rhoconnect 3.4.5 → 4.0.0.beta.10
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG.md +57 -3
- data/Gemfile +9 -7
- data/Gemfile.lock +37 -37
- data/Rakefile +18 -7
- data/bench/benchapp/Gemfile +1 -1
- data/bench/benchapp/config.ru +0 -3
- data/bench/benchapp/controllers/ruby/application.rb +17 -0
- data/bench/benchapp/controllers/ruby/application_controller.rb +17 -0
- data/bench/benchapp/controllers/ruby/mock_adapter_controller.rb +8 -0
- data/bench/benchapp/controllers/ruby/queue_mock_adapter_controller.rb +8 -0
- data/bench/benchapp/{sources → models/ruby}/mock_adapter.rb +1 -1
- data/bench/benchapp/{sources → models/ruby}/queue_mock_adapter.rb +0 -0
- data/bench/benchapp/spec/{sources → models/ruby}/mock_adapter_spec.rb +1 -1
- data/bench/benchapp/spec/{sources → models/ruby}/queue_mock_adapter_spec.rb +1 -1
- data/bench/benchapp/spec/spec_helper.rb +2 -2
- data/bench/blobapp/Gemfile +1 -1
- data/bench/blobapp/config.ru +0 -3
- data/bench/blobapp/controllers/ruby/application_controller.rb +17 -0
- data/bench/blobapp/controllers/ruby/blob_adapter_controller.rb +8 -0
- data/bench/blobapp/{sources → models/ruby}/blob_adapter.rb +9 -2
- data/bench/blobapp/spec/{sources → models/ruby}/blob_adapter_spec.rb +1 -1
- data/bench/blobapp/spec/spec_helper.rb +1 -1
- data/bench/lib/bench/cli.rb +1 -1
- data/bench/scripts/blob_cud_script.rb +1 -1
- data/bench/scripts/query_md_script.rb +1 -1
- data/bench/scripts/query_only_script.rb +1 -1
- data/bench/scripts/query_script.rb +1 -1
- data/bench/scripts/test_query_script.rb +7 -1
- data/bench/spec/mock_adapter_spec.rb +1 -1
- data/bench/spec/result_spec.rb +3 -3
- data/bin/rhoconnect +5 -3
- data/commands/dtach/dtach_install.rb +2 -2
- data/commands/execute.rb +8 -3
- data/commands/generators/app.rb +3 -3
- data/commands/generators/controller.rb +6 -0
- data/commands/generators/model.rb +6 -0
- data/commands/generators/source.rb +3 -3
- data/commands/generators/update.rb +1 -1
- data/commands/redis/redis_about.rb +2 -2
- data/commands/redis/redis_download.rb +1 -1
- data/commands/redis/redis_install.rb +4 -3
- data/commands/redis/redis_restart.rb +4 -4
- data/commands/redis/redis_start.rb +5 -4
- data/commands/redis/redis_startbg.rb +5 -4
- data/commands/redis/redis_status.rb +13 -0
- data/commands/redis/redis_stop.rb +3 -3
- data/commands/rhoconnect/config.rb +28 -16
- data/commands/rhoconnect/flushdb.rb +1 -2
- data/commands/rhoconnect/get_token.rb +15 -11
- data/commands/rhoconnect/restart.rb +13 -5
- data/commands/rhoconnect/set_admin_password.rb +8 -8
- data/commands/rhoconnect/start.rb +74 -16
- data/commands/rhoconnect/startbg.rb +1 -1
- data/commands/rhoconnect/startdebug.rb +1 -1
- data/commands/rhoconnect/stop.rb +13 -1
- data/commands/rhoconnect/web.rb +5 -5
- data/commands/rhoconnect_console/console.rb +7 -5
- data/commands/{rhoconnect → rhoconnect_spec}/spec.rb +0 -0
- data/commands/rhoconnect_war/war.rb +9 -9
- data/commands/utilities/blank_app.ru +56 -0
- data/commands/utilities/redis_runner.rb +54 -19
- data/doc/authentication.txt +80 -6
- data/doc/blob-sync.txt +104 -97
- data/doc/bulk-sync.txt +1 -1
- data/doc/client-java.txt +3 -3
- data/doc/client-objc.txt +2 -2
- data/doc/client.txt +4 -4
- data/doc/command-line.txt +105 -200
- data/doc/data-partitioning.txt +40 -0
- data/doc/deploying.txt +249 -77
- data/doc/extending-rhoconnect-server.txt +40 -57
- data/doc/heroku-addon.txt +2 -0
- data/doc/install.txt +45 -95
- data/doc/introduction.txt +1 -1
- data/doc/java-plugin.txt +365 -190
- data/doc/metadata.txt +1 -1
- data/doc/migration.txt +108 -142
- data/doc/preparing-production.txt +1 -1
- data/doc/push-backend-setup.txt +2 -0
- data/doc/push-client-setup-android.txt +78 -0
- data/doc/push-client-setup-bb.txt +81 -0
- data/doc/push-client-setup-ios.txt +70 -0
- data/doc/push-client-setup-rps.txt +200 -0
- data/doc/push-client-setup.txt +63 -66
- data/doc/push-server-setup.txt +67 -40
- data/doc/push-testing.txt +29 -0
- data/doc/push.txt +21 -6
- data/doc/rest-api.txt +128 -55
- data/doc/rhoconnect-redis-stack.txt +120 -0
- data/doc/settings.txt +4 -12
- data/doc/source-adapters-intro.txt +28 -0
- data/doc/source-adapters.txt +235 -272
- data/doc/stats-middleware.txt +9 -29
- data/doc/supported-platforms.txt +21 -30
- data/doc/testing.txt +40 -42
- data/doc/tutorial.txt +72 -57
- data/examples/simple/Gemfile +1 -1
- data/examples/simple/application.rb +4 -5
- data/examples/simple/my_server.rb +2 -2
- data/examples/simple/settings/settings.yml +1 -1
- data/generators/rhoconnect.rb +151 -50
- data/generators/templates/application/Gemfile +1 -1
- data/generators/templates/application/Rakefile +3 -3
- data/generators/templates/application/config.ru +1 -4
- data/generators/templates/application/controllers/application_controller.rb +17 -0
- data/generators/templates/application/controllers/js/application_controller.js +14 -0
- data/generators/templates/application/controllers/ruby/application_controller.rb +17 -0
- data/generators/templates/application/package.json +8 -0
- data/generators/templates/application/rcgemfile +2 -5
- data/generators/templates/application/settings/settings.yml +3 -3
- data/generators/templates/application/spec/application_controller_spec.rb +23 -0
- data/generators/templates/application/spec/js_spec.rb +25 -0
- data/generators/templates/application/spec/spec_helper.rb +21 -7
- data/generators/templates/source/controllers/js/controller.js +7 -0
- data/generators/templates/source/controllers/ruby/controller.rb +8 -0
- data/generators/templates/source/controllers/ruby/controller_spec.rb +27 -0
- data/generators/templates/source/models/js/model.js +46 -0
- data/generators/templates/source/{source_adapter.rb → models/ruby/model.rb} +15 -10
- data/generators/templates/source/{source_spec.rb → models/ruby/model_spec.rb} +1 -1
- data/install.sh +5 -5
- data/installer/unix-like/create_texts.rb +2 -2
- data/installer/unix-like/rho_connect_install_constants.rb +2 -2
- data/installer/unix-like/rho_connect_install_utilities.rb +1 -1
- data/installer/utils/constants.rb +4 -4
- data/js-adapters/ballroom.js +216 -0
- data/js-adapters/node.rb +52 -0
- data/js-adapters/node_channel.rb +181 -0
- data/js-adapters/request.js +27 -0
- data/js-adapters/response.js +57 -0
- data/js-adapters/rhoconnect_helpers.js +60 -0
- data/js-adapters/router.js +60 -0
- data/js-adapters/server.js +5 -0
- data/lib/rhoconnect/api/app/ans_login.rb +3 -3
- data/lib/rhoconnect/api/app/bulk_data.rb +10 -10
- data/lib/rhoconnect/api/app/fast_delete.rb +11 -10
- data/lib/rhoconnect/api/app/fast_insert.rb +11 -10
- data/lib/rhoconnect/api/app/fast_update.rb +11 -10
- data/lib/rhoconnect/api/app/login.rb +5 -5
- data/lib/rhoconnect/api/app/push_deletes.rb +12 -11
- data/lib/rhoconnect/api/app/push_objects.rb +12 -11
- data/lib/rhoconnect/api/app/query.rb +8 -7
- data/lib/rhoconnect/api/app/queue_updates.rb +98 -94
- data/lib/rhoconnect/api/app/search.rb +8 -7
- data/lib/rhoconnect/api/client/client_get_db_doc.rb +5 -5
- data/lib/rhoconnect/api/client/client_set_db_doc.rb +8 -8
- data/lib/rhoconnect/api/client/create.rb +7 -7
- data/lib/rhoconnect/api/client/get_client_params.rb +4 -4
- data/lib/rhoconnect/api/client/list_client_docs.rb +17 -17
- data/lib/rhoconnect/api/client/register.rb +12 -12
- data/lib/rhoconnect/api/client/reset.rb +5 -5
- data/lib/rhoconnect/api/readstate/set_refresh_time.rb +9 -9
- data/lib/rhoconnect/api/source/get_source_params.rb +4 -4
- data/lib/rhoconnect/api/source/list_sources.rb +16 -16
- data/lib/rhoconnect/api/source/update_source_params.rb +6 -6
- data/lib/rhoconnect/api/store/get_db_doc.rb +4 -4
- data/lib/rhoconnect/api/store/set_db_doc.rb +7 -7
- data/lib/rhoconnect/api/system/get_adapter.rb +4 -4
- data/lib/rhoconnect/api/system/get_license_info.rb +8 -8
- data/lib/rhoconnect/api/system/login.rb +15 -15
- data/lib/rhoconnect/api/system/reset.rb +11 -11
- data/lib/rhoconnect/api/system/save_adapter.rb +4 -4
- data/lib/rhoconnect/api/system/stats.rb +22 -22
- data/lib/rhoconnect/api/user/create_user.rb +7 -7
- data/lib/rhoconnect/api/user/delete_client.rb +6 -6
- data/lib/rhoconnect/api/user/delete_user.rb +11 -10
- data/lib/rhoconnect/api/user/list_clients.rb +4 -4
- data/lib/rhoconnect/api/user/list_source_docs.rb +10 -10
- data/lib/rhoconnect/api/user/list_users.rb +3 -3
- data/lib/rhoconnect/api/user/ping.rb +3 -3
- data/lib/rhoconnect/api/user/show_user.rb +3 -3
- data/lib/rhoconnect/api/user/update_user.rb +5 -5
- data/lib/rhoconnect/api/user/user_get_db_doc.rb +5 -5
- data/lib/rhoconnect/api/user/user_set_db_doc.rb +10 -10
- data/lib/rhoconnect/api_token.rb +5 -6
- data/lib/rhoconnect/app.rb +6 -46
- data/lib/rhoconnect/application/init.rb +5 -2
- data/lib/rhoconnect/async.rb +76 -39
- data/lib/rhoconnect/bulk_data/bulk_data.rb +6 -4
- data/lib/rhoconnect/client.rb +59 -9
- data/lib/rhoconnect/condition/admin_required.rb +27 -0
- data/lib/rhoconnect/condition/client_required.rb +50 -0
- data/lib/rhoconnect/condition/login_required.rb +22 -0
- data/lib/rhoconnect/condition/source_required.rb +49 -0
- data/lib/rhoconnect/condition/verbs.rb +17 -0
- data/lib/rhoconnect/condition/verify_success.rb +19 -0
- data/lib/rhoconnect/controller/app_base.rb +74 -0
- data/lib/rhoconnect/controller/base.rb +68 -0
- data/lib/rhoconnect/controller/clients_controller.rb +79 -0
- data/lib/rhoconnect/controller/dynamic_adapter_controller.rb +93 -0
- data/lib/rhoconnect/controller/js_base.rb +124 -0
- data/lib/rhoconnect/controller/read_state_controller.rb +22 -0
- data/lib/rhoconnect/controller/source_adapter_base.rb +14 -0
- data/lib/rhoconnect/controller/sources_controller.rb +44 -0
- data/lib/rhoconnect/controller/store_controller.rb +25 -0
- data/lib/rhoconnect/controller/system_controller.rb +67 -0
- data/lib/rhoconnect/controller/users_controller.rb +99 -0
- data/lib/rhoconnect/db_adapter.rb +1 -3
- data/lib/rhoconnect/document.rb +159 -50
- data/lib/rhoconnect/handler/authenticate/execute_methods.rb +77 -0
- data/lib/rhoconnect/handler/authenticate/runner.rb +49 -0
- data/lib/rhoconnect/handler/authenticate.rb +3 -0
- data/lib/rhoconnect/handler/bulk_data.rb +28 -0
- data/lib/rhoconnect/handler/changes/engine.rb +271 -0
- data/lib/rhoconnect/handler/changes/execute_methods.rb +88 -0
- data/lib/rhoconnect/handler/changes/pass_through_runner.rb +11 -0
- data/lib/rhoconnect/handler/changes/runner.rb +53 -0
- data/lib/rhoconnect/handler/changes.rb +31 -0
- data/lib/rhoconnect/handler/helpers/auth_method.rb +29 -0
- data/lib/rhoconnect/handler/helpers/binding.rb +18 -0
- data/lib/rhoconnect/handler/helpers/bulk_data.rb +53 -0
- data/lib/rhoconnect/handler/helpers/source_job.rb +14 -0
- data/lib/rhoconnect/handler/helpers.rb +4 -0
- data/lib/rhoconnect/handler/plugin_callbacks/execute_methods.rb +99 -0
- data/lib/rhoconnect/handler/plugin_callbacks/runner.rb +28 -0
- data/lib/rhoconnect/handler/plugin_callbacks.rb +67 -0
- data/lib/rhoconnect/handler/query/engine.rb +93 -0
- data/lib/rhoconnect/handler/query/execute_methods.rb +21 -0
- data/lib/rhoconnect/handler/query/pass_through_runner.rb +35 -0
- data/lib/rhoconnect/handler/query/runner.rb +270 -0
- data/lib/rhoconnect/handler/query.rb +19 -0
- data/lib/rhoconnect/handler/search/engine.rb +60 -0
- data/lib/rhoconnect/handler/search/execute_methods.rb +32 -0
- data/lib/rhoconnect/handler/search/pass_through_runner.rb +18 -0
- data/lib/rhoconnect/handler/search/runner.rb +104 -0
- data/lib/rhoconnect/handler/search.rb +26 -0
- data/lib/rhoconnect/handler/sync.rb +29 -0
- data/lib/rhoconnect/jobs/source_job.rb +13 -4
- data/lib/rhoconnect/js_adapter.rb +79 -0
- data/lib/rhoconnect/license.rb +10 -2
- data/lib/rhoconnect/middleware/current_user.rb +14 -1
- data/lib/rhoconnect/middleware/helpers.rb +10 -93
- data/lib/rhoconnect/middleware/x_domain_session_wrapper.rb +1 -1
- data/lib/rhoconnect/model/base.rb +229 -0
- data/lib/rhoconnect/model/dynamic_adapter_model.rb +90 -0
- data/lib/rhoconnect/model/js_base.rb +121 -0
- data/lib/rhoconnect/ping/android.rb +1 -1
- data/lib/rhoconnect/predefined_adapters/bench_adapter.rb +7 -4
- data/lib/rhoconnect/read_state.rb +3 -3
- data/lib/rhoconnect/server.rb +159 -190
- data/lib/rhoconnect/source.rb +100 -11
- data/lib/rhoconnect/stats/record.rb +10 -10
- data/lib/rhoconnect/store.rb +905 -591
- data/lib/rhoconnect/{model.rb → store_orm.rb} +53 -115
- data/lib/rhoconnect/tasks.rb +18 -4
- data/lib/rhoconnect/test_methods.rb +30 -17
- data/lib/rhoconnect/user.rb +35 -17
- data/lib/rhoconnect/utilities.rb +1 -1
- data/lib/rhoconnect/version.rb +2 -2
- data/lib/rhoconnect/web-console/server.rb +29 -14
- data/lib/rhoconnect/web-console/views/home.js +10 -10
- data/lib/rhoconnect/web-console/views/new_ping.js +1 -1
- data/lib/rhoconnect.rb +120 -51
- data/rhoconnect.gemspec +4 -3
- data/spec/api/api_helper.rb +1 -6
- data/spec/api/app/fast_delete_spec.rb +4 -4
- data/spec/api/app/fast_insert_spec.rb +4 -4
- data/spec/api/app/fast_update_spec.rb +8 -8
- data/spec/api/app/push_deletes_spec.rb +2 -2
- data/spec/api/app/push_objects_spec.rb +5 -5
- data/spec/api/client/client_get_db_doc_spec.rb +6 -4
- data/spec/api/client/client_set_db_doc_spec.rb +3 -2
- data/spec/api/client/get_client_params_spec.rb +14 -0
- data/spec/api/client/list_client_docs_spec.rb +30 -20
- data/spec/api/client/reset_spec.rb +36 -0
- data/spec/api/source/get_source_params_spec.rb +23 -17
- data/spec/api/system/get_license_info_spec.rb +0 -20
- data/spec/api/system/login_spec.rb +8 -0
- data/spec/api/system/reset_spec.rb +0 -1
- data/spec/api/system/stats_spec.rb +5 -5
- data/spec/api/user/create_user_spec.rb +14 -6
- data/spec/api/user/delete_user_spec.rb +20 -18
- data/spec/api/user/list_users_spec.rb +5 -6
- data/spec/api/user/update_user_spec.rb +5 -4
- data/spec/apps/rhotestapp/config.ru +16 -1
- data/spec/apps/rhotestapp/controllers/js/js_sample_controller.js +23 -0
- data/spec/apps/rhotestapp/controllers/js/sample2_controller.js +32 -0
- data/spec/apps/rhotestapp/controllers/ruby/application_controller.rb +21 -0
- data/spec/apps/rhotestapp/controllers/ruby/sample_adapter_controller.rb +8 -0
- data/spec/apps/rhotestapp/models/js/js_sample.js +55 -0
- data/spec/apps/rhotestapp/models/js/sample2.js +25 -0
- data/spec/apps/rhotestapp/{sources → models/ruby}/base_adapter.rb +0 -0
- data/spec/apps/rhotestapp/{sources → models/ruby}/fixed_schema_adapter.rb +0 -0
- data/spec/apps/rhotestapp/{sources → models/ruby}/other_adapter.rb +0 -0
- data/spec/apps/rhotestapp/{sources → models/ruby}/sample_adapter.rb +0 -0
- data/spec/apps/rhotestapp/{sources → models/ruby}/simple_adapter.rb +2 -2
- data/spec/apps/rhotestapp/{sources → models/ruby}/sub_adapter.rb +0 -0
- data/spec/apps/rhotestapp/settings/settings.yml +0 -1
- data/spec/bulk_data/bulk_data_spec.rb +20 -5
- data/spec/cli/cli_spec.rb +83 -0
- data/spec/client_spec.rb +20 -17
- data/spec/client_sync_spec.rb +244 -406
- data/spec/controllers/js_base_spec.rb +89 -0
- data/spec/doc/doc_spec.rb +18 -18
- data/spec/document_spec.rb +29 -13
- data/spec/dynamic_adapter_spec.rb +6 -6
- data/spec/generator/generator_spec.rb +7 -4
- data/spec/jobs/bulk_data_job_spec.rb +14 -10
- data/spec/jobs/source_job_spec.rb +8 -8
- data/spec/license_spec.rb +5 -2
- data/spec/models/js_model_spec.rb +39 -0
- data/spec/node_spec.rb +42 -0
- data/spec/perf/store_perf_spec.rb +67 -12
- data/spec/ping/android_spec.rb +1 -1
- data/spec/read_state_spec.rb +1 -1
- data/spec/rhoconnect_spec.rb +1 -1
- data/spec/server/cors_spec.rb +14 -18
- data/spec/server/server_spec.rb +265 -88
- data/spec/server/stats_spec.rb +1 -1
- data/spec/source_adapter_spec.rb +54 -27
- data/spec/source_spec.rb +8 -3
- data/spec/source_sync_spec.rb +538 -468
- data/spec/spec_helper.rb +35 -4
- data/spec/stats/record_spec.rb +10 -10
- data/spec/{model_spec.rb → store_orm_spec.rb} +56 -54
- data/spec/store_spec.rb +159 -179
- data/spec/support/shared_examples.rb +36 -27
- data/spec/sync_states_spec.rb +40 -33
- data/spec/test_methods_spec.rb +18 -14
- data/spec/user_spec.rb +17 -30
- metadata +156 -52
- data/bench/benchapp/application.rb +0 -39
- data/bench/blobapp/application.rb +0 -44
- data/commands/rhoconnect/clean_start.rb +0 -9
- data/commands/rhoconnect/create_user.rb +0 -18
- data/commands/rhoconnect/delete_device.rb +0 -9
- data/commands/rhoconnect/delete_user.rb +0 -8
- data/commands/rhoconnect/reset.rb +0 -16
- data/commands/rhoconnect/reset_refresh.rb +0 -11
- data/generators/templates/application/application.rb +0 -43
- data/lib/rhoconnect/client_sync.rb +0 -434
- data/lib/rhoconnect/dynamic_adapter.rb +0 -91
- data/lib/rhoconnect/middleware/admin_user.rb +0 -23
- data/lib/rhoconnect/middleware/current_request.rb +0 -16
- data/lib/rhoconnect/middleware/login_required.rb +0 -22
- data/lib/rhoconnect/source_adapter.rb +0 -132
- data/lib/rhoconnect/source_sync.rb +0 -464
- data/spec/apps/rhotestapp/application.rb +0 -23
data/spec/store_spec.rb
CHANGED
@@ -3,56 +3,26 @@ require File.join(File.dirname(__FILE__),'spec_helper')
|
|
3
3
|
describe "Store" do
|
4
4
|
it_behaves_like "SharedRhoconnectHelper", :rhoconnect_data => true do
|
5
5
|
describe "store methods" do
|
6
|
-
it "should create
|
7
|
-
|
8
|
-
Store.db.class.name.should match(/ConnectionPool/)
|
9
|
-
else
|
10
|
-
Store.db.class.name.should match(/Redis/)
|
11
|
-
end
|
12
|
-
end
|
13
|
-
|
14
|
-
it "should set redis connection" do
|
15
|
-
Store.db = nil
|
16
|
-
Store.db = 'localhost:6379'
|
17
|
-
Store.db.client.host.should == 'localhost'
|
18
|
-
Store.db.client.port.should == 6379
|
19
|
-
end
|
20
|
-
|
21
|
-
it "should create default redis connection" do
|
22
|
-
Store.db = nil
|
23
|
-
if RUBY_VERSION =~ /1.9/
|
24
|
-
Store.db.class.name.should match(/ConnectionPool/)
|
25
|
-
else
|
26
|
-
Store.db.class.name.should match(/Redis/)
|
27
|
-
end
|
28
|
-
end
|
29
|
-
|
30
|
-
it "should assign redis to existing redis" do
|
31
|
-
Store.db = Redis.new(:timeout => 60)
|
32
|
-
Store.db.client.timeout.should == 60
|
6
|
+
it "should create proper connection class" do
|
7
|
+
Store.get_store(0).db.class.name.should match(/Redis/)
|
33
8
|
end
|
34
9
|
|
35
10
|
it "should create redis connection based on ENV" do
|
36
11
|
ENV[REDIS_URL] = 'redis://localhost:6379'
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
Store.db = nil
|
43
|
-
Store.db.should_not == nil
|
12
|
+
Redis.should_receive(:connect).with(:url => 'redis://localhost:6379', :thread_safe => true, :timeout => Rhoconnect.redis_timeout).exactly(5).times.and_return { Redis.new }
|
13
|
+
Store.nullify
|
14
|
+
Store.num_stores.should == 0
|
15
|
+
Store.create
|
16
|
+
Store.get_store(0).db.should_not == nil
|
44
17
|
ENV.delete(REDIS_URL)
|
45
18
|
end
|
46
19
|
|
47
20
|
it "should create redis connection based on REDISTOGO_URL ENV" do
|
48
21
|
ENV[REDISTOGO_URL] = 'redis://localhost:6379'
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
end
|
54
|
-
Store.db = nil
|
55
|
-
Store.db.should_not == nil
|
22
|
+
Redis.should_receive(:connect).with(:url => 'redis://localhost:6379', :thread_safe => true, :timeout => Rhoconnect.redis_timeout).exactly(5).times.and_return { Redis.new }
|
23
|
+
Store.nullify
|
24
|
+
Store.create
|
25
|
+
Store.get_store(0).db.should_not == nil
|
56
26
|
ENV.delete(REDISTOGO_URL)
|
57
27
|
end
|
58
28
|
|
@@ -87,8 +57,8 @@ describe "Store" do
|
|
87
57
|
update_data = { '1' => {'attr1' => 'value2', 'new_attr' => 'new_val', 'hello' => 'world'},
|
88
58
|
'2' => {'whole_new_object' => 'new_value' } }
|
89
59
|
Store.put_data('mydata', data)
|
90
|
-
Store.db.should_receive(:srem).exactly(1).times
|
91
|
-
Store.db.should_receive(:sadd).exactly(2).times
|
60
|
+
Store.get_store(0).db.should_receive(:srem).exactly(1).times
|
61
|
+
Store.get_store(0).db.should_receive(:sadd).exactly(2).times
|
92
62
|
Store.update_objects('mydata', update_data)
|
93
63
|
end
|
94
64
|
|
@@ -98,12 +68,20 @@ describe "Store" do
|
|
98
68
|
Store.delete_objects('mydata', ['1'])
|
99
69
|
Store.get_data('mydata').should == {}
|
100
70
|
end
|
71
|
+
|
72
|
+
it "should update_count and delete_value with simple integer data" do
|
73
|
+
Store.put_value('mydata', 21)
|
74
|
+
Store.update_count('mydata', -5)
|
75
|
+
Store.get_value('mydata').to_i.should == 16
|
76
|
+
Store.delete_value('mydata')
|
77
|
+
Store.exists?('mydata').should be_false
|
78
|
+
end
|
101
79
|
|
102
80
|
it "should delete_objects with simple data and verify that srem is called only on affected fields" do
|
103
81
|
data = { '1' => { 'hello' => 'world', "attr1" => 'value1' } }
|
104
82
|
Store.put_data('mydata', data)
|
105
|
-
Store.db.should_receive(:srem).exactly(1).times
|
106
|
-
Store.db.should_receive(:sadd).exactly(0).times
|
83
|
+
Store.get_store(0).db.should_receive(:srem).exactly(1).times
|
84
|
+
Store.get_store(0).db.should_receive(:sadd).exactly(0).times
|
107
85
|
Store.delete_objects('mydata', ['1'])
|
108
86
|
end
|
109
87
|
|
@@ -145,8 +123,8 @@ describe "Store" do
|
|
145
123
|
Store.get_data(@s.docname(:md)).should == @data
|
146
124
|
|
147
125
|
@product3['price'] = '59.99'
|
148
|
-
elem_3 = Store.send(:set_obj_element, '3', @product3)
|
149
|
-
keypairs_3 = Store.send(:get_obj_key_and_pairs, elem_3)
|
126
|
+
elem_3 = Store.get_store(0).send(:set_obj_element, '3', @product3)
|
127
|
+
keypairs_3 = Store.get_store(0).send(:get_obj_key_and_pairs, elem_3)
|
150
128
|
expected = {elem_3 => keypairs_3}
|
151
129
|
@data1,@data1['1'],@data1['2'],@data1['3'] = {},@product1,@product2,@product3
|
152
130
|
|
@@ -161,10 +139,10 @@ describe "Store" do
|
|
161
139
|
|
162
140
|
mod_product2 = @product2.dup
|
163
141
|
mod_product2['price'] = '59.99'
|
164
|
-
elem_2 = Store.send(:set_obj_element, '2', @data['2'])
|
165
|
-
elem_3 = Store.send(:set_obj_element, '3', @product3)
|
166
|
-
keypairs_2 = Store.send(:get_obj_key_and_pairs, elem_2)
|
167
|
-
keypairs_3 = Store.send(:get_obj_key_and_pairs, elem_3)
|
142
|
+
elem_2 = Store.get_store(0).send(:set_obj_element, '2', @data['2'])
|
143
|
+
elem_3 = Store.get_store(0).send(:set_obj_element, '3', @product3)
|
144
|
+
keypairs_2 = Store.get_store(0).send(:get_obj_key_and_pairs, elem_2)
|
145
|
+
keypairs_3 = Store.get_store(0).send(:get_obj_key_and_pairs, elem_3)
|
168
146
|
expected = {elem_2 => keypairs_2, elem_3 => keypairs_3}
|
169
147
|
@data1,@data1['1'],@data1['2'] = {},@product1,mod_product2
|
170
148
|
|
@@ -188,37 +166,37 @@ describe "Store" do
|
|
188
166
|
Store.get_data(@s.docname(:md)).should == @data
|
189
167
|
end
|
190
168
|
|
191
|
-
it "should
|
169
|
+
it "should flush_data" do
|
192
170
|
Store.put_data(@s.docname(:md),@data)
|
193
|
-
Store.
|
171
|
+
Store.flush_data(@s.docname(:md))
|
194
172
|
Store.get_data(@s.docname(:md)).should == {}
|
195
173
|
end
|
196
174
|
|
197
|
-
it "should
|
198
|
-
keys = ['
|
175
|
+
it "should flush_data for all keys matching pattern" do
|
176
|
+
keys = ['test_flush_data1','test_flush_data2']
|
199
177
|
keys.each {|key| Store.put_data(key,@data)}
|
200
|
-
Store.
|
178
|
+
Store.flush_data('test_flush_data*')
|
201
179
|
keys.each {|key| Store.get_data(key).should == {} }
|
202
180
|
end
|
203
181
|
|
204
|
-
it "should
|
205
|
-
key = '
|
182
|
+
it "should flush_data without calling KEYS when there aren't pattern matching characters in the provided keymask" do
|
183
|
+
key = 'test_flush_data'
|
206
184
|
Store.put_data(key,@data)
|
207
|
-
Store.db.should_not_receive(:keys)
|
208
|
-
Store.db.should_receive(:del).once.with("#{key}:#{get_sha1('1')[0..1]}").and_return(true)
|
209
|
-
Store.db.should_receive(:del).once.with("#{key}:#{get_sha1('2')[0..1]}").and_return(true)
|
210
|
-
Store.db.should_receive(:del).once.with("#{key}:#{get_sha1('3')[0..1]}").and_return(true)
|
211
|
-
Store.db.should_receive(:del).once.with("#{key}:indices").and_return(true)
|
212
|
-
Store.
|
185
|
+
Store.get_store(0).db.should_not_receive(:keys)
|
186
|
+
Store.get_store(0).db.should_receive(:del).once.with("#{key}:#{get_sha1('1')[0..1]}").and_return(true)
|
187
|
+
Store.get_store(0).db.should_receive(:del).once.with("#{key}:#{get_sha1('2')[0..1]}").and_return(true)
|
188
|
+
Store.get_store(0).db.should_receive(:del).once.with("#{key}:#{get_sha1('3')[0..1]}").and_return(true)
|
189
|
+
Store.get_store(0).db.should_receive(:del).once.with("#{key}:indices").and_return(true)
|
190
|
+
Store.flush_data(key)
|
213
191
|
end
|
214
192
|
|
215
|
-
it "should
|
216
|
-
keys = ['
|
193
|
+
it "should flush_data and call KEYS when there are pattern matching characters in the provided keymask" do
|
194
|
+
keys = ['test_flush_data1','test_flush_data2']
|
217
195
|
keys.each {|key| Store.put_data(key,@data)}
|
218
|
-
docs = Store.
|
219
|
-
Store.db.should_receive(:keys).exactly(1).times.with("
|
220
|
-
Store.db.should_receive(:del).exactly(8).times.and_return(true)
|
221
|
-
Store.
|
196
|
+
docs = Store.keys("test_flush_data*")
|
197
|
+
Store.get_store(0).db.should_receive(:keys).exactly(1).times.with("test_flush_data*").and_return(docs)
|
198
|
+
Store.get_store(0).db.should_receive(:del).exactly(8).times.and_return(true)
|
199
|
+
Store.flush_data("test_flush_data*")
|
222
200
|
end
|
223
201
|
|
224
202
|
it "should put_zdata and get_zdata" do
|
@@ -258,121 +236,35 @@ describe "Store" do
|
|
258
236
|
zdocs.should == {}
|
259
237
|
end
|
260
238
|
|
261
|
-
it "should put_multi_zdata and get_multi_zdata for transaction's queue" do
|
262
|
-
create_doc = {'1' => {'foo' => 'bar'}}
|
263
|
-
update_doc = {'2' => {'foo1' => 'bar1'}}
|
264
|
-
delete_doc = {'3' => {'foo2' => 'bar2'}}
|
265
|
-
sources_doc = {'source1' => {'create' => create_doc,
|
266
|
-
'delete' => delete_doc}}
|
267
|
-
sources_doc['source2'] = {'update' => update_doc}
|
268
|
-
sources = ['source2', 'source1']
|
269
|
-
assoc_key = 'my_assoc_key'
|
270
|
-
Store.put_multi_zdata('transactions',assoc_key,sources,sources_doc)
|
271
|
-
zdata,ordered_sources,keys = Store.get_multi_zdata('transactions')
|
272
|
-
zdata.should == [sources_doc]
|
273
|
-
ordered_sources.should == [sources]
|
274
|
-
keys.should == [assoc_key]
|
275
|
-
end
|
276
|
-
|
277
|
-
it "should return empty list on non-existing get_multi_zdata" do
|
278
|
-
zdata,ordered_sources,keys = Store.get_multi_zdata('wrong_doc2')
|
279
|
-
zdata.should == []
|
280
|
-
ordered_sources.should == []
|
281
|
-
keys.should == []
|
282
|
-
end
|
283
|
-
|
284
|
-
it "should append duplicate data in put_multi_zdata" do
|
285
|
-
create_doc = {'1' => {'foo' => 'bar'}}
|
286
|
-
update_doc = {'2' => {'foo1' => 'bar1'}}
|
287
|
-
delete_doc = {'3' => {'foo2' => 'bar2'}}
|
288
|
-
sources_doc = {'source1' => {'create' => create_doc,
|
289
|
-
'delete' => delete_doc}}
|
290
|
-
sources_doc['source2'] = {'update' => update_doc}
|
291
|
-
sources1 = ['source2', 'source1']
|
292
|
-
sources2 = ['source1', 'source2']
|
293
|
-
assoc_key = 'my_assoc_key'
|
294
|
-
Store.put_multi_zdata('doc1',assoc_key,sources1,sources_doc)
|
295
|
-
Store.put_multi_zdata('doc1',assoc_key,sources2,sources_doc, true)
|
296
|
-
zdata,ordered_sources,keys = Store.get_multi_zdata('doc1')
|
297
|
-
zdata.should == [sources_doc,sources_doc]
|
298
|
-
ordered_sources.should == [sources1, sources2]
|
299
|
-
keys.should == [assoc_key,assoc_key]
|
300
|
-
end
|
301
|
-
|
302
|
-
it "should flush_multi_zdata and all its related documents" do
|
303
|
-
create_doc = {'1' => {'foo' => 'bar'}}
|
304
|
-
update_doc = {'2' => {'foo1' => 'bar1'}}
|
305
|
-
delete_doc = {'3' => {'foo2' => 'bar2'}}
|
306
|
-
sources_doc = {'source1' => {'create' => create_doc,
|
307
|
-
'delete' => delete_doc}}
|
308
|
-
sources_doc['source2'] = {'update' => update_doc}
|
309
|
-
sources1 = ['source2', 'source1']
|
310
|
-
sources2 = ['source1', 'source2']
|
311
|
-
assoc_key = 'my_assoc_key'
|
312
|
-
Store.put_multi_zdata('doc1',assoc_key,sources1,sources_doc)
|
313
|
-
Store.put_multi_zdata('doc1',assoc_key,sources2,sources_doc,true)
|
314
|
-
zsources1 = Store.get_data('doc1:1:my_assoc_key:sources',Array)
|
315
|
-
zsources1.should == sources1
|
316
|
-
zsources2 = Store.get_data('doc1:2:my_assoc_key:sources',Array)
|
317
|
-
zsources2.should == sources2
|
318
|
-
zdata_create1 = Store.get_data('doc1:1,my_assoc_key:source1:create')
|
319
|
-
zdata_create1.should == create_doc
|
320
|
-
zdata_update1 = Store.get_data('doc1:1,my_assoc_key:source2:update')
|
321
|
-
zdata_update1.should == update_doc
|
322
|
-
zdata_delete1 = Store.get_data('doc1:1,my_assoc_key:source1:delete')
|
323
|
-
zdata_delete1.should == delete_doc
|
324
|
-
zdata_create2 = Store.get_data('doc1:2,my_assoc_key:source1:create')
|
325
|
-
zdata_create2.should == create_doc
|
326
|
-
zdata_update2 = Store.get_data('doc1:2,my_assoc_key:source2:update')
|
327
|
-
zdata_update2.should == update_doc
|
328
|
-
zdata_delete2 = Store.get_data('doc1:2,my_assoc_key:source1:delete')
|
329
|
-
zdata_delete2.should == delete_doc
|
330
|
-
Store.flush_multi_zdata('doc1')
|
331
|
-
zdata,ordered_sources,keys = Store.get_multi_zdata('doc1')
|
332
|
-
zdata.should == []
|
333
|
-
ordered_sources.should == []
|
334
|
-
keys.should == []
|
335
|
-
zsources1 = Store.get_data('doc1:1:my_assoc_key:sources',Array)
|
336
|
-
zsources1.should == []
|
337
|
-
zsources2 = Store.get_data('doc1:2:my_assoc_key:sources',Array)
|
338
|
-
zsources2.should == []
|
339
|
-
zdata_create1 = Store.get_data('doc1:1,my_assoc_key:source1:create')
|
340
|
-
zdata_create1.should == {}
|
341
|
-
zdata_update1 = Store.get_data('doc1:1,my_assoc_key:source2:update')
|
342
|
-
zdata_update1.should == {}
|
343
|
-
zdata_delete1 = Store.get_data('doc1:1,my_assoc_key:source1:delete')
|
344
|
-
zdata_delete1.should == {}
|
345
|
-
zdata_create2 = Store.get_data('doc1:2,my_assoc_key:source1:create')
|
346
|
-
zdata_create2.should == {}
|
347
|
-
zdata_update2 = Store.get_data('doc1:2,my_assoc_key:source2:update')
|
348
|
-
zdata_update2.should == {}
|
349
|
-
zdata_delete2 = Store.get_data('doc1:2,my_assoc_key:source1:delete')
|
350
|
-
zdata_delete2.should == {}
|
351
|
-
end
|
352
|
-
|
353
239
|
if defined?(JRUBY_VERSION)
|
354
240
|
it "should lock document" do
|
355
241
|
doc = "locked_data"
|
242
|
+
threads = []
|
356
243
|
m_lock = Store.get_lock(doc)
|
357
|
-
|
358
|
-
Store.db = Redis.new
|
244
|
+
threads << Thread.new do
|
359
245
|
t_lock = Store.get_lock(doc)
|
360
246
|
Store.put_data(doc,{'1'=>@product1},true)
|
361
|
-
Store.release_lock(doc,t_lock)
|
247
|
+
Store.release_lock(doc,t_lock)
|
248
|
+
end
|
249
|
+
threads << Thread.new do
|
250
|
+
t_lock = Store.get_lock(doc)
|
251
|
+
Store.put_data(doc,{'3'=>@product3},true)
|
252
|
+
Store.release_lock(doc,t_lock)
|
362
253
|
end
|
363
254
|
Store.put_data(doc,{'2'=>@product2},true)
|
364
255
|
Store.get_data(doc).should == {'2'=>@product2}
|
365
256
|
Store.release_lock(doc,m_lock)
|
366
|
-
t.join
|
257
|
+
threads.each { |t| t.join }
|
367
258
|
m_lock = Store.get_lock(doc)
|
368
|
-
Store.get_data(doc).should == {'1'=>@product1,'2'=>@product2}
|
259
|
+
Store.get_data(doc).should == {'1'=>@product1,'2'=>@product2,'3'=>@product3}
|
369
260
|
end
|
370
261
|
else
|
371
262
|
it "should lock document" do
|
372
263
|
doc = "locked_data"
|
373
264
|
m_lock = Store.get_lock(doc)
|
374
265
|
pid = Process.fork do
|
375
|
-
Store.
|
266
|
+
Store.nullify
|
267
|
+
Store.create
|
376
268
|
t_lock = Store.get_lock(doc)
|
377
269
|
Store.put_data(doc,{'1'=>@product1},true)
|
378
270
|
Store.release_lock(doc,t_lock)
|
@@ -390,12 +282,13 @@ describe "Store" do
|
|
390
282
|
it "should lock key for timeout" do
|
391
283
|
doc = "locked_data"
|
392
284
|
lock = Time.now.to_i+3
|
393
|
-
Store.db.set "lock:#{doc}", lock
|
394
|
-
Store.should_receive(:sleep).at_least(:once).with(1).and_return { sleep 1; Store.release_lock(doc,lock); }
|
285
|
+
Store.get_store(0).db.set "lock:#{doc}", lock
|
286
|
+
Store.get_store(0).should_receive(:sleep).at_least(:once).with(1).and_return { sleep 1; Store.release_lock(doc,lock); }
|
395
287
|
Store.get_lock(doc,4)
|
396
288
|
end
|
397
289
|
|
398
290
|
it "should raise exception if lock expires" do
|
291
|
+
|
399
292
|
doc = "locked_data"
|
400
293
|
Store.get_lock(doc)
|
401
294
|
lambda { sleep 2; Store.get_lock(doc,4,true) }.should raise_error(StoreLockException,"Lock \"lock:locked_data\" expired before it was released")
|
@@ -420,7 +313,7 @@ describe "Store" do
|
|
420
313
|
doc = "locked_data"
|
421
314
|
Rhoconnect.lock_duration = 2
|
422
315
|
Store.get_lock(doc)
|
423
|
-
Store.should_receive(:sleep).at_least(1).times.with(1).and_return { sleep 1 }
|
316
|
+
Store.get_store(0).should_receive(:sleep).at_least(1).times.with(1).and_return { sleep 1 }
|
424
317
|
Store.get_lock(doc)
|
425
318
|
Rhoconnect.lock_duration = nil
|
426
319
|
end
|
@@ -447,8 +340,8 @@ describe "Store" do
|
|
447
340
|
|
448
341
|
it "should not fail to rename if key doesn't exist" do
|
449
342
|
Store.rename('key1','key2')
|
450
|
-
Store.
|
451
|
-
Store.
|
343
|
+
Store.exists?('key1').should be_false
|
344
|
+
Store.exists?('key2').should be_false
|
452
345
|
end
|
453
346
|
|
454
347
|
it "should raise ArgumentError on put_data with invalid data" do
|
@@ -467,12 +360,12 @@ describe "Store" do
|
|
467
360
|
docindex2 = get_sha1(key2)[0..1]
|
468
361
|
Store.put_object(:md, key1, data1)
|
469
362
|
Store.put_object(:md, key2, data2)
|
470
|
-
Store.
|
471
|
-
Store.
|
472
|
-
Store.
|
473
|
-
Store.
|
474
|
-
Store.db.hkeys("#{:md}:indices").should == ["#{docindex1}", "#{docindex2}"]
|
475
|
-
Store.db.hvals("#{:md}:indices").should == ["#{:md}:#{docindex1}", "#{:md}:#{docindex2}"]
|
363
|
+
Store.keys(:md).should == []
|
364
|
+
Store.exists?("#{:md}:#{docindex1}").should be_true
|
365
|
+
Store.exists?("#{:md}:#{docindex2}").should be_true
|
366
|
+
Store.exists?("#{:md}:indices").should be_true
|
367
|
+
Store.get_store(0).db.hkeys("#{:md}:indices").should == ["#{docindex1}", "#{docindex2}"]
|
368
|
+
Store.get_store(0).db.hvals("#{:md}:indices").should == ["#{:md}:#{docindex1}", "#{:md}:#{docindex2}"]
|
476
369
|
end
|
477
370
|
|
478
371
|
it "should get_object from the bucketed md" do
|
@@ -487,6 +380,93 @@ describe "Store" do
|
|
487
380
|
obj2 = Store.get_object(:md, key2)
|
488
381
|
obj2.should == data2
|
489
382
|
end
|
383
|
+
|
384
|
+
it "should make temporary document and restore it to permanent with rename" do
|
385
|
+
key1 = '1'
|
386
|
+
data1 = {'foo' => 'bar'}
|
387
|
+
key2 = '2'
|
388
|
+
data2 = {'one' => 'two', 'three' => 'four'}
|
389
|
+
docindex1 = get_sha1(key1)[0..1]
|
390
|
+
docindex2 = get_sha1(key2)[0..1]
|
391
|
+
Store.put_tmp_data(:md, {key1 => data1})
|
392
|
+
Store.put_tmp_data(:md, {key2 => data2}, true)
|
393
|
+
|
394
|
+
Store.exists?("#{:md}:#{docindex1}").should be_true
|
395
|
+
Store.exists?("#{:md}:#{docindex2}").should be_true
|
396
|
+
Store.exists?("#{:md}:indices").should be_true
|
397
|
+
Store.get_store(0).db.ttl("#{:md}:#{docindex1}").should == Rhoconnect.store_key_ttl
|
398
|
+
Store.get_store(0).db.ttl("#{:md}:#{docindex2}").should == Rhoconnect.store_key_ttl
|
399
|
+
Store.get_store(0).db.ttl("#{:md}:indices").should == Rhoconnect.store_key_ttl
|
400
|
+
|
401
|
+
Store.rename_tmp_data(:md, :md_perm)
|
402
|
+
Store.exists?("#{:md}:#{docindex1}").should be_false
|
403
|
+
Store.exists?("#{:md}:#{docindex2}").should be_false
|
404
|
+
Store.exists?("#{:md}:indices").should be_false
|
405
|
+
Store.exists?("#{:md_perm}:#{docindex1}").should be_true
|
406
|
+
Store.exists?("#{:md_perm}:#{docindex2}").should be_true
|
407
|
+
Store.exists?("#{:md_perm}:indices").should be_true
|
408
|
+
Store.get_store(0).db.ttl("#{:md_perm}:#{docindex1}").should == -1
|
409
|
+
Store.get_store(0).db.ttl("#{:md_perm}:#{docindex2}").should == -1
|
410
|
+
Store.get_store(0).db.ttl("#{:md_perm}:indices").should == -1
|
411
|
+
end
|
412
|
+
|
413
|
+
describe "multiple redis clustering" do
|
414
|
+
before(:all) do
|
415
|
+
# start 2 redis instances in addition to default 6379
|
416
|
+
system("redis-server --port 6380 &")
|
417
|
+
system("redis-server --port 6381 &")
|
418
|
+
sleep(1)
|
419
|
+
Store.nullify
|
420
|
+
Store.create(['localhost:6379', 'localhost:6380', 'localhost:6381'])
|
421
|
+
|
422
|
+
end
|
423
|
+
|
424
|
+
after(:all) do
|
425
|
+
# shutdown 2 additional redis instances (leave default one as is)
|
426
|
+
Store.get_store(1).send(:db).shutdown
|
427
|
+
Store.get_store(2).send(:db).shutdown
|
428
|
+
Store.nullify
|
429
|
+
end
|
430
|
+
|
431
|
+
it "should list number of stores" do
|
432
|
+
Store.num_stores.should == 3
|
433
|
+
end
|
434
|
+
|
435
|
+
it "data for Source and Client docs should be on the same instance" do
|
436
|
+
source_index = @s.store_index(:md)
|
437
|
+
client_index = @c.store_index(:cd)
|
438
|
+
# for this source and user , index should be computed to 2
|
439
|
+
source_index.should == 2
|
440
|
+
source_index.should == client_index
|
441
|
+
end
|
442
|
+
|
443
|
+
it "data for app-parttion should go to system Redis (with index 0)" do
|
444
|
+
@c.source_name = @s3.name
|
445
|
+
source_index = @s3.store_index(:md)
|
446
|
+
client_index = @c.store_index(:cd)
|
447
|
+
# for this source and user , index should be compured to 0
|
448
|
+
source_index.should == 0
|
449
|
+
source_index.should == client_index
|
450
|
+
end
|
451
|
+
|
452
|
+
it "should set and flush the data only in appropriate instance" do
|
453
|
+
key1 = '1'
|
454
|
+
data1 = {'foo' => 'bar'}
|
455
|
+
key2 = '2'
|
456
|
+
data2 = {'foo1' => 'bar1'}
|
457
|
+
@s.put_data(:md, {key1 => data1})
|
458
|
+
Store.get_store(2).get_data(@s.docname(:md)).should == {key1 => data1}
|
459
|
+
# data in store 1 should not be accessible through Source documents
|
460
|
+
# because this combination of user and source should index to instance #2
|
461
|
+
Store.get_store(1).put_data(@s.docname(:md), {key2 => data2})
|
462
|
+
Store.get_store(1).get_data(@s.docname(:md)).should == {key2 => data2}
|
463
|
+
|
464
|
+
@s.get_data(:md).should == {key1 => data1}
|
465
|
+
Store.get_store(2).flush_data(@s.docname(:md))
|
466
|
+
@s.get_data(:md).should == {}
|
467
|
+
Store.get_store(1).get_data(@s.docname(:md)).should == {key2 => data2}
|
468
|
+
end
|
469
|
+
end
|
490
470
|
end
|
491
471
|
end
|
492
472
|
end
|
@@ -1,36 +1,36 @@
|
|
1
|
-
# When shared examples are called as
|
1
|
+
# When shared examples are called as
|
2
2
|
# it_behaves_like "SharedRhoconnectHelper", :rhoconnect_data => false
|
3
3
|
# then :rhoconnect_data group (@product1, ..., @data) skipped.
|
4
4
|
# To enable this group call examples as
|
5
5
|
# it_behaves_like "SharedRhoconnectHelper", :rhoconnect_data => true
|
6
6
|
shared_examples_for "SharedRhoconnectHelper" do |params|
|
7
|
-
include TestHelpers
|
7
|
+
include TestHelpers
|
8
8
|
# "TestappHelper"
|
9
|
-
let(:test_app_name) { 'application' }
|
10
|
-
|
11
|
-
before(:
|
9
|
+
let(:test_app_name) { 'application' }
|
10
|
+
|
11
|
+
before(:each) do
|
12
|
+
# "RhoconnectHelper"
|
13
|
+
Store.create
|
14
|
+
Store.flush_all
|
15
|
+
Rhoconnect.use_node = false
|
16
|
+
Rhoconnect::Server.set :environment, :test
|
17
|
+
|
12
18
|
Rhoconnect.bootstrap(get_testapp_path) do |rhoconnect|
|
13
19
|
rhoconnect.vendor_directory = File.join(File.dirname(__FILE__), '..', '..', 'vendor')
|
14
20
|
end
|
15
|
-
|
16
|
-
|
17
|
-
before(:each) do
|
18
|
-
# "RhoconnectHelper"
|
19
|
-
Store.create
|
20
|
-
Store.db.flushdb
|
21
|
-
|
21
|
+
|
22
22
|
# "DBObjectsHelper"
|
23
23
|
@a_fields = { :name => test_app_name }
|
24
24
|
@a = (App.load(test_app_name) || App.create(@a_fields))
|
25
25
|
@u_fields = {:login => 'testuser'}
|
26
|
-
@u = User.create(@u_fields)
|
26
|
+
@u = User.create(@u_fields)
|
27
27
|
@u.password = 'testpass'
|
28
28
|
@c_fields = {
|
29
29
|
:device_type => 'Apple',
|
30
30
|
:device_pin => 'abcd',
|
31
31
|
:device_port => '3333',
|
32
32
|
:user_id => @u.id,
|
33
|
-
:app_id => @a.id
|
33
|
+
:app_id => @a.id
|
34
34
|
}
|
35
35
|
@s_fields = {
|
36
36
|
:name => 'SampleAdapter',
|
@@ -55,7 +55,7 @@ shared_examples_for "SharedRhoconnectHelper" do |params|
|
|
55
55
|
@s1 = Source.create(@s1_fields,@s_params)
|
56
56
|
@s2 = Source.create({:name=> 'Product2'},@s_params)
|
57
57
|
@s3 = Source.create({:name=> 'SimpleAdapter',:partition_type=> 'app'},@s_params)
|
58
|
-
@s1.belongs_to = [{'brand' => 'SampleAdapter'}].to_json
|
58
|
+
@s1.belongs_to = [{'brand' => 'SampleAdapter'}].to_json
|
59
59
|
config = Rhoconnect.source_config('FixedSchemaAdapter')
|
60
60
|
@s1.update(config)
|
61
61
|
@r = @s.read_state
|
@@ -64,9 +64,9 @@ shared_examples_for "SharedRhoconnectHelper" do |params|
|
|
64
64
|
@a.sources << @s3.id
|
65
65
|
Source.update_associations(@a.sources)
|
66
66
|
@a.users << @u.id
|
67
|
-
|
68
|
-
# "RhoconnectDataHelper"
|
69
|
-
if params && params[:rhoconnect_data]
|
67
|
+
|
68
|
+
# "RhoconnectDataHelper"
|
69
|
+
if params && params[:rhoconnect_data]
|
70
70
|
@source = 'Product'
|
71
71
|
@user_id = 5
|
72
72
|
@client_id = 1
|
@@ -84,7 +84,7 @@ end
|
|
84
84
|
shared_examples_for "BenchSpecHelper" do
|
85
85
|
before(:each) do
|
86
86
|
Store.create
|
87
|
-
Store.
|
87
|
+
Store.flush_all
|
88
88
|
|
89
89
|
@product1 = { 'name' => 'iPhone', 'brand' => 'Apple', 'price' => '199.99' }
|
90
90
|
@product2 = { 'name' => 'G2', 'brand' => 'Android', 'price' => '99.99' }
|
@@ -98,15 +98,23 @@ end
|
|
98
98
|
shared_examples_for "ApiHelper" do
|
99
99
|
include Rack::Test::Methods
|
100
100
|
include Rhoconnect
|
101
|
-
include TestHelpers
|
101
|
+
include TestHelpers
|
102
102
|
|
103
103
|
let(:test_app_name) { 'application' }
|
104
|
-
|
104
|
+
|
105
|
+
def app
|
106
|
+
Rhoconnect::Server.set :stats, false
|
107
|
+
Rhoconnect.stats = false
|
108
|
+
@app ||= Rack::URLMap.new Rhoconnect.url_map
|
109
|
+
end
|
110
|
+
|
105
111
|
before(:each) do
|
112
|
+
Rhoconnect.connection_pool_timeout = 30
|
113
|
+
Rhoconnect.connection_pool_size = 5
|
106
114
|
Store.create
|
107
|
-
Store.
|
115
|
+
Store.flush_all
|
108
116
|
|
109
|
-
|
117
|
+
Rhoconnect.use_node = false
|
110
118
|
Rhoconnect.bootstrap(get_testapp_path) do |rhoconnect|
|
111
119
|
rhoconnect.vendor_directory = File.join(rhoconnect.base_directory,'..','..','..','vendor')
|
112
120
|
end
|
@@ -118,14 +126,14 @@ shared_examples_for "ApiHelper" do
|
|
118
126
|
@a_fields = { :name => test_app_name }
|
119
127
|
@a = (App.load(test_app_name) || App.create(@a_fields))
|
120
128
|
@u_fields = {:login => 'testuser'}
|
121
|
-
@u = User.create(@u_fields)
|
129
|
+
@u = User.create(@u_fields)
|
122
130
|
@u.password = 'testpass'
|
123
131
|
@c_fields = {
|
124
132
|
:device_type => 'Apple',
|
125
133
|
:device_pin => 'abcd',
|
126
134
|
:device_port => '3333',
|
127
135
|
:user_id => @u.id,
|
128
|
-
:app_id => @a.id
|
136
|
+
:app_id => @a.id
|
129
137
|
}
|
130
138
|
@s_fields = {
|
131
139
|
:name => 'SampleAdapter',
|
@@ -149,7 +157,7 @@ shared_examples_for "ApiHelper" do
|
|
149
157
|
@s = Source.create(@s_fields,@s_params)
|
150
158
|
@s1 = Source.create(@s1_fields,@s_params)
|
151
159
|
@s2 = Source.create({:name=> 'Product2'},@s_params)
|
152
|
-
@s1.belongs_to = [{'brand' => 'SampleAdapter'}].to_json
|
160
|
+
@s1.belongs_to = [{'brand' => 'SampleAdapter'}].to_json
|
153
161
|
config = Rhoconnect.source_config('FixedSchemaAdapter')
|
154
162
|
@s1.update(config)
|
155
163
|
@r = @s.read_state
|
@@ -169,4 +177,5 @@ shared_examples_for "ApiHelper" do
|
|
169
177
|
|
170
178
|
@data = {'1'=>@product1,'2'=>@product2,'3'=>@product3}
|
171
179
|
end
|
172
|
-
end
|
180
|
+
end
|
181
|
+
|