From eb425792eb5f32ce0db85a766d68e950dc3dbac1 Mon Sep 17 00:00:00 2001 From: Magnus Klaar Date: Tue, 24 Apr 2012 03:05:21 +0200 Subject: [PATCH] Add runtime context module --- src/gr_context.erl | 71 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 71 insertions(+) create mode 100644 src/gr_context.erl diff --git a/src/gr_context.erl b/src/gr_context.erl new file mode 100644 index 0000000..c25899b --- /dev/null +++ b/src/gr_context.erl @@ -0,0 +1,71 @@ +%% Copyright (c) 2012, Magnus Klaar +%% +%% 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.