summaryrefslogtreecommitdiff
path: root/src/couch/test/eunit/couch_flags_tests.erl
diff options
context:
space:
mode:
Diffstat (limited to 'src/couch/test/eunit/couch_flags_tests.erl')
-rw-r--r--src/couch/test/eunit/couch_flags_tests.erl150
1 files changed, 150 insertions, 0 deletions
diff --git a/src/couch/test/eunit/couch_flags_tests.erl b/src/couch/test/eunit/couch_flags_tests.erl
new file mode 100644
index 000000000..32ec57b77
--- /dev/null
+++ b/src/couch/test/eunit/couch_flags_tests.erl
@@ -0,0 +1,150 @@
+% 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_flags_tests).
+
+-include_lib("couch/include/couch_eunit.hrl").
+
+%% couch_epi_plugin behaviour callbacks
+-export([
+ app/0,
+ providers/0,
+ services/0,
+ data_providers/0,
+ data_subscriptions/0,
+ processes/0,
+ notify/3
+]).
+
+-export([
+ rules/0
+]).
+
+app() ->
+ test_app.
+
+providers() ->
+ [{feature_flags, ?MODULE}].
+
+services() ->
+ [].
+
+data_providers() ->
+ [].
+
+data_subscriptions() ->
+ [].
+
+processes() ->
+ [].
+
+notify(_, _, _) ->
+ ok.
+
+rules() ->
+ test_config().
+
+setup() ->
+ %% FIXME after we upgrade couch_epi
+ application:stop(couch_epi), % in case it's already running from other tests...
+ application:unload(couch_epi),
+
+ application:load(couch_epi),
+ application:set_env(couch_epi, plugins, [couch_db_epi, ?MODULE]),
+ meck:expect(config, get, 1, []),
+
+ Ctx = test_util:start_couch([couch_epi]),
+ Ctx.
+
+
+teardown(Ctx) ->
+ test_util:stop_couch(Ctx),
+ ok = application:unload(couch_epi),
+ meck:unload(),
+ ok.
+
+couch_flags_test_() ->
+ {
+ "test couch_flags",
+ {
+ setup, fun setup/0, fun teardown/1,
+ enabled_flags_tests()
+ ++ is_enabled()
+%% ++ match_performance()
+ }
+ }.
+
+enabled_flags_tests() ->
+
+ [{"enabled_flags_tests", [
+ {"flags_default_rule",
+ ?_assertEqual(
+ [foo], couch_flags:enabled("something"))},
+ {"flags_wildcard_rule",
+ ?_assertEqual(
+ [bar, baz, foo],
+ couch_flags:enabled("shards/test/something"))},
+ {"flags_exact_rule",
+ ?_assertEqual(
+ [bar, baz, foo],
+ couch_flags:enabled("shards/test/exact"))},
+ {"flags_blacklist_rule",
+ ?_assertEqual(
+ [],
+ couch_flags:enabled("shards/blacklist/4"))}
+ ]}].
+
+is_enabled() ->
+ [{"is_enabled_tests", [
+ {"flags_default_rule [enabled]",
+ ?_assert(couch_flags:is_enabled(foo, "something"))},
+ {"flags_default_rule [disabled]",
+ ?_assertNot(couch_flags:is_enabled(baz, "something"))},
+ {"flags_default_rule [not_existent]",
+ ?_assertNot(couch_flags:is_enabled(non_existent, "something"))},
+
+ {"flags_wildcard_rule [enabled]",
+ ?_assert(couch_flags:is_enabled(bar, "shards/test/something"))},
+ {"flags_wildcard_rule [not_existent]",
+ ?_assertNot(couch_flags:is_enabled(non_existent, "shards/test/something"))},
+
+ {"flags_exact_rule [overide_disbled]",
+ ?_assert(couch_flags:is_enabled(bar, "shards/test/exact"))},
+ {"flags_exact_rule [not_existent]",
+ ?_assertNot(couch_flags:is_enabled(non_existent, "shards/test/exact"))},
+
+ {"flags_blacklist_rule [overide_enabled]",
+ ?_assertNot(couch_flags:is_enabled(foo, "shards/blacklist/4"))},
+ {"flags_blacklist_rule [not_existent]",
+ ?_assertNot(couch_flags:is_enabled(non_existent, "shards/blacklist/4"))}
+ ]}].
+
+%% match_performance() ->
+%% [{"match_performance", [
+%% ?_test(begin
+%% ?debugTime("1 million of operations took", lists:foreach(fun(_) ->
+%% couch_flags:is_enabled(bar, "shards/test/exact")
+%% end, lists:seq(1, 1000000)))
+%% end)
+%% ]}].
+
+
+test_config() ->
+ [
+ {"foo||/*", "true"},
+ {"bar||/*", "false"},
+ {"bar||/shards/test*", "true"},
+ {"foo||/shards/blacklist*", "false"},
+ {"baz||/shards/test*", "true"},
+ {"bar||/shards/exact", "true"},
+ {"bar||/shards/test/exact", "true"}
+ ].