blob: 9ca2c8a847f285ebe74fcd7fc0b9e01592c904f2 [file] [log] [blame]
% 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_uuids_tests).
-include_lib("couch/include/couch_eunit.hrl").
-define(TIMEOUT, 20).
setup_all() ->
test_util:start_applications([config]),
couch_uuids:start().
teardown_all(_) ->
couch_uuids:stop(),
test_util:stop_applications([config]).
uuids_test_() ->
{
setup,
fun setup_all/0,
fun teardown_all/1,
[
{timeout, ?TIMEOUT, fun default_algorithm/0},
{timeout, ?TIMEOUT, fun sequential_algorithm/0},
{timeout, ?TIMEOUT, fun utc_algorithm/0},
{timeout, ?TIMEOUT, fun utc_id_suffix_algorithm/0}
]
}.
default_algorithm() ->
config:delete("uuids", "algorithm", false),
check_unique().
sequential_algorithm() ->
config:set("uuids", "algorithm", "sequential", false),
check_unique(),
check_increment_monotonically(),
check_rollover().
utc_algorithm() ->
config:set("uuids", "algorithm", "utc_random", false),
check_unique(),
check_increment_monotonically().
utc_id_suffix_algorithm() ->
config:set("uuids", "algorithm", "utc_id", false),
config:set("uuids", "utc_id_suffix", "bozo", false),
check_unique(),
check_increment_monotonically(),
check_preserve_suffix().
check_unique() ->
%% this one may really runs for too long on slow hosts
?assert(test_unique(10000, [couch_uuids:new()])).
check_increment_monotonically() ->
?assert(couch_uuids:new() < couch_uuids:new()).
check_rollover() ->
UUID = binary_to_list(couch_uuids:new()),
Prefix = element(1, lists:split(26, UUID)),
N = gen_until_pref_change(Prefix, 0),
?assert(N >= 5000 andalso N =< 11000).
check_preserve_suffix() ->
UUID = binary_to_list(couch_uuids:new()),
Suffix = get_suffix(UUID),
?assert(test_same_suffix(10000, Suffix)).
test_unique(0, _) ->
true;
test_unique(N, UUIDs) ->
UUID = couch_uuids:new(),
?assertNot(lists:member(UUID, UUIDs)),
test_unique(N - 1, [UUID| UUIDs]).
gen_until_pref_change(_, Count) when Count > 8251 ->
Count;
gen_until_pref_change(Prefix, N) ->
case get_prefix(couch_uuids:new()) of
Prefix -> gen_until_pref_change(Prefix, N + 1);
_ -> N
end.
test_same_suffix(0, _) ->
true;
test_same_suffix(N, Suffix) ->
case get_suffix(couch_uuids:new()) of
Suffix -> test_same_suffix(N - 1, Suffix);
_ -> false
end.
get_prefix(UUID) ->
element(1, lists:split(26, binary_to_list(UUID))).
get_suffix(UUID) when is_binary(UUID) ->
get_suffix(binary_to_list(UUID));
get_suffix(UUID) ->
element(2, lists:split(14, UUID)).