/test/protobuf_test/main.cpp

https://gitlab.com/asimpletune/rethinkdb · C++ · 291 lines · 218 code · 50 blank · 23 comment · 70 complexity · c5bf969e5962ddae9e8bb868f1400ba2 MD5 · raw file

  1. //
  2. // main.cpp
  3. // protobuf_test
  4. //
  5. // Created by Karl Kuehn on 5/21/14.
  6. // Copyright (c) 2014 RethinkDB. All rights reserved.
  7. //
  8. #include <stdlib.h>
  9. #include <getopt.h>
  10. #include <iostream>
  11. #include <vector>
  12. #include "rethink_db.hpp"
  13. #define DEFAULT_HOST "localhost"
  14. #define DEFAULT_PORT "28015"
  15. #define DEFAULT_DB_NAME "protobuf_test_db"
  16. #define TABLE_A_NAME "table_a"
  17. #define TABLE_A_KEY "data"
  18. #define RECORDS_TO_CREATE 10
  19. using namespace std;
  20. using namespace com::rethinkdb;
  21. using namespace com::rethinkdb::driver;
  22. int main(int argc, char * const argv[]) {
  23. // -- parse input for connection information
  24. // - defaults
  25. const char * host = DEFAULT_HOST;
  26. const char * port = DEFAULT_PORT;
  27. const char * db_name = DEFAULT_DB_NAME;
  28. const char * auth_key = "";
  29. // - ENV variables
  30. if (getenv("HOST") != NULL) {
  31. host = getenv("HOST");
  32. }
  33. if (getenv("PORT") != NULL) {
  34. port = getenv("PORT");
  35. }
  36. if (getenv("DB_NAME") != NULL) {
  37. db_name = getenv("DB_NAME");
  38. }
  39. // - command-line arguments
  40. static struct option long_options[] = {
  41. {"host", required_argument, 0, 'n' },
  42. {"port", required_argument, 0, 'p' },
  43. {"db", required_argument, 0, 'd' },
  44. {"authkey", required_argument, 0, 'k' },
  45. {0, 0, 0, 0 }
  46. };
  47. int option_index = 0;
  48. int optionChosen;
  49. while ((optionChosen = getopt_long(argc, argv, "n:p:d:k:", long_options, &option_index)) != -1) {
  50. switch(optionChosen) {
  51. case 'n':
  52. host = optarg;
  53. break;
  54. case 'p':
  55. port = optarg;
  56. break;
  57. case 'd':
  58. db_name = optarg;
  59. break;
  60. case 'k':
  61. auth_key = optarg;
  62. break;
  63. }
  64. }
  65. // - summarize
  66. string auth_key_message = auth_key;
  67. if (strlen(auth_key) == 0) {
  68. auth_key_message = "(none)";
  69. }
  70. std::cout << "Testing using" << endl << " server:\t" << host << ":" << port << endl << " db name:\t" << db_name << endl << " authkey:\t" << auth_key_message << endl;
  71. // -- open connection
  72. shared_ptr <connection> dbConnection(new connection(host, port, db_name, auth_key));
  73. if (dbConnection->connect() == false) {
  74. std::cerr << "Failed opening connection" << endl;
  75. return 1;
  76. }
  77. // -- run tests
  78. vector<shared_ptr<Response>> responseAtoms = vector<shared_ptr<Response>>();
  79. int passedTests = 0;
  80. int failedTests = 0;
  81. bool failedThisTest;
  82. // - list databases
  83. try {
  84. responseAtoms = dbConnection->r()->db_list()->run();
  85. failedThisTest = false;
  86. // remove the target database if it is there
  87. for_each(responseAtoms.begin(), responseAtoms.end(), [&] (shared_ptr<Response> responseAtom) {
  88. if (responseAtom->type() != Response_ResponseType_SUCCESS_ATOM) {
  89. std::cerr << "Failed listing databases, got a non-success response" << endl;
  90. } else {
  91. for(int i = 0; i < responseAtom->response_size(); i++) {
  92. for (int j = 0; j < responseAtom->response(i).r_array_size(); j++) {
  93. if (responseAtom->response(i).r_array(j).r_str() == db_name) {
  94. dbConnection->r()->db_drop(db_name)->run();
  95. std::cout << "Removed the " << db_name << " database" << endl;
  96. }
  97. }
  98. }
  99. }
  100. });
  101. if (failedThisTest == false) {
  102. passedTests++;
  103. std::cout << "Sucessfully listed databases" << endl;
  104. } else {
  105. failedTests++;
  106. }
  107. } catch (runtime_error& e) {
  108. failedTests++;
  109. std::cerr << "Failed listing databases: " << e.what() << endl;
  110. }
  111. // - create the database
  112. try {
  113. responseAtoms = dbConnection->r()->db_create(db_name)->run();
  114. if (responseAtoms.size() != 1) {
  115. failedTests++;
  116. std::cerr << "Failed creating database: looking for 1 response, got " << responseAtoms.size() << endl;
  117. } else if (responseAtoms.at(0)->type() != Response_ResponseType_SUCCESS_ATOM) {
  118. failedTests++;
  119. std::cerr << "Failed creating database: did not get a sucess message, got: " << responseAtoms.at(0)->Utf8DebugString() << endl;
  120. } else {
  121. passedTests++;
  122. std::cout << "Sucessfully created database: " << db_name << endl;
  123. }
  124. } catch (runtime_error& e) {
  125. failedTests++;
  126. std::cerr << "Failed creating database: " << e.what() << endl;
  127. }
  128. // - create table_a
  129. try {
  130. responseAtoms = dbConnection->r()->db(db_name)->table_create(TABLE_A_NAME)->run();
  131. if (responseAtoms.size() != 1) {
  132. failedTests++;
  133. std::cerr << "Failed creating table " << TABLE_A_NAME << ": looking for 1 response, got " << responseAtoms.size() << endl;
  134. } else if (responseAtoms.at(0)->type() != Response_ResponseType_SUCCESS_ATOM) {
  135. failedTests++;
  136. std::cerr << "Failed creating table " << TABLE_A_NAME << ": did not get a sucess message, got: " << responseAtoms.at(0)->Utf8DebugString() << endl;
  137. } else {
  138. passedTests++;
  139. std::cout << "Sucessfully created table: " << TABLE_A_NAME << endl;
  140. }
  141. } catch (runtime_error& e) {
  142. failedTests++;
  143. std::cerr << "Failed creating table " << TABLE_A_NAME << ": " << e.what() << endl;
  144. }
  145. // - fill in some data
  146. try {
  147. failedThisTest = false;
  148. for (int i = 1; i < RECORDS_TO_CREATE + 1; i++) {
  149. responseAtoms = dbConnection->r()->db(db_name)->table(TABLE_A_NAME)->insert(RQL_Object(TABLE_A_KEY, RQL_Number(i)))->run();
  150. if (responseAtoms.size() != 1) {
  151. failedThisTest = true;
  152. std::cerr << "Failed filling table " << TABLE_A_NAME << ": looking for 1 response, got " << responseAtoms.size() << endl;
  153. break;
  154. } else if (responseAtoms.at(0)->type() != Response_ResponseType_SUCCESS_ATOM) {
  155. failedThisTest = true;
  156. std::cerr << "Failed filling table " << TABLE_A_NAME << ": did not get a sucess message, got: " << responseAtoms.at(0)->Utf8DebugString() << endl;
  157. break;
  158. }
  159. }
  160. if (failedThisTest == false) {
  161. passedTests++;
  162. std::cout << "Sucessfully filled table " << TABLE_A_NAME << endl;
  163. } else {
  164. failedTests++;
  165. }
  166. } catch (runtime_error& e) {
  167. failedTests++;
  168. std::cerr << "Failed filling table " << TABLE_A_NAME << ": " << e.what() << endl;
  169. }
  170. // - verify the data
  171. failedThisTest = false;
  172. for (int i = 1; i < RECORDS_TO_CREATE + 1; i++) {
  173. try {
  174. responseAtoms = dbConnection->r()->db(db_name)->table(TABLE_A_NAME)->filter(RQL_Object(TABLE_A_KEY, RQL_Number(i)))->run();
  175. for_each(responseAtoms.begin(), responseAtoms.end(), [&] (shared_ptr<Response> responseAtom) {
  176. if (responseAtom->type() != Response_ResponseType_SUCCESS_SEQUENCE) {
  177. failedThisTest = true;
  178. std::cerr << "Failed getting record " << TABLE_A_KEY << endl;
  179. } else {
  180. if (responseAtom->response_size() != 1) {
  181. failedThisTest = true;
  182. std::cerr << "Failed getting record " << TABLE_A_KEY << ", the response size was not 1 (" << responseAtom->response_size() << ")" << endl;
  183. } else if (responseAtom->response(0).r_object_size() != 2) {
  184. failedThisTest = true;
  185. std::cerr << "Failed getting record " << TABLE_A_KEY << ", the response object size was not 2 (" << responseAtom->response(0).r_object_size() << ")" << endl;
  186. } else {
  187. for (int j = 0; j < responseAtom->response(0).r_object_size(); j++) {
  188. if (responseAtom->response(0).r_object(j).key() == TABLE_A_KEY && responseAtom->response(0).r_object(j).val().r_num() != i) {
  189. failedThisTest = true;
  190. std::cerr << "Failed getting record " << TABLE_A_KEY << ", the response was not " << i << " (" << responseAtom->response(0).r_object(j).val().r_num() << ")" << endl;
  191. }
  192. }
  193. }
  194. }
  195. });
  196. } catch (runtime_error& e) {
  197. failedThisTest = true;
  198. std::cerr << "Failed getting record " << TABLE_A_KEY << ": " << e.what() << endl;
  199. break;
  200. }
  201. }
  202. if (failedThisTest == false) {
  203. passedTests++;
  204. std::cout << "Sucessfully got all records from " << TABLE_A_NAME << endl;
  205. } else {
  206. failedTests++;
  207. }
  208. // - delete the database
  209. try {
  210. responseAtoms = dbConnection->r()->db_drop(db_name)->run();
  211. if (responseAtoms.size() != 1) {
  212. failedTests++;
  213. std::cerr << "Failed dropping database: looking for 1 response, got " << responseAtoms.size() << endl;
  214. } else if (responseAtoms.at(0)->type() != Response_ResponseType_SUCCESS_ATOM) {
  215. failedTests++;
  216. std::cerr << "Failed dropping database: did not get a sucess message, got: " << responseAtoms.at(0)->Utf8DebugString() << endl;
  217. } else {
  218. passedTests++;
  219. std::cout << "Sucessfully dropped database: " << db_name << endl;
  220. }
  221. } catch (runtime_error& e) {
  222. failedTests++;
  223. std::cerr << "Failed dropping database " << db_name << ": " << e.what() << endl;
  224. }
  225. // - handle an error
  226. try {
  227. responseAtoms = dbConnection->r()->db_drop(db_name)->run();
  228. failedTests++;
  229. std::cerr << "Failed while expecting an error dropping a dead database" << endl;
  230. } catch (runtime_error& e) {
  231. passedTests++;
  232. std::cerr << "Sucessfully got an error when expected" << endl;
  233. }
  234. // -- return
  235. if (failedTests != 0) {
  236. std::cerr << "Test failed " << failedTests << " out of " << failedTests + passedTests << " subtests" << endl;
  237. return 1;
  238. }
  239. std::cout << "Passed all " << passedTests << " subtests" << endl;
  240. return 0;
  241. }