aboutsummaryrefslogtreecommitdiff
path: root/learn-you-some-erlang/ct/meeting
diff options
context:
space:
mode:
authorTrygve Laugstøl <trygvis@inamo.no>2024-02-23 07:08:18 +0100
committerTrygve Laugstøl <trygvis@inamo.no>2024-02-23 07:08:18 +0100
commit5a9cdd3cc89507d4d74f8bded56ce5e037b3b56e (patch)
tree982ca2e7f9ac4e8c350dfb5c4f60bcfdfff5afaf /learn-you-some-erlang/ct/meeting
parent05ae56e5e89abf2993f84e6d52b250131f247c35 (diff)
downloaderlang-workshop-5a9cdd3cc89507d4d74f8bded56ce5e037b3b56e.tar.gz
erlang-workshop-5a9cdd3cc89507d4d74f8bded56ce5e037b3b56e.tar.bz2
erlang-workshop-5a9cdd3cc89507d4d74f8bded56ce5e037b3b56e.tar.xz
erlang-workshop-5a9cdd3cc89507d4d74f8bded56ce5e037b3b56e.zip
wip
Diffstat (limited to 'learn-you-some-erlang/ct/meeting')
-rw-r--r--learn-you-some-erlang/ct/meeting/meeting.erl45
-rwxr-xr-xlearn-you-some-erlang/ct/meeting/meeting_SUITE.erl51
2 files changed, 96 insertions, 0 deletions
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().