summaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
authorUlf Wiger <ulf@feuerlabs.com>2016-01-12 08:17:30 -0800
committerUlf Wiger <ulf@feuerlabs.com>2016-01-12 08:22:36 -0800
commit37dd6cef3e8abdee0829aabf121a2ca5dd35b14e (patch)
treeb7174d0d66f2db6f9a0d724213ad19e427e22847 /test
parent7922125aba23033945e3b55a4bf78ef8e84521d0 (diff)
downloadrvi_core-37dd6cef3e8abdee0829aabf121a2ca5dd35b14e.tar.gz
fragmentation tests
Diffstat (limited to 'test')
-rw-r--r--test/rvi_core_SUITE.erl196
1 files changed, 194 insertions, 2 deletions
diff --git a/test/rvi_core_SUITE.erl b/test/rvi_core_SUITE.erl
index 79281e2..b907584 100644
--- a/test/rvi_core_SUITE.erl
+++ b/test/rvi_core_SUITE.erl
@@ -33,11 +33,16 @@
t_start_tlsj_backend/1,
t_start_tlsj_sample/1,
t_register_lock_service/1,
+ t_register_sota_service/1,
t_call_lock_service/1,
+ t_call_sota_service/1,
t_remote_call_lock_service/1,
+ t_check_rvi_log/1,
t_no_errors/1
]).
+-export([handle_body/4]).
+
-include_lib("common_test/include/ct.hrl").
-include_lib("kernel/include/file.hrl").
@@ -76,7 +81,9 @@ groups() ->
t_start_basic_backend,
t_start_basic_sample,
t_register_lock_service,
+ t_register_sota_service,
t_call_lock_service,
+ t_call_sota_service,
t_remote_call_lock_service,
t_no_errors
]},
@@ -85,8 +92,11 @@ groups() ->
t_start_tls_backend,
t_start_tls_sample,
t_register_lock_service,
+ t_register_sota_service,
t_call_lock_service,
t_remote_call_lock_service,
+ t_call_sota_service,
+ t_check_rvi_log,
t_no_errors
]},
{test_run_tlsj, [],
@@ -94,7 +104,9 @@ groups() ->
t_start_tlsj_backend,
t_start_tlsj_sample,
t_register_lock_service,
+ t_register_sota_service,
t_call_lock_service,
+ t_call_sota_service,
t_remote_call_lock_service,
t_no_errors
]},
@@ -103,7 +115,9 @@ groups() ->
t_start_bt_backend,
t_start_bt_sample,
t_register_lock_service,
+ t_register_sota_service,
t_call_lock_service,
+ t_call_sota_service,
t_remote_call_lock_service,
t_no_errors
]}
@@ -144,6 +158,7 @@ end_per_group(test_install, _) ->
ok;
end_per_group(_, _) ->
stop_nodes(),
+ stop_services(),
ok.
init_per_testcase(Case, Config) ->
@@ -166,13 +181,17 @@ t_backend_keys_and_cert(Config) ->
" -key ", RootKeyDir, "/root_key.pem",
" -days 365 -out ", RootKeyDir, "/root_cert.crt"]),
Dir = ensure_dir("basic_backend_keys"),
+ CredDir = ensure_dir("basic_backend_creds"),
generate_device_keys(Dir, Config),
- generate_cred(backend, Dir, ensure_dir("basic_backend_creds"), Config).
+ generate_cred(backend, Dir, CredDir, Config),
+ generate_sota_cred(backend, Dir, CredDir, Config).
t_sample_keys_and_cert(Config) ->
Dir = ensure_dir("basic_sample_keys"),
generate_device_keys(Dir, Config),
- generate_cred(sample, Dir, ensure_dir("basic_sample_creds"), Config).
+ CredDir = ensure_dir("basic_sample_creds"),
+ generate_cred(sample, Dir, CredDir, Config),
+ generate_sota_cred(sample, Dir, CredDir, Config).
t_install_backend_node(_Config) ->
install_rvi_node("basic_backend", env(),
@@ -255,6 +274,41 @@ t_register_lock_service(_Config) ->
save({service, lock}, Pid),
timer:sleep(2000).
+t_register_sota_service(_Config) ->
+ Pid = start_json_rpc_server(9987),
+ reg_service_request("sample", <<"sota">>, <<"http://localhost:9987">>),
+ save({service, sota}, Pid),
+ timer:sleep(2000).
+
+t_call_sota_service(_Config) ->
+ {Mega, Secs, _} = os:timestamp(),
+ Timeout = Mega * 1000000 + Secs + 60,
+ register(sota_client, self()),
+ Data = sota_bin(),
+ json_rpc_request(service_edge("backend"),
+ <<"message">>,
+ [
+ {<<"service_name">>, <<"jlr.com/vin/abc/sota">>},
+ {<<"timeout">>, Timeout},
+ {<<"parameters">>,
+ [
+ {<<"data">>, Data},
+ {<<"sendto">>, <<"sota_client">>},
+ {<<"rvi.max_msg_size">>, 100}
+ ]}
+ ]),
+ receive
+ {message, [{service_name, <<"/sota">>},
+ {data, Data}]} = Res ->
+ ct:log("got json_rpc_result: ~p", [Res]),
+ ok;
+ {message, Other} ->
+ ct:log("wrong message: ~p", [Other]),
+ error({unmatched, Other})
+ after 10000 ->
+ error(timeout)
+ end.
+
t_call_lock_service(_Config) ->
CallPid = spawn_cmd(
[python(),
@@ -284,6 +338,100 @@ t_remote_call_lock_service(_Config) ->
verify_call_res(join_stdout_msgs(CallRes)),
ct:log("CallRes = ~p~n", [CallRes]).
+t_check_rvi_log(_Config) ->
+ [URLb, URLs] = [rvi_log_addr(Node) || Node <- ["backend", "sample"]],
+ {Method, Args} = {<<"fetch">>, [{<<"tid">>, <<".*">>}]},
+ Logs =
+ [{URL, unwrap_log(
+ json_rpc_request(URL, Method, Args))}
+ || URL <- [URLb, URLs]],
+ ct:log("Logs = ~p", [Logs]),
+ ok.
+
+unwrap_log(Res) ->
+ {_, R} = lists:keyfind(<<"result">>, 1, Res),
+ {_, 0} = lists:keyfind(<<"status">>, 1, R),
+ {_, L} = lists:keyfind(<<"log">>, 1, R),
+ lists:flatmap(
+ fun({Id, Es}) ->
+ [unwrap_event(Id, E) || E <- Es]
+ end, L).
+
+unwrap_event(Id, [{<<"ts">>,T},{<<"lvl">>,L},{<<"cmp">>,C},{<<"evt">>,E}]) ->
+ {Id, T, binary_to_integer(L), C, E}.
+
+json_rpc_request(URL, Method, Args) ->
+ Req = jsx:encode([{<<"jsonrpc">>, <<"2.0">>},
+ {<<"id">>, 1},
+ {<<"method">>, Method},
+ {<<"params">>, Args}]),
+ Hdrs = [{'Content-Type', "application/json"}],
+ json_result(exo_http:wpost(URL, {1, 1}, Hdrs, Req, 1000)).
+
+reg_service_request(Node, Svc, URL) ->
+ check_reg_svc_response(
+ json_rpc_request(service_edge(Node),
+ <<"register_service">>,
+ [{<<"service">>, Svc},
+ {<<"network_address">>, URL}])).
+
+check_reg_svc_response(JSON) ->
+ ct:log("check_reg_svc: ~p", [JSON]),
+ {_, Res} = lists:keyfind(<<"result">>, 1, JSON),
+ {_, 0} = lists:keyfind(<<"status">>, 1, Res),
+ ok.
+
+sota_bin() ->
+ <<"11111111111111111111111111111111111111111111111111"
+ "22222222222222222222222222222222222222222222222222"
+ "33333333333333333333333333333333333333333333333333"
+ "44444444444444444444444444444444444444444444444444"
+ "55555555555555555555555555555555555555555555555555"
+ "66666666666666666666666666666666666666666666666666"
+ "77777777777777777777777777777777777777777777777777"
+ "88888888888888888888888888888888888888888888888888"
+ "99999999999999999999999999999999999999999999999999"
+ "00000000000000000000000000000000000000000000000000">>.
+
+json_result({ok, {http_response, {_V1, _V2}, 200, _Text, _Hdr}, JSON}) ->
+ jsx:decode(JSON).
+
+start_json_rpc_server(Port) ->
+ {ok, Pid} = exo_http_server:start(Port, [{request_handler,
+ {?MODULE, handle_body, [foo]}}]),
+ save({server,Port}, Pid),
+ Pid.
+
+handle_body(Socket, Request, Body, St) ->
+ JSON = jsx:decode(Body),
+ ct:log("Got JSON Req: ~p", [JSON]),
+ case JSON of
+ [{<<"jsonrpc">>, <<"2.0">>},
+ {<<"id">>, ID},
+ {<<"method">>, <<"message">>},
+ {<<"params">>,
+ [{<<"service_name">>, SvcName},
+ {<<"parameters">>,
+ [ {<<"data">>, Data},
+ {<<"sendto">>, SendTo},
+ {<<"rvi.max_msg_size">>, _}]}
+ ]}] ->
+ binary_to_existing_atom(SendTo, latin1)
+ ! {message, [{service_name, SvcName},
+ {data, Data}]},
+ Reply = [{<<"jsonrpc">>, <<"2.0">>},
+ {<<"id">>, ID},
+ {<<"result">>, <<"ok">>}],
+ exo_http_server:response(
+ Socket, undefined, 200, "OK",
+ jsx:encode(Reply),
+ [{'content_type', "application/json"}]);
+ Other ->
+ exo_http_server:response(
+ Socket, undefined, 501, "Internal Error", "Internal Error"),
+ error({unrecognized, Other})
+ end.
+
verify_service_res(Bin) ->
{match,_} =
re:run(Bin, <<"Service:[\\h]*jlr.com/vin/abc/lock">>, []),
@@ -433,6 +581,39 @@ generate_cred(backend, KeyDir, CertDir, _Config) ->
" --cred_out=", KeyDir, "/backend_cred.json"]),
ok.
+generate_sota_cred(sample, KeyDir, CredDir, _Config) ->
+ %% Don't put sota_cred.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_credential.py"
+ " --id=", UUID,
+ " --issuer=GENIVI"
+ " --device_cert=", KeyDir, "/device_cert.crt",
+ " --start='", Start, "'"
+ " --stop='", Stop, "'"
+ " --root_key=", root_keys(), "/root_key.pem"
+ " --register='jlr.com/vin/abc/store'"
+ " --invoke='jlr.com/backend/set_state'"
+ " --jwt_out=", CredDir, "/sota_cred.jwt"
+ " --cred_out=", KeyDir, "/sota_cred.json"]),
+ ok;
+generate_sota_cred(backend, KeyDir, CertDir, _Config) ->
+ UUID = uuid(),
+ {Start, Stop} = start_stop(),
+ cmd([scripts(), "/rvi_create_credential.py"
+ " --id=", UUID,
+ " --issuer=GENIVI"
+ " --device_cert=", KeyDir, "/device_cert.crt",
+ " --start='", Start, "'"
+ " --stop='", Stop, "'"
+ " --root_key=", root_keys(), "/root_key.pem"
+ " --register='jlr.com'"
+ " --invoke='jlr.com'"
+ " --jwt_out=", CertDir, "/sota_backend_cred.jwt"
+ " --cred_out=", KeyDir, "/sota_backend_cred.json"]),
+ ok.
+
subj() ->
"/C=US/ST=OR/O=JLR/localityName=Portland/organizationalUnitName=Ostc".
@@ -473,6 +654,9 @@ root_keys() ->
service_edge("backend") -> "http://localhost:8801";
service_edge("sample" ) -> "http://localhost:9001".
+rvi_log_addr("backend") -> "http://localhost:8809";
+rvi_log_addr("sample" ) -> "http://localhost:9009".
+
install_rvi_node(Name, Env, _ConfigF) ->
Root = code:lib_dir(rvi_core),
Scripts = filename:join(Root, "scripts"),
@@ -582,6 +766,14 @@ stop_nodes() ->
[verify_killed(cmd_(["kill -9 ", P], [])) || {_,P} <- Nodes],
[delete_node(N) || {N,_} <- Nodes].
+stop_services() ->
+ Services =
+ ets:select(?DATA, [{ {{service,'_'},'_'}, [], ['$_'] },
+ { {{server,'_'},'_'}, [], ['$_'] }]),
+ ct:log("Stopping services: ~p~n", [Services]),
+ [exit(Pid, shutdown) || {_, Pid} <- Services],
+ ok.
+
delete_node(N) ->
ct:log("delete_node(~p)", [N]),
ets:delete(?DATA, {N, pid}).