diff options
author | Trygve Laugstøl <trygvis@inamo.no> | 2024-02-23 07:08:18 +0100 |
---|---|---|
committer | Trygve Laugstøl <trygvis@inamo.no> | 2024-02-23 07:08:18 +0100 |
commit | 5a9cdd3cc89507d4d74f8bded56ce5e037b3b56e (patch) | |
tree | 982ca2e7f9ac4e8c350dfb5c4f60bcfdfff5afaf /learn-you-some-erlang/ct/meeting | |
parent | 05ae56e5e89abf2993f84e6d52b250131f247c35 (diff) | |
download | erlang-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.erl | 45 | ||||
-rwxr-xr-x | learn-you-some-erlang/ct/meeting/meeting_SUITE.erl | 51 |
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(). |