rhoconnect 3.0.0.beta1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (361) hide show
  1. data/CHANGELOG +208 -0
  2. data/CREDITS +38 -0
  3. data/Gemfile +18 -0
  4. data/Gemfile.lock +97 -0
  5. data/LICENSE +75 -0
  6. data/README.md +10 -0
  7. data/Rakefile +82 -0
  8. data/bench/bench +7 -0
  9. data/bench/bench_runner.rb +112 -0
  10. data/bench/benchapp/Gemfile +21 -0
  11. data/bench/benchapp/Gemfile.lock +76 -0
  12. data/bench/benchapp/Rakefile +22 -0
  13. data/bench/benchapp/application.rb +39 -0
  14. data/bench/benchapp/config.ru +36 -0
  15. data/bench/benchapp/settings/license.key +1 -0
  16. data/bench/benchapp/settings/settings.yml +20 -0
  17. data/bench/benchapp/sources/mock_adapter.rb +55 -0
  18. data/bench/benchapp/sources/queue_mock_adapter.rb +2 -0
  19. data/bench/benchapp/spec/sources/mock_adapter_spec.rb +25 -0
  20. data/bench/benchapp/spec/sources/queue_mock_adapter_spec.rb +25 -0
  21. data/bench/benchapp/spec/spec_helper.rb +42 -0
  22. data/bench/blobapp/Gemfile +31 -0
  23. data/bench/blobapp/Gemfile.lock +103 -0
  24. data/bench/blobapp/Rakefile +25 -0
  25. data/bench/blobapp/application.rb +44 -0
  26. data/bench/blobapp/config.ru +36 -0
  27. data/bench/blobapp/settings/license.key +1 -0
  28. data/bench/blobapp/settings/settings.yml +16 -0
  29. data/bench/blobapp/sources/blob_adapter.rb +71 -0
  30. data/bench/blobapp/spec/sources/blob_adapter_spec.rb +25 -0
  31. data/bench/blobapp/spec/spec_helper.rb +42 -0
  32. data/bench/lib/bench/cli.rb +16 -0
  33. data/bench/lib/bench/logging.rb +13 -0
  34. data/bench/lib/bench/mock_client.rb +41 -0
  35. data/bench/lib/bench/result.rb +50 -0
  36. data/bench/lib/bench/runner.rb +107 -0
  37. data/bench/lib/bench/session.rb +67 -0
  38. data/bench/lib/bench/statistics.rb +56 -0
  39. data/bench/lib/bench/test_data.rb +98 -0
  40. data/bench/lib/bench/timer.rb +10 -0
  41. data/bench/lib/bench/utils.rb +49 -0
  42. data/bench/lib/bench.rb +129 -0
  43. data/bench/lib/testdata/100-data.txt +148 -0
  44. data/bench/lib/testdata/5-data.txt +9 -0
  45. data/bench/lib/testdata/images/icon.ico +0 -0
  46. data/bench/lib/testdata/images/icon.png +0 -0
  47. data/bench/lib/testdata/images/loading-Landscape.png +0 -0
  48. data/bench/lib/testdata/images/loading-LandscapeLeft.png +0 -0
  49. data/bench/lib/testdata/images/loading-LandscapeRight.png +0 -0
  50. data/bench/lib/testdata/images/loading-Portrait.png +0 -0
  51. data/bench/lib/testdata/images/loading-PortraitUpsideDown.png +0 -0
  52. data/bench/lib/testdata/images/loading.png +0 -0
  53. data/bench/lib/testdata/images/loading@2x.png +0 -0
  54. data/bench/run_bench.sh +42 -0
  55. data/bench/run_blob_script.sh +3 -0
  56. data/bench/run_cud_script.sh +3 -0
  57. data/bench/run_query_md_script.sh +3 -0
  58. data/bench/run_query_only_script.sh +3 -0
  59. data/bench/run_query_script.sh +3 -0
  60. data/bench/scripts/blob_cud_script.rb +98 -0
  61. data/bench/scripts/cud_script.rb +92 -0
  62. data/bench/scripts/helpers.rb +101 -0
  63. data/bench/scripts/query_md_script.rb +45 -0
  64. data/bench/scripts/query_only_script.rb +51 -0
  65. data/bench/scripts/query_script.rb +45 -0
  66. data/bench/spec/bench_spec_helper.rb +33 -0
  67. data/bench/spec/logging_spec.rb +15 -0
  68. data/bench/spec/mock_adapter_spec.rb +61 -0
  69. data/bench/spec/mock_client_spec.rb +65 -0
  70. data/bench/spec/result_spec.rb +61 -0
  71. data/bench/spec/utils_spec.rb +36 -0
  72. data/bin/rhoconnect +34 -0
  73. data/bin/rhoconnect-setup +84 -0
  74. data/doc/async-jobs.txt +69 -0
  75. data/doc/authentication.txt +76 -0
  76. data/doc/benchmarks.txt +168 -0
  77. data/doc/blob-sync.txt +130 -0
  78. data/doc/bulk-sync.txt +102 -0
  79. data/doc/client.txt +432 -0
  80. data/doc/command-line.txt +210 -0
  81. data/doc/contributing.txt +60 -0
  82. data/doc/deploying.txt +82 -0
  83. data/doc/install.txt +28 -0
  84. data/doc/introduction.txt +20 -0
  85. data/doc/licensing.txt +18 -0
  86. data/doc/metadata.txt +458 -0
  87. data/doc/migration.txt +182 -0
  88. data/doc/public/css/print.css +29 -0
  89. data/doc/public/css/screen.css +257 -0
  90. data/doc/public/css/style.css +20 -0
  91. data/doc/push.txt +135 -0
  92. data/doc/release.txt +41 -0
  93. data/doc/rest-api.txt +367 -0
  94. data/doc/source-adapters.txt +325 -0
  95. data/doc/stats-middleware.txt +69 -0
  96. data/doc/testing.txt +222 -0
  97. data/doc/tutorial.txt +315 -0
  98. data/doc/web-console.txt +35 -0
  99. data/examples/simple/Rakefile +14 -0
  100. data/examples/simple/application.rb +27 -0
  101. data/examples/simple/config.ru +49 -0
  102. data/examples/simple/settings/license.key +1 -0
  103. data/examples/simple/settings/settings.yml +23 -0
  104. data/examples/simple/sources/sample_adapter.rb +5 -0
  105. data/examples/simple/sources/simple_adapter.rb +5 -0
  106. data/generators/rhoconnect.rb +119 -0
  107. data/generators/templates/application/Gemfile +21 -0
  108. data/generators/templates/application/Rakefile +22 -0
  109. data/generators/templates/application/application.rb +39 -0
  110. data/generators/templates/application/config.ru +36 -0
  111. data/generators/templates/application/settings/license.key +1 -0
  112. data/generators/templates/application/settings/settings.yml +14 -0
  113. data/generators/templates/application/spec/spec_helper.rb +42 -0
  114. data/generators/templates/source/source_adapter.rb +47 -0
  115. data/generators/templates/source/source_spec.rb +25 -0
  116. data/install.sh +408 -0
  117. data/installer/unix-like/rho_connect_install_checkers.rb +140 -0
  118. data/installer/unix-like/rho_connect_install_constants.rb +51 -0
  119. data/installer/unix-like/rho_connect_install_debian.rb +63 -0
  120. data/installer/unix-like/rho_connect_install_dnd.rb +58 -0
  121. data/installer/unix-like/rho_connect_install_get_params.rb +30 -0
  122. data/installer/unix-like/rho_connect_install_installers.rb +142 -0
  123. data/installer/unix-like/rho_connect_install_utilities.rb +85 -0
  124. data/installer/unix-like/rho_connect_install_yum.rb +63 -0
  125. data/installer/unix-like/rhoinstaller.rb +89 -0
  126. data/installer/utils/create_texts.rb +366 -0
  127. data/installer/utils/install_test.rb +140 -0
  128. data/installer/windows/EnvVarUpdate.nsh +328 -0
  129. data/installer/windows/ServiceLib.nsh +369 -0
  130. data/installer/windows/configUi.ini +44 -0
  131. data/installer/windows/icon.ico +0 -0
  132. data/installer/windows/rhosync.nsi +418 -0
  133. data/installer/windows/uninstall.bat +7 -0
  134. data/lib/rhoconnect/api/admin/get_api_token.rb +14 -0
  135. data/lib/rhoconnect/api/admin/get_license_info.rb +8 -0
  136. data/lib/rhoconnect/api/admin/login.rb +6 -0
  137. data/lib/rhoconnect/api/admin/reset.rb +10 -0
  138. data/lib/rhoconnect/api/admin/stats.rb +21 -0
  139. data/lib/rhoconnect/api/application/bulk_data.rb +7 -0
  140. data/lib/rhoconnect/api/application/clientcreate.rb +8 -0
  141. data/lib/rhoconnect/api/application/clientlogin.rb +6 -0
  142. data/lib/rhoconnect/api/application/clientregister.rb +6 -0
  143. data/lib/rhoconnect/api/application/clientreset.rb +6 -0
  144. data/lib/rhoconnect/api/application/query.rb +7 -0
  145. data/lib/rhoconnect/api/application/queue_updates.rb +6 -0
  146. data/lib/rhoconnect/api/application/search.rb +6 -0
  147. data/lib/rhoconnect/api/client/create_client.rb +3 -0
  148. data/lib/rhoconnect/api/client/delete_client.rb +5 -0
  149. data/lib/rhoconnect/api/client/get_client_params.rb +3 -0
  150. data/lib/rhoconnect/api/client/list_client_docs.rb +12 -0
  151. data/lib/rhoconnect/api/client/list_clients.rb +3 -0
  152. data/lib/rhoconnect/api/client/ping.rb +7 -0
  153. data/lib/rhoconnect/api/source/get_adapter.rb +3 -0
  154. data/lib/rhoconnect/api/source/get_db_doc.rb +7 -0
  155. data/lib/rhoconnect/api/source/get_source_params.rb +3 -0
  156. data/lib/rhoconnect/api/source/list_source_docs.rb +10 -0
  157. data/lib/rhoconnect/api/source/list_sources.rb +15 -0
  158. data/lib/rhoconnect/api/source/push_deletes.rb +8 -0
  159. data/lib/rhoconnect/api/source/push_objects.rb +8 -0
  160. data/lib/rhoconnect/api/source/save_adapter.rb +3 -0
  161. data/lib/rhoconnect/api/source/set_db_doc.rb +8 -0
  162. data/lib/rhoconnect/api/source/set_refresh_time.rb +8 -0
  163. data/lib/rhoconnect/api/source/upload_file.rb +4 -0
  164. data/lib/rhoconnect/api/user/create_user.rb +7 -0
  165. data/lib/rhoconnect/api/user/delete_user.rb +9 -0
  166. data/lib/rhoconnect/api/user/list_users.rb +3 -0
  167. data/lib/rhoconnect/api/user/update_user.rb +4 -0
  168. data/lib/rhoconnect/api_token.rb +19 -0
  169. data/lib/rhoconnect/app.rb +76 -0
  170. data/lib/rhoconnect/bulk_data/bulk_data.rb +88 -0
  171. data/lib/rhoconnect/bulk_data/syncdb.index.schema +4 -0
  172. data/lib/rhoconnect/bulk_data/syncdb.schema +41 -0
  173. data/lib/rhoconnect/bulk_data.rb +2 -0
  174. data/lib/rhoconnect/client.rb +96 -0
  175. data/lib/rhoconnect/client_sync.rb +412 -0
  176. data/lib/rhoconnect/console/app/helpers/auth_helper.rb +22 -0
  177. data/lib/rhoconnect/console/app/helpers/extensions.rb +19 -0
  178. data/lib/rhoconnect/console/app/helpers/helpers.rb +57 -0
  179. data/lib/rhoconnect/console/app/public/ThickBox.css +649 -0
  180. data/lib/rhoconnect/console/app/public/home.css +438 -0
  181. data/lib/rhoconnect/console/app/public/images/foot_logo_rhoconnect.png +0 -0
  182. data/lib/rhoconnect/console/app/public/images/header_halo.jpg +0 -0
  183. data/lib/rhoconnect/console/app/public/images/land_separator.gif +0 -0
  184. data/lib/rhoconnect/console/app/public/images/landing_header.jpg +0 -0
  185. data/lib/rhoconnect/console/app/public/images/logo_rhoconnect.png +0 -0
  186. data/lib/rhoconnect/console/app/public/images/rhomobile_rhohub_logo.png +0 -0
  187. data/lib/rhoconnect/console/app/public/images/tabs_separator.png +0 -0
  188. data/lib/rhoconnect/console/app/public/jqplot/excanvas.min.js +35 -0
  189. data/lib/rhoconnect/console/app/public/jqplot/jqplot.barRenderer.min.js +34 -0
  190. data/lib/rhoconnect/console/app/public/jqplot/jqplot.canvasAxisLabelRenderer.js +187 -0
  191. data/lib/rhoconnect/console/app/public/jqplot/jqplot.canvasAxisTickRenderer.js +226 -0
  192. data/lib/rhoconnect/console/app/public/jqplot/jqplot.canvasTextRenderer.js +408 -0
  193. data/lib/rhoconnect/console/app/public/jqplot/jqplot.categoryAxisRenderer.min.js +34 -0
  194. data/lib/rhoconnect/console/app/public/jqplot/jqplot.cursor.js +952 -0
  195. data/lib/rhoconnect/console/app/public/jqplot/jqplot.dateAxisRenderer.js +313 -0
  196. data/lib/rhoconnect/console/app/public/jqplot/jqplot.dateAxisRenderer.min.js +34 -0
  197. data/lib/rhoconnect/console/app/public/jqplot/jqplot.pointLabels.min.js +34 -0
  198. data/lib/rhoconnect/console/app/public/jqplot/jquery-1.4.2.min.js +154 -0
  199. data/lib/rhoconnect/console/app/public/jqplot/jquery.jqplot.min.css +1 -0
  200. data/lib/rhoconnect/console/app/public/jqplot/jquery.jqplot.min.js +34 -0
  201. data/lib/rhoconnect/console/app/public/main.css +7 -0
  202. data/lib/rhoconnect/console/app/public/reset.css +76 -0
  203. data/lib/rhoconnect/console/app/public/style.css +2201 -0
  204. data/lib/rhoconnect/console/app/public/text.txt +0 -0
  205. data/lib/rhoconnect/console/app/routes/adapter.rb +28 -0
  206. data/lib/rhoconnect/console/app/routes/auth.rb +29 -0
  207. data/lib/rhoconnect/console/app/routes/client.rb +31 -0
  208. data/lib/rhoconnect/console/app/routes/docs.rb +145 -0
  209. data/lib/rhoconnect/console/app/routes/heroku.rb +19 -0
  210. data/lib/rhoconnect/console/app/routes/home.rb +63 -0
  211. data/lib/rhoconnect/console/app/routes/timing.rb +242 -0
  212. data/lib/rhoconnect/console/app/routes/user.rb +117 -0
  213. data/lib/rhoconnect/console/app/views/adapter.erb +16 -0
  214. data/lib/rhoconnect/console/app/views/client.erb +30 -0
  215. data/lib/rhoconnect/console/app/views/content.erb +14 -0
  216. data/lib/rhoconnect/console/app/views/doc.erb +8 -0
  217. data/lib/rhoconnect/console/app/views/docdata.erb +28 -0
  218. data/lib/rhoconnect/console/app/views/docs.erb +30 -0
  219. data/lib/rhoconnect/console/app/views/edituser.erb +13 -0
  220. data/lib/rhoconnect/console/app/views/headermenu.erb +40 -0
  221. data/lib/rhoconnect/console/app/views/home.erb +24 -0
  222. data/lib/rhoconnect/console/app/views/index.erb +58 -0
  223. data/lib/rhoconnect/console/app/views/jqplot.erb +52 -0
  224. data/lib/rhoconnect/console/app/views/layout.erb +165 -0
  225. data/lib/rhoconnect/console/app/views/login.erb +26 -0
  226. data/lib/rhoconnect/console/app/views/newuser.erb +17 -0
  227. data/lib/rhoconnect/console/app/views/ping.erb +28 -0
  228. data/lib/rhoconnect/console/app/views/result.erb +11 -0
  229. data/lib/rhoconnect/console/app/views/rightboxlinks.erb +15 -0
  230. data/lib/rhoconnect/console/app/views/select_doc.erb +17 -0
  231. data/lib/rhoconnect/console/app/views/upload_doc.erb +23 -0
  232. data/lib/rhoconnect/console/app/views/user.erb +29 -0
  233. data/lib/rhoconnect/console/app/views/users.erb +12 -0
  234. data/lib/rhoconnect/console/rhoconnect_api.rb +245 -0
  235. data/lib/rhoconnect/console/server.rb +32 -0
  236. data/lib/rhoconnect/console.rb +3 -0
  237. data/lib/rhoconnect/cors.rb +229 -0
  238. data/lib/rhoconnect/credential.rb +9 -0
  239. data/lib/rhoconnect/db_adapter.rb +46 -0
  240. data/lib/rhoconnect/document.rb +49 -0
  241. data/lib/rhoconnect/dynamic_adapter.rb +91 -0
  242. data/lib/rhoconnect/generator.rb +1 -0
  243. data/lib/rhoconnect/jobs/bulk_data_job.rb +203 -0
  244. data/lib/rhoconnect/jobs/ping_job.rb +46 -0
  245. data/lib/rhoconnect/jobs/source_job.rb +16 -0
  246. data/lib/rhoconnect/license.rb +86 -0
  247. data/lib/rhoconnect/lock_ops.rb +11 -0
  248. data/lib/rhoconnect/model.rb +414 -0
  249. data/lib/rhoconnect/ping/android.rb +56 -0
  250. data/lib/rhoconnect/ping/apple.rb +52 -0
  251. data/lib/rhoconnect/ping/blackberry.rb +56 -0
  252. data/lib/rhoconnect/ping.rb +3 -0
  253. data/lib/rhoconnect/read_state.rb +31 -0
  254. data/lib/rhoconnect/rho_indifferent_access.rb +88 -0
  255. data/lib/rhoconnect/server/views/index.erb +13 -0
  256. data/lib/rhoconnect/server.rb +286 -0
  257. data/lib/rhoconnect/source.rb +289 -0
  258. data/lib/rhoconnect/source_adapter.rb +123 -0
  259. data/lib/rhoconnect/source_sync.rb +302 -0
  260. data/lib/rhoconnect/stats/middleware.rb +20 -0
  261. data/lib/rhoconnect/stats/record.rb +108 -0
  262. data/lib/rhoconnect/store.rb +232 -0
  263. data/lib/rhoconnect/tasks.rb +350 -0
  264. data/lib/rhoconnect/test_methods.rb +220 -0
  265. data/lib/rhoconnect/user.rb +95 -0
  266. data/lib/rhoconnect/version.rb +3 -0
  267. data/lib/rhoconnect/x_domain_session_wrapper.rb +53 -0
  268. data/lib/rhoconnect.rb +285 -0
  269. data/rhoconnect.gemspec +67 -0
  270. data/spec/api/admin/api_token_spec.rb +14 -0
  271. data/spec/api/admin/get_api_token_spec.rb +36 -0
  272. data/spec/api/admin/get_license_info_spec.rb +38 -0
  273. data/spec/api/admin/reset_spec.rb +22 -0
  274. data/spec/api/admin/stats_spec.rb +66 -0
  275. data/spec/api/api_helper.rb +21 -0
  276. data/spec/api/application/rhoconnect_api_spec.rb +548 -0
  277. data/spec/api/client/create_client_spec.rb +13 -0
  278. data/spec/api/client/delete_client_spec.rb +13 -0
  279. data/spec/api/client/get_client_params_spec.rb +18 -0
  280. data/spec/api/client/list_client_docs_spec.rb +32 -0
  281. data/spec/api/client/list_clients_spec.rb +22 -0
  282. data/spec/api/client/ping_spec.rb +23 -0
  283. data/spec/api/rhosync_api_spec.rb.orig +606 -0
  284. data/spec/api/source/adapter_spec.rb +29 -0
  285. data/spec/api/source/get_db_doc_spec.rb +21 -0
  286. data/spec/api/source/get_source_params_spec.rb +32 -0
  287. data/spec/api/source/list_source_docs_spec.rb +25 -0
  288. data/spec/api/source/list_sources_spec.rb +26 -0
  289. data/spec/api/source/push_deletes_spec.rb +18 -0
  290. data/spec/api/source/push_objects_spec.rb +27 -0
  291. data/spec/api/source/set_db_doc_spec.rb +19 -0
  292. data/spec/api/source/set_refresh_time_spec.rb +43 -0
  293. data/spec/api/source/upload_file_spec.rb +26 -0
  294. data/spec/api/user/create_user_spec.rb +16 -0
  295. data/spec/api/user/delete_user_spec.rb +36 -0
  296. data/spec/api/user/list_users_spec.rb +30 -0
  297. data/spec/api/user/update_user_spec.rb +31 -0
  298. data/spec/api_token_spec.rb +14 -0
  299. data/spec/app_spec.rb +18 -0
  300. data/spec/apps/emptyapp/application.rb +27 -0
  301. data/spec/apps/emptyapp/settings/license.key +1 -0
  302. data/spec/apps/emptyapp/settings/settings.yml +14 -0
  303. data/spec/apps/rhotestapp/Rakefile +1 -0
  304. data/spec/apps/rhotestapp/application.rb +19 -0
  305. data/spec/apps/rhotestapp/config.ru +1 -0
  306. data/spec/apps/rhotestapp/settings/apple_fake_cert.pem +1 -0
  307. data/spec/apps/rhotestapp/settings/license.key +1 -0
  308. data/spec/apps/rhotestapp/settings/settings.yml +36 -0
  309. data/spec/apps/rhotestapp/sources/base_adapter.rb +9 -0
  310. data/spec/apps/rhotestapp/sources/fixed_schema_adapter.rb +28 -0
  311. data/spec/apps/rhotestapp/sources/sample_adapter.rb +71 -0
  312. data/spec/apps/rhotestapp/sources/simple_adapter.rb +41 -0
  313. data/spec/apps/rhotestapp/sources/sub_adapter.rb +7 -0
  314. data/spec/apps/rhotestapp/vendor/mygem-0.1.0/lib/mygem/mygem.rb +8 -0
  315. data/spec/apps/rhotestapp/vendor/mygem-0.1.0/lib/mygem.rb +1 -0
  316. data/spec/bulk_data/bulk_data_spec.rb +97 -0
  317. data/spec/client_spec.rb +124 -0
  318. data/spec/client_sync_spec.rb +774 -0
  319. data/spec/doc/base.html +72 -0
  320. data/spec/doc/doc_spec.rb +376 -0
  321. data/spec/doc/footer.html +4 -0
  322. data/spec/doc/header.html +30 -0
  323. data/spec/document_spec.rb +31 -0
  324. data/spec/dynamic_adapter_spec.rb +43 -0
  325. data/spec/factories/factories.rb +17 -0
  326. data/spec/generator/generator_spec.rb +58 -0
  327. data/spec/generator/generator_spec_helper.rb +9 -0
  328. data/spec/jobs/bulk_data_job_spec.rb +125 -0
  329. data/spec/jobs/ping_job_spec.rb +102 -0
  330. data/spec/jobs/source_job_spec.rb +29 -0
  331. data/spec/license_spec.rb +66 -0
  332. data/spec/model_spec.rb +273 -0
  333. data/spec/perf/bulk_data_perf_spec.rb +32 -0
  334. data/spec/perf/perf_spec_helper.rb +50 -0
  335. data/spec/perf/store_perf_spec.rb +27 -0
  336. data/spec/ping/android_spec.rb +91 -0
  337. data/spec/ping/apple_spec.rb +70 -0
  338. data/spec/ping/blackberry_spec.rb +62 -0
  339. data/spec/read_state_spec.rb +35 -0
  340. data/spec/rhosync_spec.rb +75 -0
  341. data/spec/server/cors_spec.rb +287 -0
  342. data/spec/server/server_spec.rb +470 -0
  343. data/spec/server/x_domain_session_wrapper_spec.rb +150 -0
  344. data/spec/source_adapter_spec.rb +125 -0
  345. data/spec/source_spec.rb +114 -0
  346. data/spec/source_sync_spec.rb +328 -0
  347. data/spec/spec.opts +4 -0
  348. data/spec/spec_helper.rb +231 -0
  349. data/spec/stats/middleware_spec.rb +53 -0
  350. data/spec/stats/record_spec.rb +92 -0
  351. data/spec/store_spec.rb +251 -0
  352. data/spec/support/shared_examples.rb +168 -0
  353. data/spec/sync_states_spec.rb +72 -0
  354. data/spec/test_methods_spec.rb +134 -0
  355. data/spec/testdata/1000-data.txt +1414 -0
  356. data/spec/testdata/compressed/compress-data.txt +1 -0
  357. data/spec/testdata/upload1.txt +1 -0
  358. data/spec/testdata/upload2.txt +1 -0
  359. data/spec/user_spec.rb +139 -0
  360. data/tasks/redis.rake +206 -0
  361. metadata +706 -0
@@ -0,0 +1,53 @@
1
+ require "cgi"
2
+
3
+ class XDomainSessionWrapper
4
+ def initialize(app, opts={})
5
+ @app = app
6
+ @session_cookie = opts[:session_cookie] || 'rhoconnect_session'
7
+ @api_uri_regexp = opts[:api_uri_regexp] || /\A\/api\/application/
8
+ @login_uri_regexp = opts[:login_uri_regexp] || /\A\/api\/application\/clientlogin/
9
+ yield self if block_given?
10
+ end
11
+
12
+ def is_sync_protocol(env)
13
+ # if it is rhoconnect protocol URI
14
+ @api_uri_regexp.match(env['PATH_INFO'])
15
+ end
16
+
17
+ def call(env)
18
+ if is_sync_protocol(env)
19
+ env['HTTP_COOKIE'] = env['HTTP_COOKIE'] || CGI.unescape(get_session_from_url(env))
20
+ end
21
+
22
+ status, headers, body = @app.call(env)
23
+
24
+ if is_sync_protocol(env)
25
+ cookies = headers['Set-Cookie'].to_s
26
+ #puts "<----- Cookies: #{cookies}"
27
+ # put cookies to body as JSON on login success
28
+ if @login_uri_regexp.match(env['PATH_INFO']) && status == 200
29
+ body = session_json_from(cookies)
30
+ headers['Content-Length'] = body.length.to_s
31
+ end
32
+ end
33
+
34
+ # The Body itself should not be an instance of String,as this will break in Ruby 1.9
35
+ body = ["#{body}"] if body.is_a?(String)
36
+ [status, headers, body]
37
+ end
38
+
39
+ def session_json_from(cookies)
40
+ rexp = Regexp.new(@session_cookie +'=[^\s]*')
41
+ sc = cookies.to_s.slice rexp
42
+ "{\"" +@session_cookie +"\": \"#{CGI.escape sc.to_s}\"}"
43
+ end
44
+
45
+ def get_session_from_url(env)
46
+ rexp = Regexp.new(@session_cookie +'=.*\Z')
47
+ qs = env['QUERY_STRING'].to_s.slice rexp
48
+ qs = qs.to_s.split(/&/)[0]
49
+ nv = qs.to_s.split(/=/)
50
+ return nv[1] if nv.length > 1
51
+ ''
52
+ end
53
+ end
data/lib/rhoconnect.rb ADDED
@@ -0,0 +1,285 @@
1
+ require 'redis'
2
+ require 'cgi'
3
+ require 'json'
4
+ require 'base64'
5
+ require 'zip/zip'
6
+ require 'yaml'
7
+ require 'rhoconnect/license'
8
+ require 'rhoconnect/version'
9
+ require 'rhoconnect/document'
10
+ require 'rhoconnect/lock_ops'
11
+ require 'rhoconnect/model'
12
+ require 'rhoconnect/source'
13
+ require 'rhoconnect/store'
14
+ require 'rhoconnect/stats/record'
15
+ require 'rhoconnect/stats/middleware'
16
+ require 'rhoconnect/user'
17
+ require 'rhoconnect/api_token'
18
+ require 'rhoconnect/app'
19
+ require 'rhoconnect/client'
20
+ require 'rhoconnect/read_state'
21
+ require 'rhoconnect/client_sync'
22
+ require 'rhoconnect/source_adapter'
23
+ require 'rhoconnect/source_sync'
24
+ require 'rhoconnect/rho_indifferent_access'
25
+ require 'rhoconnect/jobs/source_job'
26
+ require 'rhoconnect/jobs/ping_job'
27
+ require 'rhoconnect/bulk_data'
28
+ require 'rhoconnect/db_adapter'
29
+ require 'rhoconnect/dynamic_adapter'
30
+
31
+ REDIS_URL = 'REDIS' unless defined? REDIS_URL
32
+
33
+ # Various module utilities for the store
34
+ module Rhoconnect
35
+ APP_NAME = 'application' unless defined? APP_NAME
36
+
37
+ class InvalidArgumentError < RuntimeError; end
38
+ class RhoconnectServerError < RuntimeError; end
39
+
40
+ # Used by application authenticate to indicate login failure
41
+ class LoginException < RuntimeError; end
42
+
43
+ extend self
44
+
45
+ class << self
46
+ attr_accessor :base_directory, :app_directory, :data_directory,
47
+ :vendor_directory, :blackberry_bulk_sync, :redis, :environment,
48
+ :log_disabled, :license, :bulk_sync_poll_interval, :stats, :appserver, :api_token,
49
+ :raise_on_expired_lock, :lock_duration, :cookie_expire
50
+ end
51
+
52
+ ### Begin Rhoconnect setup methods
53
+ # Server hook to initialize Rhoconnect
54
+ def bootstrap(basedir)
55
+ config = get_config(basedir)
56
+ #Load environment
57
+ environment = (ENV['RHO_ENV'] || ENV['RACK_ENV'] || :development).to_sym
58
+ # Initialize Rhoconnect and Resque
59
+ Rhoconnect.base_directory = basedir
60
+ Rhoconnect.app_directory = get_setting(config,environment,:app_directory)
61
+ Rhoconnect.data_directory = get_setting(config,environment,:data_directory)
62
+ Rhoconnect.vendor_directory = get_setting(config,environment,:vendor_directory)
63
+ Rhoconnect.blackberry_bulk_sync = get_setting(config,environment,:blackberry_bulk_sync,false)
64
+ Rhoconnect.bulk_sync_poll_interval = get_setting(config,environment,:bulk_sync_poll_interval,3600)
65
+ Rhoconnect.redis = get_setting(config,environment,:redis,false)
66
+ Rhoconnect.appserver = get_setting(config,environment,:appserver,false)
67
+ Rhoconnect.api_token = ENV['API_TOKEN'] || get_setting(config,environment,:api_token,false)
68
+ Rhoconnect.log_disabled = get_setting(config,environment,:log_disabled,false)
69
+ Rhoconnect.raise_on_expired_lock = get_setting(config,environment,:raise_on_expired_lock,false)
70
+ Rhoconnect.lock_duration = get_setting(config,environment,:lock_duration)
71
+ Rhoconnect.environment = environment
72
+ Rhoconnect.cookie_expire = get_setting(config,environment,:cookie_expire) || 31536000
73
+ yield self if block_given?
74
+ Store.create(Rhoconnect.redis)
75
+ Resque.redis = Store.db
76
+ Rhoconnect.base_directory ||= File.join(File.dirname(__FILE__),'..')
77
+ Rhoconnect.app_directory ||= Rhoconnect.base_directory
78
+ Rhoconnect.data_directory ||= File.join(Rhoconnect.base_directory,'data')
79
+ Rhoconnect.vendor_directory ||= File.join(Rhoconnect.base_directory,'vendor')
80
+ Rhoconnect.stats ||= false
81
+ Rhoconnect.license = License.new
82
+
83
+ check_and_add(File.join(Rhoconnect.app_directory,'sources'))
84
+ start_app(config)
85
+ create_admin_user
86
+ check_hsql_lib! if Rhoconnect.blackberry_bulk_sync
87
+ end
88
+
89
+ def start_app(config)
90
+ if config and config[Rhoconnect.environment]
91
+ app = nil
92
+ app_name = APP_NAME
93
+ if App.is_exist?(app_name)
94
+ app = App.load(app_name)
95
+ else
96
+ app = App.create(:name => app_name)
97
+ end
98
+ sources = config[:sources] || []
99
+ Source.delete_all
100
+ app.delete_sources
101
+ sources.each do |source_name,fields|
102
+ check_for_schema_field!(fields)
103
+ fields[:name] = source_name
104
+ Source.create(fields,{:app_id => app.name})
105
+ app.sources << source_name
106
+ # load ruby file for source adapter to re-load class
107
+ load under_score(source_name+'.rb')
108
+ end
109
+ # Create associations for all sources
110
+ Source.update_associations(app.sources)
111
+ end
112
+ end
113
+
114
+ # Generate admin user on first load
115
+ def create_admin_user
116
+ unless User.is_exist?('rhoadmin')
117
+ admin = User.create({:login => 'rhoadmin', :admin => 1})
118
+ admin.password = ENV['PSWRD'] || ''
119
+ admin.create_token
120
+ end
121
+ end
122
+
123
+ # Add path to load_path unless it has been added already
124
+ def check_and_add(path)
125
+ $:.unshift path unless $:.include?(path)
126
+ end
127
+
128
+ def get_config(basedir)
129
+ # Load settings
130
+ settings_file = File.join(basedir,'settings','settings.yml') if basedir
131
+ YAML.load_file(settings_file) if settings_file and File.exist?(settings_file)
132
+ end
133
+
134
+ def source_config
135
+ { "sources" => Rhoconnect.get_config(Rhoconnect.base_directory)[:sources] }
136
+ end
137
+ ### End Rhoconnect setup methods
138
+
139
+
140
+ def check_default_secret!(secret)
141
+ if secret == '<changeme>'
142
+ log "*"*60+"\n\n"
143
+ log "WARNING: Change the session secret in config.ru from <changeme> to something secure."
144
+ log " i.e. running `rake secret` in a rails app will generate a secret you could use.\n\n"
145
+ log "*"*60
146
+ end
147
+ end
148
+
149
+ def check_for_schema_field!(fields)
150
+ if fields['schema']
151
+ log "ERROR: 'schema' field in settings.yml is not supported anymore, please use source adapter schema method!"
152
+ exit(1)
153
+ end
154
+ end
155
+
156
+ # Serializes oav to set element
157
+ def setelement(obj,attrib,value)
158
+ #"#{obj}:#{attrib}:#{Base64.encode64(value.to_s)}"
159
+ "#{obj}:#{attrib}:#{value.to_s}"
160
+ end
161
+
162
+ # De-serializes oav from set element
163
+ def getelement(element)
164
+ res = element.split(':',3)
165
+ #[res[0], res[1], Base64.decode64(res[2].to_s)]
166
+ [res[0], res[1], res[2]]
167
+ end
168
+
169
+ # Get random UUID string
170
+ def get_random_uuid
171
+ UUIDTools::UUID.random_create.to_s.gsub(/\-/,'')
172
+ end
173
+
174
+ # Generates new token (64-bit integer) based on # of
175
+ # microseconds since Jan 1 2009
176
+ def get_token
177
+ ((Time.now.to_f - Time.mktime(2009,"jan",1,0,0,0,0).to_f) * 10**6).to_i
178
+ end
179
+
180
+ # Computes token for a single client request
181
+ def compute_token(doc_key)
182
+ token = get_token
183
+ Store.put_value(doc_key,token)
184
+ token.to_s
185
+ end
186
+
187
+ # Returns require-friendly filename for a class
188
+ def under_score(camel_cased_word)
189
+ camel_cased_word.to_s.gsub(/::/, '/').
190
+ gsub(/([A-Z]+)([A-Z][a-z])/,'\1_\2').
191
+ gsub(/([a-z\d])([A-Z])/,'\1_\2').
192
+ tr("-", "_").
193
+ downcase
194
+ end
195
+
196
+ # Taken from rails inflector
197
+ def camelize(lower_case_and_underscored_word, first_letter_in_uppercase = true)
198
+ if first_letter_in_uppercase
199
+ lower_case_and_underscored_word.to_s.gsub(/\/(.?)/) { "::#{$1.upcase}" }.gsub(/(?:^|_)(.)/) { $1.upcase }
200
+ end
201
+ end
202
+
203
+ def check_hsql_lib!
204
+ unless File.exists?(File.join(Rhoconnect.vendor_directory,'hsqldata.jar'))
205
+ log "*"*60
206
+ log ""
207
+ log "WARNING: Missing vendor/hsqldata.jar, please install it for BlackBerry bulk sync support."
208
+ log ""
209
+ log "*"*60
210
+ end
211
+ end
212
+
213
+ def expire_bulk_data(username, partition = :user)
214
+ name = BulkData.get_name(partition,username)
215
+ data = BulkData.load(name)
216
+ data.refresh_time = Time.now.to_i if data
217
+ end
218
+
219
+ def unzip_file(file_dir,params)
220
+ uploaded_file = File.join(file_dir, params[:filename])
221
+ begin
222
+ File.open(uploaded_file, 'wb') do |file|
223
+ file.write(params[:tempfile].read)
224
+ end
225
+ Zip::ZipFile.open(uploaded_file) do |zip_file|
226
+ zip_file.each do |f|
227
+ f_path = File.join(file_dir,f.name)
228
+ FileUtils.mkdir_p(File.dirname(f_path))
229
+ zip_file.extract(f, f_path) { true }
230
+ end
231
+ end
232
+ rescue Exception => e
233
+ log "Failed to unzip `#{uploaded_file}`"
234
+ raise e
235
+ ensure
236
+ FileUtils.rm_f(uploaded_file)
237
+ end
238
+ end
239
+
240
+ def lap_timer(msg,start)
241
+ duration = timenow - start
242
+ log "#{msg}: #{duration}"
243
+ timenow
244
+ end
245
+
246
+ def start_timer(msg='starting')
247
+ log "#{msg}"
248
+ timenow
249
+ end
250
+
251
+ def timenow
252
+ (Time.now.to_f * 1000)
253
+ end
254
+
255
+ def log(*args)
256
+ now = Time.now.strftime('%I:%M:%S %p %Y-%m-%d')
257
+ puts "[#{now}] #{args.join}" unless Rhoconnect.log_disabled
258
+ end
259
+
260
+ # Base rhoconnect application class
261
+ class Base
262
+ # Add everything in vendor to load path
263
+ # TODO: Integrate with 3rd party dependency management
264
+ def self.initializer(path=nil)
265
+ Dir["vendor/*"].each do |dir|
266
+ $:.unshift File.join(dir,'lib')
267
+ end
268
+ require 'rhoconnect'
269
+ require 'rhoconnect/server'
270
+ # Bootstrap Rhoconnect system
271
+ Rhoconnect.bootstrap(path || ENV['PWD'])
272
+ end
273
+
274
+ def self.store_blob(obj,field_name,blob)
275
+ blob[:tempfile].path if blob[:tempfile]
276
+ end
277
+ end
278
+
279
+ protected
280
+ def get_setting(config,environment,setting,default=nil)
281
+ res = nil
282
+ res = config[environment][setting] if config and environment
283
+ res || default
284
+ end
285
+ end
@@ -0,0 +1,67 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path("../lib", __FILE__)
3
+ require "rhoconnect/version"
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = "rhoconnect"
7
+ s.version = Rhoconnect::VERSION
8
+ s.platform = Gem::Platform::RUBY
9
+ s.authors = ["Rhomobile"]
10
+ s.date = Time.now.strftime('%Y-%m-%d')
11
+ s.email = %q{dev@rhomobile.com}
12
+ s.homepage = %q{http://rhomobile.com/products/rhoconnect}
13
+ s.summary = %q{RhoConnect Server Framework}
14
+ s.description = %q{RhoConnect Server Framework and related command-line utilities}
15
+
16
+ s.rubyforge_project = nil
17
+
18
+ # s.files = `git ls-files`.split("\n")
19
+ # s.test_files = `git ls-files -- {examples,spec,features}/*`.split("\n")
20
+ # s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
21
+ s.files = %w(
22
+ CHANGELOG CREDITS Gemfile Gemfile.lock install.sh README.md Rakefile LICENSE Rakefile rhoconnect.gemspec
23
+ )
24
+ s.files += Dir.glob("bench/**/*")
25
+ s.files += Dir.glob("doc/**/*")
26
+ s.files += Dir.glob("examples/**/*")
27
+ s.files += Dir.glob("generators/**/*")
28
+ s.files += Dir.glob("installer/**/*")
29
+ s.files += Dir.glob("lib/**/*")
30
+ s.files += Dir.glob("tasks/**/*")
31
+ s.test_files = Dir.glob("spec/**/*")
32
+ s.executables = Dir.glob("bin/*").map{ |f| File.basename(f) }
33
+ s.require_paths = ["lib"]
34
+
35
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
36
+ s.rubygems_version = %q{1.5.0}
37
+ s.extra_rdoc_files = [
38
+ "LICENSE",
39
+ "README.md"
40
+ ]
41
+
42
+ s.add_dependency('bundler', '~> 1.0')
43
+ s.add_dependency("sinatra", '~> 1.2')
44
+ s.add_dependency('rake', '0.9.2')
45
+ s.add_dependency('json', '~> 1.5.0')
46
+ s.add_dependency('rubyzip', '~> 0.9.4')
47
+ s.add_dependency('uuidtools', '>= 2.1.1')
48
+ s.add_dependency('redis', '>= 2.2.0')
49
+ s.add_dependency('resque', '~> 1.17.0')
50
+ s.add_dependency('rest-client', '~> 1.6.1')
51
+ s.add_dependency('templater', '~> 1.0.0')
52
+
53
+ # Platform specific gems
54
+ if defined?(JRUBY_VERSION)
55
+ s.add_dependency('jdbc-sqlite3', ">= 3.7.2")
56
+ s.add_dependency('dbi', ">= 0.4.5")
57
+ s.add_dependency('dbd-jdbc', ">= 0.1.4")
58
+ s.add_dependency('jruby-openssl', ">= 0.7.4")
59
+ else
60
+ s.add_dependency('sqlite3', ">= 1.3.3")
61
+ # Helps with some of the limitations of green threads, not needed in ruby 1.9.x
62
+ if RUBY_VERSION =~ /1.8/
63
+ s.add_dependency('SystemTimer', '~> 1.2.3')
64
+ end
65
+ end
66
+
67
+ end
@@ -0,0 +1,14 @@
1
+ require File.join(File.dirname(__FILE__),'..','..','spec_helper')
2
+ require File.join(File.dirname(__FILE__), '..','..','support', 'shared_examples')
3
+
4
+ describe "ApiToken" do
5
+ it_behaves_like "SharedRhoconnectHelper", :rhoconnect_data => true do
6
+ it "should generate api token with user" do
7
+ token = ApiToken.create(:user_id => @u.id)
8
+ token.value.length.should == 32
9
+ token.user_id.should == @u.id
10
+ token.user.login.should == @u.login
11
+ token.delete
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,36 @@
1
+ require File.join(File.dirname(__FILE__),'..','api_helper')
2
+
3
+ describe "RhoconnectApiGetApiToken" do
4
+ it_should_behave_like "ApiHelper" do
5
+ it "should login and receive the token string" do
6
+ post "/api/admin/login", :login => 'rhoadmin',:password => ''
7
+ last_response.body.should == @api_token
8
+ end
9
+
10
+ it "should login using the old route and show deprecation warning" do
11
+ post "/login", :login => 'rhoadmin',:password => ''
12
+ last_response.body.should == @api_token
13
+ last_response.headers["Warning"].index('deprecated').should_not == nil
14
+ end
15
+
16
+ it "should get deprecation warning for get_api_token method" do
17
+ post "/api/admin/login", :login => 'rhoadmin',:password => ''
18
+ post "/api/admin/get_api_token"
19
+ last_response.body.should == @api_token
20
+ last_response.headers['Warning'].index('deprecated').should_not == nil
21
+ end
22
+
23
+ it "should fail to login and get token if user is not rhoadmin" do
24
+ Rhoconnect.appserver = nil
25
+ post "/api/admin/login", :login => @u_fields[:login],:password => 'testpass'
26
+ last_response.status.should == 422
27
+ last_response.body.should == 'Invalid/missing API user'
28
+ end
29
+
30
+ it "should return 422 if no token provided" do
31
+ params = {:attributes => {:login => 'testuser1', :password => 'testpass1'}}
32
+ post "/api/user/create_user", params
33
+ last_response.status.should == 422
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,38 @@
1
+ require File.join(File.dirname(__FILE__),'..','api_helper')
2
+
3
+ describe "RhoconnectApiGetLicenseInfo" do
4
+ it_should_behave_like "ApiHelper" do
5
+ it "should get license info" do
6
+ true.should == true
7
+ post "/api/admin/get_license_info", {:api_token => @api_token}
8
+ JSON.parse(last_response.body).should == {
9
+ "available" => 9,
10
+ "issued" => "Fri Apr 23 17:20:13 -0700 2010",
11
+ "seats" => 10,
12
+ "rhoconnect_version" => "Version 1",
13
+ "licensee" => "Rhomobile" }
14
+ end
15
+
16
+ it "should get custom_license info with deprecation warning" do
17
+ true.should == true
18
+
19
+ # this one for test purposes to make sure
20
+ # that an old way custom REST API still works
21
+ Rhoconnect::Server.api :custom_license_info do |params,user|
22
+ {:rhoconnect_version => Rhoconnect.license.rhoconnect_version,
23
+ :licensee => Rhoconnect.license.licensee,
24
+ :seats => Rhoconnect.license.seats,
25
+ :issued => Rhoconnect.license.issued,
26
+ :available => Rhoconnect.license.available }.to_json
27
+ end
28
+
29
+ post "/api/custom_license_info", {:api_token => @api_token}
30
+ JSON.parse(last_response.body).should == {
31
+ "available" => 9,
32
+ "issued" => "Fri Apr 23 17:20:13 -0700 2010",
33
+ "seats" => 10,
34
+ "rhoconnect_version" => "Version 1",
35
+ "licensee" => "Rhomobile" }
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,22 @@
1
+ require File.join(File.dirname(__FILE__),'..','api_helper')
2
+
3
+ describe "RhoconnectApiReset" do
4
+ it_should_behave_like "ApiHelper" do
5
+ it "should reset and re-create rhoadmin user with bootstrap" do
6
+ Store.put_data('somedoc',{ '1' => {'foo'=>'bar'}})
7
+ post "/api/admin/reset", :api_token => @api_token
8
+ App.is_exist?(test_app_name).should == true
9
+ Store.get_data('somedoc').should == {}
10
+ User.authenticate('rhoadmin','').should_not be_nil
11
+ end
12
+
13
+ it "should reset and re-create rhoadmin user with initializer" do
14
+ Store.put_data('somedoc',{ '1' => {'foo'=>'bar'}})
15
+ post "/api/admin/reset", :api_token => @api_token
16
+ App.is_exist?(test_app_name).should == true
17
+ Store.get_data('somedoc').should == {}
18
+ User.authenticate('rhoadmin','').should_not be_nil
19
+ load File.join(Rhoconnect.base_directory,test_app_name+'.rb')
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,66 @@
1
+ require File.join(File.dirname(__FILE__),'..','api_helper')
2
+
3
+ describe "RhoconnectApiStats" do
4
+ it_should_behave_like "ApiHelper" do
5
+ before(:each) do
6
+ Rhoconnect.stats = true
7
+ end
8
+
9
+ after(:each) do
10
+ Rhoconnect.stats = false
11
+ end
12
+
13
+ it "should retrieve metric names" do
14
+ Store.set_value('stat:foo', '1')
15
+ Store.set_value('stat:bar', '2')
16
+ post "/api/admin/stats", {
17
+ :api_token => @api_token,
18
+ :names => '*'
19
+ }
20
+ last_response.should be_ok
21
+ JSON.parse(last_response.body).sort.should == ['bar', 'foo']
22
+ end
23
+
24
+ it "should retrieve range metric" do
25
+ Store.db.zadd('stat:foo', 2, "1:2")
26
+ Store.db.zadd('stat:foo', 3, "1:3")
27
+ post "/api/admin/stats", {
28
+ :api_token => @api_token,
29
+ :metric => 'foo',
30
+ :start => 0,
31
+ :finish => -1
32
+ }
33
+ last_response.should be_ok
34
+ JSON.parse(last_response.body).should == ["1:2", "1:3"]
35
+ end
36
+
37
+ it "should retrieve string metric" do
38
+ Store.db.set('stat:foo', 'bar')
39
+ post "/api/admin/stats", {
40
+ :api_token => @api_token,
41
+ :metric => 'foo'
42
+ }
43
+ last_response.should be_ok
44
+ last_response.body.should == 'bar'
45
+ end
46
+
47
+ it "should raise error on unknown metric" do
48
+ post "/api/admin/stats", {
49
+ :api_token => @api_token,
50
+ :metric => 'foo'
51
+ }
52
+ last_response.status.should == 404
53
+ last_response.body.should == 'Unknown metric'
54
+ end
55
+
56
+ it "should raise error if stats not enabled" do
57
+ Rhoconnect.stats = false
58
+ post "/api/admin/stats", {
59
+ :api_token => @api_token,
60
+ :metric => 'foo'
61
+ }
62
+ last_response.status.should == 500
63
+ last_response.body.should == 'Stats not enabled'
64
+ end
65
+ end
66
+ end
@@ -0,0 +1,21 @@
1
+ require 'rack/test'
2
+ require 'rspec'
3
+
4
+ require File.join(File.dirname(__FILE__),'..','..','lib','rhoconnect','server.rb')
5
+ require File.join(File.dirname(__FILE__),'..','spec_helper')
6
+ require File.join(File.dirname(__FILE__), '..', 'support', 'shared_examples')
7
+
8
+ def app
9
+ @app ||= Rhoconnect::Server.new
10
+ end
11
+
12
+ def compress(path)
13
+ path.sub!(%r[/$],'')
14
+ archive = File.join(path,File.basename(path))+'.zip'
15
+ FileUtils.rm archive, :force=>true
16
+ Zip::ZipFile.open(archive, 'w') do |zipfile|
17
+ Dir["#{path}/**/**"].reject{|f|f==archive}.each do |file|
18
+ zipfile.add(file.sub(path+'/',''),file)
19
+ end
20
+ end
21
+ end