|
|
@ -0,0 +1,71 @@ |
|
|
|
%% Copyright (c) 2012, Magnus Klaar <klaar@ninenines.eu> |
|
|
|
%% |
|
|
|
%% Permission to use, copy, modify, and/or distribute this software for any |
|
|
|
%% purpose with or without fee is hereby granted, provided that the above |
|
|
|
%% copyright notice and this permission notice appear in all copies. |
|
|
|
%% |
|
|
|
%% THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES |
|
|
|
%% WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF |
|
|
|
%% MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR |
|
|
|
%% ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES |
|
|
|
%% WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN |
|
|
|
%% ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF |
|
|
|
%% OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. |
|
|
|
|
|
|
|
%% @doc Runtime context for events. |
|
|
|
-module(gr_context). |
|
|
|
|
|
|
|
-export([ |
|
|
|
make/1 |
|
|
|
]). |
|
|
|
|
|
|
|
make(Options) -> |
|
|
|
make_(undefined, undefined, undefined, undefined, Options). |
|
|
|
|
|
|
|
make_(_Node, App, Pid, Time, [{'$n', Node}|T]) -> |
|
|
|
make_(Node, App, Pid, Time, T); |
|
|
|
make_(Node, _App, Pid, Time, [{'$a', App}|T]) -> |
|
|
|
make_(Node, App, Pid, Time, T); |
|
|
|
make_(Node, App, _Pid, Time, [{'$p', Pid}|T]) -> |
|
|
|
make_(Node, App, Pid, Time, T); |
|
|
|
make_(Node, App, Pid, _Time, [{'$t', Time}|T]) -> |
|
|
|
make_(Node, App, Pid, Time, T); |
|
|
|
make_(Node, App, Pid, Time, []) -> |
|
|
|
Pid2 = case Pid of undefined -> self(); _ -> Pid end, |
|
|
|
Node2 = case Node of undefined -> node(Pid2); _ -> Node end, |
|
|
|
App2 = case App of undefined -> application(Pid2); _ -> App end, |
|
|
|
Time2 = case Time of undefined -> os:timestamp(); _ -> Time end, |
|
|
|
{Node2, App2, Pid2, Time2}. |
|
|
|
|
|
|
|
application(Pid) when Pid =:= self() -> |
|
|
|
case application:get_application(group_leader()) of |
|
|
|
{ok, App} -> App; |
|
|
|
undefined -> undefined |
|
|
|
end; |
|
|
|
application(Pid) -> |
|
|
|
{_, GroupLeader} = erlang:process_info(Pid, group_leader), |
|
|
|
case application:get_application(GroupLeader) of |
|
|
|
{ok, App} -> App; |
|
|
|
undefined -> undefined |
|
|
|
end. |
|
|
|
|
|
|
|
-ifdef(TEST). |
|
|
|
-include_lib("eunit/include/eunit.hrl"). |
|
|
|
|
|
|
|
make_defaults_test() -> |
|
|
|
{Node, App, Pid, Time} = gr_context:make([]), |
|
|
|
?assertEqual(Node, node()), |
|
|
|
?assertEqual(Pid, self()), |
|
|
|
?assert(is_atom(App)), |
|
|
|
?assertMatch({_,_,_}, Time). |
|
|
|
|
|
|
|
|
|
|
|
make_override_test() -> |
|
|
|
Pid = spawn(fun() -> ok end), |
|
|
|
{Node, App, Pid, Time} = gr_context:make([ |
|
|
|
{'$n', nodename}, {'$a', appname}, {'$p', Pid}, {'$t', timeval}]), |
|
|
|
?assertEqual(nodename, Node), |
|
|
|
?assertEqual(appname, App), |
|
|
|
?assertEqual(timeval, Time). |
|
|
|
|
|
|
|
-endif. |