MongoDBTest.cpp 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488
  1. //
  2. // MongoDBTest.cpp
  3. //
  4. // Copyright (c) 2004-2006, Applied Informatics Software Engineering GmbH.
  5. // and Contributors.
  6. //
  7. // SPDX-License-Identifier: BSL-1.0
  8. //
  9. #include "Poco/DateTime.h"
  10. #include "Poco/ObjectPool.h"
  11. #include "Poco/MongoDB/InsertRequest.h"
  12. #include "Poco/MongoDB/QueryRequest.h"
  13. #include "Poco/MongoDB/DeleteRequest.h"
  14. #include "Poco/MongoDB/GetMoreRequest.h"
  15. #include "Poco/MongoDB/PoolableConnectionFactory.h"
  16. #include "Poco/MongoDB/Database.h"
  17. #include "Poco/MongoDB/Cursor.h"
  18. #include "Poco/MongoDB/ObjectId.h"
  19. #include "Poco/MongoDB/Binary.h"
  20. #include "Poco/Net/NetException.h"
  21. #include "Poco/UUIDGenerator.h"
  22. #include "MongoDBTest.h"
  23. #include "CppUnit/TestCaller.h"
  24. #include "CppUnit/TestSuite.h"
  25. #include <iostream>
  26. using namespace Poco::MongoDB;
  27. Poco::MongoDB::Connection::Ptr MongoDBTest::_mongo;
  28. MongoDBTest::MongoDBTest(const std::string& name):
  29. CppUnit::TestCase("MongoDB")
  30. {
  31. }
  32. MongoDBTest::~MongoDBTest()
  33. {
  34. }
  35. void MongoDBTest::setUp()
  36. {
  37. }
  38. void MongoDBTest::tearDown()
  39. {
  40. }
  41. void MongoDBTest::testInsertRequest()
  42. {
  43. Poco::MongoDB::Document::Ptr player = new Poco::MongoDB::Document();
  44. player->add("lastname", std::string("Braem"));
  45. player->add("firstname", std::string("Franky"));
  46. Poco::DateTime birthdate;
  47. birthdate.assign(1969, 3, 9);
  48. player->add("birthdate", birthdate.timestamp());
  49. player->add("start", 1993);
  50. player->add("active", false);
  51. Poco::DateTime now;
  52. player->add("lastupdated", now.timestamp());
  53. player->add("unknown", NullValue());
  54. Poco::MongoDB::InsertRequest request("team.players");
  55. request.documents().push_back(player);
  56. _mongo->sendRequest(request);
  57. }
  58. void MongoDBTest::testQueryRequest()
  59. {
  60. Poco::MongoDB::QueryRequest request("team.players");
  61. request.selector().add("lastname" , std::string("Braem"));
  62. request.setNumberToReturn(1);
  63. Poco::MongoDB::ResponseMessage response;
  64. _mongo->sendRequest(request, response);
  65. if ( response.documents().size() > 0 )
  66. {
  67. Poco::MongoDB::Document::Ptr doc = response.documents()[0];
  68. try
  69. {
  70. std::string lastname = doc->get<std::string>("lastname");
  71. assert(lastname.compare("Braem") == 0);
  72. std::string firstname = doc->get<std::string>("firstname");
  73. assert(firstname.compare("Franky") == 0);
  74. Poco::Timestamp birthDateTimestamp = doc->get<Poco::Timestamp>("birthdate");
  75. Poco::DateTime birthDate(birthDateTimestamp);
  76. assert(birthDate.year() == 1969 && birthDate.month() == 3 && birthDate.day() == 9);
  77. Poco::Timestamp lastupdatedTimestamp = doc->get<Poco::Timestamp>("lastupdated");
  78. assert(doc->isType<NullValue>("unknown"));
  79. bool active = doc->get<bool>("active");
  80. assert(!active);
  81. std::string id = doc->get("_id")->toString();
  82. }
  83. catch(Poco::NotFoundException& nfe)
  84. {
  85. fail(nfe.message() + " not found.");
  86. }
  87. }
  88. else
  89. {
  90. fail("No document returned");
  91. }
  92. }
  93. void MongoDBTest::testDBQueryRequest()
  94. {
  95. Database db("team");
  96. Poco::SharedPtr<Poco::MongoDB::QueryRequest> request = db.createQueryRequest("players");
  97. request->selector().add("lastname" , std::string("Braem"));
  98. Poco::MongoDB::ResponseMessage response;
  99. _mongo->sendRequest(*request, response);
  100. if ( response.documents().size() > 0 )
  101. {
  102. Poco::MongoDB::Document::Ptr doc = response.documents()[0];
  103. try
  104. {
  105. std::string lastname = doc->get<std::string>("lastname");
  106. assert(lastname.compare("Braem") == 0);
  107. std::string firstname = doc->get<std::string>("firstname");
  108. assert(firstname.compare("Franky") == 0);
  109. Poco::Timestamp birthDateTimestamp = doc->get<Poco::Timestamp>("birthdate");
  110. Poco::DateTime birthDate(birthDateTimestamp);
  111. assert(birthDate.year() == 1969 && birthDate.month() == 3 && birthDate.day() == 9);
  112. Poco::Timestamp lastupdatedTimestamp = doc->get<Poco::Timestamp>("lastupdated");
  113. assert(doc->isType<NullValue>("unknown"));
  114. std::string id = doc->get("_id")->toString();
  115. }
  116. catch(Poco::NotFoundException& nfe)
  117. {
  118. fail(nfe.message() + " not found.");
  119. }
  120. }
  121. else
  122. {
  123. fail("No document returned");
  124. }
  125. }
  126. void MongoDBTest::testCountCommand()
  127. {
  128. Poco::MongoDB::QueryRequest request("team.$cmd");
  129. request.setNumberToReturn(1);
  130. request.selector().add("count", std::string("players"));
  131. Poco::MongoDB::ResponseMessage response;
  132. _mongo->sendRequest(request, response);
  133. if ( response.documents().size() > 0 )
  134. {
  135. Poco::MongoDB::Document::Ptr doc = response.documents()[0];
  136. assert(doc->getInteger("n") == 1);
  137. }
  138. else
  139. {
  140. fail("Didn't get a response from the count command");
  141. }
  142. }
  143. void MongoDBTest::testDBCountCommand()
  144. {
  145. Poco::MongoDB::Database db("team");
  146. Poco::SharedPtr<Poco::MongoDB::QueryRequest> request = db.createCountRequest("players");
  147. Poco::MongoDB::ResponseMessage response;
  148. _mongo->sendRequest(*request, response);
  149. if ( response.documents().size() > 0 )
  150. {
  151. Poco::MongoDB::Document::Ptr doc = response.documents()[0];
  152. assert(doc->getInteger("n") == 1);
  153. }
  154. else
  155. {
  156. fail("Didn't get a response from the count command");
  157. }
  158. }
  159. void MongoDBTest::testDBCount2Command()
  160. {
  161. Poco::MongoDB::Database db("team");
  162. Poco::Int64 count = db.count(*_mongo, "players");
  163. assert(count == 1);
  164. }
  165. void MongoDBTest::testDeleteRequest()
  166. {
  167. Poco::MongoDB::DeleteRequest request("team.players");
  168. request.selector().add("lastname", std::string("Braem"));
  169. _mongo->sendRequest(request);
  170. }
  171. void MongoDBTest::testCursorRequest()
  172. {
  173. Poco::MongoDB::Database db("team");
  174. Poco::SharedPtr<Poco::MongoDB::DeleteRequest> deleteRequest = db.createDeleteRequest("numbers");
  175. _mongo->sendRequest(*deleteRequest);
  176. Poco::SharedPtr<Poco::MongoDB::InsertRequest> insertRequest = db.createInsertRequest("numbers");
  177. for(int i = 0; i < 10000; ++i)
  178. {
  179. Document::Ptr doc = new Document();
  180. doc->add("number", i);
  181. insertRequest->documents().push_back(doc);
  182. }
  183. _mongo->sendRequest(*insertRequest);
  184. Poco::Int64 count = db.count(*_mongo, "numbers");
  185. assert(count == 10000);
  186. Poco::MongoDB::Cursor cursor("team", "numbers");
  187. int n = 0;
  188. Poco::MongoDB::ResponseMessage& response = cursor.next(*_mongo);
  189. while(1)
  190. {
  191. n += static_cast<int>(response.documents().size());
  192. if ( response.cursorID() == 0 )
  193. break;
  194. response = cursor.next(*_mongo);
  195. }
  196. assert(n == 10000);
  197. Poco::MongoDB::QueryRequest drop("team.$cmd");
  198. drop.setNumberToReturn(1);
  199. drop.selector().add("drop", std::string("numbers"));
  200. Poco::MongoDB::ResponseMessage responseDrop;
  201. _mongo->sendRequest(drop, responseDrop);
  202. }
  203. void MongoDBTest::testBuildInfo()
  204. {
  205. Poco::MongoDB::QueryRequest request("team.$cmd");
  206. request.setNumberToReturn(1);
  207. request.selector().add("buildInfo", 1);
  208. Poco::MongoDB::ResponseMessage response;
  209. try
  210. {
  211. _mongo->sendRequest(request, response);
  212. }
  213. catch(Poco::NotImplementedException& nie)
  214. {
  215. std::cout << nie.message() << std::endl;
  216. return;
  217. }
  218. if ( response.documents().size() > 0 )
  219. {
  220. Poco::MongoDB::Document::Ptr doc = response.documents()[0];
  221. std::cout << doc->toString(2);
  222. }
  223. else
  224. {
  225. fail("Didn't get a response from the buildinfo command");
  226. }
  227. }
  228. void MongoDBTest::testConnectionPool()
  229. {
  230. #if POCO_OS == POCO_OS_ANDROID
  231. std::string host = "10.0.2.2";
  232. #else
  233. std::string host = "127.0.0.1";
  234. #endif
  235. Poco::Net::SocketAddress sa(host, 27017);
  236. Poco::PoolableObjectFactory<Poco::MongoDB::Connection, Poco::MongoDB::Connection::Ptr> factory(sa);
  237. Poco::ObjectPool<Poco::MongoDB::Connection, Poco::MongoDB::Connection::Ptr> pool(factory, 10, 15);
  238. Poco::MongoDB::PooledConnection pooledConnection(pool);
  239. Poco::MongoDB::QueryRequest request("team.$cmd");
  240. request.setNumberToReturn(1);
  241. request.selector().add("count", std::string("players"));
  242. Poco::MongoDB::ResponseMessage response;
  243. ((Connection::Ptr) pooledConnection)->sendRequest(request, response);
  244. if ( response.documents().size() > 0 )
  245. {
  246. Poco::MongoDB::Document::Ptr doc = response.documents()[0];
  247. assert(doc->getInteger("n") == 1);
  248. }
  249. else
  250. {
  251. fail("Didn't get a response from the count command");
  252. }
  253. }
  254. void MongoDBTest::testObjectID()
  255. {
  256. ObjectId oid("536aeebba081de6815000002");
  257. std::string str2 = oid.toString();
  258. assert(str2 == "536aeebba081de6815000002");
  259. }
  260. void MongoDBTest::testCommand() {
  261. Poco::MongoDB::Database db("team");
  262. Poco::SharedPtr<Poco::MongoDB::QueryRequest> command = db.createCommand();
  263. command->selector().add("create", "fixCol")
  264. .add("capped", true)
  265. .add("max", 1024*1024)
  266. .add("size", 1024);
  267. Poco::MongoDB::ResponseMessage response;
  268. _mongo->sendRequest(*command, response);
  269. if ( response.documents().size() > 0 )
  270. {
  271. Poco::MongoDB::Document::Ptr doc = response.documents()[0];
  272. }
  273. else
  274. {
  275. Poco::MongoDB::Document::Ptr lastError = db.getLastErrorDoc(*_mongo);
  276. fail(lastError->toString(2));
  277. }
  278. }
  279. void MongoDBTest::testUUID()
  280. {
  281. Poco::MongoDB::Document::Ptr club = new Poco::MongoDB::Document();
  282. club->add("name", std::string("Barcelona"));
  283. Poco::UUIDGenerator generator;
  284. Poco::UUID uuid = generator.create();
  285. Poco::MongoDB::Binary::Ptr uuidBinary = new Poco::MongoDB::Binary(uuid);
  286. club->add("uuid", uuidBinary);
  287. Poco::MongoDB::InsertRequest request("team.club");
  288. request.documents().push_back(club);
  289. _mongo->sendRequest(request);
  290. Poco::MongoDB::QueryRequest queryReq("team.club");
  291. queryReq.selector().add("name" , std::string("Barcelona"));
  292. Poco::MongoDB::ResponseMessage response;
  293. _mongo->sendRequest(queryReq, response);
  294. if ( response.documents().size() > 0 )
  295. {
  296. Poco::MongoDB::Document::Ptr doc = response.documents()[0];
  297. try
  298. {
  299. std::string name = doc->get<std::string>("name");
  300. assert(name.compare("Barcelona") == 0);
  301. Poco::MongoDB::Binary::Ptr uuidBinary = doc->get<Binary::Ptr>("uuid");
  302. assert(uuid == uuidBinary->uuid());
  303. }
  304. catch(Poco::NotFoundException& nfe)
  305. {
  306. fail(nfe.message() + " not found.");
  307. }
  308. }
  309. else
  310. {
  311. fail("No document returned");
  312. }
  313. Poco::MongoDB::DeleteRequest delRequest("team.club");
  314. delRequest.selector().add("name", std::string("Barcelona"));
  315. _mongo->sendRequest(delRequest);
  316. }
  317. void MongoDBTest::testConnectURI()
  318. {
  319. Poco::MongoDB::Connection conn;
  320. Poco::MongoDB::Connection::SocketFactory sf;
  321. #if POCO_OS == POCO_OS_ANDROID
  322. std::string host = "10.0.2.2";
  323. #else
  324. std::string host = "127.0.0.1";
  325. #endif
  326. conn.connect("mongodb://" + host, sf);
  327. conn.disconnect();
  328. try
  329. {
  330. conn.connect("http://" + host, sf);
  331. fail("invalid URI scheme - must throw");
  332. }
  333. catch (Poco::UnknownURISchemeException&)
  334. {
  335. }
  336. try
  337. {
  338. conn.connect("mongodb://" + host + "?ssl=true", sf);
  339. fail("SSL not supported, must throw");
  340. }
  341. catch (Poco::NotImplementedException&)
  342. {
  343. }
  344. conn.connect("mongodb://" + host + "/admin?ssl=false&connectTimeoutMS=10000&socketTimeoutMS=10000", sf);
  345. conn.disconnect();
  346. try
  347. {
  348. conn.connect("mongodb://" + host + "/admin?connectTimeoutMS=foo", sf);
  349. fail("invalid parameter - must throw");
  350. }
  351. catch (Poco::Exception&)
  352. {
  353. }
  354. #ifdef MONGODB_TEST_AUTH
  355. conn.connect("mongodb://admin:[email protected]/admin", sf);
  356. conn.disconnect();
  357. #endif
  358. }
  359. CppUnit::Test* MongoDBTest::suite()
  360. {
  361. #if POCO_OS == POCO_OS_ANDROID
  362. std::string host = "10.0.2.2";
  363. #else
  364. std::string host = "127.0.0.1";
  365. #endif
  366. try
  367. {
  368. _mongo = new Poco::MongoDB::Connection(host, 27017);
  369. std::cout << "Connected to [" << host << ":27017]" << std::endl;
  370. }
  371. catch (Poco::Net::ConnectionRefusedException& e)
  372. {
  373. std::cout << "Couldn't connect to " << e.message() << ". " << std::endl;
  374. return 0;
  375. }
  376. CppUnit::TestSuite* pSuite = new CppUnit::TestSuite("MongoDBTest");
  377. CppUnit_addTest(pSuite, MongoDBTest, testBuildInfo);
  378. CppUnit_addTest(pSuite, MongoDBTest, testInsertRequest);
  379. CppUnit_addTest(pSuite, MongoDBTest, testQueryRequest);
  380. CppUnit_addTest(pSuite, MongoDBTest, testDBQueryRequest);
  381. CppUnit_addTest(pSuite, MongoDBTest, testCountCommand);
  382. CppUnit_addTest(pSuite, MongoDBTest, testDBCountCommand);
  383. CppUnit_addTest(pSuite, MongoDBTest, testDBCount2Command);
  384. CppUnit_addTest(pSuite, MongoDBTest, testConnectionPool);
  385. CppUnit_addTest(pSuite, MongoDBTest, testDeleteRequest);
  386. CppUnit_addTest(pSuite, MongoDBTest, testCursorRequest);
  387. CppUnit_addTest(pSuite, MongoDBTest, testObjectID);
  388. CppUnit_addTest(pSuite, MongoDBTest, testCommand);
  389. CppUnit_addTest(pSuite, MongoDBTest, testUUID);
  390. CppUnit_addTest(pSuite, MongoDBTest, testConnectURI);
  391. return pSuite;
  392. }