diff options
Diffstat (limited to 'learn-you-some-erlang/ct')
-rw-r--r-- | learn-you-some-erlang/ct/demo/basic_SUITE.erl | 13 | ||||
-rw-r--r-- | learn-you-some-erlang/ct/demo/state_SUITE.erl | 24 | ||||
-rw-r--r-- | learn-you-some-erlang/ct/dist.spec | 14 | ||||
-rw-r--r-- | learn-you-some-erlang/ct/meeting/meeting.erl | 45 | ||||
-rwxr-xr-x | learn-you-some-erlang/ct/meeting/meeting_SUITE.erl | 51 | ||||
-rw-r--r-- | learn-you-some-erlang/ct/spec.spec | 7 |
6 files changed, 154 insertions, 0 deletions
diff --git a/learn-you-some-erlang/ct/demo/basic_SUITE.erl b/learn-you-some-erlang/ct/demo/basic_SUITE.erl new file mode 100644 index 0000000..566ff54 --- /dev/null +++ b/learn-you-some-erlang/ct/demo/basic_SUITE.erl @@ -0,0 +1,13 @@ +-module(basic_SUITE). +-include_lib("common_test/include/ct.hrl"). +-export([all/0]). +-export([test1/1, test2/1]). + +all() -> [test1,test2]. + +test1(_Config) -> + 1 = 1. + +test2(_Config) -> + A = 0, + 1/A. diff --git a/learn-you-some-erlang/ct/demo/state_SUITE.erl b/learn-you-some-erlang/ct/demo/state_SUITE.erl new file mode 100644 index 0000000..3ee0e5b --- /dev/null +++ b/learn-you-some-erlang/ct/demo/state_SUITE.erl @@ -0,0 +1,24 @@ +-module(state_SUITE). +-include_lib("common_test/include/ct.hrl"). + +-export([all/0, init_per_testcase/2, end_per_testcase/2]). +-export([ets_tests/1]). + +all() -> [ets_tests]. + +init_per_testcase(ets_tests, Config) -> + TabId = ets:new(account, [ordered_set, public]), + ets:insert(TabId, {andy, 2131}), + ets:insert(TabId, {david, 12}), + ets:insert(TabId, {steve, 12943752}), + [{table,TabId} | Config]. + +end_per_testcase(ets_tests, Config) -> + ets:delete(?config(table, Config)). + +ets_tests(Config) -> + TabId = ?config(table, Config), + [{david, 12}] = ets:lookup(TabId, david), + steve = ets:last(TabId), + true = ets:insert(TabId, {zachary, 99}), + zachary = ets:last(TabId). diff --git a/learn-you-some-erlang/ct/dist.spec b/learn-you-some-erlang/ct/dist.spec new file mode 100644 index 0000000..e25cdfb --- /dev/null +++ b/learn-you-some-erlang/ct/dist.spec @@ -0,0 +1,14 @@ +{node, a, 'a@ferdmbp.local'}. +{node, b, 'b@ferdmbp.local'}. + +{init, [a,b], [{node_start, [{monitor_master, true}]}]}. + +{alias, demo, "/Users/ferd/code/self/learn-you-some-erlang/ct/demo/"}. +{alias, meeting, "/Users/ferd/code/self/learn-you-some-erlang/ct/meeting/"}. + +{logdir, all_nodes, "/Users/ferd/code/self/learn-you-some-erlang/ct/logs/"}. +{logdir, master, "/Users/ferd/code/self/learn-you-some-erlang/ct/logs/"}. + +{suites, [b], meeting, all}. +{suites, [a], demo, all}. +{skip_cases, [a], demo, basic_SUITE, test2, "This test fails on purpose"}. diff --git a/learn-you-some-erlang/ct/meeting/meeting.erl b/learn-you-some-erlang/ct/meeting/meeting.erl new file mode 100644 index 0000000..0de9453 --- /dev/null +++ b/learn-you-some-erlang/ct/meeting/meeting.erl @@ -0,0 +1,45 @@ +-module(meeting). +-export([rent_projector/1, use_chairs/1, book_room/1, + get_all_bookings/0, start/0, stop/0]). +-record(bookings, {projector, room, chairs}). + +start() -> + Pid = spawn(fun() -> loop(#bookings{}) end), + register(?MODULE, Pid). + +stop() -> + ?MODULE ! stop. + +rent_projector(Group) -> + ?MODULE ! {projector, Group}. + +book_room(Group) -> + ?MODULE ! {room, Group}. + +use_chairs(Group) -> + ?MODULE ! {chairs, Group}. + +get_all_bookings() -> + Ref = make_ref(), + ?MODULE ! {self(), Ref, get_bookings}, + receive + {Ref, Reply} -> + Reply + end. + +loop(B = #bookings{}) -> + receive + stop -> ok; + {From, Ref, get_bookings} -> + From ! {Ref, [{room, B#bookings.room}, + {chairs, B#bookings.chairs}, + {projector, B#bookings.projector}]}, + loop(B); + {room, Group} -> + loop(B#bookings{room=Group}); + {chairs, Group} -> + loop(B#bookings{chairs=Group}); + {projector, Group} -> + loop(B#bookings{projector=Group}) + end. + diff --git a/learn-you-some-erlang/ct/meeting/meeting_SUITE.erl b/learn-you-some-erlang/ct/meeting/meeting_SUITE.erl new file mode 100755 index 0000000..f699569 --- /dev/null +++ b/learn-you-some-erlang/ct/meeting/meeting_SUITE.erl @@ -0,0 +1,51 @@ +-module(meeting_SUITE). +-include_lib("common_test/include/ct.hrl"). +-export([all/0, groups/0, init_per_group/2, end_per_group/2]). +-export([carla/1, mark/1, dog/1, all_same_owner/1]). + +%% Regroup the tests as groups that will let you try to see if the 'meeting.erl' +%% modules contains concurrency errors or not. + +all() -> [{group, session}]. + +groups() -> [{session, + [], + [{group, clients}, all_same_owner]}, + {clients, + [parallel, {repeat, 10}], + [carla, mark, dog]}]. + +init_per_group(session, Config) -> + meeting:start(), + Config; +init_per_group(_, Config) -> + Config. + +end_per_group(session, _Config) -> + meeting:stop(); +end_per_group(_, _Config) -> + ok. + +carla(_Config) -> + meeting:book_room(women), + timer:sleep(10), + meeting:rent_projector(women), + timer:sleep(10), + meeting:use_chairs(women). + +mark(_Config) -> + meeting:rent_projector(men), + timer:sleep(10), + meeting:use_chairs(men), + timer:sleep(10), + meeting:book_room(men). + +dog(_Config) -> + meeting:rent_projector(animals), + timer:sleep(10), + meeting:use_chairs(animals), + timer:sleep(10), + meeting:book_room(animals). + +all_same_owner(_Config) -> + [{_,Owner}, {_, Owner}, {_, Owner}] = meeting:get_all_bookings(). diff --git a/learn-you-some-erlang/ct/spec.spec b/learn-you-some-erlang/ct/spec.spec new file mode 100644 index 0000000..1752664 --- /dev/null +++ b/learn-you-some-erlang/ct/spec.spec @@ -0,0 +1,7 @@ +{alias, demo, "./demo/"}. +{alias, meeting, "./meeting/"}. +{logdir, "./logs/"}. + +{suites, meeting, all}. +{suites, demo, all}. +{skip_cases, demo, basic_SUITE, test2, "This test fails on purpose"}. |