diff --git a/broker/src/asapo_broker/database/database.go b/broker/src/asapo_broker/database/database.go index 81cbb2d54e48345558f62f1a3c090a1021a9eefc..342eb2816c6895f70d07a0139b6b9ac8a8731e2e 100644 --- a/broker/src/asapo_broker/database/database.go +++ b/broker/src/asapo_broker/database/database.go @@ -2,6 +2,7 @@ package database type Agent interface { ProcessRequest(db_name string, group_id string, op string, extra string) ([]byte, error) + Ping() error Connect(string) error Close() Copy() Agent diff --git a/broker/src/asapo_broker/database/database_test.go b/broker/src/asapo_broker/database/database_test.go index db511efdc23c3ad09b4f36a51e8015ceb8c2a475..3ca42ab570bc3747bc7d90ba4db3483da902e6a7 100644 --- a/broker/src/asapo_broker/database/database_test.go +++ b/broker/src/asapo_broker/database/database_test.go @@ -10,12 +10,14 @@ func TestMockDataBase(t *testing.T) { var db MockedDatabase db.On("Connect", mock.AnythingOfType("string")).Return(nil) db.On("Close").Return() + db.On("Ping").Return(nil) db.On("Copy").Return(nil) db.On("ProcessRequest", "", "", 0).Return([]byte(""), nil) db.Connect("") db.Close() db.Copy() + db.Ping() var err DBError err.Error() } diff --git a/broker/src/asapo_broker/database/mock_database.go b/broker/src/asapo_broker/database/mock_database.go index 97570e51bf5e75c19fd9daf2f7ec4162173f4725..7edb3bb83cb530c8543506769b5296f9cb2b8c7b 100644 --- a/broker/src/asapo_broker/database/mock_database.go +++ b/broker/src/asapo_broker/database/mock_database.go @@ -19,6 +19,11 @@ func (db *MockedDatabase) Close() { db.Called() } +func (db *MockedDatabase) Ping() error { + args := db.Called() + return args.Error(0) +} + func (db *MockedDatabase) Copy() Agent { db.Called() return db diff --git a/broker/src/asapo_broker/database/mongodb.go b/broker/src/asapo_broker/database/mongodb.go index 921ca52312330f9fb12c89259f890089eff8187f..2d7ed3987ad064f357295be1258e14a3b9d3b2f6 100644 --- a/broker/src/asapo_broker/database/mongodb.go +++ b/broker/src/asapo_broker/database/mongodb.go @@ -65,6 +65,13 @@ func (db *Mongodb) updateDatabaseList() (err error) { return err } +func (db *Mongodb) Ping() (err error) { + if db.session == nil { + return &DBError{utils.StatusServiceUnavailable, no_session_msg} + } + return db.session.Ping() +} + func (db *Mongodb) dataBaseExist(dbname string) (err error) { if db.databaseInList(dbname) { return nil diff --git a/broker/src/asapo_broker/database/mongodb_test.go b/broker/src/asapo_broker/database/mongodb_test.go index 91bbad836823a528df2c055179616062866b0b20..44dc0c445849aaf3a91291efe1eb64935ae30d40 100644 --- a/broker/src/asapo_broker/database/mongodb_test.go +++ b/broker/src/asapo_broker/database/mongodb_test.go @@ -302,6 +302,18 @@ func TestMongoDBGetSizeNoDatabase(t *testing.T) { assert.NotNil(t, err) } +func TestMongoPing(t *testing.T) { + db.Connect(dbaddress) + defer cleanup() + err := db.Ping() + assert.Nil(t, err) +} + +func TestMongoPingNotConected(t *testing.T) { + err := db.Ping() + assert.NotNil(t, err) +} + func TestMongoDBgetRecordByIDNotConnected(t *testing.T) { _, err := db.ProcessRequest(dbname, "", "id", "2") assert.Equal(t, utils.StatusServiceUnavailable, err.(*DBError).Code) diff --git a/broker/src/asapo_broker/server/get_health.go b/broker/src/asapo_broker/server/get_health.go index b7d9f2446fb62c2c3e7d353172978d4a9682e832..b124010030ae05fcfa9a919dee0b9e88f7cd2e60 100644 --- a/broker/src/asapo_broker/server/get_health.go +++ b/broker/src/asapo_broker/server/get_health.go @@ -4,8 +4,13 @@ import ( "net/http" ) - func routeGetHealth(w http.ResponseWriter, r *http.Request) { + db_new := db.Copy() + defer db_new.Close() + err := db_new.Ping() + if err != nil { + ReconnectDb() + } r.Header.Set("Content-type", "application/json") w.WriteHeader(http.StatusNoContent) } diff --git a/broker/src/asapo_broker/server/get_health_test.go b/broker/src/asapo_broker/server/get_health_test.go index 0efbdf70d17c57c0ebe81ea9a7cc8956c06f01ee..60a91692df0f5a60caee4d4bef3e5f9e4483dc36 100644 --- a/broker/src/asapo_broker/server/get_health_test.go +++ b/broker/src/asapo_broker/server/get_health_test.go @@ -1,13 +1,48 @@ package server import ( - "github.com/stretchr/testify/assert" + "asapo_broker/database" + "asapo_common/logger" + "errors" + "github.com/stretchr/testify/suite" "net/http" "testing" ) +type GetHealthTestSuite struct { + suite.Suite + mock_db *database.MockedDatabase +} + +func (suite *GetHealthTestSuite) SetupTest() { + statistics.Reset() + suite.mock_db = new(database.MockedDatabase) + db = suite.mock_db + logger.SetMockLog() +} + +func (suite *GetHealthTestSuite) TearDownTest() { + assertExpectations(suite.T(), suite.mock_db) + logger.UnsetMockLog() + db = nil +} + +func TestGetHealthTestSuite(t *testing.T) { + suite.Run(t, new(GetHealthTestSuite)) +} + +func (suite *GetHealthTestSuite) TestGetHealthOk() { + suite.mock_db.On("Ping").Return(nil) + ExpectCopyClose(suite.mock_db) + + w := doRequest("/health") + suite.Equal(http.StatusNoContent, w.Code) +} + +func (suite *GetHealthTestSuite) TestGetHealthTriesToReconnectsToDataBase() { + suite.mock_db.On("Ping").Return(errors.New("ping error")) + ExpectCopyCloseReconnect(suite.mock_db) -func TestGetNext(t *testing.T) { w := doRequest("/health") - assert.Equal(t, http.StatusNoContent, w.Code) + suite.Equal(http.StatusNoContent, w.Code) }