371
387
Flags = "%%! -archive_script_dict foo bar"
372
388
" -archive_script_dict foo"
373
389
" -archive_script_dummy bar",
374
?line {ok, OrigFI} = file:read_file_info(OrigFile),
390
?line {ok, OrigFI} = file:read_file_info(OrigFile),
377
393
%% Create and run scripts without emulator flags
378
MainBase = "archive_script_main",
379
MainScript = filename:join([PrivDir, MainBase]),
394
MainBase = "archive_script_main",
395
MainScript = filename:join([PrivDir, MainBase]),
382
?line ok = file:write_file(MainScript,
398
?line ok = file:write_file(MainScript,
386
?line ok = file:write_file_info(MainScript, OrigFI),
402
?line ok = file:write_file_info(MainScript, OrigFI),
388
404
?line run(PrivDir, MainBase ++ " -arg1 arg2 arg3",
389
[<<"main:[\"-arg1\",\"arg2\",\"arg3\"]\n"
390
"dict:[{archive_script_dict,[\"foo\",\"bar\"]},{archive_script_dict,[\"foo\"]}]\n"
391
"dummy:[{archive_script_dummy,[\"bar\"]}]\n"
392
"priv:{ok,<<\"Some private data...\\n\">>}\n"
395
?line run(PrivDir, "", MainBase ++ " -arg1 arg2 arg3",
396
[<<"main:[\"-arg1\",\"arg2\",\"arg3\"]\n"
397
"dict:[{archive_script_dict,[\"foo\",\"bar\"]},{archive_script_dict,[\"foo\"]}]\n"
398
"dummy:[{archive_script_dummy,[\"bar\"]}]\n"
399
"priv:{ok,<<\"Some private data...\\n\">>}\n"
405
[<<"main:[\"-arg1\",\"arg2\",\"arg3\"]\n"
406
"dict:[{archive_script_dict,[\"foo\",\"bar\"]},{archive_script_dict,[\"foo\"]}]\n"
407
"dummy:[{archive_script_dummy,[\"bar\"]}]\n"
408
"priv:{ok,<<\"Some private data...\\n\">>}\n"
411
?line run_with_opts(PrivDir, "", MainBase ++ " -arg1 arg2 arg3",
412
[<<"main:[\"-arg1\",\"arg2\",\"arg3\"]\n"
413
"dict:[{archive_script_dict,[\"foo\",\"bar\"]},{archive_script_dict,[\"foo\"]}]\n"
414
"dummy:[{archive_script_dummy,[\"bar\"]}]\n"
415
"priv:{ok,<<\"Some private data...\\n\">>}\n"
402
418
?line ok = file:rename(MainScript, MainScript ++ "_with_shebang"),
404
420
%% Without shebang (no flags)
405
?line ok = file:write_file(MainScript,
421
?line ok = file:write_file(MainScript,
406
422
["Something else than shebang!!!", "\n",
408
?line ok = file:write_file_info(MainScript, OrigFI),
410
?line run(PrivDir, "", MainBase ++ " -arg1 arg2 arg3",
411
[<<"main:[\"-arg1\",\"arg2\",\"arg3\"]\n"
424
?line ok = file:write_file_info(MainScript, OrigFI),
426
?line run_with_opts(PrivDir, "", MainBase ++ " -arg1 arg2 arg3",
427
[<<"main:[\"-arg1\",\"arg2\",\"arg3\"]\n"
414
430
"priv:{ok,<<\"Some private data...\\n\">>}\n"
415
431
"ExitCode:0">>]),
416
432
?line ok = file:rename(MainScript, MainScript ++ "_without_shebang"),
418
434
%% Plain archive without header (no flags)
420
436
?line ok = file:write_file(MainScript, [ArchiveBin]),
421
?line ok = file:write_file_info(MainScript, OrigFI),
423
?line run(PrivDir, "", MainBase ++ " -arg1 arg2 arg3",
424
[<<"main:[\"-arg1\",\"arg2\",\"arg3\"]\n"
437
?line ok = file:write_file_info(MainScript, OrigFI),
439
?line run_with_opts(PrivDir, "", MainBase ++ " -arg1 arg2 arg3",
440
[<<"main:[\"-arg1\",\"arg2\",\"arg3\"]\n"
427
443
"priv:{ok,<<\"Some private data...\\n\">>}\n"
428
444
"ExitCode:0">>]),
429
445
?line ok = file:rename(MainScript, MainScript ++ "_without_header"),
432
448
%% Create and run scripts with emulator flags
433
449
AltBase = "archive_script_alternate_main",
434
450
AltScript = filename:join([PrivDir, AltBase]),
435
?line ok = file:write_file(AltScript,
451
?line ok = file:write_file(AltScript,
438
454
Flags, " -escript main archive_script_main2\n",
440
?line ok = file:write_file_info(AltScript, OrigFI),
456
?line ok = file:write_file_info(AltScript, OrigFI),
442
458
?line run(PrivDir, AltBase ++ " -arg1 arg2 arg3",
443
459
[<<"main2:[\"-arg1\",\"arg2\",\"arg3\"]\n"
483
499
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
501
create_and_extract(Config) when is_list(Config) ->
507
prepare_creation("create_and_extract", Config),
510
[[{source, ErlCode}],
512
[{archive, ArchiveBin}]],
514
%% Verify all combinations of scripts with shebangs
515
[verify_sections(NewFile, FileInfo, S ++ C ++ E ++ B) ||
516
S <- [[{shebang, default}],
517
[{shebang, "/usr/bin/env escript"}]],
519
[{comment, undefined}],
520
[{comment, default}],
521
[{comment, "This is a nonsense comment"}]],
523
[{emu_args, undefined}],
524
[{emu_args, EmuArg}]],
525
B <- [[{source, Source}] | Bodies]],
527
%% Verify all combinations of scripts without shebangs
528
[verify_sections(NewFile, FileInfo, S ++ C ++ E ++ B) ||
529
S <- [[], [{shebang, undefined}]],
530
C <- [[], [{comment, undefined}]],
531
E <- [[], [{emu_args, undefined}]],
534
%% Verify the compile_source option
535
file:delete(NewFile),
536
?line ok = escript:create(NewFile, [{source, Source}]),
537
?line {ok, [_, _, _, {source, Source}]} = escript:extract(NewFile, []),
538
?line {ok, [_, _, _, {source, BeamCode2}]} =
539
escript:extract(NewFile, [compile_source]),
540
verify_sections(NewFile, FileInfo,
545
file:delete(NewFile),
548
prepare_creation(Base, Config) ->
550
PrivDir = ?config(priv_dir, Config),
551
DataDir = ?config(data_dir, Config),
552
OrigFile = filename:join([DataDir,"emulator_flags"]),
553
?line {ok, FileInfo} = file:read_file_info(OrigFile),
554
NewFile = filename:join([PrivDir, Base]),
555
?line {ok, [{shebang, default},
559
escript:extract(OrigFile, []),
562
ErlFile = NewFile ++ ".erl",
563
ErlCode = list_to_binary(["\n-module(", Base, ").\n",
564
"-export([main/1]).\n\n",
566
?line ok = file:write_file(ErlFile, ErlCode),
569
?line {ok, _Mod, BeamCode} =
570
compile:file(ErlFile, [binary, debug_info]),
573
?line {ok, {_, ArchiveBin}} =
574
zip:create("dummy_archive_name",
575
[{Base ++ ".erl", ErlCode},
576
{Base ++ ".beam", BeamCode}],
577
[{compress, []}, memory]),
580
Base ++ ".erl", ErlCode,
581
Base ++ ".beam", BeamCode,
584
verify_sections(File, FileInfo, Sections) ->
585
io:format("~p:verify_sections(\n\t~p,\n\t~p,\n\t~p).\n",
586
[?MODULE, File, FileInfo, Sections]),
590
?line ok = escript:create(File, Sections),
591
?line ok = file:write_file_info(File, FileInfo),
594
Dir = filename:absname(filename:dirname(File)),
595
Base = filename:basename(File),
598
case lists:keysearch(Tag, 1, Sections) of
600
{value, {_, undefined}} -> false;
604
ExpectedMain = <<"main:[\"-arg1\",\"arg2\",\"arg3\"]\n">>,
606
case HasArg(emu_args) of
608
<<"nostick:[{nostick,[]}]\n"
609
"mnesia:[{mnesia,[\"dir\",\"a/directory\"]},{mnesia,[\"debug\",\"verbose\"]}]\n"
614
<<"nostick:[]\nmnesia:[]\nERL_FLAGS=false\nunknown:[]\nExitCode:0">>
617
InputArgs = Base ++ " -arg1 arg2 arg3",
618
Expected = <<ExpectedMain/binary, ExpectedOutput/binary>>,
619
case HasArg(shebang) of
621
?line run(Dir, InputArgs, [Expected]);
623
?line run_with_opts(Dir, [], InputArgs, [Expected])
627
?line {ok, Bin} = escript:create(binary, Sections),
628
?line {ok, Read} = file:read_file(File),
629
?line Bin = Read, % Assert
631
Normalized = normalize_sections(Sections),
632
?line {ok, Extracted} = escript:extract(File, []),
633
io:format("Normalized; ~p\n", [Normalized]),
634
io:format("Extracted ; ~p\n", [Extracted]),
635
?line Normalized = Extracted, % Assert
638
normalize_sections(Sections) ->
642
is_atom(Val) -> {Val, default};
646
case lists:map(AtomToTuple, [{K, V} || {K, V} <- Sections, V =/= undefined]) of
647
[{shebang, Shebang} | Rest] ->
648
[{shebang, Shebang} |
650
[{comment, Comment} | Rest2] ->
651
[{comment, Comment} |
653
[{emu_args, EmuArgs}, Body] ->
654
[{emu_args, EmuArgs}, Body];
656
[{emu_args, undefined}, Body]
659
[{emu_args, EmuArgs}, Body] ->
660
[{comment, undefined}, {emu_args, EmuArgs}, Body];
662
[{comment, undefined}, {emu_args, undefined}, Body]
666
[{shebang, undefined}, {comment, undefined}, {emu_args, undefined}, Body]
668
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
670
foldl(Config) when is_list(Config) ->
676
prepare_creation("foldl", Config),
678
Collect = fun(Name, GetInfo, GetBin, Acc) ->
679
[{Name, GetInfo(), GetBin()} | Acc]
682
%% Get line numbers and the file attribute right
683
SourceFile = NewFile ++ ".erl",
684
<<_:1/binary, ErlCode2/binary>> = ErlCode,
685
?line ok = file:write_file(SourceFile, ErlCode2),
686
?line {ok, _Mod, BeamCode} =
687
compile:file(SourceFile, [binary, debug_info]),
689
%% Verify source script
690
?line ok = escript:create(SourceFile, [{source, ErlCode}]),
691
?line {ok, [{".", _, BeamCode2}]}
692
= escript_foldl(Collect, [], SourceFile),
694
?line {ok, Abstr} = beam_lib:chunks(BeamCode, [abstract_code]),
695
?line {ok, Abstr2} = beam_lib:chunks(BeamCode2, [abstract_code]),
696
%% io:format("abstr1=~p\n", [Abstr]),
697
%% io:format("abstr2=~p\n", [Abstr2]),
698
?line Abstr = Abstr2, % Assert
700
%% Verify beam script
701
?line ok = escript:create(NewFile, [{beam, BeamCode}]),
702
?line {ok, [{".", _, BeamCode}]}
703
= escript_foldl(Collect, [], NewFile),
705
%% Verify archive scripts
706
?line ok = escript:create(NewFile, [{archive, ArchiveBin}]),
707
?line {ok, [{BeamBase, #file_info{}, _},
708
{ErlBase, #file_info{}, _}]}
709
= escript_foldl(Collect, [], NewFile),
711
ArchiveFiles = [{ErlBase, ErlCode}, {BeamBase, BeamCode}],
712
?line ok = escript:create(NewFile, [{archive, ArchiveFiles, []}]),
713
?line {ok, [{BeamBase, _, _},
715
= escript_foldl(Collect, [], NewFile),
719
escript_foldl(Fun, Acc, File) ->
720
code:ensure_loaded(zip),
721
case erlang:function_exported(zip, foldl, 3) of
723
emulate_escript_foldl(Fun, Acc, File);
725
escript:foldl(Fun, Acc, File)
728
emulate_escript_foldl(Fun, Acc, File) ->
729
case escript:extract(File, [compile_source]) of
730
{ok, [_Shebang, _Comment, _EmuArgs, Body]} ->
732
{source, BeamCode} ->
733
GetInfo = fun() -> file:read_file_info(File) end,
734
GetBin = fun() -> BeamCode end,
735
{ok, Fun(".", GetInfo, GetBin, Acc)};
737
GetInfo = fun() -> file:read_file_info(File) end,
738
GetBin = fun() -> BeamCode end,
739
{ok, Fun(".", GetInfo, GetBin, Acc)};
740
{archive, ArchiveBin} ->
741
zip:foldl(Fun, Acc, {File, ArchiveBin})
747
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
749
overflow(Config) when is_list(Config) ->
750
Data = ?config(data_dir, Config),
751
Dir = filename:absname(Data), %Get rid of trailing slash.
752
?line run(Dir, "arg_overflow",
754
?line run(Dir, "linebuf_overflow",
758
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
485
760
run(Dir, Cmd0, Expected0) ->
486
761
Expected = iolist_to_binary(expected_output(Expected0, Dir)),
487
762
Cmd = case os:type() of