From 4ca6c1a49d6c06e01eac06dd5df996def23fb253 Mon Sep 17 00:00:00 2001 From: Lukas Larsson Date: Tue, 12 Oct 2010 11:01:24 +0200 Subject: Update jinterface tests to conform with common_test standard --- lib/jinterface/test/jinterface_SUITE.erl | 98 +++++++------------------------- lib/jinterface/test/nc_SUITE.erl | 39 +++++++------ 2 files changed, 38 insertions(+), 99 deletions(-) (limited to 'lib/jinterface') diff --git a/lib/jinterface/test/jinterface_SUITE.erl b/lib/jinterface/test/jinterface_SUITE.erl index ea097680dd..5c31469849 100644 --- a/lib/jinterface/test/jinterface_SUITE.erl +++ b/lib/jinterface/test/jinterface_SUITE.erl @@ -18,7 +18,7 @@ %% -module(jinterface_SUITE). --export([all/1, init_per_suite/1, end_per_suite/1, +-export([all/0,groups/0,init_per_group/2,end_per_group/2, init_per_suite/1, end_per_suite/1, init_per_testcase/2, end_per_testcase/2]). -export([nodename/1, register_and_whereis/1, get_names/1, boolean_atom/1, @@ -31,13 +31,13 @@ erl_link_java_exit/1, java_link_erl_exit/1, internal_link_linking_exits/1, internal_link_linked_exits/1, internal_unlink_linking_exits/1, internal_unlink_linked_exits/1, - normal_exit/1, kill_mbox/1, kill_erl_proc_from_java/1, - kill_mbox_from_erlang/1, erl_exit_with_reason_any_term/1, + normal_exit/1, kill_erl_proc_from_java/1, + erl_exit_with_reason_any_term/1, java_exit_with_reason_any_term/1, status_handler_localStatus/1, status_handler_remoteStatus/1, status_handler_connAttempt/1]). --include("test_server.hrl"). +-include_lib("common_test/include/ct.hrl"). -include("test_server_line.hrl"). -define(debug,true). @@ -80,14 +80,21 @@ %%%----------------------------------------------------------------- %%% INIT/END %%%----------------------------------------------------------------- -all(suite) -> - lists:append([ - fundamental(), - ping(), - send_receive(), - link_unlink(), - status_handler() - ]). +all() -> +lists:append([fundamental(), ping(), send_receive(), + link_unlink(), status_handler()]). + +groups() -> + [{kill_mbox, [], {skip, "Not yet implemented"}}, + {kill_mbox_from_erlang, [], + {skip, "Not yet implemented"}}]. + +init_per_group(_GroupName, Config) -> + Config. + +end_per_group(_GroupName, Config) -> + Config. + fundamental() -> [ @@ -476,59 +483,6 @@ normal_exit(Config) when is_list(Config) -> %%%----------------------------------------------------------------- -kill_mbox(doc) -> - ["MboxLinkUnlink.java: " - "Test that mbox.exit(new OtpErlangAtom(\"kill\") causes linked " - "processes to exit with reason 'killed', which can be trapped."]; -kill_mbox(suite) -> - {skip, "Not yet implemented"}; -kill_mbox(Config) when is_list(Config) -> - Fun = - fun() -> - register(erl_link_server,self()), - process_flag(trap_exit,true), - receive - {Main,Mbox} when is_pid(Main), is_pid(Mbox) -> - ?dbg("Erlang sending \"~p\"",[kill_mbox]), - Pid = spawn_link(fun() -> - process_flag(trap_exit,true), - link(Mbox), - Mbox ! {?kill_mbox}, - receive - {'EXIT',Mbox,killed} -> - exit(correct_reason); - {'EXIT',Mbox,R} -> - exit({faulty_reason,R}) - end - end), - receive - {'EXIT',Pid,{faulty_reason,Reason}} -> - receive done -> Main ! done end, - exit({faulty_reason,Reason}); - {'EXIT',Pid,im_killed} -> - receive done -> Main ! done end - after 1000 -> - receive - Other -> - ?dbg("Got garbage when waiting for exit:" - " ~p", [Other]), - Main ! done, - exit({got_unexpected,Other}) - after 0 -> - ok - end - end; - Other -> - ?dbg("Got garbage: ~p",[Other]), - exit(Other) - end - end, - - spawn_link(Fun), - ok = jitu:java(?config(java, Config), - ?config(data_dir, Config), - "MboxLinkUnlink", - [erlang:get_cookie(),node()]). %%%----------------------------------------------------------------- kill_erl_proc_from_java(doc) -> @@ -547,20 +501,6 @@ kill_erl_proc_from_java(Config) when is_list(Config) -> erl_java_link(LinkFun,kill_erl_proc_from_java,killed,Config). %%%----------------------------------------------------------------- -kill_mbox_from_erlang(doc) -> - ["MboxLinkUnlink.java: " - "Test that exit(Mbox,kill) causes linked the Mbox to be killed, and" - "linked processes to exit with reason 'killed', even if trapping exits"]; -kill_mbox_from_erlang(suite) -> - {skip, "Not yet implemented"}; -kill_mbox_from_erlang(Config) when is_list(Config) -> - LinkFun = fun(Mbox) -> - link(Mbox), - Mbox ! {?kill_mbox_from_erlang}, - exit(Mbox,kill), - receive after infinity -> ok end - end, - erl_java_link(LinkFun,kill_mbox_from_erlang,killed,Config). %%%----------------------------------------------------------------- erl_exit_with_reason_any_term(doc) -> diff --git a/lib/jinterface/test/nc_SUITE.erl b/lib/jinterface/test/nc_SUITE.erl index 82dd3c2535..a96b3495aa 100644 --- a/lib/jinterface/test/nc_SUITE.erl +++ b/lib/jinterface/test/nc_SUITE.erl @@ -19,11 +19,11 @@ -module(nc_SUITE). --include("test_server.hrl"). +-include_lib("common_test/include/ct.hrl"). -include("test_server_line.hrl"). --export([all/1, +-export([all/0,groups/0,init_per_group/2,end_per_group/2, init_per_suite/1, end_per_suite/1, init_per_testcase/2, @@ -50,24 +50,23 @@ %% Top of cases -all(doc) -> []; -all(suite) -> [pid_roundtrip, - port_roundtrip, - ref_roundtrip, - new_float, - old_stuff, - binary_roundtrip, - decompress_roundtrip, - compress_roundtrip, - integer_roundtrip, - fun_roundtrip, - lists_roundtrip, - lists_roundtrip_2, - lists_iterator, - unicode, - unicode_list_to_string, - unicode_string_to_list, - connect]. +all() -> +[pid_roundtrip, port_roundtrip, ref_roundtrip, + new_float, old_stuff, binary_roundtrip, + decompress_roundtrip, compress_roundtrip, + integer_roundtrip, fun_roundtrip, lists_roundtrip, + lists_roundtrip_2, lists_iterator, unicode, + unicode_list_to_string, unicode_string_to_list, connect]. + +groups() -> + []. + +init_per_group(_GroupName, Config) -> + Config. + +end_per_group(_GroupName, Config) -> + Config. + -- cgit v1.2.3 From 83f932257470f5ae01fc61130e997fdea0562653 Mon Sep 17 00:00:00 2001 From: Lukas Larsson Date: Mon, 6 Dec 2010 16:48:31 +0100 Subject: Add ts_install_scb to suite/0 --- lib/jinterface/test/jinterface_SUITE.erl | 4 +++- lib/jinterface/test/nc_SUITE.erl | 4 +++- 2 files changed, 6 insertions(+), 2 deletions(-) (limited to 'lib/jinterface') diff --git a/lib/jinterface/test/jinterface_SUITE.erl b/lib/jinterface/test/jinterface_SUITE.erl index 5c31469849..eff569a40e 100644 --- a/lib/jinterface/test/jinterface_SUITE.erl +++ b/lib/jinterface/test/jinterface_SUITE.erl @@ -18,7 +18,7 @@ %% -module(jinterface_SUITE). --export([all/0,groups/0,init_per_group/2,end_per_group/2, init_per_suite/1, end_per_suite/1, +-export([all/0, suite/0,groups/0,init_per_group/2,end_per_group/2, init_per_suite/1, end_per_suite/1, init_per_testcase/2, end_per_testcase/2]). -export([nodename/1, register_and_whereis/1, get_names/1, boolean_atom/1, @@ -80,6 +80,8 @@ %%%----------------------------------------------------------------- %%% INIT/END %%%----------------------------------------------------------------- +suite() -> [{suite_callbacks,[ts_install_scb]}]. + all() -> lists:append([fundamental(), ping(), send_receive(), link_unlink(), status_handler()]). diff --git a/lib/jinterface/test/nc_SUITE.erl b/lib/jinterface/test/nc_SUITE.erl index a96b3495aa..4b7ba1a437 100644 --- a/lib/jinterface/test/nc_SUITE.erl +++ b/lib/jinterface/test/nc_SUITE.erl @@ -23,7 +23,7 @@ -include("test_server_line.hrl"). --export([all/0,groups/0,init_per_group/2,end_per_group/2, +-export([all/0, suite/0,groups/0,init_per_group/2,end_per_group/2, init_per_suite/1, end_per_suite/1, init_per_testcase/2, @@ -50,6 +50,8 @@ %% Top of cases +suite() -> [{suite_callbacks,[ts_install_scb]}]. + all() -> [pid_roundtrip, port_roundtrip, ref_roundtrip, new_float, old_stuff, binary_roundtrip, -- cgit v1.2.3 From 892b9be5e72daeefd4af514f4c79d0b4c1863479 Mon Sep 17 00:00:00 2001 From: Lukas Larsson Date: Tue, 14 Dec 2010 16:02:14 +0100 Subject: Fix formatting for jinterface --- lib/jinterface/test/jinterface_SUITE.erl | 89 ++++++++++++++++++++++++++++---- lib/jinterface/test/nc_SUITE.erl | 16 +++--- 2 files changed, 88 insertions(+), 17 deletions(-) (limited to 'lib/jinterface') diff --git a/lib/jinterface/test/jinterface_SUITE.erl b/lib/jinterface/test/jinterface_SUITE.erl index eff569a40e..db33059af5 100644 --- a/lib/jinterface/test/jinterface_SUITE.erl +++ b/lib/jinterface/test/jinterface_SUITE.erl @@ -18,7 +18,8 @@ %% -module(jinterface_SUITE). --export([all/0, suite/0,groups/0,init_per_group/2,end_per_group/2, init_per_suite/1, end_per_suite/1, +-export([all/0, suite/0,groups/0,init_per_group/2,end_per_group/2, + init_per_suite/1, end_per_suite/1, init_per_testcase/2, end_per_testcase/2]). -export([nodename/1, register_and_whereis/1, get_names/1, boolean_atom/1, @@ -31,7 +32,8 @@ erl_link_java_exit/1, java_link_erl_exit/1, internal_link_linking_exits/1, internal_link_linked_exits/1, internal_unlink_linking_exits/1, internal_unlink_linked_exits/1, - normal_exit/1, kill_erl_proc_from_java/1, + normal_exit/1, kill_mbox/1,kill_erl_proc_from_java/1, + kill_mbox_from_erlang/1, erl_exit_with_reason_any_term/1, java_exit_with_reason_any_term/1, status_handler_localStatus/1, status_handler_remoteStatus/1, @@ -83,19 +85,17 @@ suite() -> [{suite_callbacks,[ts_install_scb]}]. all() -> -lists:append([fundamental(), ping(), send_receive(), - link_unlink(), status_handler()]). + lists:append([fundamental(), ping(), send_receive(), + link_unlink(), status_handler()]). groups() -> - [{kill_mbox, [], {skip, "Not yet implemented"}}, - {kill_mbox_from_erlang, [], - {skip, "Not yet implemented"}}]. + []. init_per_group(_GroupName, Config) -> - Config. + Config. end_per_group(_GroupName, Config) -> - Config. + Config. fundamental() -> @@ -168,6 +168,10 @@ init_per_suite(Config) when is_list(Config) -> end_per_suite(Config) when is_list(Config) -> jitu:finish_all(Config). +init_per_testcase(Case, _Config) + when Case =:= kill_mbox; + Case =:= kill_mbox_from_erlang -> + {skip, "Not yet implemented"}; init_per_testcase(_Case,Config) -> Dog = ?t:timetrap({seconds,10}), [{watch_dog,Dog}|Config]. @@ -485,6 +489,59 @@ normal_exit(Config) when is_list(Config) -> %%%----------------------------------------------------------------- +kill_mbox(doc) -> + ["MboxLinkUnlink.java: " + "Test that mbox.exit(new OtpErlangAtom(\"kill\") causes linked " + "processes to exit with reason 'killed', which can be trapped."]; +kill_mbox(suite) -> + {skip, "Not yet implemented"}; +kill_mbox(Config) when is_list(Config) -> + Fun = + fun() -> + register(erl_link_server,self()), + process_flag(trap_exit,true), + receive + {Main,Mbox} when is_pid(Main), is_pid(Mbox) -> + ?dbg("Erlang sending \"~p\"",[kill_mbox]), + Pid = spawn_link(fun() -> + process_flag(trap_exit,true), + link(Mbox), + Mbox ! {?kill_mbox}, + receive + {'EXIT',Mbox,killed} -> + exit(correct_reason); + {'EXIT',Mbox,R} -> + exit({faulty_reason,R}) + end + end), + receive + {'EXIT',Pid,{faulty_reason,Reason}} -> + receive done -> Main ! done end, + exit({faulty_reason,Reason}); + {'EXIT',Pid,im_killed} -> + receive done -> Main ! done end + after 1000 -> + receive + Other -> + ?dbg("Got garbage when waiting for exit:" + " ~p", [Other]), + Main ! done, + exit({got_unexpected,Other}) + after 0 -> + ok + end + end; + Other -> + ?dbg("Got garbage: ~p",[Other]), + exit(Other) + end + end, + + spawn_link(Fun), + ok = jitu:java(?config(java, Config), + ?config(data_dir, Config), + "MboxLinkUnlink", + [erlang:get_cookie(),node()]). %%%----------------------------------------------------------------- kill_erl_proc_from_java(doc) -> @@ -503,6 +560,20 @@ kill_erl_proc_from_java(Config) when is_list(Config) -> erl_java_link(LinkFun,kill_erl_proc_from_java,killed,Config). %%%----------------------------------------------------------------- +kill_mbox_from_erlang(doc) -> + ["MboxLinkUnlink.java: " + "Test that exit(Mbox,kill) causes linked the Mbox to be killed, and" + "linked processes to exit with reason 'killed', even if trapping exits"]; +kill_mbox_from_erlang(suite) -> + {skip, "Not yet implemented"}; +kill_mbox_from_erlang(Config) when is_list(Config) -> + LinkFun = fun(Mbox) -> + link(Mbox), + Mbox ! {?kill_mbox_from_erlang}, + exit(Mbox,kill), + receive after infinity -> ok end + end, + erl_java_link(LinkFun,kill_mbox_from_erlang,killed,Config). %%%----------------------------------------------------------------- erl_exit_with_reason_any_term(doc) -> diff --git a/lib/jinterface/test/nc_SUITE.erl b/lib/jinterface/test/nc_SUITE.erl index 4b7ba1a437..fde2fd5071 100644 --- a/lib/jinterface/test/nc_SUITE.erl +++ b/lib/jinterface/test/nc_SUITE.erl @@ -53,21 +53,21 @@ suite() -> [{suite_callbacks,[ts_install_scb]}]. all() -> -[pid_roundtrip, port_roundtrip, ref_roundtrip, - new_float, old_stuff, binary_roundtrip, - decompress_roundtrip, compress_roundtrip, - integer_roundtrip, fun_roundtrip, lists_roundtrip, - lists_roundtrip_2, lists_iterator, unicode, - unicode_list_to_string, unicode_string_to_list, connect]. + [pid_roundtrip, port_roundtrip, ref_roundtrip, + new_float, old_stuff, binary_roundtrip, + decompress_roundtrip, compress_roundtrip, + integer_roundtrip, fun_roundtrip, lists_roundtrip, + lists_roundtrip_2, lists_iterator, unicode, + unicode_list_to_string, unicode_string_to_list, connect]. groups() -> []. init_per_group(_GroupName, Config) -> - Config. + Config. end_per_group(_GroupName, Config) -> - Config. + Config. -- cgit v1.2.3 From 5fef403779c4894189abf6fd18e6c8e5d54064c5 Mon Sep 17 00:00:00 2001 From: Lukas Larsson Date: Tue, 7 Dec 2010 17:52:12 +0100 Subject: Update all test specs --- lib/jinterface/test/Makefile | 2 +- lib/jinterface/test/jinterface.dynspec | 32 -------------------------------- lib/jinterface/test/jinterface.spec | 20 ++++++++++++++++++++ lib/jinterface/test/jinterface_SUITE.erl | 9 ++++++++- lib/jinterface/test/nc_SUITE.erl | 13 ++++++++----- 5 files changed, 37 insertions(+), 39 deletions(-) delete mode 100644 lib/jinterface/test/jinterface.dynspec create mode 100644 lib/jinterface/test/jinterface.spec (limited to 'lib/jinterface') diff --git a/lib/jinterface/test/Makefile b/lib/jinterface/test/Makefile index 36955d1e91..b2ddffea42 100644 --- a/lib/jinterface/test/Makefile +++ b/lib/jinterface/test/Makefile @@ -32,7 +32,7 @@ RELSYSDIR = $(RELEASE_PATH)/jinterface_test # ---------------------------------------------------- # Target Specs # ---------------------------------------------------- -TEST_SPEC_FILE = jinterface.dynspec +TEST_SPEC_FILE = jinterface.spec MODULES = nc_SUITE \ jinterface_SUITE diff --git a/lib/jinterface/test/jinterface.dynspec b/lib/jinterface/test/jinterface.dynspec deleted file mode 100644 index 44712521df..0000000000 --- a/lib/jinterface/test/jinterface.dynspec +++ /dev/null @@ -1,32 +0,0 @@ -%% -*- erlang -*- -%% -%% %CopyrightBegin% -%% -%% Copyright Ericsson AB 2006-2010. All Rights Reserved. -%% -%% The contents of this file are subject to the Erlang Public License, -%% Version 1.1, (the "License"); you may not use this file except in -%% compliance with the License. You should have received a copy of the -%% Erlang Public License along with this software. If not, it can be -%% retrieved online at http://www.erlang.org/. -%% -%% Software distributed under the License is distributed on an "AS IS" -%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See -%% the License for the specific language governing rights and limitations -%% under the License. -%% -%% %CopyrightEnd% -%% -%% You can test this file using this command. -%% file:script("jinterface.dynspec", [{'Os',"Unix"}]). - -case case code:priv_dir(jinterface) of - {error,bad_name} -> false; - P -> filelib:is_dir(P) end of - true -> - []; - false -> - NoApp = "No jinterface application", - [{skip,{nc_SUITE,NoApp}}, - {skip,{jinterface_SUITE,NoApp}}] -end. diff --git a/lib/jinterface/test/jinterface.spec b/lib/jinterface/test/jinterface.spec new file mode 100644 index 0000000000..99bc0f4005 --- /dev/null +++ b/lib/jinterface/test/jinterface.spec @@ -0,0 +1,20 @@ +%% -*- erlang -*- +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 2006-2010. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% +{suites,"../jinterface_test",all}. diff --git a/lib/jinterface/test/jinterface_SUITE.erl b/lib/jinterface/test/jinterface_SUITE.erl index db33059af5..b42101908e 100644 --- a/lib/jinterface/test/jinterface_SUITE.erl +++ b/lib/jinterface/test/jinterface_SUITE.erl @@ -163,7 +163,14 @@ status_handler() -> init_per_suite(Config) when is_list(Config) -> - jitu:init_all(Config). + case case code:priv_dir(jinterface) of + {error,bad_name} -> false; + P -> filelib:is_dir(P) end of + true -> + jitu:init_all(Config); + false -> + {skip,"No jinterface application"} + end. end_per_suite(Config) when is_list(Config) -> jitu:finish_all(Config). diff --git a/lib/jinterface/test/nc_SUITE.erl b/lib/jinterface/test/nc_SUITE.erl index fde2fd5071..f9a588f32c 100644 --- a/lib/jinterface/test/nc_SUITE.erl +++ b/lib/jinterface/test/nc_SUITE.erl @@ -69,12 +69,15 @@ init_per_group(_GroupName, Config) -> end_per_group(_GroupName, Config) -> Config. - - - - init_per_suite(Config) when is_list(Config) -> - jitu:init_all(Config). + case case code:priv_dir(jinterface) of + {error,bad_name} -> false; + P -> filelib:is_dir(P) end of + true -> + jitu:init_all(Config); + false -> + {skip,"No jinterface application"} + end. end_per_suite(Config) -> jitu:finish_all(Config). -- cgit v1.2.3 From cfa01c9bd748df38750dc4841030e6520610538a Mon Sep 17 00:00:00 2001 From: Lukas Larsson Date: Wed, 12 Jan 2011 14:56:23 +0100 Subject: Update and add cover spec files to work with common_test --- lib/jinterface/test/Makefile | 3 ++- lib/jinterface/test/jinterface.cover | 2 ++ 2 files changed, 4 insertions(+), 1 deletion(-) create mode 100644 lib/jinterface/test/jinterface.cover (limited to 'lib/jinterface') diff --git a/lib/jinterface/test/Makefile b/lib/jinterface/test/Makefile index b2ddffea42..ac9556c2f7 100644 --- a/lib/jinterface/test/Makefile +++ b/lib/jinterface/test/Makefile @@ -33,6 +33,7 @@ RELSYSDIR = $(RELEASE_PATH)/jinterface_test # Target Specs # ---------------------------------------------------- TEST_SPEC_FILE = jinterface.spec +COVER_FILE = jinterface.cover MODULES = nc_SUITE \ jinterface_SUITE @@ -80,5 +81,5 @@ release_docs_spec: release_tests_spec: tests $(INSTALL_DIR) $(RELSYSDIR) - $(INSTALL_DATA) $(TEST_SPEC_FILE) $(ERL_FILES) $(RELSYSDIR) + $(INSTALL_DATA) $(TEST_SPEC_FILE) $(COVER_FILE) $(ERL_FILES) $(RELSYSDIR) @tar cf - *_SUITE_data | (cd $(RELSYSDIR); tar xf -) diff --git a/lib/jinterface/test/jinterface.cover b/lib/jinterface/test/jinterface.cover new file mode 100644 index 0000000000..d4edcd99d2 --- /dev/null +++ b/lib/jinterface/test/jinterface.cover @@ -0,0 +1,2 @@ +{incl_app,jinterface,details}. + -- cgit v1.2.3 From 308d6638450f5ffc7f432302367e84bcd92ea683 Mon Sep 17 00:00:00 2001 From: Lukas Larsson Date: Wed, 9 Feb 2011 19:10:44 +0100 Subject: Rename Suite Callback to Common Test Hook --- lib/jinterface/test/jinterface_SUITE.erl | 2 +- lib/jinterface/test/nc_SUITE.erl | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) (limited to 'lib/jinterface') diff --git a/lib/jinterface/test/jinterface_SUITE.erl b/lib/jinterface/test/jinterface_SUITE.erl index b42101908e..e608bcb093 100644 --- a/lib/jinterface/test/jinterface_SUITE.erl +++ b/lib/jinterface/test/jinterface_SUITE.erl @@ -82,7 +82,7 @@ %%%----------------------------------------------------------------- %%% INIT/END %%%----------------------------------------------------------------- -suite() -> [{suite_callbacks,[ts_install_scb]}]. +suite() -> [{ct_hooks,[ts_install_cth]}]. all() -> lists:append([fundamental(), ping(), send_receive(), diff --git a/lib/jinterface/test/nc_SUITE.erl b/lib/jinterface/test/nc_SUITE.erl index f9a588f32c..03f6f2036c 100644 --- a/lib/jinterface/test/nc_SUITE.erl +++ b/lib/jinterface/test/nc_SUITE.erl @@ -50,7 +50,7 @@ %% Top of cases -suite() -> [{suite_callbacks,[ts_install_scb]}]. +suite() -> [{ct_hooks,[ts_install_cth]}]. all() -> [pid_roundtrip, port_roundtrip, ref_roundtrip, -- cgit v1.2.3