Changeset 46 for trunk


Ignore:
Timestamp:
01/29/09 16:43:23 (3 years ago)
Author:
dom
Message:

Fixed a leak in fixtures:use_tree and improved boot test reports (in shells_test) in case of failure.

Location:
trunk/src
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/fixtures.erl

    r45 r46  
    88-export ([make_tree/2, delete_tree/1]). 
    99-export ([use_tree/3]). 
    10 -export ([use_tree/4]). 
    11 -include_lib("kernel/include/file.hrl"). 
     10-export ([use_tree/2]). 
     11-include_lib ("kernel/include/file.hrl"). 
    1212 
    1313make_tree (Root, Tree) -> 
     
    6868    lists: foreach (Delete, Filename_list). 
    6969 
     70use_tree (Tree, Fun) -> 
     71    use_tree (temporary_pathname (), Tree, Fun). 
     72 
    7073use_tree (Dir, Tree, Fun) -> 
    71     use_tree (Dir, Tree, Fun, fun (_, _) -> ok end). 
     74    try 
     75        make_tree (Dir, Tree), 
     76        safe_call (Dir, Tree, Fun) 
     77    after 
     78        delete_tree (Dir) 
     79    end. 
    7280 
    73 use_tree (Dir, Tree, Use_fun, Cleanup_fun) -> 
    74     make_tree (Dir, Tree), 
    75     LastCall = case catch Use_fun (Dir, Tree) of 
    76                    {'EXIT', Reason} -> 
    77                        fun () -> exit (Reason) end; 
    78                    Result -> 
    79                        fun() -> Result end 
    80                end, 
    81     Cleanup_fun (Dir, Tree), 
    82     delete_tree (Dir), 
    83     LastCall (). 
     81safe_call (Dir, Tree, Fun) -> 
     82    Self = self (), 
     83    Pid = spawn_link (fun() -> safe_call (Self, Dir, Tree, Fun) end), 
     84    receive 
     85        {Pid, {'EXIT', Error}} -> exit (Error); 
     86        {Pid, Result} -> Result 
     87    end. 
     88 
     89safe_call (Parent, Dir, Tree, Fun) -> 
     90    process_flag (trap_exit, true), 
     91    Self = self (), 
     92    Pid = spawn_link (fun () -> Self ! {self (), Fun (Dir, Tree)} end), 
     93    receive 
     94        {Pid, Result} -> Parent ! {Self, Result}; 
     95        {'EXIT', Pid, Error} -> Parent ! {Self, {'EXIT', Error}} 
     96    end. 
  • trunk/src/fixtures_test.erl

    r45 r46  
    99-export ([use_tree_creates_the_tree_first_and_destroys_it_after/0]). 
    1010-export ([use_tree_passes_a_tree_to_a_fun/0]). 
    11 -export([use_tree_destroys_tree_even_if_fun_crashes/0]). 
    12 -export([use_tree_can_take_a_cleanup_fun/0]). 
    13 -include_lib ("kernel/include/file.hrl"). 
     11-export ([use_tree_destroys_tree_even_if_fun_crashes/0]). 
     12-export ([use_tree_destroys_tree_even_if_trapexit/0]). 
    1413 
    1514temporary_pathname () -> 
     
    5958use_tree_creates_the_tree_first_and_destroys_it_after () -> 
    6059    Tmp = fixtures: temporary_pathname (), 
    61     ["test", "test2", "testdir"] = fixtures: use_tree (Tmp, tree (), fun keep_real_files/2), 
     60    Result = fixtures: use_tree (Tmp, tree (), fun keep_real_files/2), 
     61    ["test", "test2", "testdir"] = Result, 
    6262    {error,enoent} = file:read_file_info (Tmp), 
    6363    pass. 
     
    6969    Tmp = fixtures: temporary_pathname (), 
    7070    Tree = tree (), 
    71     {'EXIT', {suicide, Tmp, Tree}} = (catch fixtures: use_tree (Tmp, Tree, fun suicide/2)), 
     71    ok = 
     72        try 
     73            fixtures: use_tree (Tmp, Tree, fun suicide/2), 
     74            no_crash 
     75        catch 
     76            _:{suicide, Tmp, Tree} -> ok; 
     77            C:E -> {unexpected, C, E} 
     78        end, 
     79    {error, enoent} = file:read_file_info (Tmp), 
     80    pass. 
     81 
     82spawn_undef (_, _) -> 
     83    spawn_link (blabla, blabla, []), 
     84    receive M -> M end. 
     85             
     86use_tree_destroys_tree_even_if_trapexit () -> 
     87    Tmp = fixtures: temporary_pathname (), 
     88    ok = 
     89        try 
     90            fixtures: use_tree (Tmp, [], fun spawn_undef/2), 
     91            no_crash 
     92        catch 
     93            _:{undef, _} -> ok; 
     94            C:E -> {unexpected, C, E} 
     95        end, 
    7296    {error, enoent} = file:read_file_info (Tmp), 
    7397    pass. 
     
    7599suicide (Dir, Tree) ->     
    76100    exit ({suicide, Dir, Tree}). 
    77  
    78 use_tree_can_take_a_cleanup_fun () -> 
    79     Tmp = fixtures: temporary_pathname (), 
    80     Tree = tree (), 
    81     put (cleanup_called, false), 
    82     Cleanup = fun (D, T) -> put (cleanup_called, {true, D, T}) end, 
    83     Result = (catch fixtures: use_tree (Tmp, Tree, fun suicide/2, Cleanup)), 
    84     {'EXIT', {suicide, Tmp, Tree}} = Result, 
    85     {true, Tmp, Tree} = get (cleanup_called), 
    86     pass. 
    87101     
  • trunk/src/shells_tests.erl

    r45 r46  
    2222    Binaries = [modules: to_binary (P) || P <- Paths], 
    2323    Tester ! lists: zip (Paths, Binaries), 
    24     {Run, Passed} = final_test_result (), 
    25     Run = Passed, 
     24    {Run, Passed, Messages} = final_test_result ([]), 
     25    {passed, Run, Paths, Messages} = {passed, Passed, Paths, Messages}, 
    2626    ok. 
    2727     
    28 final_test_result () -> 
     28final_test_result (Messages) -> 
    2929    receive 
    30         {Run, Run, Passed} -> 
    31             {Run, Passed}; 
    32         _ -> 
    33             final_test_result () 
    34     after 1000 -> timeout 
     30        {Run, Run, Passed} = Message -> 
     31            {Run, Passed, lists: reverse ([Message | Messages])}; 
     32        Message -> 
     33            final_test_result ([Message | Messages]) 
     34    after 1000 -> {timeout, Messages} 
    3535    end. 
Note: See TracChangeset for help on using the changeset viewer.