%% %% %CopyrightBegin% %% %% Copyright Ericsson AB 2000-2010. All Rights Reserved. %% %% The contents of this file are subject to the Erlang Public License, %% Version 1.1, (the "License"); you may not use this file except in %% compliance with the License. You should have received a copy of the %% Erlang Public License along with this software. If not, it can be %% retrieved online at http://www.erlang.org/. %% %% Software distributed under the License is distributed on an "AS IS" %% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See %% the License for the specific language governing rights and limitations %% under the License. %% %% %CopyrightEnd% -module(random_SUITE). -export([all/0, suite/0,groups/0,init_per_suite/1, end_per_suite/1, init_per_group/2,end_per_group/2]). -export([interval_1/1, seed0/1, seed/1]). -export([init_per_testcase/2, end_per_testcase/2]). -include_lib("test_server/include/test_server.hrl"). % Default timetrap timeout (set in init_per_testcase). -define(default_timeout, ?t:minutes(1)). init_per_testcase(_Case, Config) -> ?line Dog = ?t:timetrap(?default_timeout), [{watchdog, Dog} | Config]. end_per_testcase(_Case, Config) -> Dog = ?config(watchdog, Config), test_server:timetrap_cancel(Dog), ok. suite() -> [{suite_callbacks,[ts_install_scb]}]. all() -> [interval_1, seed0, seed]. groups() -> []. init_per_suite(Config) -> Config. end_per_suite(_Config) -> ok. init_per_group(_GroupName, Config) -> Config. end_per_group(_GroupName, Config) -> Config. seed0(doc) -> ["Test that seed is set implicitly, and always the same."]; seed0(suite) -> []; seed0(Config) when is_list(Config) -> ?line Self = self(), ?line _ = spawn(fun() -> Self ! random:uniform() end), ?line F1 = receive Fa -> Fa end, ?line _ = spawn(fun() -> random:seed(), Self ! random:uniform() end), ?line F2 = receive Fb -> Fb end, ?line F1 = F2, ok. seed(doc) -> ["Test that seed/1 and seed/3 is equivalent."]; seed(suite) -> []; seed(Config) when is_list(Config) -> ?line Self = self(), ?line Seed = {S1, S2, S3} = now(), ?line _ = spawn(fun() -> random:seed(S1,S2,S3), Rands = lists:foldl(fun (_, Out) -> [random:uniform(10000)|Out] end, [], lists:seq(1,100)), Self ! {seed_test, Rands} end), ?line Rands1 = receive {seed_test, R1s} -> R1s end, ?line _ = spawn(fun() -> random:seed(Seed), Rands = lists:foldl(fun (_, Out) -> [random:uniform(10000)|Out] end, [], lists:seq(1,100)), Self ! {seed_test, Rands} end), ?line Rands2 = receive {seed_test, R2s} -> R2s end, ?line Rands1 = Rands2, ok. interval_1(doc) -> ["Check that uniform/1 returns values within the proper interval."]; interval_1(suite) -> []; interval_1(Config) when is_list(Config) -> ?line Top = 7, ?line N = 10, ?line check_interval(N, Top), ok. check_interval(0, _) -> ok; check_interval(N, Top) -> X = random:uniform(Top), if X < 1 -> test_server:fail(too_small); X > Top -> test_server:fail(too_large); true -> ok end, check_interval(N-1, Top).