| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488 |
- //
- // MongoDBTest.cpp
- //
- // Copyright (c) 2004-2006, Applied Informatics Software Engineering GmbH.
- // and Contributors.
- //
- // SPDX-License-Identifier: BSL-1.0
- //
- #include "Poco/DateTime.h"
- #include "Poco/ObjectPool.h"
- #include "Poco/MongoDB/InsertRequest.h"
- #include "Poco/MongoDB/QueryRequest.h"
- #include "Poco/MongoDB/DeleteRequest.h"
- #include "Poco/MongoDB/GetMoreRequest.h"
- #include "Poco/MongoDB/PoolableConnectionFactory.h"
- #include "Poco/MongoDB/Database.h"
- #include "Poco/MongoDB/Cursor.h"
- #include "Poco/MongoDB/ObjectId.h"
- #include "Poco/MongoDB/Binary.h"
- #include "Poco/Net/NetException.h"
- #include "Poco/UUIDGenerator.h"
- #include "MongoDBTest.h"
- #include "CppUnit/TestCaller.h"
- #include "CppUnit/TestSuite.h"
- #include <iostream>
- using namespace Poco::MongoDB;
- Poco::MongoDB::Connection::Ptr MongoDBTest::_mongo;
- MongoDBTest::MongoDBTest(const std::string& name):
- CppUnit::TestCase("MongoDB")
- {
- }
- MongoDBTest::~MongoDBTest()
- {
- }
- void MongoDBTest::setUp()
- {
- }
- void MongoDBTest::tearDown()
- {
- }
- void MongoDBTest::testInsertRequest()
- {
- Poco::MongoDB::Document::Ptr player = new Poco::MongoDB::Document();
- player->add("lastname", std::string("Braem"));
- player->add("firstname", std::string("Franky"));
- Poco::DateTime birthdate;
- birthdate.assign(1969, 3, 9);
- player->add("birthdate", birthdate.timestamp());
- player->add("start", 1993);
- player->add("active", false);
- Poco::DateTime now;
- player->add("lastupdated", now.timestamp());
- player->add("unknown", NullValue());
- Poco::MongoDB::InsertRequest request("team.players");
- request.documents().push_back(player);
- _mongo->sendRequest(request);
- }
- void MongoDBTest::testQueryRequest()
- {
- Poco::MongoDB::QueryRequest request("team.players");
- request.selector().add("lastname" , std::string("Braem"));
- request.setNumberToReturn(1);
- Poco::MongoDB::ResponseMessage response;
- _mongo->sendRequest(request, response);
- if ( response.documents().size() > 0 )
- {
- Poco::MongoDB::Document::Ptr doc = response.documents()[0];
- try
- {
- std::string lastname = doc->get<std::string>("lastname");
- assert(lastname.compare("Braem") == 0);
- std::string firstname = doc->get<std::string>("firstname");
- assert(firstname.compare("Franky") == 0);
- Poco::Timestamp birthDateTimestamp = doc->get<Poco::Timestamp>("birthdate");
- Poco::DateTime birthDate(birthDateTimestamp);
- assert(birthDate.year() == 1969 && birthDate.month() == 3 && birthDate.day() == 9);
- Poco::Timestamp lastupdatedTimestamp = doc->get<Poco::Timestamp>("lastupdated");
- assert(doc->isType<NullValue>("unknown"));
- bool active = doc->get<bool>("active");
- assert(!active);
- std::string id = doc->get("_id")->toString();
- }
- catch(Poco::NotFoundException& nfe)
- {
- fail(nfe.message() + " not found.");
- }
- }
- else
- {
- fail("No document returned");
- }
- }
- void MongoDBTest::testDBQueryRequest()
- {
- Database db("team");
- Poco::SharedPtr<Poco::MongoDB::QueryRequest> request = db.createQueryRequest("players");
- request->selector().add("lastname" , std::string("Braem"));
- Poco::MongoDB::ResponseMessage response;
- _mongo->sendRequest(*request, response);
- if ( response.documents().size() > 0 )
- {
- Poco::MongoDB::Document::Ptr doc = response.documents()[0];
- try
- {
- std::string lastname = doc->get<std::string>("lastname");
- assert(lastname.compare("Braem") == 0);
- std::string firstname = doc->get<std::string>("firstname");
- assert(firstname.compare("Franky") == 0);
- Poco::Timestamp birthDateTimestamp = doc->get<Poco::Timestamp>("birthdate");
- Poco::DateTime birthDate(birthDateTimestamp);
- assert(birthDate.year() == 1969 && birthDate.month() == 3 && birthDate.day() == 9);
- Poco::Timestamp lastupdatedTimestamp = doc->get<Poco::Timestamp>("lastupdated");
- assert(doc->isType<NullValue>("unknown"));
- std::string id = doc->get("_id")->toString();
- }
- catch(Poco::NotFoundException& nfe)
- {
- fail(nfe.message() + " not found.");
- }
- }
- else
- {
- fail("No document returned");
- }
- }
- void MongoDBTest::testCountCommand()
- {
- Poco::MongoDB::QueryRequest request("team.$cmd");
- request.setNumberToReturn(1);
- request.selector().add("count", std::string("players"));
- Poco::MongoDB::ResponseMessage response;
- _mongo->sendRequest(request, response);
- if ( response.documents().size() > 0 )
- {
- Poco::MongoDB::Document::Ptr doc = response.documents()[0];
- assert(doc->getInteger("n") == 1);
- }
- else
- {
- fail("Didn't get a response from the count command");
- }
- }
- void MongoDBTest::testDBCountCommand()
- {
- Poco::MongoDB::Database db("team");
- Poco::SharedPtr<Poco::MongoDB::QueryRequest> request = db.createCountRequest("players");
- Poco::MongoDB::ResponseMessage response;
- _mongo->sendRequest(*request, response);
- if ( response.documents().size() > 0 )
- {
- Poco::MongoDB::Document::Ptr doc = response.documents()[0];
- assert(doc->getInteger("n") == 1);
- }
- else
- {
- fail("Didn't get a response from the count command");
- }
- }
- void MongoDBTest::testDBCount2Command()
- {
- Poco::MongoDB::Database db("team");
- Poco::Int64 count = db.count(*_mongo, "players");
- assert(count == 1);
- }
- void MongoDBTest::testDeleteRequest()
- {
- Poco::MongoDB::DeleteRequest request("team.players");
- request.selector().add("lastname", std::string("Braem"));
- _mongo->sendRequest(request);
- }
- void MongoDBTest::testCursorRequest()
- {
- Poco::MongoDB::Database db("team");
- Poco::SharedPtr<Poco::MongoDB::DeleteRequest> deleteRequest = db.createDeleteRequest("numbers");
- _mongo->sendRequest(*deleteRequest);
- Poco::SharedPtr<Poco::MongoDB::InsertRequest> insertRequest = db.createInsertRequest("numbers");
- for(int i = 0; i < 10000; ++i)
- {
- Document::Ptr doc = new Document();
- doc->add("number", i);
- insertRequest->documents().push_back(doc);
- }
- _mongo->sendRequest(*insertRequest);
- Poco::Int64 count = db.count(*_mongo, "numbers");
- assert(count == 10000);
- Poco::MongoDB::Cursor cursor("team", "numbers");
- int n = 0;
- Poco::MongoDB::ResponseMessage& response = cursor.next(*_mongo);
- while(1)
- {
- n += static_cast<int>(response.documents().size());
- if ( response.cursorID() == 0 )
- break;
- response = cursor.next(*_mongo);
- }
- assert(n == 10000);
- Poco::MongoDB::QueryRequest drop("team.$cmd");
- drop.setNumberToReturn(1);
- drop.selector().add("drop", std::string("numbers"));
- Poco::MongoDB::ResponseMessage responseDrop;
- _mongo->sendRequest(drop, responseDrop);
- }
- void MongoDBTest::testBuildInfo()
- {
- Poco::MongoDB::QueryRequest request("team.$cmd");
- request.setNumberToReturn(1);
- request.selector().add("buildInfo", 1);
- Poco::MongoDB::ResponseMessage response;
- try
- {
- _mongo->sendRequest(request, response);
- }
- catch(Poco::NotImplementedException& nie)
- {
- std::cout << nie.message() << std::endl;
- return;
- }
- if ( response.documents().size() > 0 )
- {
- Poco::MongoDB::Document::Ptr doc = response.documents()[0];
- std::cout << doc->toString(2);
- }
- else
- {
- fail("Didn't get a response from the buildinfo command");
- }
- }
- void MongoDBTest::testConnectionPool()
- {
- #if POCO_OS == POCO_OS_ANDROID
- std::string host = "10.0.2.2";
- #else
- std::string host = "127.0.0.1";
- #endif
- Poco::Net::SocketAddress sa(host, 27017);
- Poco::PoolableObjectFactory<Poco::MongoDB::Connection, Poco::MongoDB::Connection::Ptr> factory(sa);
- Poco::ObjectPool<Poco::MongoDB::Connection, Poco::MongoDB::Connection::Ptr> pool(factory, 10, 15);
- Poco::MongoDB::PooledConnection pooledConnection(pool);
- Poco::MongoDB::QueryRequest request("team.$cmd");
- request.setNumberToReturn(1);
- request.selector().add("count", std::string("players"));
- Poco::MongoDB::ResponseMessage response;
- ((Connection::Ptr) pooledConnection)->sendRequest(request, response);
- if ( response.documents().size() > 0 )
- {
- Poco::MongoDB::Document::Ptr doc = response.documents()[0];
- assert(doc->getInteger("n") == 1);
- }
- else
- {
- fail("Didn't get a response from the count command");
- }
- }
- void MongoDBTest::testObjectID()
- {
- ObjectId oid("536aeebba081de6815000002");
- std::string str2 = oid.toString();
- assert(str2 == "536aeebba081de6815000002");
- }
- void MongoDBTest::testCommand() {
- Poco::MongoDB::Database db("team");
- Poco::SharedPtr<Poco::MongoDB::QueryRequest> command = db.createCommand();
- command->selector().add("create", "fixCol")
- .add("capped", true)
- .add("max", 1024*1024)
- .add("size", 1024);
- Poco::MongoDB::ResponseMessage response;
- _mongo->sendRequest(*command, response);
- if ( response.documents().size() > 0 )
- {
- Poco::MongoDB::Document::Ptr doc = response.documents()[0];
- }
- else
- {
- Poco::MongoDB::Document::Ptr lastError = db.getLastErrorDoc(*_mongo);
- fail(lastError->toString(2));
- }
- }
- void MongoDBTest::testUUID()
- {
- Poco::MongoDB::Document::Ptr club = new Poco::MongoDB::Document();
- club->add("name", std::string("Barcelona"));
- Poco::UUIDGenerator generator;
- Poco::UUID uuid = generator.create();
- Poco::MongoDB::Binary::Ptr uuidBinary = new Poco::MongoDB::Binary(uuid);
- club->add("uuid", uuidBinary);
- Poco::MongoDB::InsertRequest request("team.club");
- request.documents().push_back(club);
- _mongo->sendRequest(request);
- Poco::MongoDB::QueryRequest queryReq("team.club");
- queryReq.selector().add("name" , std::string("Barcelona"));
- Poco::MongoDB::ResponseMessage response;
- _mongo->sendRequest(queryReq, response);
- if ( response.documents().size() > 0 )
- {
- Poco::MongoDB::Document::Ptr doc = response.documents()[0];
- try
- {
- std::string name = doc->get<std::string>("name");
- assert(name.compare("Barcelona") == 0);
- Poco::MongoDB::Binary::Ptr uuidBinary = doc->get<Binary::Ptr>("uuid");
- assert(uuid == uuidBinary->uuid());
- }
- catch(Poco::NotFoundException& nfe)
- {
- fail(nfe.message() + " not found.");
- }
- }
- else
- {
- fail("No document returned");
- }
- Poco::MongoDB::DeleteRequest delRequest("team.club");
- delRequest.selector().add("name", std::string("Barcelona"));
- _mongo->sendRequest(delRequest);
- }
- void MongoDBTest::testConnectURI()
- {
- Poco::MongoDB::Connection conn;
- Poco::MongoDB::Connection::SocketFactory sf;
- #if POCO_OS == POCO_OS_ANDROID
- std::string host = "10.0.2.2";
- #else
- std::string host = "127.0.0.1";
- #endif
- conn.connect("mongodb://" + host, sf);
- conn.disconnect();
- try
- {
- conn.connect("http://" + host, sf);
- fail("invalid URI scheme - must throw");
- }
- catch (Poco::UnknownURISchemeException&)
- {
- }
- try
- {
- conn.connect("mongodb://" + host + "?ssl=true", sf);
- fail("SSL not supported, must throw");
- }
- catch (Poco::NotImplementedException&)
- {
- }
- conn.connect("mongodb://" + host + "/admin?ssl=false&connectTimeoutMS=10000&socketTimeoutMS=10000", sf);
- conn.disconnect();
- try
- {
- conn.connect("mongodb://" + host + "/admin?connectTimeoutMS=foo", sf);
- fail("invalid parameter - must throw");
- }
- catch (Poco::Exception&)
- {
- }
- #ifdef MONGODB_TEST_AUTH
- conn.connect("mongodb://admin:[email protected]/admin", sf);
- conn.disconnect();
- #endif
- }
- CppUnit::Test* MongoDBTest::suite()
- {
- #if POCO_OS == POCO_OS_ANDROID
- std::string host = "10.0.2.2";
- #else
- std::string host = "127.0.0.1";
- #endif
- try
- {
- _mongo = new Poco::MongoDB::Connection(host, 27017);
- std::cout << "Connected to [" << host << ":27017]" << std::endl;
- }
- catch (Poco::Net::ConnectionRefusedException& e)
- {
- std::cout << "Couldn't connect to " << e.message() << ". " << std::endl;
- return 0;
- }
- CppUnit::TestSuite* pSuite = new CppUnit::TestSuite("MongoDBTest");
- CppUnit_addTest(pSuite, MongoDBTest, testBuildInfo);
- CppUnit_addTest(pSuite, MongoDBTest, testInsertRequest);
- CppUnit_addTest(pSuite, MongoDBTest, testQueryRequest);
- CppUnit_addTest(pSuite, MongoDBTest, testDBQueryRequest);
- CppUnit_addTest(pSuite, MongoDBTest, testCountCommand);
- CppUnit_addTest(pSuite, MongoDBTest, testDBCountCommand);
- CppUnit_addTest(pSuite, MongoDBTest, testDBCount2Command);
- CppUnit_addTest(pSuite, MongoDBTest, testConnectionPool);
- CppUnit_addTest(pSuite, MongoDBTest, testDeleteRequest);
- CppUnit_addTest(pSuite, MongoDBTest, testCursorRequest);
- CppUnit_addTest(pSuite, MongoDBTest, testObjectID);
- CppUnit_addTest(pSuite, MongoDBTest, testCommand);
- CppUnit_addTest(pSuite, MongoDBTest, testUUID);
- CppUnit_addTest(pSuite, MongoDBTest, testConnectURI);
- return pSuite;
- }
|