spec/source_sync_spec.rb in rhosync-2.1.10 vs spec/source_sync_spec.rb in rhosync-2.1.11
- old
+ new
@@ -206,10 +206,81 @@
end
it "should do search with exception raised" do
verify_read_operation_with_error('search')
end
+
+ it "should do query with exception raised and update refresh time only after retries limit is exceeded" do
+ @s.retry_limit = 1
+ msg = "Error during query"
+ set_test_data('test_db_storage',{},msg,"query error")
+ res = @ss.do_query
+ verify_result(@s.docname(:md) => {},
+ @s.docname(:errors) => {'query-error'=>{'message'=>msg}})
+ # 1) if retry_limit is set to N - then, first N retries should not update refresh_time
+ @s.read_state.retry_counter.should == 1
+ @s.read_state.refresh_time.should <= Time.now.to_i
+
+ # try once more and fail again
+ set_test_data('test_db_storage',{},msg,"query error")
+ res = @ss.do_query
+ verify_result(@s.docname(:md) => {},
+ @s.docname(:errors) => {'query-error'=>{'message'=>msg}})
+
+ # 2) if retry_limit is set to N and number of retries exceeded it - update refresh_time
+ @s.read_state.retry_counter.should == 0
+ @s.read_state.refresh_time.should > Time.now.to_i
+ end
+
+ it "should do query with exception raised and restore state with succesfull retry" do
+ @s.retry_limit = 1
+ msg = "Error during query"
+ set_test_data('test_db_storage',{},msg,"query error")
+ res = @ss.do_query
+ verify_result(@s.docname(:md) => {},
+ @s.docname(:errors) => {'query-error'=>{'message'=>msg}})
+ # 1) if retry_limit is set to N - then, first N retries should not update refresh_time
+ @s.read_state.retry_counter.should == 1
+ @s.read_state.refresh_time.should <= Time.now.to_i
+
+ # try once more (with success)
+ expected = {'1'=>@product1,'2'=>@product2}
+ set_test_data('test_db_storage',expected)
+ @ss.do_query
+ verify_result(@s.docname(:md) => expected,
+ @s.docname(:errors) => {})
+ @s.read_state.retry_counter.should == 0
+ @s.read_state.refresh_time.should > Time.now.to_i
+ end
+
+ it "should do query with exception raised and update refresh time if retry_limit is 0" do
+ @s.retry_limit = 0
+ msg = "Error during query"
+ set_test_data('test_db_storage',{},msg,"query error")
+ res = @ss.do_query
+ verify_result(@s.docname(:md) => {},
+ @s.docname(:errors) => {'query-error'=>{'message'=>msg}})
+ # if poll_interval is set to 0 - refresh time should be updated
+ @s.read_state.retry_counter.should == 0
+ @s.read_state.refresh_time.should > Time.now.to_i
+ end
+
+ it "should do query with exception raised and update refresh time if poll_interval == 0" do
+ @s.retry_limit = 1
+ @s.poll_interval = 0
+ msg = "Error during query"
+ set_test_data('test_db_storage',{},msg,"query error")
+ prev_refresh_time = @s.read_state.refresh_time
+ # make sure refresh time is expired
+ sleep(1)
+ res = @ss.do_query
+ verify_result(@s.docname(:md) => {},
+ @s.docname(:errors) => {'query-error'=>{'message'=>msg}})
+ # if poll_interval is set to 0 - refresh time should be updated
+ @s.read_state.retry_counter.should == 0
+ @s.read_state.refresh_time.should > prev_refresh_time
+ end
end
describe "app-level partitioning" do
it "should create app-level masterdoc with '__shared__' docname" do
@s1 = Source.load(@s_fields[:name],{:user_id => "testuser",:app_id => @a.id})
@@ -219,10 +290,11 @@
set_state('test_db_storage' => expected)
@ss1.process_query
verify_result("source:#{@test_app_name}:__shared__:#{@s_fields[:name]}:md" => expected)
Store.db.keys("read_state:#{@test_app_name}:__shared__*").sort.should ==
[ "read_state:#{@test_app_name}:__shared__:SampleAdapter:refresh_time",
- "read_state:#{@test_app_name}:__shared__:SampleAdapter:rho__id"]
+ "read_state:#{@test_app_name}:__shared__:SampleAdapter:retry_counter",
+ "read_state:#{@test_app_name}:__shared__:SampleAdapter:rho__id"].sort
end
end
def verify_read_operation(operation)
expected = {'1'=>@product1,'2'=>@product2}
\ No newline at end of file