diff --git a/broker/src/asapo_broker/database/mongodb.go b/broker/src/asapo_broker/database/mongodb.go index b1129ebcffc3b33b31ebaea06e4a457313087e7f..bf46a66a83045e5b4bd3add146a87b635268a870 100644 --- a/broker/src/asapo_broker/database/mongodb.go +++ b/broker/src/asapo_broker/database/mongodb.go @@ -20,6 +20,7 @@ type Pointer struct { } const data_collection_name = "data" +const meta_collection_name = "meta" const pointer_collection_name = "current_location" const pointer_field_name = "current_pointer" const no_session_msg = "database session not created" @@ -121,6 +122,16 @@ func (db *Mongodb) InsertRecord(dbname string, s interface{}) error { return c.Insert(s) } +func (db *Mongodb) InsertMeta(dbname string, s interface{}) error { + if db.session == nil { + return errors.New(no_session_msg) + } + + c := db.session.DB(dbname).C(meta_collection_name) + + return c.Insert(s) +} + func (db *Mongodb) getMaxIndex(dbname string) (max_id int, err error) { c := db.session.DB(dbname).C(data_collection_name) var id Pointer @@ -328,6 +339,22 @@ func (db *Mongodb) ResetCounter(db_name string, group_id string) ([]byte, error) return []byte(""), err } +func (db *Mongodb) getMeta(dbname string, id int) ([]byte, error) { + + var res map[string]interface{} + q := bson.M{"_id": id} + c := db.session.DB(dbname).C(meta_collection_name) + err := c.Find(q).One(&res) + if err != nil { + log_str := "error getting meta with id " + strconv.Itoa(id) + " for " + dbname + " : " + err.Error() + logger.Debug(log_str) + return nil, &DBError{utils.StatusNoData, err.Error()} + } + + log_str := "got record id " + strconv.Itoa(id) + " for " + dbname + logger.Debug(log_str) + return utils.MapToJson(&res) +} func (db *Mongodb) ProcessRequest(db_name string, group_id string, op string, id int) (answer []byte, err error) { switch op { @@ -343,6 +370,9 @@ func (db *Mongodb) ProcessRequest(db_name string, group_id string, op string, id return db.ResetCounter(db_name, group_id) case "size": return db.GetSize(db_name) + case "meta": + return db.getMeta(db_name, id) + } return nil, errors.New("Wrong db operation: " + op) diff --git a/broker/src/asapo_broker/database/mongodb_test.go b/broker/src/asapo_broker/database/mongodb_test.go index a5500e9ddc5444558eab2c30944de1d94b4a45d9..bb200d7f2dae131e49ea8bfca11c0076cacd0e89 100644 --- a/broker/src/asapo_broker/database/mongodb_test.go +++ b/broker/src/asapo_broker/database/mongodb_test.go @@ -20,6 +20,7 @@ var db Mongodb const dbname = "run1" const dbaddress = "127.0.0.1:27017" const groupId = "bid2a5auidddp1vl71d0" +const metaID = 0 var rec1 = TestRecord{1, "aaa"} var rec2 = TestRecord{2, "bbb"} @@ -297,13 +298,33 @@ func TestMongoDBResetCounter(t *testing.T) { assert.Nil(t, err1) assert.Equal(t, string(rec1_expect), string(res1)) - _,err_reset := db.ProcessRequest(dbname, groupId, "resetcounter", 0) + _, err_reset := db.ProcessRequest(dbname, groupId, "resetcounter", 0) assert.Nil(t, err_reset) res2, err2 := db.ProcessRequest(dbname, groupId, "next", 0) - assert.Nil(t, err2) assert.Equal(t, string(rec1_expect), string(res2)) } + +func TestMongoDBGetMetaOK(t *testing.T) { + db.Connect(dbaddress) + defer cleanup() + rec1.ID = metaID + rec_expect, _ := json.Marshal(rec1) + db.InsertMeta(dbname, &rec1) + + res, err := db.ProcessRequest(dbname, "", "meta", metaID) + + assert.Nil(t, err) + assert.Equal(t, string(rec_expect), string(res)) +} + +func TestMongoDBGetMetaErr(t *testing.T) { + db.Connect(dbaddress) + defer cleanup() + + _, err := db.ProcessRequest(dbname, "", "meta", metaID) + assert.NotNil(t, err) +} diff --git a/broker/src/asapo_broker/server/get_meta.go b/broker/src/asapo_broker/server/get_meta.go new file mode 100644 index 0000000000000000000000000000000000000000..c038cb54d918333e5c02b57f39cadbcb9fbe27d3 --- /dev/null +++ b/broker/src/asapo_broker/server/get_meta.go @@ -0,0 +1,14 @@ +package server + +import ( + "net/http" +) + +func routeGetMeta(w http.ResponseWriter, r *http.Request) { + id, ok := extractRequestParametersID(r) + if !ok { + w.WriteHeader(http.StatusBadRequest) + return + } + processRequest(w, r, "meta", id, false) +} diff --git a/broker/src/asapo_broker/server/get_meta_test.go b/broker/src/asapo_broker/server/get_meta_test.go new file mode 100644 index 0000000000000000000000000000000000000000..6b07de63e31410a23fda301b836935dbf4aafadd --- /dev/null +++ b/broker/src/asapo_broker/server/get_meta_test.go @@ -0,0 +1,43 @@ +package server + +import ( + "asapo_broker/database" + "asapo_common/logger" + "github.com/stretchr/testify/mock" + "github.com/stretchr/testify/suite" + "net/http" + "testing" +) + +type GetMetaTestSuite struct { + suite.Suite + mock_db *database.MockedDatabase +} + +func (suite *GetMetaTestSuite) SetupTest() { + statistics.Reset() + suite.mock_db = new(database.MockedDatabase) + db = suite.mock_db + prepareTestAuth() + logger.SetMockLog() +} + +func (suite *GetMetaTestSuite) TearDownTest() { + assertExpectations(suite.T(), suite.mock_db) + logger.UnsetMockLog() + db = nil +} + +func TestGetMetaTestSuite(t *testing.T) { + suite.Run(t, new(GetMetaTestSuite)) +} + +func (suite *GetMetaTestSuite) TestGetMetaOK() { + suite.mock_db.On("ProcessRequest", expectedBeamtimeId, "", "meta", 0).Return([]byte("{\"test\":10}"), nil) + logger.MockLog.On("Debug", mock.MatchedBy(containsMatcher("processing request meta"))) + ExpectCopyClose(suite.mock_db) + + w := doRequest("/database/" + expectedBeamtimeId + "/0/meta/0" + correctTokenSuffix) + suite.Equal(http.StatusOK, w.Code, "GetSize OK") + suite.Equal("{\"test\":10}", string(w.Body.Bytes()), "GetMeta sends meta") +} diff --git a/broker/src/asapo_broker/server/listroutes.go b/broker/src/asapo_broker/server/listroutes.go index 750ee8c40ef0cc723b64b1cb688329df447135e0..f56310e24193032db17e49f160a730982c875425 100644 --- a/broker/src/asapo_broker/server/listroutes.go +++ b/broker/src/asapo_broker/server/listroutes.go @@ -29,6 +29,12 @@ var listRoutes = utils.Routes{ "/database/{dbname}/{groupid}/{id}", routeGetByID, }, + utils.Route{ + "GetMeta", + "Get", + "/database/{dbname}/0/meta/{id}", + routeGetMeta, + }, utils.Route{ "CreateGroup", "Post", diff --git a/tests/automatic/broker/CMakeLists.txt b/tests/automatic/broker/CMakeLists.txt index 37420e25280cc15c84dddb7d4b1159f6eab7d0b1..ef8369c2ab30c50c75935c2ce4989e089beb3007 100644 --- a/tests/automatic/broker/CMakeLists.txt +++ b/tests/automatic/broker/CMakeLists.txt @@ -1,5 +1,6 @@ add_subdirectory(get_next) add_subdirectory(get_last) +add_subdirectory(get_meta) add_subdirectory(read_config) diff --git a/tests/automatic/broker/get_meta/CMakeLists.txt b/tests/automatic/broker/get_meta/CMakeLists.txt new file mode 100644 index 0000000000000000000000000000000000000000..37351767df15cf93350e299046b6b0c078ec0e1b --- /dev/null +++ b/tests/automatic/broker/get_meta/CMakeLists.txt @@ -0,0 +1,10 @@ +set(TARGET_NAME asapo-broker) + +################################ +# Testing +################################ +configure_file(${CMAKE_SOURCE_DIR}/tests/automatic/settings/broker_settings.json settings.json COPYONLY) +configure_file(${CMAKE_SOURCE_DIR}/tests/automatic/settings/broker_secret.key broker_secret.key COPYONLY) + +add_script_test("${TARGET_NAME}-getmeta" "$<TARGET_PROPERTY:${TARGET_NAME},EXENAME> $<TARGET_PROPERTY:asapo,EXENAME>" nomem + ) diff --git a/tests/automatic/broker/get_meta/check_linux.sh b/tests/automatic/broker/get_meta/check_linux.sh new file mode 100644 index 0000000000000000000000000000000000000000..0e906ae6c103d6baa75d11375b5d30187acfa672 --- /dev/null +++ b/tests/automatic/broker/get_meta/check_linux.sh @@ -0,0 +1,26 @@ +#!/usr/bin/env bash + +database_name=test + +set -e + +trap Cleanup EXIT + +Cleanup() { + echo cleanup + echo "db.dropDatabase()" | mongo ${database_name} + kill -9 $brokerid +} + +echo 'db.meta.insert({"_id":0,"data":"test"})' | mongo ${database_name} + +token=`$2 token -secret broker_secret.key ${database_name}` + +$1 -config settings.json & + +sleep 0.3 +brokerid=`echo $!` + +curl -v --silent 127.0.0.1:5005/database/${database_name}/0/meta/0?token=$token --stderr - | grep '"data":"test"' +curl -v --silent 127.0.0.1:5005/database/${database_name}/0/meta/1?token=$token --stderr - | grep 'not found' + diff --git a/tests/automatic/broker/get_meta/check_windows.bat b/tests/automatic/broker/get_meta/check_windows.bat new file mode 100644 index 0000000000000000000000000000000000000000..8e111ea82520404ddb13e186748953f9af671401 --- /dev/null +++ b/tests/automatic/broker/get_meta/check_windows.bat @@ -0,0 +1,30 @@ +SET database_name=data +SET mongo_exe="c:\Program Files\MongoDB\Server\3.6\bin\mongo.exe" + +echo db.meta.insert({"_id":0}) | %mongo_exe% %database_name% || goto :error + +set full_name="%1" +set short_name="%~nx1" + +"%2" token -secret broker_secret.key %database_name% > token +set /P token=< token + +start /B "" "%full_name%" -config settings.json + +ping 1.0.0.0 -n 1 -w 100 > nul + +C:\Curl\curl.exe -v --silent 127.0.0.1:5005/database/%database_name%/0/meta?token=%token% --stderr - | findstr /c:\"_id\":0 || goto :error +C:\Curl\curl.exe -v --silent 127.0.0.1:5005/database/%database_name%/1/meta?token=%token% --stderr - | findstr /c:"not found" || goto :error + + +goto :clean + +:error +call :clean +exit /b 1 + +:clean +Taskkill /IM "%short_name%" /F +echo db.dropDatabase() | %mongo_exe% %database_name% +del /f token +del /f groupid \ No newline at end of file diff --git a/tests/automatic/mongo_db/upsert/upsert_mongodb.cpp b/tests/automatic/mongo_db/upsert/upsert_mongodb.cpp index 059953937e21dac3763a489e8d2ae13ab5ad6839..6855c88f796727a62144fc4640030931211507af 100644 --- a/tests/automatic/mongo_db/upsert/upsert_mongodb.cpp +++ b/tests/automatic/mongo_db/upsert/upsert_mongodb.cpp @@ -48,16 +48,16 @@ int main(int argc, char* argv[]) { db.Connect("127.0.0.1", "test", "meta"); } - auto err = db.Upsert(0, reinterpret_cast<const uint8_t*>(json.c_str()),json.size()); + auto err = db.Upsert(0, reinterpret_cast<const uint8_t*>(json.c_str()), json.size()); if (err) { - std::cout<<err->Explain()<<std::endl; + std::cout << err->Explain() << std::endl; } Assert(err, args.keyword); - err = db.Upsert(0, reinterpret_cast<const uint8_t*>(json.c_str()),json.size()); + err = db.Upsert(0, reinterpret_cast<const uint8_t*>(json.c_str()), json.size()); if (err) { - std::cout<<err->Explain()<<std::endl; + std::cout << err->Explain() << std::endl; } Assert(err, args.keyword);