From 665f2d450a8f26dfb14e0c9891d1167d80768286 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B6rn=20Gustavsson?= Date: Thu, 8 Dec 2011 14:24:51 +0100 Subject: file_SUITE: Fix unix_free/1 unix_free/1 returned the total size of the disk, not the free space. --- lib/kernel/test/file_SUITE.erl | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) (limited to 'lib/kernel') diff --git a/lib/kernel/test/file_SUITE.erl b/lib/kernel/test/file_SUITE.erl index 85346762ac..70c1569543 100644 --- a/lib/kernel/test/file_SUITE.erl +++ b/lib/kernel/test/file_SUITE.erl @@ -3310,9 +3310,11 @@ unix_free(Config) -> Cmd = ["df -k '",?config(priv_dir, Config),"'"], DF0 = os:cmd(Cmd), io:format("$ ~s~n~s", [Cmd,DF0]), - [$\n|DF1] = lists:dropwhile(fun ($\n) -> false; (_) -> true end, DF0), - {ok,[N],_} = io_lib:fread(" ~*s ~d", DF1), - N. + Lines = re:split(DF0, "\n", [trim,{return,list}]), + Last = lists:last(Lines), + RE = "^[^\\s]*\\s+\\d+\\s+\\d+\\s+(\\d+)", + {match,[Avail]} = re:run(Last, RE, [{capture,all_but_first,list}]), + list_to_integer(Avail). do_large_file(Config) -> ?line Watchdog = ?t:timetrap(?t:minutes(5)), -- cgit v1.2.3 From 28e3678aaf61de3a727820c8fbf500118990bcfc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B6rn=20Gustavsson?= Date: Thu, 8 Dec 2011 14:28:25 +0100 Subject: file_SUITE: Refactor large_file/1 Factor out support functions from large_file/1 so that we can write other test cases that use large files. --- lib/kernel/test/file_SUITE.erl | 115 ++++++++++++++++++++++++----------------- 1 file changed, 67 insertions(+), 48 deletions(-) (limited to 'lib/kernel') diff --git a/lib/kernel/test/file_SUITE.erl b/lib/kernel/test/file_SUITE.erl index 70c1569543..3c97ecde80 100644 --- a/lib/kernel/test/file_SUITE.erl +++ b/lib/kernel/test/file_SUITE.erl @@ -3287,52 +3287,13 @@ large_file(suite) -> large_file(doc) -> ["Tests positioning in large files (> 4G)"]; large_file(Config) when is_list(Config) -> - case {os:type(),os:version()} of - {{win32,nt},_} -> - do_large_file(Config); - {{unix,sunos},{A,B,C}} - when A == 5, B == 5, C >= 1; A == 5, B >= 6; A >= 6 -> - do_large_file(Config); - {{unix,Unix},_} when Unix =/= sunos -> - N = unix_free(Config), - io:format("Free: ~w KByte~n", [N]), - if N < 5 * (1 bsl 20) -> - %% Less than 5 GByte free - {skipped,"Less than 5 GByte free"}; - true -> - do_large_file(Config) - end; - _ -> - {skipped,"Only supported on Win32, Unix or SunOS >= 5.5.1"} - end. - -unix_free(Config) -> - Cmd = ["df -k '",?config(priv_dir, Config),"'"], - DF0 = os:cmd(Cmd), - io:format("$ ~s~n~s", [Cmd,DF0]), - Lines = re:split(DF0, "\n", [trim,{return,list}]), - Last = lists:last(Lines), - RE = "^[^\\s]*\\s+\\d+\\s+\\d+\\s+(\\d+)", - {match,[Avail]} = re:run(Last, RE, [{capture,all_but_first,list}]), - list_to_integer(Avail). + run_large_file_test(Config, + fun(Name) -> do_large_file(Name) end, + "_large_file"). -do_large_file(Config) -> +do_large_file(Name) -> ?line Watchdog = ?t:timetrap(?t:minutes(5)), - %% - ?line Name = filename:join(?config(priv_dir, Config), - ?MODULE_STRING ++ "_large_file"), - ?line Tester = self(), - Deleter = - spawn( - fun() -> - Mref = erlang:monitor(process, Tester), - receive - {'DOWN',Mref,_,_,_} -> ok; - {Tester,done} -> ok - end, - ?FILE_MODULE:delete(Name) - end), - %% + ?line S = "1234567890", L = length(S), R = lists:reverse(S), @@ -3368,10 +3329,6 @@ do_large_file(Config) -> ?line {ok,R} = ?FILE_MODULE:read(F1, L+1), ?line ok = ?FILE_MODULE:close(F1), %% - ?line Mref = erlang:monitor(process, Deleter), - ?line Deleter ! {Tester,done}, - ?line receive {'DOWN',Mref,_,_,_} -> ok end, - %% ?line ?t:timetrap_cancel(Watchdog), ok. @@ -3952,3 +3909,65 @@ flush(Msgs) -> after 0 -> lists:reverse(Msgs) end. + +%%% +%%% Support for testing large files. +%%% + +run_large_file_test(Config, Run, Name) -> + case {os:type(),os:version()} of + {{win32,nt},_} -> + do_run_large_file_test(Config, Run, Name); + {{unix,sunos},{A,B,C}} + when A == 5, B == 5, C >= 1; A == 5, B >= 6; A >= 6 -> + do_run_large_file_test(Config, Run, Name); + {{unix,Unix},_} when Unix =/= sunos -> + N = unix_free(Config), + io:format("Free: ~w KByte~n", [N]), + if N < 5 * (1 bsl 20) -> + %% Less than 5 GByte free + {skip,"Less than 5 GByte free"}; + true -> + do_run_large_file_test(Config, Run, Name) + end; + _ -> + {skip,"Only supported on Win32, Unix or SunOS >= 5.5.1"} + end. + + +do_run_large_file_test(Config, Run, Name0) -> + Name = filename:join(?config(priv_dir, Config), + ?MODULE_STRING ++ Name0), + + %% Set up a process that will delete this file. + Tester = self(), + Deleter = + spawn( + fun() -> + Mref = erlang:monitor(process, Tester), + receive + {'DOWN',Mref,_,_,_} -> ok; + {Tester,done} -> ok + end, + ?FILE_MODULE:delete(Name) + end), + + %% Run the test case. + Res = Run(Name), + + %% Delete file and finish deleter process. + Mref = erlang:monitor(process, Deleter), + Deleter ! {Tester,done}, + receive {'DOWN',Mref,_,_,_} -> ok end, + + Res. + +unix_free(Path) -> + Cmd = ["df -k '",Path,"'"], + DF0 = os:cmd(Cmd), + io:format("$ ~s~n~s", [Cmd,DF0]), + Lines = re:split(DF0, "\n", [trim,{return,list}]), + Last = lists:last(Lines), + RE = "^[^\\s]*\\s+\\d+\\s+\\d+\\s+(\\d+)", + {match,[Avail]} = re:run(Last, RE, [{capture,all_but_first,list}]), + list_to_integer(Avail). -- cgit v1.2.3 From ceb6dc4167d4d4c61ee41df60168cd318be624de Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B6rn=20Gustavsson?= Date: Mon, 5 Dec 2011 14:22:21 +0100 Subject: file_SUITE: Add large_write/1 Test writing 2GB to a file in one go. --- lib/kernel/test/file_SUITE.erl | 34 ++++++++++++++++++++++++++-------- 1 file changed, 26 insertions(+), 8 deletions(-) (limited to 'lib/kernel') diff --git a/lib/kernel/test/file_SUITE.erl b/lib/kernel/test/file_SUITE.erl index 3c97ecde80..b1c06e6aa7 100644 --- a/lib/kernel/test/file_SUITE.erl +++ b/lib/kernel/test/file_SUITE.erl @@ -78,7 +78,7 @@ -export([altname/1]). --export([large_file/1]). +-export([large_file/1, large_write/1]). -export([read_line_1/1, read_line_2/1, read_line_3/1,read_line_4/1]). @@ -106,7 +106,7 @@ all() -> {group, compression}, {group, links}, copy, delayed_write, read_ahead, segment_read, segment_write, ipread, pid2name, interleaved_read_write, otp_5814, - large_file, read_line_1, read_line_2, read_line_3, + large_file, large_write, read_line_1, read_line_2, read_line_3, read_line_4, standard_io]. groups() -> @@ -3334,6 +3334,25 @@ do_large_file(Name) -> %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +large_write(Config) when is_list(Config) -> + run_large_file_test(Config, + fun(Name) -> do_large_write(Name) end, + "_large_write"). + +do_large_write(Name) -> + case erlang:system_info(wordsize) of + 4 -> + {skip,"Needs a 64-bit emulator"}; + 8 -> + Size = 4*1024*1024*1024+1, + Bin = <<0:Size/unit:8>>, + ok = file:write_file(Name, Bin), + {ok,#file_info{size=Size}} = file:read_file_info(Name), + ok + end. + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + response_analysis(Module, Function, Arguments) -> @@ -3918,12 +3937,11 @@ run_large_file_test(Config, Run, Name) -> case {os:type(),os:version()} of {{win32,nt},_} -> do_run_large_file_test(Config, Run, Name); - {{unix,sunos},{A,B,C}} - when A == 5, B == 5, C >= 1; A == 5, B >= 6; A >= 6 -> - do_run_large_file_test(Config, Run, Name); - {{unix,Unix},_} when Unix =/= sunos -> - N = unix_free(Config), - io:format("Free: ~w KByte~n", [N]), + {{unix,sunos},OsVersion} when OsVersion < {5,5,1} -> + {skip,"Only supported on Win32, Unix or SunOS >= 5.5.1"}; + {{unix,_},_} -> + N = unix_free(?config(priv_dir, Config)), + io:format("Free disk: ~w KByte~n", [N]), if N < 5 * (1 bsl 20) -> %% Less than 5 GByte free {skip,"Less than 5 GByte free"}; -- cgit v1.2.3 From e5f0a210a5b60c81172e8bdba9227abdb0834bb4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B6rn=20Gustavsson?= Date: Tue, 6 Dec 2011 17:25:57 +0100 Subject: prim_file_SUITE: Add large_write/1 Test writing slightly more than 4GB as an io list with smaller binaries. --- lib/kernel/test/prim_file_SUITE.erl | 82 ++++++++++++++++++++++++++++++++++++- 1 file changed, 81 insertions(+), 1 deletion(-) (limited to 'lib/kernel') diff --git a/lib/kernel/test/prim_file_SUITE.erl b/lib/kernel/test/prim_file_SUITE.erl index ccf26ee034..33651fadb2 100644 --- a/lib/kernel/test/prim_file_SUITE.erl +++ b/lib/kernel/test/prim_file_SUITE.erl @@ -52,6 +52,10 @@ list_dir_limit/1]). -export([advise/1]). +-export([large_write/1]). + +%% System probe functions that might be handy to check from the shell +-export([unix_free/1]). -include_lib("test_server/include/test_server.hrl"). -include_lib("kernel/include/file.hrl"). @@ -83,7 +87,7 @@ groups() -> cur_dir_1a, cur_dir_1b]}, {files, [], [{group, open}, {group, pos}, {group, file_info}, - truncate, sync, datasync, advise]}, + truncate, sync, datasync, advise, large_write]}, {open, [], [open1, modes, close, access, read_write, pread_write, append, exclusive]}, @@ -1322,6 +1326,22 @@ advise(Config) when is_list(Config) -> ?line test_server:timetrap_cancel(Dog), ok. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +large_write(Config) when is_list(Config) -> + run_large_file_test(Config, + fun(Name) -> do_large_write(Name) end, + "_large_write"). + +do_large_write(Name) -> + ChunkSize = 256*1024*1024+1, + Chunks = 16, + Size = Chunks * ChunkSize, + Chunk = <<0:ChunkSize/unit:8>>, + Bin = lists:duplicate(Chunks, Chunk), + ok = prim_file:write_file(Name, Bin), + {ok,#file_info{size=Size}} = file:read_file_info(Name), + ok. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -2044,3 +2064,63 @@ list_dir_limit_cleanup(Dir, Handle, N, Cnt) -> ?PRIM_FILE:delete(Handle, filename:join(Dir, Name)), list_dir_limit_cleanup(Dir, Handle, N, Cnt+1). +%%% +%%% Support for testing large files. +%%% + +run_large_file_test(Config, Run, Name) -> + case {os:type(),os:version()} of + {{win32,nt},_} -> + do_run_large_file_test(Config, Run, Name); + {{unix,sunos},OsVersion} when OsVersion < {5,5,1} -> + {skip,"Only supported on Win32, Unix or SunOS >= 5.5.1"}; + {{unix,_},_} -> + N = unix_free(?config(priv_dir, Config)), + io:format("Free disk: ~w KByte~n", [N]), + if N < 5 bsl 20 -> + %% Less than 5 GByte free + {skip,"Less than 5 GByte free disk"}; + true -> + do_run_large_file_test(Config, Run, Name) + end; + _ -> + {skip,"Only supported on Win32, Unix or SunOS >= 5.5.1"} + end. + + +do_run_large_file_test(Config, Run, Name0) -> + Name = filename:join(?config(priv_dir, Config), + ?MODULE_STRING ++ Name0), + + %% Set up a process that will delete this file. + Tester = self(), + Deleter = + spawn( + fun() -> + Mref = erlang:monitor(process, Tester), + receive + {'DOWN',Mref,_,_,_} -> ok; + {Tester,done} -> ok + end, + prim_file:delete(Name) + end), + + %% Run the test case. + Res = Run(Name), + + %% Delete file and finish deleter process. + Mref = erlang:monitor(process, Deleter), + Deleter ! {Tester,done}, + receive {'DOWN',Mref,_,_,_} -> ok end, + + Res. + +unix_free(Path) -> + Cmd = ["df -k '",Path,"'"], + DF0 = os:cmd(Cmd), + io:format("$ ~s~n~s", [Cmd,DF0]), + Lines = re:split(DF0, "\n", [trim,{return,list}]), + Last = lists:last(Lines), + RE = "^[^\\s]*\\s+\\d+\\s+\\d+\\s+(\\d+)", + {match,[Avail]} = re:run(Last, RE, [{capture,all_but_first,list}]), + list_to_integer(Avail). -- cgit v1.2.3 From 5a3a2097e0e931257bf1182fa575c7b973519886 Mon Sep 17 00:00:00 2001 From: Raimo Niskanen Date: Fri, 16 Dec 2011 11:32:57 +0100 Subject: file_SUITE: large_write - check mem size before creating huge binary --- lib/kernel/test/file_SUITE.erl | 73 ++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 70 insertions(+), 3 deletions(-) (limited to 'lib/kernel') diff --git a/lib/kernel/test/file_SUITE.erl b/lib/kernel/test/file_SUITE.erl index b1c06e6aa7..0a4d5a31d2 100644 --- a/lib/kernel/test/file_SUITE.erl +++ b/lib/kernel/test/file_SUITE.erl @@ -92,6 +92,8 @@ -export([bytes/2, iterate/3]). +%% System probe functions that might be handy to check from the shell +-export([unix_free/1, memsize/0, bsd_memsize/1, win_memsize/1]). -include_lib("test_server/include/test_server.hrl"). -include_lib("kernel/include/file.hrl"). @@ -3340,10 +3342,16 @@ large_write(Config) when is_list(Config) -> "_large_write"). do_large_write(Name) -> - case erlang:system_info(wordsize) of - 4 -> + Memsize = memsize(), + io:format("Memsize = ~w Bytes~n", [Memsize]), + case {erlang:system_info(wordsize),Memsize} of + {4,_} -> {skip,"Needs a 64-bit emulator"}; - 8 -> + {8,N} when N < 6 bsl 30 -> + {skip, + "This machine has < 6 GB memory: " + ++integer_to_list(N)}; + {8,_} -> Size = 4*1024*1024*1024+1, Bin = <<0:Size/unit:8>>, ok = file:write_file(Name, Bin), @@ -3989,3 +3997,62 @@ unix_free(Path) -> RE = "^[^\\s]*\\s+\\d+\\s+\\d+\\s+(\\d+)", {match,[Avail]} = re:run(Last, RE, [{capture,all_but_first,list}]), list_to_integer(Avail). + +memsize() -> + case os:type() of + {unix,openbsd} -> + bsd_memsize("hw.physmem"); + {unix,freebsd} -> + bsd_memsize("hw.physmem"); + {unix,darwin} -> + bsd_memsize("hw.memsize"); + {unix,linux} -> + Meminfo = os:cmd("cat /proc/meminfo"), + Re = "^MemTotal:\\s+(\\d+)\\s+kB\$", + ReOpts = [multiline,{capture,all_but_first,list}], + case re:run(Meminfo, Re, ReOpts) of + {match,[Str]} -> + list_to_integer(Str) bsl 10; + nomatch -> + 0 + end; + {win32,_} -> + win_memsize(os:cmd("mem.exe")); + _ -> + 0 + end. + +bsd_memsize(MIB) -> + Reply = os:cmd(["sysctl ",MIB]), + try strip_prefix(MIB, Reply) of + Str -> + Re = "^\\s*(?::|=)\\s*(\\d+)", + ReOpts = [{capture,all_but_first,list}], + case re:run(Str, Re, ReOpts) of + {match,[SizeStr]} -> + list_to_integer(SizeStr); + nomatch -> + 0 + end + catch + error:_ -> + 0 + end. + +win_memsize(Mem) -> + Lines = re:split(Mem, "\\R+", [trim,{return,list}]), + {ok,RE} = re:compile("^\\s*(\\d+)"), + REOpts = [{capture,all_but_first,list}], + Numbers = + [case re:run(Line, RE, REOpts) of + nomatch -> + 0; + {match,[Digits]} -> + list_to_integer(Digits) + end || Line <- Lines], + lists:foldl(fun erlang:max/2, 0, Numbers). + +strip_prefix([X|Prefix], [X|List]) -> + strip_prefix(Prefix, List); +strip_prefix([], List) -> + List. -- cgit v1.2.3 From 4a46e6223c46b86a8c84f630753d4d007e354fea Mon Sep 17 00:00:00 2001 From: Raimo Niskanen Date: Fri, 16 Dec 2011 12:02:41 +0100 Subject: prim_file_SUITE: large_write - meaner test data and check result content --- lib/kernel/test/prim_file_SUITE.erl | 31 ++++++++++++++++++++++++++----- 1 file changed, 26 insertions(+), 5 deletions(-) (limited to 'lib/kernel') diff --git a/lib/kernel/test/prim_file_SUITE.erl b/lib/kernel/test/prim_file_SUITE.erl index 33651fadb2..ceed33515c 100644 --- a/lib/kernel/test/prim_file_SUITE.erl +++ b/lib/kernel/test/prim_file_SUITE.erl @@ -1334,13 +1334,27 @@ large_write(Config) when is_list(Config) -> "_large_write"). do_large_write(Name) -> - ChunkSize = 256*1024*1024+1, - Chunks = 16, - Size = Chunks * ChunkSize, + Dog = test_server:timetrap(test_server:minutes(60)), + ChunkSize = (256 bsl 20) + 1, % 256 M + 1 + Chunks = 16, % times 16 -> 4 G + 16 + Base = 100, + Interleave = lists:seq(Base+1, Base+Chunks), Chunk = <<0:ChunkSize/unit:8>>, - Bin = lists:duplicate(Chunks, Chunk), - ok = prim_file:write_file(Name, Bin), + Data = zip_data(lists:duplicate(Chunks, Chunk), Interleave), + Size = Chunks * ChunkSize + Chunks, % 4 G + 32 + ok = prim_file:write_file(Name, Data), {ok,#file_info{size=Size}} = file:read_file_info(Name), + {ok,Fd} = prim_file:open(Name, [read]), + check_large_write(Dog, Fd, ChunkSize, 0, Interleave). + +check_large_write(Dog, Fd, ChunkSize, Pos, [X|Interleave]) -> + Pos1 = Pos + ChunkSize, + {ok,Pos1} = prim_file:position(Fd, {cur,ChunkSize}), + {ok,[X]} = prim_file:read(Fd, 1), + check_large_write(Dog, Fd, ChunkSize, Pos1+1, Interleave); +check_large_write(Dog, Fd, _, _, []) -> + eof = prim_file:read(Fd, 1), + test_server:timetrap_cancel(Dog), ok. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -2124,3 +2138,10 @@ unix_free(Path) -> RE = "^[^\\s]*\\s+\\d+\\s+\\d+\\s+(\\d+)", {match,[Avail]} = re:run(Last, RE, [{capture,all_but_first,list}]), list_to_integer(Avail). + +zip_data([A|As], [B|Bs]) -> + [[A,B]|zip_data(As, Bs)]; +zip_data([], Bs) -> + Bs; +zip_data(As, []) -> + As. -- cgit v1.2.3 From 5c41307acc50055f622a19121b93c3c7c676db2a Mon Sep 17 00:00:00 2001 From: Raimo Niskanen Date: Fri, 16 Dec 2011 16:59:21 +0100 Subject: file_SITE,prim_file_SUITE: Accept old OpenBSD pecularity --- lib/kernel/test/file_SUITE.erl | 1 + lib/kernel/test/prim_file_SUITE.erl | 1 + 2 files changed, 2 insertions(+) (limited to 'lib/kernel') diff --git a/lib/kernel/test/file_SUITE.erl b/lib/kernel/test/file_SUITE.erl index 0a4d5a31d2..5a01c4a654 100644 --- a/lib/kernel/test/file_SUITE.erl +++ b/lib/kernel/test/file_SUITE.erl @@ -396,6 +396,7 @@ make_del_dir(Config) when is_list(Config) -> %% Don't worry ;-) the parent directory should never be empty, right? ?line case ?FILE_MODULE:del_dir('..') of {error, eexist} -> ok; + {error, eacces} -> ok; %OpenBSD {error, einval} -> ok %FreeBSD end, ?line {error, enoent} = ?FILE_MODULE:del_dir(""), diff --git a/lib/kernel/test/prim_file_SUITE.erl b/lib/kernel/test/prim_file_SUITE.erl index ceed33515c..831eadb04a 100644 --- a/lib/kernel/test/prim_file_SUITE.erl +++ b/lib/kernel/test/prim_file_SUITE.erl @@ -294,6 +294,7 @@ make_del_dir(Config, Handle, Suffix) -> %% Don't worry ;-) the parent directory should never be empty, right? ?line case ?PRIM_FILE_call(del_dir, Handle, [".."]) of {error, eexist} -> ok; + {error, eacces} -> ok; %OpenBSD {error, einval} -> ok %FreeBSD end, ?line {error, enoent} = ?PRIM_FILE_call(del_dir, Handle, [""]), -- cgit v1.2.3 From 2839bd40b0598b793e2038e2ed7068747905481e Mon Sep 17 00:00:00 2001 From: Raimo Niskanen Date: Tue, 20 Dec 2011 14:46:25 +0100 Subject: file_SUITE: Increase timeout for large_file Windows needs large timeout. --- lib/kernel/test/file_SUITE.erl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'lib/kernel') diff --git a/lib/kernel/test/file_SUITE.erl b/lib/kernel/test/file_SUITE.erl index 5a01c4a654..2c1102e81e 100644 --- a/lib/kernel/test/file_SUITE.erl +++ b/lib/kernel/test/file_SUITE.erl @@ -3295,7 +3295,7 @@ large_file(Config) when is_list(Config) -> "_large_file"). do_large_file(Name) -> - ?line Watchdog = ?t:timetrap(?t:minutes(5)), + ?line Watchdog = ?t:timetrap(?t:minutes(20)), ?line S = "1234567890", L = length(S), -- cgit v1.2.3 From 4e0e77ea852ae9bd63308b37feb4ad72246a8932 Mon Sep 17 00:00:00 2001 From: Raimo Niskanen Date: Wed, 21 Dec 2011 16:15:18 +0100 Subject: prim_file_SUITE: large_file success depends on wordsize Check VM wordsize to see if a driver command with data larger than 32-bit size is supposed to succeed. On wordsize 4 machines (32-bit) {error,einval} is expected since the total size passed to a driver can not exceed sizeof(ErlDrvSizeT). --- lib/kernel/test/prim_file_SUITE.erl | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) (limited to 'lib/kernel') diff --git a/lib/kernel/test/prim_file_SUITE.erl b/lib/kernel/test/prim_file_SUITE.erl index 831eadb04a..3e2202922c 100644 --- a/lib/kernel/test/prim_file_SUITE.erl +++ b/lib/kernel/test/prim_file_SUITE.erl @@ -1343,10 +1343,15 @@ do_large_write(Name) -> Chunk = <<0:ChunkSize/unit:8>>, Data = zip_data(lists:duplicate(Chunks, Chunk), Interleave), Size = Chunks * ChunkSize + Chunks, % 4 G + 32 - ok = prim_file:write_file(Name, Data), - {ok,#file_info{size=Size}} = file:read_file_info(Name), - {ok,Fd} = prim_file:open(Name, [read]), - check_large_write(Dog, Fd, ChunkSize, 0, Interleave). + Wordsize = erlang:system_info(wordsize), + case prim_file:write_file(Name, Data) of + ok when Wordsize =:= 8 -> + {ok,#file_info{size=Size}} = file:read_file_info(Name), + {ok,Fd} = prim_file:open(Name, [read]), + check_large_write(Dog, Fd, ChunkSize, 0, Interleave); + {error,einval} when Wordsize =:= 4 -> + ok + end. check_large_write(Dog, Fd, ChunkSize, Pos, [X|Interleave]) -> Pos1 = Pos + ChunkSize, -- cgit v1.2.3 From 77b157e42a7fd1a6f325276bdd88fd1a7f6bbea4 Mon Sep 17 00:00:00 2001 From: Raimo Niskanen Date: Thu, 5 Jan 2012 16:32:30 +0100 Subject: file_SUITE: Assume 64-bit windows has enough memory Temporary workaround until there is a memory info function conveniantly usable from test suites. --- lib/kernel/test/file_SUITE.erl | 19 +++---------------- 1 file changed, 3 insertions(+), 16 deletions(-) (limited to 'lib/kernel') diff --git a/lib/kernel/test/file_SUITE.erl b/lib/kernel/test/file_SUITE.erl index 2c1102e81e..6cab40d49d 100644 --- a/lib/kernel/test/file_SUITE.erl +++ b/lib/kernel/test/file_SUITE.erl @@ -1,7 +1,7 @@ %% %% %CopyrightBegin% %% -%% Copyright Ericsson AB 1996-2011. All Rights Reserved. +%% Copyright Ericsson AB 1996-2012. 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 @@ -93,7 +93,7 @@ %% System probe functions that might be handy to check from the shell --export([unix_free/1, memsize/0, bsd_memsize/1, win_memsize/1]). +-export([unix_free/1, memsize/0, bsd_memsize/1]). -include_lib("test_server/include/test_server.hrl"). -include_lib("kernel/include/file.hrl"). @@ -4018,7 +4018,7 @@ memsize() -> 0 end; {win32,_} -> - win_memsize(os:cmd("mem.exe")); + enough; % atom() > integer(); assume (64-bit) windows have enough _ -> 0 end. @@ -4040,19 +4040,6 @@ bsd_memsize(MIB) -> 0 end. -win_memsize(Mem) -> - Lines = re:split(Mem, "\\R+", [trim,{return,list}]), - {ok,RE} = re:compile("^\\s*(\\d+)"), - REOpts = [{capture,all_but_first,list}], - Numbers = - [case re:run(Line, RE, REOpts) of - nomatch -> - 0; - {match,[Digits]} -> - list_to_integer(Digits) - end || Line <- Lines], - lists:foldl(fun erlang:max/2, 0, Numbers). - strip_prefix([X|Prefix], [X|List]) -> strip_prefix(Prefix, List); strip_prefix([], List) -> -- cgit v1.2.3