diff options
Diffstat (limited to 'src/couch/test/eunit/couch_query_servers_tests.erl')
-rw-r--r-- | src/couch/test/eunit/couch_query_servers_tests.erl | 95 |
1 files changed, 95 insertions, 0 deletions
diff --git a/src/couch/test/eunit/couch_query_servers_tests.erl b/src/couch/test/eunit/couch_query_servers_tests.erl new file mode 100644 index 000000000..f8df896c4 --- /dev/null +++ b/src/couch/test/eunit/couch_query_servers_tests.erl @@ -0,0 +1,95 @@ +% Licensed under the Apache License, Version 2.0 (the "License"); you may not +% use this file except in compliance with the License. You may obtain a copy of +% the License at +% +% http://www.apache.org/licenses/LICENSE-2.0 +% +% Unless required by applicable law or agreed to in writing, software +% distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +% WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +% License for the specific language governing permissions and limitations under +% the License. + +-module(couch_query_servers_tests). + +-include_lib("couch/include/couch_eunit.hrl"). + + +setup() -> + meck:new([config, couch_log]). + + +teardown(_) -> + meck:unload(). + + +sum_overflow_test_() -> + { + "Test overflow detection in the _sum reduce function", + { + setup, + fun setup/0, + fun teardown/1, + [ + fun should_return_error_on_overflow/0, + fun should_return_object_on_log/0, + fun should_return_object_on_false/0 + ] + } + }. + + +should_return_error_on_overflow() -> + meck:reset([config, couch_log]), + meck:expect( + config, get, ["query_server_config", "reduce_limit", "true"], + "true" + ), + meck:expect(couch_log, error, ['_', '_'], ok), + KVs = gen_sum_kvs(), + {ok, [Result]} = couch_query_servers:reduce(<<"foo">>, [<<"_sum">>], KVs), + ?assertMatch({[{<<"error">>, <<"builtin_reduce_error">>} | _]}, Result), + ?assert(meck:called(config, get, '_')), + ?assert(meck:called(couch_log, error, '_')). + + +should_return_object_on_log() -> + meck:reset([config, couch_log]), + meck:expect( + config, get, ["query_server_config", "reduce_limit", "true"], + "log" + ), + meck:expect(couch_log, error, ['_', '_'], ok), + KVs = gen_sum_kvs(), + {ok, [Result]} = couch_query_servers:reduce(<<"foo">>, [<<"_sum">>], KVs), + ?assertMatch({[_ | _]}, Result), + Keys = [K || {K, _} <- element(1, Result)], + ?assert(not lists:member(<<"error">>, Keys)), + ?assert(meck:called(config, get, '_')), + ?assert(meck:called(couch_log, error, '_')). + + +should_return_object_on_false() -> + meck:reset([config, couch_log]), + meck:expect( + config, get, ["query_server_config", "reduce_limit", "true"], + "false" + ), + meck:expect(couch_log, error, ['_', '_'], ok), + KVs = gen_sum_kvs(), + {ok, [Result]} = couch_query_servers:reduce(<<"foo">>, [<<"_sum">>], KVs), + ?assertMatch({[_ | _]}, Result), + Keys = [K || {K, _} <- element(1, Result)], + ?assert(not lists:member(<<"error">>, Keys)), + ?assert(meck:called(config, get, '_')), + ?assertNot(meck:called(couch_log, error, '_')). + + +gen_sum_kvs() -> + lists:map(fun(I) -> + Props = lists:map(fun(_) -> + K = couch_util:encodeBase64Url(crypto:strong_rand_bytes(16)), + {K, 1} + end, lists:seq(1, 20)), + [I, {Props}] + end, lists:seq(1, 10)). |