File 9334-Remove-the-old-test-framework.patch of Package erlang
From 46cdb1f5b20a3522bffe392efaaf629645ef9ef5 Mon Sep 17 00:00:00 2001
From: Raimo Niskanen <raimo@erlang.org>
Date: Mon, 23 Feb 2026 17:27:36 +0100
Subject: [PATCH 4/4] Remove the old test framework
---
lib/tftp/test/tftp_SUITE.erl | 468 ++++++++++++++++----------------
lib/tftp/test/tftp_test_lib.erl | 266 +-----------------
lib/tftp/test/tftp_test_lib.hrl | 33 +--
3 files changed, 256 insertions(+), 511 deletions(-)
diff --git a/lib/tftp/test/tftp_SUITE.erl b/lib/tftp/test/tftp_SUITE.erl
index 5b14c52734..d0581e2a65 100644
--- a/lib/tftp/test/tftp_SUITE.erl
+++ b/lib/tftp/test/tftp_SUITE.erl
@@ -33,38 +33,25 @@
-define(START_DAEMON(Options),
begin
- {{ok, Pid}} = ?VERIFY({ok, _Pid}, tftp:start([{port, 0} | Options])),
- {{ok, ActualOptions}} = ?IGNORE(tftp:info(Pid)),
+ {{ok, Pid}} = ?TRY(tftp:start([{port, 0} | Options])),
+ {{ok, ActualOptions}} = ?TRY(tftp:info(Pid)),
{value, {port, ActualPort}} =
lists:keysearch(port, 1, ActualOptions),
{ActualPort, Pid}
end).
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%% API
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-
-t() ->
- tftp_test_lib:t([{?MODULE, all}]).
-
-t(Cases) ->
- tftp_test_lib:t(Cases, default_config()).
-
-t(Cases, Config) ->
- tftp_test_lib:t(Cases, Config).
-
-default_config() ->
- [].
-
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Test server callbacks
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
init_per_testcase(Case, Config) ->
- tftp_test_lib:init_per_testcase(Case, Config).
+ io:format("\n ", []),
+ ?TRY(application:stop(tftp)),
+ Config.
end_per_testcase(Case, Config) when is_list(Config) ->
- tftp_test_lib:end_per_testcase(Case, Config).
+ ?TRY(application:stop(tftp)),
+ Config.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Top test case
@@ -122,9 +109,9 @@ simple(doc) ->
simple(suite) ->
[];
simple(Config) when is_list(Config) ->
- ?VERIFY(ok, application:start(tftp)),
+ {ok} = ?TRY(application:start(tftp)),
- {{Port, DaemonPid}} = ?IGNORE(?START_DAEMON([{debug, brief}])),
+ {{Port, DaemonPid}} = ?TRY(?START_DAEMON([{debug, brief}])),
%% Read fail
RemoteFilename = "tftp_temporary_remote_test_file.txt",
@@ -132,22 +119,22 @@ simple(Config) when is_list(Config) ->
Blob = list_to_binary(lists:duplicate(2000, $1)),
%% Blob = <<"Some file contents\n">>,
Size = size(Blob),
- ?IGNORE(file:delete(RemoteFilename)),
- ?VERIFY({error, {client_open, enoent, _}},
- tftp:read_file(RemoteFilename, binary, [{port, Port}])),
-
+ ?TRY(file:delete(RemoteFilename)),
+ {{error, {client_open, enoent, _}}} =
+ ?TRY(tftp:read_file(RemoteFilename, binary, [{port, Port}])),
+
%% Write and read
- ?VERIFY({ok, Size}, tftp:write_file(RemoteFilename, Blob, [{port, Port}])),
- ?VERIFY({ok, Blob}, tftp:read_file(RemoteFilename, binary, [{port, Port}])),
- ?IGNORE(file:delete(LocalFilename)),
- ?VERIFY({ok, Size}, tftp:read_file(RemoteFilename, LocalFilename, [{port, Port}])),
+ {{ok, Size}} = ?TRY(tftp:write_file(RemoteFilename, Blob, [{port, Port}])),
+ {{ok, Blob}} = ?TRY(tftp:read_file(RemoteFilename, binary, [{port, Port}])),
+ ?TRY(file:delete(LocalFilename)),
+ {{ok, Size}} = ?TRY(tftp:read_file(RemoteFilename, LocalFilename, [{port, Port}])),
%% Cleanup
unlink(DaemonPid),
exit(DaemonPid, kill),
- ?VERIFY(ok, file:delete(LocalFilename)),
- ?VERIFY(ok, file:delete(RemoteFilename)),
- ?VERIFY(ok, application:stop(tftp)),
+ {ok} = ?TRY(file:delete(LocalFilename)),
+ {ok} = ?TRY(file:delete(RemoteFilename)),
+ {ok} = ?TRY(application:stop(tftp)),
ok.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -159,7 +146,7 @@ root_dir(doc) ->
root_dir(suite) ->
[];
root_dir(Config) when is_list(Config) ->
- ?VERIFY(ok, application:start(tftp)),
+ {ok} = ?TRY(application:start(tftp)),
PrivDir = get_conf(priv_dir, Config),
Root = hd(filename:split(PrivDir)),
Up = "..",
@@ -167,52 +154,52 @@ root_dir(Config) when is_list(Config) ->
Local = "tftp_temporary_local_test_file.txt",
SideDir = fn_jn(PrivDir,tftp_side),
RootDir = fn_jn(PrivDir,tftp_root),
- ?IGNORE(file:del_dir_r(RootDir)),
- ?IGNORE(file:del_dir_r(SideDir)),
+ ?TRY(file:del_dir_r(RootDir)),
+ ?TRY(file:del_dir_r(SideDir)),
ok = filelib:ensure_path(fn_jn(RootDir,sub)),
ok = filelib:ensure_path(SideDir),
Blob = binary:copy(<<$1>>, 2000),
Size = byte_size(Blob),
ok = file:write_file(fn_jn(SideDir,Remote), Blob),
{{Port, DaemonPid}} =
- ?IGNORE(?START_DAEMON([{debug, brief},
- {callback,
- {"", tftp_file, [{root_dir, RootDir}]}}])),
+ ?TRY(?START_DAEMON([{debug, brief},
+ {callback,
+ {"", tftp_file, [{root_dir, RootDir}]}}])),
try
%% Outside root_dir
- ?VERIFY({error, {client_open, badop, _}},
- tftp:read_file(
+ {{error, {client_open, badop, _}}} =
+ ?TRY(tftp:read_file(
fn_jn([Up,tftp_side,Remote]), binary, [{port, Port}])),
- ?VERIFY({error, {client_open, badop, _}},
- tftp:write_file(
- fn_jn([Up,tftp_side,Remote]), Blob, [{port, Port}])),
+ {{error, {client_open, badop, _}}} =
+ ?TRY(tftp:write_file(
+ fn_jn([Up,tftp_side,Remote]), Blob, [{port, Port}])),
%% Nonexistent
- ?VERIFY({error, {client_open, enoent, _}},
- tftp:read_file(
+ {{error, {client_open, enoent, _}}} =
+ ?TRY(tftp:read_file(
fn_jn(sub,Remote), binary, [{port, Port}])),
- ?VERIFY({error, {client_open, enoent, _}},
- tftp:write_file(
- fn_jn(nonexistent,Remote), Blob, [{port, Port}])),
+ {{error, {client_open, enoent, _}}} =
+ ?TRY(tftp:write_file(
+ fn_jn(nonexistent,Remote), Blob, [{port, Port}])),
%% Write and read
- ?VERIFY({ok, Size},
- tftp:write_file(
- fn_jn(sub,Remote), Blob, [{port, Port}])),
- ?VERIFY({ok, Blob},
- tftp:read_file(
- fn_jn([Root,sub,Remote]), binary, [{port, Port}])),
- ?VERIFY({ok, Size},
- tftp:read_file(
- fn_jn(sub,Remote), Local, [{port, Port}])),
- ?VERIFY({ok, Blob}, file:read_file(Local)),
- ?VERIFY(ok, file:delete(Local)),
- ?VERIFY(ok, application:stop(tftp))
+ {{ok, Size}} =
+ ?TRY(tftp:write_file(
+ fn_jn(sub,Remote), Blob, [{port, Port}])),
+ {{ok, Blob}} =
+ ?TRY(tftp:read_file(
+ fn_jn([Root,sub,Remote]), binary, [{port, Port}])),
+ {{ok, Size}} =
+ ?TRY(tftp:read_file(
+ fn_jn(sub,Remote), Local, [{port, Port}])),
+ {{ok, Blob}} = ?TRY(file:read_file(Local)),
+ {ok} = ?TRY(file:delete(Local)),
+ {ok} = ?TRY(application:stop(tftp))
after
%% Cleanup
unlink(DaemonPid),
exit(DaemonPid, kill),
- ?IGNORE(file:del_dir_r(SideDir)),
- ?IGNORE(file:del_dir_r(RootDir)),
- ?IGNORE(application:stop(tftp))
+ ?TRY(file:del_dir_r(SideDir)),
+ ?TRY(file:del_dir_r(RootDir)),
+ ?TRY(application:stop(tftp))
end,
ok.
@@ -226,10 +213,10 @@ extra(doc) ->
extra(suite) ->
[];
extra(Config) when is_list(Config) ->
- ?VERIFY(exit, {badarg,{fake_key, fake_flag}},
- tftp:start([{port, 0}, {fake_key, fake_flag}])),
+ {'EXIT', {badarg,{fake_key, fake_flag}}} =
+ ?TRY(tftp:start([{port, 0}, {fake_key, fake_flag}])),
- {{Port, DaemonPid}} = ?IGNORE(?START_DAEMON([{debug, brief}])),
+ {{Port, DaemonPid}} = ?TRY(?START_DAEMON([{debug, brief}])),
RemoteFilename = "tftp_extra_temporary_remote_test_file.txt",
LocalFilename = "tftp_extra_temporary_local_test_file.txt",
@@ -250,19 +237,19 @@ extra(Config) when is_list(Config) ->
{port, Port},
%%{ debug,all},
{callback, {".*", tftp_test_lib, Generic}}],
- ?VERIFY(ok, file:write_file(LocalFilename, Blob)),
- ?VERIFY({ok, [{count, Size}, Peer]},
- tftp:write_file(RemoteFilename, LocalFilename, Options)),
- ?VERIFY(ok, file:delete(LocalFilename)),
-
- ?VERIFY({ok,[{bin, Blob}, Peer]},
- tftp:read_file(RemoteFilename, LocalFilename, Options)),
+ {ok} = ?TRY(file:write_file(LocalFilename, Blob)),
+ {{ok, [{count, Size}, Peer]}} =
+ ?TRY(tftp:write_file(RemoteFilename, LocalFilename, Options)),
+ {ok} = ?TRY(file:delete(LocalFilename)),
+
+ {{ok,[{bin, Blob}, Peer]}} =
+ ?TRY(tftp:read_file(RemoteFilename, LocalFilename, Options)),
%% Cleanup
unlink(DaemonPid),
exit(DaemonPid, kill),
- ?VERIFY(ok, file:delete(LocalFilename)),
- ?VERIFY(ok, file:delete(RemoteFilename)),
+ {ok} = ?TRY(file:delete(LocalFilename)),
+ {ok} = ?TRY(file:delete(RemoteFilename)),
ok.
-record(extra_state, {file, blksize, count, acc, peer}).
@@ -305,7 +292,7 @@ extra_open(_Peer, Access, LocalFilename, _Mode, NegotiatedOptions, #extra_state{
{ok, Bin} = file:read_file(LocalFilename),
{LocalFilename, Bin}
end;
- write ->
+ write ->
{LocalFilename, []}
end,
%% Both sides
@@ -363,7 +350,7 @@ resend_client(suite) ->
[];
resend_client(Config) when is_list(Config) ->
Host = {127, 0, 0, 1},
- {{Port, DaemonPid}} = ?IGNORE(?START_DAEMON([{debug, all}])),
+ {{Port, DaemonPid}} = ?TRY(?START_DAEMON([{debug, all}])),
try
@@ -391,13 +378,13 @@ resend_read_client(Host, Port, BlkSize) ->
Block5 = lists:duplicate(BlkSize, $5),
Blocks = [Block1, Block2, Block3, Block4, Block5],
Blob = list_to_binary(Blocks),
- ?VERIFY(ok, file:write_file(RemoteFilename, Blob)),
+ {ok} = ?TRY(file:write_file(RemoteFilename, Blob)),
Timeout = timer:seconds(3),
- ?VERIFY(timeout, recv(0)),
+ {timeout} = ?TRY(recv(0)),
%% Open socket
- {{ok, Socket}} = ?VERIFY({ok, _}, gen_udp:open(0, [binary, {reuseaddr, true}, {active, true}])),
+ {{ok, Socket}} = ?TRY(gen_udp:open(0, [binary, {reuseaddr, true}, {active, true}])),
ReadList = [0, 1, RemoteFilename, 0, "octet", 0],
Data1Bin = list_to_binary([0, 3, 0, 1 | Block1]),
@@ -406,95 +393,96 @@ resend_read_client(Host, Port, BlkSize) ->
BlkSize =:= 512 ->
%% Send READ
ReadBin = list_to_binary(ReadList),
- ?VERIFY(ok, gen_udp:send(Socket, Host, Port, ReadBin)),
+ {ok} = ?TRY(gen_udp:send(Socket, Host, Port, ReadBin)),
%% Sleep a while in order to provoke the server to re-send the packet
timer:sleep(Timeout + timer:seconds(1)),
%% Recv DATA #1 (the packet that the server think that we have lost)
- {{udp, _, _, NewPort0, _}} = ?VERIFY({udp, Socket, Host, _, Data1Bin}, recv(Timeout)),
+ {{udp, Socket, Host, NewPort0, Data1Bin}} = ?TRY(recv(Timeout)),
NewPort0;
true ->
%% Send READ
BlkSizeList = integer_to_list(BlkSize),
Options = ["blksize", 0, BlkSizeList, 0],
ReadBin = list_to_binary([ReadList | Options]),
- ?VERIFY(ok, gen_udp:send(Socket, Host, Port, ReadBin)),
+ {ok} = ?TRY(gen_udp:send(Socket, Host, Port, ReadBin)),
%% Recv OACK
OptionAckBin = list_to_binary([0, 6 | Options]),
- {{udp, _, _, NewPort0, _}} = ?VERIFY({udp, Socket, Host, _, OptionAckBin}, recv(Timeout)),
+ {{udp, Socket, Host, NewPort0, OptionAckBin}} =
+ ?TRY(recv(Timeout)),
%% Send ACK #0
Ack0Bin = <<0, 4, 0, 0>>,
- ?VERIFY(ok, gen_udp:send(Socket, Host, NewPort0, Ack0Bin)),
+ {ok} = ?TRY(gen_udp:send(Socket, Host, NewPort0, Ack0Bin)),
%% Send ACK #0 AGAIN (pretend that we timed out)
timer:sleep(timer:seconds(1)),
- ?VERIFY(ok, gen_udp:send(Socket, Host, NewPort0, Ack0Bin)),
+ {ok} = ?TRY(gen_udp:send(Socket, Host, NewPort0, Ack0Bin)),
%% Recv DATA #1 (the packet that the server think that we have lost)
- ?VERIFY({udp, Socket, Host, NewPort0, Data1Bin}, recv(Timeout)),
+ {{udp, Socket, Host, NewPort0, Data1Bin}} = ?TRY(recv(Timeout)),
NewPort0
end,
%% Recv DATA #1 AGAIN (the re-sent package)
- ?VERIFY({udp, Socket, Host, NewPort, Data1Bin}, recv(Timeout)),
+ {{udp, Socket, Host, NewPort, Data1Bin}} = ?TRY(recv(Timeout)),
%% Send ACK #1
Ack1Bin = <<0, 4, 0, 1>>,
- ?VERIFY(ok, gen_udp:send(Socket, Host, NewPort, Ack1Bin)),
+ {ok} = ?TRY(gen_udp:send(Socket, Host, NewPort, Ack1Bin)),
%% Recv DATA #2
Data2Bin = list_to_binary([0, 3, 0, 2 | Block2]),
- ?VERIFY({udp, Socket, Host, NewPort, Data2Bin}, recv(Timeout)),
+ {{udp, Socket, Host, NewPort, Data2Bin}} = ?TRY(recv(Timeout)),
%% Send ACK #2
Ack2Bin = <<0, 4, 0, 2>>,
- ?VERIFY(ok, gen_udp:send(Socket, Host, NewPort, Ack2Bin)),
+ {ok} = ?TRY(gen_udp:send(Socket, Host, NewPort, Ack2Bin)),
%% Recv DATA #3
Data3Bin = list_to_binary([0, 3, 0, 3 | Block3]),
- ?VERIFY({udp, Socket, Host, NewPort, Data3Bin}, recv(Timeout)),
+ {{udp, Socket, Host, NewPort, Data3Bin}} = ?TRY(recv(Timeout)),
%% Send ACK #3
Ack3Bin = <<0, 4, 0, 3>>,
- ?VERIFY(ok, gen_udp:send(Socket, Host, NewPort, Ack3Bin)),
+ {ok} = ?TRY(gen_udp:send(Socket, Host, NewPort, Ack3Bin)),
%% Send ACK #3 AGAIN (pretend that we timed out)
timer:sleep(timer:seconds(1)),
- ?VERIFY(ok, gen_udp:send(Socket, Host, NewPort, Ack3Bin)),
+ {ok} = ?TRY(gen_udp:send(Socket, Host, NewPort, Ack3Bin)),
%% Recv DATA #4 (the packet that the server think that we have lost)
Data4Bin = list_to_binary([0, 3, 0, 4 | Block4]),
- ?VERIFY({udp, Socket, Host, NewPort, Data4Bin}, recv(Timeout)),
+ {{udp, Socket, Host, NewPort, Data4Bin}} = ?TRY(recv(Timeout)),
%% Recv DATA #4 AGAIN (the re-sent package)
- ?VERIFY({udp, Socket, Host, NewPort, Data4Bin}, recv(Timeout)),
+ {{udp, Socket, Host, NewPort, Data4Bin}} = ?TRY(recv(Timeout)),
%% Send ACK #2 which is out of range
- ?VERIFY(ok, gen_udp:send(Socket, Host, NewPort, Ack2Bin)),
+ {ok} = ?TRY(gen_udp:send(Socket, Host, NewPort, Ack2Bin)),
%% Send ACK #4
Ack4Bin = <<0, 4, 0, 4>>,
- ?VERIFY(ok, gen_udp:send(Socket, Host, NewPort, Ack4Bin)),
+ {ok} = ?TRY(gen_udp:send(Socket, Host, NewPort, Ack4Bin)),
%% Recv DATA #5
Data5Bin = list_to_binary([0, 3, 0, 5 | Block5]),
- ?VERIFY({udp, Socket, Host, NewPort, Data5Bin}, recv(Timeout)),
+ {{udp, Socket, Host, NewPort, Data5Bin}} = ?TRY(recv(Timeout)),
%% Send ACK #5
Ack5Bin = <<0, 4, 0, 5>>,
- ?VERIFY(ok, gen_udp:send(Socket, Host, NewPort, Ack5Bin)),
+ {ok} = ?TRY(gen_udp:send(Socket, Host, NewPort, Ack5Bin)),
%% Recv ACK #6
- ?VERIFY({udp, Socket, Host, NewPort, <<0,3,0,6>>}, recv(Timeout)),
+ {{udp, Socket, Host, NewPort, <<0,3,0,6>>}} = ?TRY(recv(Timeout)),
%% Close socket
- ?VERIFY(ok, gen_udp:close(Socket)),
+ {ok} = ?TRY(gen_udp:close(Socket)),
- ?VERIFY(timeout, recv(Timeout)),
- ?VERIFY(ok, file:delete(RemoteFilename)),
+ {timeout} = ?TRY(recv(Timeout)),
+ {ok} = ?TRY(file:delete(RemoteFilename)),
ok.
resend_write_client(Host, Port, BlkSize) ->
@@ -506,14 +494,15 @@ resend_write_client(Host, Port, BlkSize) ->
Block5 = lists:duplicate(BlkSize, $5),
Blocks = [Block1, Block2, Block3, Block4, Block5],
Blob = list_to_binary(Blocks),
- ?IGNORE(file:delete(RemoteFilename)),
- ?VERIFY({error, enoent}, file:read_file(RemoteFilename)),
+ ?TRY(file:delete(RemoteFilename)),
+ {{error, enoent}} = ?TRY(file:read_file(RemoteFilename)),
Timeout = timer:seconds(3),
- ?VERIFY(timeout, recv(0)),
+ {timeout} = ?TRY(recv(0)),
%% Open socket
- {{ok, Socket}} = ?VERIFY({ok, _}, gen_udp:open(0, [binary, {reuseaddr, true}, {active, true}])),
+ {{ok, Socket}} =
+ ?TRY(gen_udp:open(0, [binary, {reuseaddr, true}, {active, true}])),
WriteList = [0, 2, RemoteFilename, 0, "octet", 0],
NewPort =
@@ -521,92 +510,93 @@ resend_write_client(Host, Port, BlkSize) ->
BlkSize =:= 512 ->
%% Send WRITE
WriteBin = list_to_binary(WriteList),
- ?VERIFY(ok, gen_udp:send(Socket, Host, Port, WriteBin)),
+ {ok} = ?TRY(gen_udp:send(Socket, Host, Port, WriteBin)),
%% Sleep a while in order to provoke the server to re-send the packet
timer:sleep(Timeout + timer:seconds(1)),
%% Recv ACK #0 (the packet that the server think that we have lost)
Ack0Bin = <<0, 4, 0, 0>>,
- ?VERIFY({udp, Socket, Host, _, Ack0Bin}, recv(Timeout)),
+ {{udp, Socket, Host, _, Ack0Bin}} = ?TRY(recv(Timeout)),
%% Recv ACK #0 AGAIN (the re-sent package)
- {{udp, _, _, NewPort0, _}} = ?VERIFY({udp, Socket, Host, _, Ack0Bin}, recv(Timeout)),
+ {{udp, Socket, Host, NewPort0, Ack0Bin}} = ?TRY(recv(Timeout)),
NewPort0;
true ->
%% Send WRITE
BlkSizeList = integer_to_list(BlkSize),
WriteBin = list_to_binary([WriteList, "blksize", 0, BlkSizeList, 0]),
- ?VERIFY(ok, gen_udp:send(Socket, Host, Port, WriteBin)),
+ {ok} = ?TRY(gen_udp:send(Socket, Host, Port, WriteBin)),
%% Sleep a while in order to provoke the server to re-send the packet
timer:sleep(timer:seconds(1)),
%% Recv OACK (the packet that the server think that we have lost)
OptionAckBin = list_to_binary([0, 6, "blksize",0, BlkSizeList, 0]),
- ?VERIFY({udp, Socket, Host, _, OptionAckBin}, recv(Timeout)),
-
+ {{udp, Socket, Host, _, OptionAckBin}} = ?TRY(recv(Timeout)),
+
%% Recv OACK AGAIN (the re-sent package)
- {{udp, _, _, NewPort0, _}} = ?VERIFY({udp, Socket, Host, _, OptionAckBin}, recv(Timeout)),
+ {{udp, Socket, Host, NewPort0, OptionAckBin}} =
+ ?TRY(recv(Timeout)),
NewPort0
end,
%% Send DATA #1
Data1Bin = list_to_binary([0, 3, 0, 1 | Block1]),
- ?VERIFY(ok, gen_udp:send(Socket, Host, NewPort, Data1Bin)),
+ {ok} = ?TRY(gen_udp:send(Socket, Host, NewPort, Data1Bin)),
- %% Recv ACK #1
+ %% Recv ACK #1
Ack1Bin = <<0, 4, 0, 1>>,
- ?VERIFY({udp, Socket, Host, NewPort, Ack1Bin}, recv(Timeout)),
+ {{udp, Socket, Host, NewPort, Ack1Bin}} = ?TRY(recv(Timeout)),
%% Send DATA #2
Data2Bin = list_to_binary([0, 3, 0, 2 | Block2]),
- ?VERIFY(ok, gen_udp:send(Socket, Host, NewPort, Data2Bin)),
+ {ok} = ?TRY(gen_udp:send(Socket, Host, NewPort, Data2Bin)),
%% Recv ACK #2
Ack2Bin = <<0, 4, 0, 2>>,
- ?VERIFY({udp, Socket, Host, NewPort, Ack2Bin}, recv(Timeout)),
+ {{udp, Socket, Host, NewPort, Ack2Bin}} = ?TRY(recv(Timeout)),
%% Send DATA #3
Data3Bin = list_to_binary([0, 3, 0, 3 | Block3]),
- ?VERIFY(ok, gen_udp:send(Socket, Host, NewPort, Data3Bin)),
+ {ok} = ?TRY(gen_udp:send(Socket, Host, NewPort, Data3Bin)),
%% Recv ACK #3
Ack3Bin = <<0, 4, 0, 3>>,
- ?VERIFY({udp, Socket, Host, NewPort, Ack3Bin}, recv(Timeout)),
+ {{udp, Socket, Host, NewPort, Ack3Bin}} = ?TRY(recv(Timeout)),
%% Send DATA #3 AGAIN (pretend that we timed out)
timer:sleep(timer:seconds(1)),
- ?VERIFY(ok, gen_udp:send(Socket, Host, NewPort, Data3Bin)),
+ {ok} = ?TRY(gen_udp:send(Socket, Host, NewPort, Data3Bin)),
%% Recv ACK #3 AGAIN (the packet that the server think that we have lost)
- ?VERIFY({udp, Socket, Host, NewPort, Ack3Bin}, recv(Timeout)),
+ {{udp, Socket, Host, NewPort, Ack3Bin}} = ?TRY(recv(Timeout)),
%% Send DATA #2 which is out of range
- ?VERIFY(ok, gen_udp:send(Socket, Host, NewPort, Data2Bin)),
+ {ok} = ?TRY(gen_udp:send(Socket, Host, NewPort, Data2Bin)),
%% Send DATA #4
Data4Bin = list_to_binary([0, 3, 0, 4 | Block4]),
- ?VERIFY(ok, gen_udp:send(Socket, Host, NewPort, Data4Bin)),
+ {ok} = ?TRY(gen_udp:send(Socket, Host, NewPort, Data4Bin)),
%% Recv ACK #4
Ack4Bin = <<0, 4, 0, 4>>,
- ?VERIFY({udp, Socket, Host, NewPort, Ack4Bin}, recv(Timeout)),
+ {{udp, Socket, Host, NewPort, Ack4Bin}} = ?TRY(recv(Timeout)),
%% Send DATA #5
Data5Bin = list_to_binary([0, 3, 0, 5 | Block5]),
- ?VERIFY(ok, gen_udp:send(Socket, Host, NewPort, Data5Bin)),
+ {ok} = ?TRY(gen_udp:send(Socket, Host, NewPort, Data5Bin)),
%% Recv ACK #5
Ack5Bin = <<0, 4, 0, 5>>,
- ?VERIFY({udp, Socket, Host, NewPort, Ack5Bin}, recv(Timeout)),
+ {{udp, Socket, Host, NewPort, Ack5Bin}} = ?TRY(recv(Timeout)),
%% Close socket
- ?VERIFY(ok, gen_udp:close(Socket)),
+ {ok} = ?TRY(gen_udp:close(Socket)),
- ?VERIFY(timeout, recv(Timeout)),
- ?VERIFY({ok, Blob}, file:read_file(RemoteFilename)),
- ?VERIFY(ok, file:delete(RemoteFilename)),
+ {timeout} = ?TRY(recv(Timeout)),
+ {{ok, Blob}} = ?TRY(file:read_file(RemoteFilename)),
+ {ok} = ?TRY(file:delete(RemoteFilename)),
ok.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -640,22 +630,25 @@ resend_read_server(Host, BlkSize) ->
Blob = list_to_binary(Blocks),
Timeout = timer:seconds(3),
- ?VERIFY(timeout, recv(0)),
+ {timeout} = ?TRY(recv(0)),
%% Open daemon socket
- {{ok, DaemonSocket}} = ?VERIFY({ok, _}, gen_udp:open(0, [binary, {reuseaddr, true}, {active, true}])),
- {{ok, DaemonPort}} = ?IGNORE(inet:port(DaemonSocket)),
+ {{ok, DaemonSocket}} =
+ ?TRY(gen_udp:open(0, [binary, {reuseaddr, true}, {active, true}])),
+ {{ok, DaemonPort}} = ?TRY(inet:port(DaemonSocket)),
%% Open server socket
- {{ok, ServerSocket}} = ?VERIFY({ok, _}, gen_udp:open(0, [binary, {reuseaddr, true}, {active, true}])),
- ?IGNORE(inet:port(ServerSocket)),
+ {{ok, ServerSocket}} =
+ ?TRY(gen_udp:open(0, [binary, {reuseaddr, true}, {active, true}])),
+ ?TRY(inet:port(ServerSocket)),
%% Prepare client process
ReplyTo = self(),
ClientFun =
fun(Extra) ->
Options = [{port, DaemonPort}, {debug, brief}] ++ Extra,
- {Res} = ?VERIFY({ok, Blob}, tftp:read_file(RemoteFilename, binary, Options)),
+ {{ok, Blob} = Res} =
+ ?TRY(tftp:read_file(RemoteFilename, binary, Options)),
ReplyTo ! {self(), {tftp_client_reply, Res}},
exit(normal)
end,
@@ -671,111 +664,116 @@ resend_read_server(Host, BlkSize) ->
%% Recv READ
ReadBin = list_to_binary(ReadList),
- {{udp, _, _, ClientPort0, _}} = ?VERIFY({udp, DaemonSocket, Host, _, ReadBin}, recv(Timeout)),
+ {{udp, DaemonSocket, Host, ClientPort0, ReadBin}} =
+ ?TRY(recv(Timeout)),
%% Send DATA #1
- ?VERIFY(ok, gen_udp:send(ServerSocket, Host, ClientPort0, Data1Bin)),
+ {ok} = ?TRY(gen_udp:send(ServerSocket, Host, ClientPort0, Data1Bin)),
%% Sleep a while in order to provoke the client to re-send the packet
timer:sleep(Timeout + timer:seconds(1)),
%% Recv ACK #1 (the packet that the server think that we have lost)
- ?VERIFY({udp, ServerSocket, Host, ClientPort0, Ack1Bin}, recv(Timeout)),
+ {{udp, ServerSocket, Host, ClientPort0, Ack1Bin}} =
+ ?TRY(recv(Timeout)),
%% Recv ACK #1 AGAIN (the re-sent package)
- ?VERIFY({udp, ServerSocket, Host, _, Ack1Bin}, recv(Timeout)),
+ {{udp, ServerSocket, Host, _, Ack1Bin}} = ?TRY(recv(Timeout)),
{ClientPort0, ClientPid0};
true ->
%% Start client process
BlkSizeList = integer_to_list(BlkSize),
ClientPid0 = spawn_link(fun() -> ClientFun([{"blksize", BlkSizeList}]) end),
-
+
%% Recv READ
Options = ["blksize", 0, BlkSizeList, 0],
ReadBin = list_to_binary([ReadList | Options]),
- {{udp, _, _, ClientPort0, _}} = ?VERIFY({udp, DaemonSocket, Host, _, ReadBin}, recv(Timeout)),
+ {{udp, DaemonSocket, Host, ClientPort0, ReadBin}} =
+ ?TRY(recv(Timeout)),
%% Send OACK
BlkSizeList = integer_to_list(BlkSize),
OptionAckBin = list_to_binary([0, 6, "blksize",0, BlkSizeList, 0]),
- ?VERIFY(ok, gen_udp:send(ServerSocket, Host, ClientPort0, OptionAckBin)),
+ {ok} = ?TRY(gen_udp:send(ServerSocket, Host, ClientPort0, OptionAckBin)),
%% Sleep a while in order to provoke the client to re-send the packet
timer:sleep(Timeout + timer:seconds(1)),
%% Recv ACK #0 (the packet that the server think that we have lost)
Ack0Bin = <<0, 4, 0, 0>>,
- ?VERIFY({udp, ServerSocket, Host, ClientPort0, Ack0Bin}, recv(Timeout)),
+ {{udp, ServerSocket, Host, ClientPort0, Ack0Bin}} =
+ ?TRY(recv(Timeout)),
%% Recv ACK #0 AGAIN (the re-sent package)
- ?VERIFY({udp, ServerSocket, Host, ClientPort0, Ack0Bin}, recv(Timeout)),
+ {{udp, ServerSocket, Host, ClientPort0, Ack0Bin}} =
+ ?TRY(recv(Timeout)),
%% Send DATA #1
- ?VERIFY(ok, gen_udp:send(ServerSocket, Host, ClientPort0, Data1Bin)),
+ {ok} = ?TRY(gen_udp:send(ServerSocket, Host, ClientPort0, Data1Bin)),
%% Recv ACK #1
- ?VERIFY({udp, ServerSocket, Host, _, Ack1Bin}, recv(Timeout)),
+ {{udp, ServerSocket, Host, _, Ack1Bin}} = ?TRY(recv(Timeout)),
{ClientPort0, ClientPid0}
end,
%% Send DATA #2
Data2Bin = list_to_binary([0, 3, 0, 2 | Block2]),
- ?VERIFY(ok, gen_udp:send(ServerSocket, Host, ClientPort, Data2Bin)),
+ {ok} = ?TRY(gen_udp:send(ServerSocket, Host, ClientPort, Data2Bin)),
%% Recv ACK #2
Ack2Bin = <<0, 4, 0, 2>>,
- ?VERIFY({udp, ServerSocket, Host, ClientPort, Ack2Bin}, recv(Timeout)),
+ {{udp, ServerSocket, Host, ClientPort, Ack2Bin}} = ?TRY(recv(Timeout)),
%% Send DATA #3
Data3Bin = list_to_binary([0, 3, 0, 3 | Block3]),
- ?VERIFY(ok, gen_udp:send(ServerSocket, Host, ClientPort, Data3Bin)),
+ {ok} = ?TRY(gen_udp:send(ServerSocket, Host, ClientPort, Data3Bin)),
%% Recv ACK #3
Ack3Bin = <<0, 4, 0, 3>>,
- ?VERIFY({udp, ServerSocket, Host, ClientPort, Ack3Bin}, recv(Timeout)),
+ {{udp, ServerSocket, Host, ClientPort, Ack3Bin}} = ?TRY(recv(Timeout)),
%% Send DATA #3 AGAIN (pretend that we timed out)
timer:sleep(timer:seconds(1)),
- ?VERIFY(ok, gen_udp:send(ServerSocket, Host, ClientPort, Data3Bin)),
+ {ok} = ?TRY(gen_udp:send(ServerSocket, Host, ClientPort, Data3Bin)),
%% Recv ACK #3 AGAIN (the packet that the server think that we have lost)
- ?VERIFY({udp, ServerSocket, Host, ClientPort, Ack3Bin}, recv(Timeout)),
+ {{udp, ServerSocket, Host, ClientPort, Ack3Bin}} = ?TRY(recv(Timeout)),
%% Send DATA #4
Data4Bin = list_to_binary([0, 3, 0, 4 | Block4]),
- ?VERIFY(ok, gen_udp:send(ServerSocket, Host, ClientPort, Data4Bin)),
+ {ok} = ?TRY(gen_udp:send(ServerSocket, Host, ClientPort, Data4Bin)),
%% Recv ACK #4
Ack4Bin = <<0, 4, 0, 4>>,
- ?VERIFY({udp, ServerSocket, Host, ClientPort, Ack4Bin}, recv(Timeout)),
+ {{udp, ServerSocket, Host, ClientPort, Ack4Bin}} = ?TRY(recv(Timeout)),
%% Send DATA #3 which is out of range
- ?VERIFY(ok, gen_udp:send(ServerSocket, Host, ClientPort, Data3Bin)),
+ {ok} = ?TRY(gen_udp:send(ServerSocket, Host, ClientPort, Data3Bin)),
%% Send DATA #5
Data5Bin = list_to_binary([0, 3, 0, 5 | Block5]),
- ?VERIFY(ok, gen_udp:send(ServerSocket, Host, ClientPort, Data5Bin)),
+ {ok} = ?TRY(gen_udp:send(ServerSocket, Host, ClientPort, Data5Bin)),
%% Recv ACK #5
Ack5Bin = <<0, 4, 0, 5>>,
- ?VERIFY({udp, ServerSocket, Host, ClientPort, Ack5Bin}, recv(Timeout)),
+ {{udp, ServerSocket, Host, ClientPort, Ack5Bin}} = ?TRY(recv(Timeout)),
%% Send DATA #6
Data6Bin = list_to_binary([0, 3, 0, 6 | Block6]),
- ?VERIFY(ok, gen_udp:send(ServerSocket, Host, ClientPort, Data6Bin)),
+ {ok} = ?TRY(gen_udp:send(ServerSocket, Host, ClientPort, Data6Bin)),
%% Recv ACK #6
Ack6Bin = <<0, 4, 0, 6>>,
- ?VERIFY({udp, ServerSocket, Host, ClientPort, Ack6Bin}, recv(Timeout)),
+ {{udp, ServerSocket, Host, ClientPort, Ack6Bin}} = ?TRY(recv(Timeout)),
%% Close daemon and server sockets
- ?VERIFY(ok, gen_udp:close(ServerSocket)),
- ?VERIFY(ok, gen_udp:close(DaemonSocket)),
+ {ok} = ?TRY(gen_udp:close(ServerSocket)),
+ {ok} = ?TRY(gen_udp:close(DaemonSocket)),
- ?VERIFY({ClientPid, {tftp_client_reply, {ok, Blob}}},
- recv(2 * (Timeout + timer:seconds(1)))),
+ {{ClientPid, {tftp_client_reply, {ok, Blob}}}} =
+ ?TRY(recv(2 * (Timeout + timer:seconds(1)))),
- ?VERIFY(timeout, recv(Timeout)),
+ {timeout} = ?TRY(recv(Timeout)),
ok.
resend_write_server(Host, BlkSize) ->
@@ -791,22 +789,25 @@ resend_write_server(Host, BlkSize) ->
Size = size(Blob),
Timeout = timer:seconds(3),
- ?VERIFY(timeout, recv(0)),
+ {timeout} = ?TRY(recv(0)),
%% Open daemon socket
- {{ok, DaemonSocket}} = ?VERIFY({ok, _}, gen_udp:open(0, [binary, {reuseaddr, true}, {active, true}])),
- {{ok, DaemonPort}} = ?IGNORE(inet:port(DaemonSocket)),
+ {{ok, DaemonSocket}} =
+ ?TRY(gen_udp:open(0, [binary, {reuseaddr, true}, {active, true}])),
+ {{ok, DaemonPort}} = ?TRY(inet:port(DaemonSocket)),
%% Open server socket
- {{ok, ServerSocket}} = ?VERIFY({ok, _}, gen_udp:open(0, [binary, {reuseaddr, true}, {active, true}])),
- ?IGNORE(inet:port(ServerSocket)),
+ {{ok, ServerSocket}} =
+ ?TRY(gen_udp:open(0, [binary, {reuseaddr, true}, {active, true}])),
+ ?TRY(inet:port(ServerSocket)),
%% Prepare client process
ReplyTo = self(),
ClientFun =
fun(Extra) ->
Options = [{port, DaemonPort}, {debug, brief}] ++ Extra,
- {Res} = ?VERIFY({ok, Size}, tftp:write_file(RemoteFilename, Blob, Options)),
+ {{ok, Size} = Res} =
+ ?TRY(tftp:write_file(RemoteFilename, Blob, Options)),
ReplyTo ! {self(), {tftp_client_reply, Res}},
exit(normal)
end,
@@ -822,108 +823,113 @@ resend_write_server(Host, BlkSize) ->
%% Recv WRITE
WriteBin = list_to_binary(WriteList),
io:format("WriteBin ~p\n", [WriteBin]),
- {{udp, _, _, ClientPort0, _}} = ?VERIFY({udp, DaemonSocket, Host, _, WriteBin}, recv(Timeout)),
+ {{udp, DaemonSocket, Host, ClientPort0, WriteBin}} =
+ ?TRY(recv(Timeout)),
%% Send ACK #1
Ack0Bin = <<0, 4, 0, 0>>,
- ?VERIFY(ok, gen_udp:send(ServerSocket, Host, ClientPort0, Ack0Bin)),
+ {ok} = ?TRY(gen_udp:send(ServerSocket, Host, ClientPort0, Ack0Bin)),
%% Sleep a while in order to provoke the client to re-send the packet
timer:sleep(Timeout + timer:seconds(1)),
%% Recv DATA #1 (the packet that the server think that we have lost)
- ?VERIFY({udp, ServerSocket, Host, ClientPort0, Data1Bin}, recv(Timeout)),
+ {{udp, ServerSocket, Host, ClientPort0, Data1Bin}} =
+ ?TRY(recv(Timeout)),
%% Recv DATA #1 AGAIN (the re-sent package)
- ?VERIFY({udp, ServerSocket, Host, _, Data1Bin}, recv(Timeout)),
+ {{udp, ServerSocket, Host, _, Data1Bin}} = ?TRY(recv(Timeout)),
{ClientPort0, ClientPid0};
true ->
%% Start client process
BlkSizeList = integer_to_list(BlkSize),
ClientPid0 = spawn_link(fun() -> ClientFun([{"blksize", BlkSizeList}]) end),
-
+
%% Recv WRITE
Options = ["blksize", 0, BlkSizeList, 0],
WriteBin = list_to_binary([WriteList | Options]),
- {{udp, _, _, ClientPort0, _}} = ?VERIFY({udp, DaemonSocket, Host, _, WriteBin}, recv(Timeout)),
+ {{udp, DaemonSocket, Host, ClientPort0, WriteBin}} =
+ ?TRY(recv(Timeout)),
%% Send OACK
BlkSizeList = integer_to_list(BlkSize),
OptionAckBin = list_to_binary([0, 6, "blksize",0, BlkSizeList, 0]),
- ?VERIFY(ok, gen_udp:send(ServerSocket, Host, ClientPort0, OptionAckBin)),
+ {ok} = ?TRY(gen_udp:send(ServerSocket, Host, ClientPort0, OptionAckBin)),
%% Sleep a while in order to provoke the client to re-send the packet
timer:sleep(Timeout + timer:seconds(1)),
%% Recv DATA #1 (the packet that the server think that we have lost)
- ?VERIFY({udp, ServerSocket, Host, ClientPort0, Data1Bin}, recv(Timeout)),
+ {{udp, ServerSocket, Host, ClientPort0, Data1Bin}} =
+ ?TRY(recv(Timeout)),
%% Recv DATA #1 AGAIN (the re-sent package)
- ?VERIFY({udp, ServerSocket, Host, ClientPort0, Data1Bin}, recv(Timeout)),
+ {{udp, ServerSocket, Host, ClientPort0, Data1Bin}} =
+ ?TRY(recv(Timeout)),
{ClientPort0, ClientPid0}
end,
%% Send ACK #1
Ack1Bin = <<0, 4, 0, 1>>,
- ?VERIFY(ok, gen_udp:send(ServerSocket, Host, ClientPort, Ack1Bin)),
+ {ok} = ?TRY(gen_udp:send(ServerSocket, Host, ClientPort, Ack1Bin)),
%% Recv DATA #2
Data2Bin = list_to_binary([0, 3, 0, 2 | Block2]),
- ?VERIFY({udp, ServerSocket, Host, ClientPort, Data2Bin}, recv(Timeout)),
+ {{udp, ServerSocket, Host, ClientPort, Data2Bin}} = ?TRY(recv(Timeout)),
%% Send ACK #2
Ack2Bin = <<0, 4, 0, 2>>,
- ?VERIFY(ok, gen_udp:send(ServerSocket, Host, ClientPort, Ack2Bin)),
+ {ok} = ?TRY(gen_udp:send(ServerSocket, Host, ClientPort, Ack2Bin)),
%% Recv DATA #3
Data3Bin = list_to_binary([0, 3, 0, 3 | Block3]),
- ?VERIFY({udp, ServerSocket, Host, ClientPort, Data3Bin}, recv(Timeout)),
+ {{udp, ServerSocket, Host, ClientPort, Data3Bin}} = ?TRY(recv(Timeout)),
%% Send ACK #3
Ack3Bin = <<0, 4, 0, 3>>,
- ?VERIFY(ok, gen_udp:send(ServerSocket, Host, ClientPort, Ack3Bin)),
+ {ok} = ?TRY(gen_udp:send(ServerSocket, Host, ClientPort, Ack3Bin)),
%% Send ACK #3 AGAIN (pretend that we timed out)
timer:sleep(timer:seconds(1)),
- ?VERIFY(ok, gen_udp:send(ServerSocket, Host, ClientPort, Ack3Bin)),
+ {ok} = ?TRY(gen_udp:send(ServerSocket, Host, ClientPort, Ack3Bin)),
%% Recv DATA #4 (the packet that the server think that we have lost)
Data4Bin = list_to_binary([0, 3, 0, 4 | Block4]),
- ?VERIFY({udp, ServerSocket, Host, ClientPort, Data4Bin}, recv(Timeout)),
+ {{udp, ServerSocket, Host, ClientPort, Data4Bin}} = ?TRY(recv(Timeout)),
%% Recv DATA #4 AGAIN (the re-sent package)
- ?VERIFY({udp, ServerSocket, Host, ClientPort, Data4Bin}, recv(Timeout)),
+ {{udp, ServerSocket, Host, ClientPort, Data4Bin}} = ?TRY(recv(Timeout)),
%% Send ACK #4
Ack4Bin = <<0, 4, 0, 4>>,
- ?VERIFY(ok, gen_udp:send(ServerSocket, Host, ClientPort, Ack4Bin)),
+ {ok} = ?TRY(gen_udp:send(ServerSocket, Host, ClientPort, Ack4Bin)),
%% Recv DATA #5
Data5Bin = list_to_binary([0, 3, 0, 5 | Block5]),
- ?VERIFY({udp, ServerSocket, Host, ClientPort, Data5Bin}, recv(Timeout)),
+ {{udp, ServerSocket, Host, ClientPort, Data5Bin}} = ?TRY(recv(Timeout)),
%% Send ACK #3 which is out of range
- ?VERIFY(ok, gen_udp:send(ServerSocket, Host, ClientPort, Ack3Bin)),
+ {ok} = ?TRY(gen_udp:send(ServerSocket, Host, ClientPort, Ack3Bin)),
%% Send ACK #5
Ack5Bin = <<0, 4, 0, 5>>,
- ?VERIFY(ok, gen_udp:send(ServerSocket, Host, ClientPort, Ack5Bin)),
+ {ok} = ?TRY(gen_udp:send(ServerSocket, Host, ClientPort, Ack5Bin)),
%% Recv DATA #6
Data6Bin = list_to_binary([0, 3, 0, 6 | Block6]),
- ?VERIFY({udp, ServerSocket, Host, ClientPort, Data6Bin}, recv(Timeout)),
+ {{udp, ServerSocket, Host, ClientPort, Data6Bin}} = ?TRY(recv(Timeout)),
%% Send ACK #6
Ack6Bin = <<0, 4, 0, 6>>,
- ?VERIFY(ok, gen_udp:send(ServerSocket, Host, ClientPort, Ack6Bin)),
+ {ok} = ?TRY(gen_udp:send(ServerSocket, Host, ClientPort, Ack6Bin)),
%% Close daemon and server sockets
- ?VERIFY(ok, gen_udp:close(ServerSocket)),
- ?VERIFY(ok, gen_udp:close(DaemonSocket)),
+ {ok} = ?TRY(gen_udp:close(ServerSocket)),
+ {ok} = ?TRY(gen_udp:close(DaemonSocket)),
- ?VERIFY({ClientPid, {tftp_client_reply, {ok, Size}}}, recv(Timeout)),
+ {{ClientPid, {tftp_client_reply, {ok, Size}}}} = ?TRY(recv(Timeout)),
- ?VERIFY(timeout, recv(Timeout)),
+ {timeout} = ?TRY(recv(Timeout)),
ok.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -935,7 +941,7 @@ reuse_connection(suite) ->
[];
reuse_connection(Config) when is_list(Config) ->
Host = {127, 0, 0, 1},
- {{Port, DaemonPid}} = ?IGNORE(?START_DAEMON([{debug, all}])),
+ {{Port, DaemonPid}} = ?TRY(?START_DAEMON([{debug, all}])),
RemoteFilename = "reuse_connection.tmp",
BlkSize = 512,
@@ -943,55 +949,56 @@ reuse_connection(Config) when is_list(Config) ->
Block2 = lists:duplicate(BlkSize div 2, $2),
Blocks = [Block1, Block2],
Blob = list_to_binary(Blocks),
- ?VERIFY(ok, file:write_file(RemoteFilename, Blob)),
-
+ {ok} = ?TRY(file:write_file(RemoteFilename, Blob)),
+
Seconds = 3,
Timeout = timer:seconds(Seconds),
- ?VERIFY(timeout, recv(0)),
-
+ {timeout} = ?TRY(recv(0)),
+
%% Open socket
- {{ok, Socket}} = ?VERIFY({ok, _}, gen_udp:open(0, [binary, {reuseaddr, true}, {active, true}])),
-
+ {{ok, Socket}} =
+ ?TRY(gen_udp:open(0, [binary, {reuseaddr, true}, {active, true}])),
+
ReadList = [0, 1, RemoteFilename, 0, "octet", 0],
Data1Bin = list_to_binary([0, 3, 0, 1 | Block1]),
-
+
%% Send READ
TimeoutList = integer_to_list(Seconds),
Options = ["timeout", 0, TimeoutList, 0],
ReadBin = list_to_binary([ReadList | Options]),
- ?VERIFY(ok, gen_udp:send(Socket, Host, Port, ReadBin)),
+ {ok} = ?TRY(gen_udp:send(Socket, Host, Port, ReadBin)),
%% Send yet another READ for same file
- ?VERIFY(ok, gen_udp:send(Socket, Host, Port, ReadBin)),
+ {ok} = ?TRY(gen_udp:send(Socket, Host, Port, ReadBin)),
%% Recv OACK
OptionAckBin = list_to_binary([0, 6 | Options]),
- {{udp, _, _, NewPort, _}} = ?VERIFY({udp, Socket, Host, _, OptionAckBin}, recv(Timeout)),
+ {{udp, Socket, Host, NewPort, OptionAckBin}} = ?TRY(recv(Timeout)),
%% Send ACK #0
Ack0Bin = <<0, 4, 0, 0>>,
- ?VERIFY(ok, gen_udp:send(Socket, Host, NewPort, Ack0Bin)),
+ {ok} = ?TRY(gen_udp:send(Socket, Host, NewPort, Ack0Bin)),
%% Recv DATA #1
- ?VERIFY({udp, Socket, Host, NewPort, Data1Bin}, recv(Timeout)),
+ {{udp, Socket, Host, NewPort, Data1Bin}} = ?TRY(recv(Timeout)),
%% Send ACK #1
Ack1Bin = <<0, 4, 0, 1>>,
- ?VERIFY(ok, gen_udp:send(Socket, Host, NewPort, Ack1Bin)),
+ {ok} = ?TRY(gen_udp:send(Socket, Host, NewPort, Ack1Bin)),
%% Recv DATA #2
Data2Bin = list_to_binary([0, 3, 0, 2 | Block2]),
- ?VERIFY({udp, Socket, Host, NewPort, Data2Bin}, recv(Timeout)),
+ {{udp, Socket, Host, NewPort, Data2Bin}} = ?TRY(recv(Timeout)),
%% Send ACK #2
Ack2Bin = <<0, 4, 0, 2>>,
- ?VERIFY(ok, gen_udp:send(Socket, Host, NewPort, Ack2Bin)),
+ {ok} = ?TRY(gen_udp:send(Socket, Host, NewPort, Ack2Bin)),
%% Close socket
- ?VERIFY(ok, gen_udp:close(Socket)),
+ {ok} = ?TRY(gen_udp:close(Socket)),
- ?VERIFY(timeout, recv(Timeout)),
- ?VERIFY(ok, file:delete(RemoteFilename)),
+ {timeout} = ?TRY(recv(Timeout)),
+ {ok} = ?TRY(file:delete(RemoteFilename)),
%% Cleanup
unlink(DaemonPid),
@@ -1007,9 +1014,9 @@ large_file(doc) ->
large_file(suite) ->
[];
large_file(Config) when is_list(Config) ->
- ?VERIFY(ok, application:start(tftp)),
+ {ok} = ?TRY(application:start(tftp)),
- {{Port, DaemonPid}} = ?IGNORE(?START_DAEMON([{debug, brief}])),
+ {{Port, DaemonPid}} = ?TRY(?START_DAEMON([{debug, brief}])),
%% Read fail
RemoteFilename = "tftp_temporary_large_file_remote_test_file.txt",
@@ -1018,19 +1025,20 @@ large_file(Config) when is_list(Config) ->
{ok, FH} = file:open(LocalFilename, [write,exclusive]),
{ok, Size} = file:position(FH, {eof, 2*512*65535}),
ok = file:truncate(FH),
- ?IGNORE(file:close(FH)),
+ ?TRY(file:close(FH)),
%% Write and read
- ?VERIFY({ok, Size}, tftp:write_file(RemoteFilename, LocalFilename, [{port, Port}])),
- ?IGNORE(file:delete(LocalFilename)),
- ?VERIFY({ok, Size}, tftp:read_file(RemoteFilename, LocalFilename, [{port, Port}])),
+ {{ok, Size}} =
+ ?TRY(tftp:write_file(RemoteFilename, LocalFilename, [{port, Port}])),
+ ?TRY(file:delete(LocalFilename)),
+ {{ok, Size}} = ?TRY(tftp:read_file(RemoteFilename, LocalFilename, [{port, Port}])),
%% Cleanup
unlink(DaemonPid),
exit(DaemonPid, kill),
- ?VERIFY(ok, file:delete(LocalFilename)),
- ?VERIFY(ok, file:delete(RemoteFilename)),
- ?VERIFY(ok, application:stop(tftp)),
+ {ok} = ?TRY(file:delete(LocalFilename)),
+ {ok} = ?TRY(file:delete(RemoteFilename)),
+ {ok} = ?TRY(application:stop(tftp)),
ok.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
diff --git a/lib/tftp/test/tftp_test_lib.erl b/lib/tftp/test/tftp_test_lib.erl
index f1913960ef..1cdbc032fe 100644
--- a/lib/tftp/test/tftp_test_lib.erl
+++ b/lib/tftp/test/tftp_test_lib.erl
@@ -20,274 +20,38 @@
%% %CopyrightEnd%
%%
-%% ---------------------------------------------------------------------
-%% et
-%% The 'et' app is used to report "events".
-%% But its possible to build otp *without* 'et' (--without-et').
-%% If that is the case, we cannot report event. We therefor have
-%% a wrapper function, report_event, which first tests if the 'et'
-%% module actually exists (by attempting to load the module).
-%% ---------------------------------------------------------------------
-
-module(tftp_test_lib).
-compile([export_all, nowarn_export_all]).
--include("tftp_test_lib.hrl").
-
-
-%%
-%% -----
-%%
-
-init_per_testcase(_Case, Config) when is_list(Config) ->
- io:format("\n ", []),
- ?IGNORE(application:stop(tftp)),
- Config.
-
-end_per_testcase(_Case, Config) when is_list(Config) ->
- ?IGNORE(application:stop(tftp)),
- Config.
-
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Infrastructure for test suite
+%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-verify(MatchFun, Fun, Mod, Line) ->
- try Fun() of
- Result ->
- case MatchFun({Result}) of
- true ->
- log("Ok, ~p~n", [Result], Mod, Line),
- {Result};
- false ->
- log("<ERROR> Bad result: ~p\n", [Result], Mod, Line),
- erlang:error({Mod, Line, Result})
- end
- catch Class : Reason : Stacktrace ->
- case MatchFun({Class, Reason}) of
- true ->
- log("Expected exception, ~w : ~w : ~p~n",
- [Class, Reason, Stacktrace],
- Mod, Line),
- {Class, Reason, Stacktrace};
- false ->
- log("Exception, ~w : ~w : ~p~n",
- [Class, Reason, Stacktrace],
- Mod, Line),
- erlang:error({Mod, Line, Class, Reason, Stacktrace})
- end
- end.
-
-ignore(Fun, Mod, Line) ->
+try_catch(Fun, Module, Line, FunctionName) ->
try Fun() of
Result ->
- log("Ok, ~p~n", [Result], Mod, Line),
+ log("~p~n", [Result],
+ Module, Line, FunctionName),
{Result}
catch Class : Reason : Stacktrace ->
- log("Ignored exception, ~w : ~w : ~p~n",
- [Class, Reason, Stacktrace],
- Mod, Line),
- {Class, Reason, Stacktrace}
+ CLASS = 'CLASS'(Class),
+ log("~w : ~w~n ~p~n", [CLASS, Reason, Stacktrace],
+ Module, Line, FunctionName),
+ {CLASS, Reason}
end.
-error(Actual, Mod, Line) ->
- log("<ERROR> Bad result: ~p\n", [Actual], Mod, Line),
- erlang:error({Mod, Line, Actual}).
-
-log(Format, Args, Mod, Line) ->
- io:format(user, "~p(~p): " ++ Format, [Mod, Line] ++ Args).
-
-
-default_config() ->
- [].
-
-t() ->
- t([{?MODULE, all}]).
-
-t(Cases) ->
- t(Cases, default_config()).
-
-t(Cases, Config) ->
- process_flag(trap_exit, true),
- Res = lists:flatten(do_test(Cases, Config)),
- io:format("Res: ~p\n", [Res]),
- display_result(Res),
- Res.
-
-do_test({Mod, Fun}, Config) when is_atom(Mod), is_atom(Fun) ->
- try apply(Mod, Fun, [suite]) of
- [] ->
- io:format("Eval: ~p:", [{Mod, Fun}]),
- Res = eval(Mod, Fun, Config),
- {R, _, _} = Res,
- io:format(" ~p\n", [R]),
- Res;
-
- Cases when is_list(Cases) ->
- io:format("Expand: ~p ...\n", [{Mod, Fun}]),
- Map = fun(Case) when is_atom(Case)-> {Mod, Case};
- (Case) -> Case
- end,
- do_test(lists:map(Map, Cases), Config);
-
- {req, _, {conf, Init, Cases, Finish}} ->
- try apply(Mod, Init, [Config]) of
- Conf when is_list(Conf) ->
- io:format("Expand: ~p ...\n", [{Mod, Fun}]),
- Map = fun(Case) when is_atom(Case)-> {Mod, Case};
- (Case) -> Case
- end,
- Res = do_test(lists:map(Map, Cases), Conf),
- try apply(Mod, Finish, [Conf]) catch _ : _ -> ok end,
- Res;
-
- Error ->
- io:format(" => failed: ~p\n", [Error]),
- [{failed, {Mod, Fun}, Error}]
-
- catch throw : {skipped, Reason} ->
- io:format(" => skipping: ~p\n", [Reason]),
- [{skipped, {Mod, Fun}, Reason}]
- end;
-
- Error ->
- io:format("Ignoring: ~p: ~p\n", [{Mod, Fun}, Error]),
- [{failed, {Mod, Fun}, Error}]
-
- catch error : undef : Stacktrace ->
- io:format("Undefined: ~p~n~p~n", [{Mod, Fun}, Stacktrace]),
- [{nyi, {Mod, Fun}, ok}]
- end;
-do_test(Mod, Config) when is_atom(Mod) ->
- Res = do_test({Mod, all}, Config),
- Res;
-do_test(Cases, Config) when is_list(Cases) ->
- [do_test(Case, Config) || Case <- Cases];
-do_test(Bad, _Config) ->
- [{badarg, Bad, ok}].
-
-eval(Mod, Fun, Config) ->
- TestCase = {?MODULE, Mod, Fun},
- Label = lists:concat(["TEST CASE: ", Fun]),
- report_event(40, ?MODULE, Mod, Label ++ " started",
- [TestCase, Config]),
- global:register_name(tftp_test_case_sup, self()),
- Flag = process_flag(trap_exit, true),
- Config2 = Mod:init_per_testcase(Fun, Config),
- Pid = spawn_link(?MODULE, do_eval, [self(), Mod, Fun, Config2]),
- R = wait_for_evaluator(Pid, Mod, Fun, Config2, []),
- Mod:end_per_testcase(Fun, Config2),
- global:unregister_name(tftp_test_case_sup),
- process_flag(trap_exit, Flag),
- R.
-
-wait_for_evaluator(Pid, Mod, Fun, Config, Errors) ->
- TestCase = {?MODULE, Mod, Fun},
- Label = lists:concat(["TEST CASE: ", Fun]),
- receive
- {done, Pid, ok} when Errors == [] ->
- report_event(40, Mod, ?MODULE, Label ++ " ok",
- [TestCase, Config]),
- {ok, {Mod, Fun}, Errors};
- {done, Pid, {ok, _}} when Errors == [] ->
- report_event(40, Mod, ?MODULE, Label ++ " ok",
- [TestCase, Config]),
- {ok, {Mod, Fun}, Errors};
- {done, Pid, Fail} ->
- report_event(20, Mod, ?MODULE, Label ++ " failed",
- [TestCase, Config, {return, Fail}, Errors]),
- {failed, {Mod,Fun}, Fail};
- {'EXIT', Pid, {skipped, Reason}} ->
- report_event(20, Mod, ?MODULE, Label ++ " skipped",
- [TestCase, Config, {skipped, Reason}]),
- {skipped, {Mod, Fun}, Errors};
- {'EXIT', Pid, Reason} ->
- report_event(20, Mod, ?MODULE, Label ++ " crashed",
- [TestCase, Config, {'EXIT', Reason}]),
- {crashed, {Mod, Fun}, [{'EXIT', Reason} | Errors]};
- {fail, Pid, Reason} ->
- wait_for_evaluator(Pid, Mod, Fun, Config, Errors ++ [Reason])
- end.
-
-do_eval(ReplyTo, Mod, Fun, Config) ->
- try apply(Mod, Fun, [Config]) of
- Other ->
- ReplyTo ! {done, self(), Other}
- catch throw : {skipped, Reason} ->
- ReplyTo ! {'EXIT', self(), {skipped, Reason}}
- end,
- unlink(ReplyTo),
- exit(shutdown).
-
-display_result([]) ->
- io:format("OK\n", []);
-display_result(Res) when is_list(Res) ->
- Ok = [MF || {ok, MF, _} <- Res],
- Nyi = [MF || {nyi, MF, _} <- Res],
- Skipped = [{MF, Reason} || {skipped, MF, Reason} <- Res],
- Failed = [{MF, Reason} || {failed, MF, Reason} <- Res],
- Crashed = [{MF, Reason} || {crashed, MF, Reason} <- Res],
- display_summary(Ok, Nyi, Skipped, Failed, Crashed),
- display_skipped(Skipped),
- display_failed(Failed),
- display_crashed(Crashed).
-
-display_summary(Ok, Nyi, Skipped, Failed, Crashed) ->
- io:format("\nTest case summary:\n", []),
- display_summary(Ok, "successful"),
- display_summary(Nyi, "not yet implemented"),
- display_summary(Skipped, "skipped"),
- display_summary(Failed, "failed"),
- display_summary(Crashed, "crashed"),
- io:format("\n", []).
-
-display_summary(Res, Info) ->
- io:format(" ~w test cases ~s\n", [length(Res), Info]).
-
-display_skipped([]) ->
- ok;
-display_skipped(Skipped) ->
- io:format("Skipped test cases:\n", []),
- F = fun({MF, Reason}) -> io:format(" ~p => ~p\n", [MF, Reason]) end,
- lists:foreach(F, Skipped),
- io:format("\n", []).
-
-
-display_failed([]) ->
- ok;
-display_failed(Failed) ->
- io:format("Failed test cases:\n", []),
- F = fun({MF, Reason}) -> io:format(" ~p => ~p\n", [MF, Reason]) end,
- lists:foreach(F, Failed),
- io:format("\n", []).
-
-display_crashed([]) ->
- ok;
-display_crashed(Crashed) ->
- io:format("Crashed test cases:\n", []),
- F = fun({MF, Reason}) -> io:format(" ~p => ~p\n", [MF, Reason]) end,
- lists:foreach(F, Crashed),
- io:format("\n", []).
-
-
-report_event(DetailLevel, From, To, Label, Contents) ->
- case code:ensure_loaded(et) of
- {module, _} ->
- et:report_event(DetailLevel, From, To, Label, Contents);
- {error, _} ->
- io:format(user,
- "EVENT: "
- "~n Level: ~p"
- "~n From: ~p"
- "~n To: ~p"
- "~n Label: ~p"
- "~n Content: ~p",
- [DetailLevel, From, To, Label, Contents]),
- ok
+'CLASS'(Class) ->
+ case Class of
+ exit -> 'EXIT';
+ error -> 'ERROR';
+ throw -> 'THROW'
end.
+log(Format, Args, Mod, Line, FunctionName) ->
+ io:format(user, "~w:~w:~w: " ++ Format, [Mod, FunctionName, Line] ++ Args).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% generic callback
diff --git a/lib/tftp/test/tftp_test_lib.hrl b/lib/tftp/test/tftp_test_lib.hrl
index 727838df8d..ef39a6a391 100644
--- a/lib/tftp/test/tftp_test_lib.hrl
+++ b/lib/tftp/test/tftp_test_lib.hrl
@@ -20,35 +20,8 @@
%% %CopyrightEnd%
%%
--define(VERIFY(Expected, Expr),
+-define(TRY(Expr),
begin
- tftp_test_lib:verify(
- fun (_ExPr_ReSuLt) ->
- case _ExPr_ReSuLt of
- {Expected} -> true;
- _ -> false
- end
- end,
- fun () -> begin Expr end end,
- ?MODULE, ?LINE)
- end).
-
--define(VERIFY(Class, Reason, Expr),
- begin
- tftp_test_lib:verify(
- fun (_ExCePtIoN_TuPlE) ->
- case _ExCePtIoN_TuPlE of
- {(Class), (Reason)} -> true;
- _ -> false
- end
- end,
- fun () -> begin Expr end end,
- ?MODULE, ?LINE)
- end).
-
--define(IGNORE(Expr),
- begin
- tftp_test_lib:ignore(
- fun () -> begin Expr end end,
- ?MODULE, ?LINE)
+ tftp_test_lib:try_catch(fun () -> begin Expr end end,
+ ?MODULE, ?LINE, ?FUNCTION_NAME)
end).
--
2.51.0