aboutsummaryrefslogtreecommitdiff
path: root/learn-you-some-erlang/ct
diff options
context:
space:
mode:
Diffstat (limited to 'learn-you-some-erlang/ct')
-rw-r--r--learn-you-some-erlang/ct/demo/basic_SUITE.erl13
-rw-r--r--learn-you-some-erlang/ct/demo/state_SUITE.erl24
-rw-r--r--learn-you-some-erlang/ct/dist.spec14
-rw-r--r--learn-you-some-erlang/ct/meeting/meeting.erl45
-rwxr-xr-xlearn-you-some-erlang/ct/meeting/meeting_SUITE.erl51
-rw-r--r--learn-you-some-erlang/ct/spec.spec7
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"}.