summaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
authorUlf Wiger <ulf@feuerlabs.com>2015-08-14 19:32:22 +0200
committerUlf Wiger <ulf@feuerlabs.com>2015-08-14 19:32:22 +0200
commit2dd27e3c33de6c2b31e4cdc30a345b3c64e3040a (patch)
tree5620cfbed7605baa2c1325fbbc7ca56157164616 /test
parent54974ae9ead2200104cb35b5e34fff8030a06cc9 (diff)
downloadrvi_core-2dd27e3c33de6c2b31e4cdc30a345b3c64e3040a.tar.gz
added svc reg+call tests + bug fixes
Diffstat (limited to 'test')
-rw-r--r--test/config/backend.config3
-rw-r--r--test/config/sample.config7
-rw-r--r--test/rvi_core_SUITE.erl181
3 files changed, 180 insertions, 11 deletions
diff --git a/test/config/backend.config b/test/config/backend.config
index 7839d38..3a7be0b 100644
--- a/test/config/backend.config
+++ b/test/config/backend.config
@@ -10,7 +10,8 @@
{provisioning_key,
{openssl_pem, filename:join(CurDir, "root_keys/root_pub.pem")}},
{authorize_jwt, filename:join(
- CurDir, "basic_backend_keys/dev_pub_sign.jwt")}
+ CurDir, "basic_backend_keys/dev_pub_sign.jwt")},
+ {cert_dir, filename:join(CurDir, "basic_backend_certs")}
]}
]}
].
diff --git a/test/config/sample.config b/test/config/sample.config
index 1c0db37..97588f7 100644
--- a/test/config/sample.config
+++ b/test/config/sample.config
@@ -5,12 +5,15 @@
{set_env,
[
{rvi_core,
- [{key_pair, {openssl_pem, filename:join(
+ [
+ {node_service_prefix, "jlr.com/vin/abc"},
+ {key_pair, {openssl_pem, filename:join(
CurDir, "basic_sample_keys/dev_priv.pem")}},
{provisioning_key,
{openssl_pem, filename:join(CurDir, "root_keys/root_pub.pem")}},
{authorize_jwt, filename:join(
- CurDir, "basic_sample_keys/dev_pub_sign.jwt")}
+ CurDir, "basic_sample_keys/dev_pub_sign.jwt")},
+ {cert_dir, filename:join(CurDir, "basic_sample_certs")}
]}
]}
].
diff --git a/test/rvi_core_SUITE.erl b/test/rvi_core_SUITE.erl
index ea1b447..efdefb4 100644
--- a/test/rvi_core_SUITE.erl
+++ b/test/rvi_core_SUITE.erl
@@ -11,14 +11,16 @@
%% test case exports
-export(
[
- t_backend_keys/1,
+ t_backend_keys_and_cert/1,
t_sample_keys_and_cert/1,
t_install_backend_node/1,
t_install_sample_node/1,
t_install_sms_backend_node/1,
t_install_sms_sample_node/1,
t_start_basic_backend/1,
- t_start_basic_sample/1
+ t_start_basic_sample/1,
+ t_register_lock_service/1,
+ t_call_lock_service/1
]).
-include_lib("common_test/include/ct.hrl").
@@ -37,7 +39,7 @@ groups() ->
%% Note that order is significant in this test group.
%% The test cases produce files on disk that are used in later tests
[
- t_backend_keys,
+ t_backend_keys_and_cert,
t_sample_keys_and_cert,
t_install_backend_node,
t_install_sample_node,
@@ -47,7 +49,9 @@ groups() ->
{test_run, [],
[
t_start_basic_backend,
- t_start_basic_sample
+ t_start_basic_sample,
+ t_register_lock_service,
+ t_call_lock_service
]}
].
@@ -83,16 +87,18 @@ end_per_testcase(Case, _Config) ->
%% Test cases
%% ======================================================================
-t_backend_keys(Config) ->
+t_backend_keys_and_cert(Config) ->
RootKeyDir = ensure_dir(root_keys()),
cmd([scripts(),"/rvi_create_root_key.sh -o ",
RootKeyDir, "/root -b 2048"]),
- generate_device_keys("basic_backend_keys", Config).
+ Dir = ensure_dir("basic_backend_keys"),
+ generate_device_keys(Dir, Config),
+ generate_cert(backend, Dir, ensure_dir("basic_backend_certs"), Config).
t_sample_keys_and_cert(Config) ->
Dir = ensure_dir("basic_sample_keys"),
generate_device_keys(Dir, Config),
- generate_cert(Dir, ensure_dir("basic_sample_certs"), Config).
+ generate_cert(sample, Dir, ensure_dir("basic_sample_certs"), Config).
t_install_backend_node(Config) ->
install_rvi_node("basic_backend", env(),
@@ -124,14 +130,133 @@ t_start_basic_sample(Config) ->
await_started("basic_sample"),
ok.
+t_register_lock_service(Config) ->
+ Pid =
+ spawn_cmd(
+ [python(),
+ "/rvi_service.py -n ", service_edge("sample"), " lock"]),
+ save({service, lock}, Pid),
+ timer:sleep(2000).
+
+t_call_lock_service(Config) ->
+ CallPid = spawn_cmd(
+ [python(),
+ "/rvi_call.py -n ", service_edge("sample"),
+ " jlr.com/vin/abc/lock arg1='val1'"]),
+ timer:sleep(2000),
+ [{_, Svc}] = lookup({service, lock}),
+ SvcRes = fetch(Svc),
+ verify_service_res(join_stdout_msgs(SvcRes)),
+ ct:log("SvcRes = ~p~n", [SvcRes]),
+ CallRes = fetch(CallPid),
+ verify_call_res(join_stdout_msgs(CallRes)),
+ ct:log("CallRes = ~p~n", [CallRes]).
+
+verify_service_res(Bin) ->
+ {match,_} =
+ re:run(Bin, <<"Service:[\\h]*jlr.com/vin/abc/lock">>, []),
+ {match,_} =
+ re:run(Bin, <<"Service invoked![\\s]*args: {u'arg1': u'val1'}">>, []),
+ nomatch = re:run(Bin, <<"Traceback">>, []),
+ ok.
+
+verify_call_res(Bin) ->
+ nomatch = re:run(Bin, <<"Traceback">>, []),
+ ok.
+
+join_stdout_msgs(L) ->
+ lists:foldl(
+ fun({stdout,_,Bin}, Acc) ->
+ <<Acc/binary, Bin/binary>>;
+ (_, Acc) ->
+ Acc
+ end, <<>>, L).
+
+spawn_cmd(Cmd0) ->
+ Cmd = binary_to_list(iolist_to_binary(Cmd0)),
+ Me = self(),
+ Pid = spawn(fun() ->
+ Res = exec:run(Cmd, [stdin, stdout, stderr]),
+ ct:log("~s ->~n~p~n", [Cmd, Res]),
+ Me ! {self(), ok},
+ cmd_loop()
+ end),
+ receive
+ {Pid, ok} ->
+ Pid
+ end.
+
+fetch(Pid) ->
+ ct:log("fetch(~p)", [Pid]),
+ Pid ! {self(), fetch},
+ receive
+ {Pid, Res} ->
+ Res
+ after 3000 ->
+ error(timeout)
+ end.
+
+cmd_loop() -> cmd_loop([]).
+
+cmd_loop(Acc) ->
+ receive
+ {From, fetch} ->
+ From ! {self(), lists:reverse(Acc)},
+ cmd_loop([]);
+ Msg ->
+ io:fwrite(user, "~p <- ~p", [self(), Msg]),
+ cmd_loop([Msg|Acc])
+ end.
+
generate_device_keys(Dir, Config) ->
ensure_dir(Dir),
cmd([scripts(),"/rvi_create_device_key.py ",
"-p ", root_keys(), "/root_priv.pem -o ", Dir, "/dev -b 2048"]).
-generate_cert(KeyDir, SampleDir, Config) ->
+generate_cert(sample, KeyDir, CertDir, Config) ->
+ %% Don't put lock_cert.json in the certs directory, since rvi_core
+ %% will report a parse failure for it.
+ UUID = uuid(),
+ {Start, Stop} = start_stop(),
+ cmd([scripts(), "/rvi_create_certificate.py"
+ " --id=", UUID,
+ " --device_key=", KeyDir, "/dev_pub.pem",
+ " --start='", Start, "'"
+ " --stop='", Stop, "'"
+ " --root_key=", root_keys(), "/root_priv.pem"
+ " --register='jlr.com/vin/abc/unlock jlr.com/vin/abc/lock'"
+ " --invoke='jlr.com/backend/set_state'"
+ " --jwt_out=", CertDir, "/lock_cert.jwt"
+ " --cert_out=", KeyDir, "/lock_cert.json"]),
+ ok;
+generate_cert(backend, KeyDir, CertDir, Config) ->
+ UUID = uuid(),
+ {Start, Stop} = start_stop(),
+ cmd([scripts(), "/rvi_create_certificate.py"
+ " --id=", UUID,
+ " --device_key=", KeyDir, "/dev_pub.pem",
+ " --start='", Start, "'"
+ " --stop='", Stop, "'"
+ " --root_key=", root_keys(), "/root_priv.pem"
+ " --register='jlr.com'"
+ " --invoke='jlr.com'"
+ " --jwt_out=", CertDir, "/backend_cert.jwt"
+ " --cert_out=", KeyDir, "/backend_cert.json"]),
ok.
+start_stop() ->
+ DT = erlang:localtime(),
+ GS = calendar:datetime_to_gregorian_seconds(DT),
+ Start_GS = GS - 3600, % valid since one hour ago
+ Stop_GS = GS + 24*3600, % valid for the next 24 hrs
+ Start = calendar:gregorian_seconds_to_datetime(Start_GS),
+ Stop = calendar:gregorian_seconds_to_datetime(Stop_GS),
+ {fmt_date(Start), fmt_date(Stop)}.
+
+fmt_date({{Y,Mo,D}, {H,Mi,S}}) ->
+ io_lib:fwrite("~4..0w-~2..0w-~2..0w "
+ "~2..0w:~2..0w:~2..0w", [Y,Mo,D,H,Mi,S]).
+
ensure_dir(Dir) ->
ok = filelib:ensure_dir(filename:join(Dir, "foo")),
Dir.
@@ -145,9 +270,15 @@ root() ->
scripts() ->
[root(), "/scripts"].
+python() ->
+ [root(), "/python"].
+
root_keys() ->
"root_keys".
+service_edge("backend") -> "http://localhost:8801";
+service_edge("sample" ) -> "http://localhost:8901".
+
install_rvi_node(Name, Env, ConfigF) ->
Root = code:lib_dir(rvi_core),
Scripts = filename:join(Root, "scripts"),
@@ -227,3 +358,37 @@ save(Key, Data) ->
node_name(Name) ->
[_, Host] = re:split(atom_to_list(node()), "@", [{return, list}]),
list_to_atom(Name ++ "@" ++ Host).
+
+%% Copied from gsms_plivo.erl
+uuid() ->
+ %% For now, convert to list (TODO: shouldn't be necessary)
+ binary_to_list(uuid_()).
+
+uuid_() ->
+ %% https://en.wikipedia.org/wiki/Universally_unique_identifier
+ N = 4, M = 2, % version 4 - random bytes
+ <<A:48, _:4, B:12, _:2, C:62>> = crypto:rand_bytes(16),
+ UBin = <<A:48, N:4, B:12, M:2, C:62>>,
+ <<A1:8/binary, B1:4/binary, C1:4/binary, D1:4/binary, E1:12/binary>> =
+ << <<(hex(X)):8>> || <<X:4>> <= UBin >>,
+ <<A1:8/binary, "-",
+ B1:4/binary, "-",
+ C1:4/binary, "-",
+ D1:4/binary, "-",
+ E1:12/binary>>.
+
+hex(X) when X >= 0, X =< 9 ->
+ $0 + X;
+hex(X) when X >= 10, X =< 15 ->
+ $a + X - 10.
+
+
+json_rpc(URL, Method, Args) ->
+ Req = binary_to_list(
+ iolist_to_binary(
+ exo_json:encode({struct, [{"jsonrpc", "2.0"},
+ {"id", 1},
+ {"method", Method},
+ {"params", Args}]}))),
+ Hdrs = [{'Content-Type', "application/json"}],
+ exo_http:wpost(URL, {1,1}, Hdrs, Req, 1000).