Browse Source

eunit tests for get_env/4 et al

Ulf Wiger 14 years ago
parent
commit
9c505d47a1
3 changed files with 55 additions and 8 deletions
  1. 7 7
      README.md
  2. 9 1
      src/gproc.erl
  3. 39 0
      test/gproc_tests.erl

+ 7 - 7
README.md

@@ -78,7 +78,7 @@ global gproc.
 By default, `./rebar doc` generates Github-flavored Markdown files.If you want to change this, remove the `edoc_opts` line from `rebar.config`.
 
 Gproc was first introduced at the ACM SIGPLAN Erlang Workshop in
-Freiburg 2007 ([Paper available here](http://github.com/esl/gproc/blob/master/doc/erlang07-wiger.pdf)).
+Freiburg 2007 ([Paper available here](http://github.com/esl/gproc/blob/env_vars/doc/erlang07-wiger.pdf)).
 
 
 <h2 class="indextitle">Modules</h2>
@@ -86,10 +86,10 @@ Freiburg 2007 ([Paper available here](http://github.com/esl/gproc/blob/master/do
 
 
 <table width="100%" border="0" summary="list of modules">
-<tr><td><a href="http://github.com/esl/gproc/blob/master/doc/gproc.md" class="module">gproc</a></td></tr>
-<tr><td><a href="http://github.com/esl/gproc/blob/master/doc/gproc_app.md" class="module">gproc_app</a></td></tr>
-<tr><td><a href="http://github.com/esl/gproc/blob/master/doc/gproc_dist.md" class="module">gproc_dist</a></td></tr>
-<tr><td><a href="http://github.com/esl/gproc/blob/master/doc/gproc_init.md" class="module">gproc_init</a></td></tr>
-<tr><td><a href="http://github.com/esl/gproc/blob/master/doc/gproc_lib.md" class="module">gproc_lib</a></td></tr>
-<tr><td><a href="http://github.com/esl/gproc/blob/master/doc/gproc_sup.md" class="module">gproc_sup</a></td></tr></table>
+<tr><td><a href="http://github.com/esl/gproc/blob/env_vars/doc/gproc.md" class="module">gproc</a></td></tr>
+<tr><td><a href="http://github.com/esl/gproc/blob/env_vars/doc/gproc_app.md" class="module">gproc_app</a></td></tr>
+<tr><td><a href="http://github.com/esl/gproc/blob/env_vars/doc/gproc_dist.md" class="module">gproc_dist</a></td></tr>
+<tr><td><a href="http://github.com/esl/gproc/blob/env_vars/doc/gproc_init.md" class="module">gproc_init</a></td></tr>
+<tr><td><a href="http://github.com/esl/gproc/blob/env_vars/doc/gproc_lib.md" class="module">gproc_lib</a></td></tr>
+<tr><td><a href="http://github.com/esl/gproc/blob/env_vars/doc/gproc_sup.md" class="module">gproc_sup</a></td></tr></table>
 

+ 9 - 1
src/gproc.erl

@@ -361,7 +361,7 @@ set_env(Scope, App, Key, Value, Strategy)
        Scope==g, is_atom(App), is_atom(Key) ->
     case is_valid_set_strategy(Strategy, Value) of
 	true ->
-	    cache_env(Scope, App, Key, Value),
+	    update_cached_env(Scope, App, Key, Value),
 	    set_strategy(Strategy, App, Key, Value);
 	false ->
 	    erlang:error(badarg)
@@ -437,6 +437,14 @@ lookup_env(Scope, App, Key, P) ->
 cache_env(Scope, App, Key, Value) ->
     reg({p, Scope, {gproc_env, App, Key}}, Value).
 
+update_cached_env(Scope, App, Key, Value) ->
+    case lookup_env(Scope, App, Key, self()) of
+	undefined ->
+	    cache_env(Scope, App, Key, Value);
+	{ok, _} ->
+	    set_value({p, Scope, {gproc_env, App, Key}}, Value)
+    end.
+
 is_valid_set_strategy([os_env|T], Value) ->
     is_string(Value) andalso is_valid_set_strategy(T, Value);
 is_valid_set_strategy([{os_env, _}|T], Value) ->

+ 39 - 0
test/gproc_tests.erl

@@ -57,6 +57,12 @@ reg_test_() ->
       , ?_test(t_is_clean())
       , {spawn, ?_test(t_qlc())}
       , ?_test(t_is_clean())
+      , {spawn, ?_test(t_get_env())}
+      , ?_test(t_is_clean())
+      , {spawn, ?_test(t_get_set_env())}
+      , ?_test(t_is_clean())
+      , {spawn, ?_test(t_set_env())}
+      , ?_test(t_is_clean())
      ]}.
 
 t_simple_reg() ->
@@ -274,6 +280,39 @@ t_qlc() ->
 		 qlc:e(qlc:q([{K,P,V} || {K,P,V} <-
 					     gproc:table(all), P == self()]))).
 
+t_get_env() ->
+    ?assertEqual(ok, application:set_env(gproc, ssss, "s1")),
+    ?assertEqual(true, os:putenv("SSSS", "s2")),
+    ?assertEqual(true, os:putenv("TTTT", "s3")),
+    ?assertEqual(ok, application:set_env(gproc, aaaa, a)),
+    ?assertEqual(undefined, gproc:get_env(l, gproc, ssss, [])),
+    ?assertEqual("s1", gproc:get_env(l, gproc, ssss, [app_env])),
+    ?assertEqual("s2", gproc:get_env(l, gproc, ssss, [os_env])),
+    ?assertEqual("s1", gproc:get_env(l, gproc, ssss, [app_env, os_env])),
+    ?assertEqual("s3", gproc:get_env(l, gproc, ssss, [{os_env,"TTTT"}])),
+    ?assertEqual("s4", gproc:get_env(l, gproc, ssss, [{default,"s4"}])).
+
+t_get_set_env() ->
+    ?assertEqual(ok, application:set_env(gproc, aaaa, a)),
+    ?assertEqual(a, gproc:get_set_env(l, gproc, aaaa, [app_env])),
+    ?assertEqual(ok, application:set_env(gproc, aaaa, undefined)),
+    ?assertEqual(a, gproc:get_env(l, gproc, aaaa, [error])).
+
+t_set_env() ->
+    ?assertEqual(ok, application:set_env(gproc, aaaa, a)),
+    ?assertEqual(a, gproc:get_set_env(l, gproc, aaaa, [app_env])),
+    ?assertEqual(ok, application:set_env(gproc, aaaa, undefined)),
+    ?assertEqual(b, gproc:set_env(l, gproc, aaaa, b, [app_env])),
+    ?assertEqual({ok,b}, application:get_env(gproc, aaaa)),
+    %%
+    ?assertEqual(true, os:putenv("SSSS", "s0")),
+    ?assertEqual("s0", gproc:get_env(l, gproc, ssss, [os_env])),
+    ?assertEqual("s1", gproc:set_env(l, gproc, ssss, "s1", [os_env])),
+    ?assertEqual("s1", os:getenv("SSSS")),
+    ?assertEqual(true, os:putenv("SSSS", "s0")),
+    ?assertEqual([{self(),"s1"}],
+		 gproc:lookup_values({p,l,{gproc_env,gproc,ssss}})).
+
 t_loop() ->
     receive
 	{From, {give_away, Key}} ->