diff options
author | Ulf Wiger <ulf@feuerlabs.com> | 2015-08-14 19:32:22 +0200 |
---|---|---|
committer | Ulf Wiger <ulf@feuerlabs.com> | 2015-08-14 19:32:22 +0200 |
commit | 2dd27e3c33de6c2b31e4cdc30a345b3c64e3040a (patch) | |
tree | 5620cfbed7605baa2c1325fbbc7ca56157164616 /test | |
parent | 54974ae9ead2200104cb35b5e34fff8030a06cc9 (diff) | |
download | rvi_core-2dd27e3c33de6c2b31e4cdc30a345b3c64e3040a.tar.gz |
added svc reg+call tests + bug fixes
Diffstat (limited to 'test')
-rw-r--r-- | test/config/backend.config | 3 | ||||
-rw-r--r-- | test/config/sample.config | 7 | ||||
-rw-r--r-- | test/rvi_core_SUITE.erl | 181 |
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). |