github.com/gnolang/gno@v0.0.0-20240520182011-228e9d0192ce/tm2/pkg/autofile/autofile_test.go (about) 1 package autofile 2 3 import ( 4 "os" 5 "syscall" 6 "testing" 7 "time" 8 9 "github.com/stretchr/testify/require" 10 11 osm "github.com/gnolang/gno/tm2/pkg/os" 12 ) 13 14 func TestSIGHUP(t *testing.T) { 15 // First, create an AutoFile writing to a tempfile dir 16 file, err := os.CreateTemp("", "sighup_test") 17 require.NoError(t, err) 18 err = file.Close() 19 require.NoError(t, err) 20 name := file.Name() 21 22 // Here is the actual AutoFile 23 af, err := OpenAutoFile(name) 24 require.NoError(t, err) 25 26 // Write to the file. 27 _, err = af.Write([]byte("Line 1\n")) 28 require.NoError(t, err) 29 _, err = af.Write([]byte("Line 2\n")) 30 require.NoError(t, err) 31 32 // Move the file over 33 err = os.Rename(name, name+"_old") 34 require.NoError(t, err) 35 36 // Send SIGHUP to self. 37 syscall.Kill(syscall.Getpid(), syscall.SIGHUP) 38 39 // Wait a bit... signals are not handled synchronously. 40 time.Sleep(time.Millisecond * 10) 41 42 // Write more to the file. 43 _, err = af.Write([]byte("Line 3\n")) 44 require.NoError(t, err) 45 _, err = af.Write([]byte("Line 4\n")) 46 require.NoError(t, err) 47 err = af.Close() 48 require.NoError(t, err) 49 50 // Both files should exist 51 if body := osm.MustReadFile(name + "_old"); string(body) != "Line 1\nLine 2\n" { 52 t.Errorf("Unexpected body %s", body) 53 } 54 if body := osm.MustReadFile(name); string(body) != "Line 3\nLine 4\n" { 55 t.Errorf("Unexpected body %s", body) 56 } 57 } 58 59 // // Manually modify file permissions, close, and reopen using autofile: 60 // // We expect the file permissions to be changed back to the intended perms. 61 // func TestOpenAutoFilePerms(t *testing.T) { 62 // file, err := os.CreateTemp("", "permission_test") 63 // require.NoError(t, err) 64 // err = file.Close() 65 // require.NoError(t, err) 66 // name := file.Name() 67 68 // // open and change permissions 69 // af, err := OpenAutoFile(name) 70 // require.NoError(t, err) 71 // err = af.file.Chmod(0755) 72 // require.NoError(t, err) 73 // err = af.Close() 74 // require.NoError(t, err) 75 76 // // reopen and expect an ErrPermissionsChanged as Cause 77 // af, err = OpenAutoFile(name) 78 // require.Error(t, err) 79 // if e, ok := err.(*errors.ErrPermissionsChanged); ok { 80 // t.Logf("%v", e) 81 // } else { 82 // t.Errorf("unexpected error %v", e) 83 // } 84 // } 85 86 func TestAutoFileSize(t *testing.T) { 87 // First, create an AutoFile writing to a tempfile dir 88 f, err := os.CreateTemp("", "sighup_test") 89 require.NoError(t, err) 90 err = f.Close() 91 require.NoError(t, err) 92 93 // Here is the actual AutoFile. 94 af, err := OpenAutoFile(f.Name()) 95 require.NoError(t, err) 96 97 // 1. Empty file 98 size, err := af.Size() 99 require.Zero(t, size) 100 require.NoError(t, err) 101 102 // 2. Not empty file 103 data := []byte("Maniac\n") 104 _, err = af.Write(data) 105 require.NoError(t, err) 106 size, err = af.Size() 107 require.EqualValues(t, len(data), size) 108 require.NoError(t, err) 109 110 // 3. Not existing file 111 err = af.Close() 112 require.NoError(t, err) 113 err = os.Remove(f.Name()) 114 require.NoError(t, err) 115 size, err = af.Size() 116 require.EqualValues(t, 0, size, "Expected a new file to be empty") 117 require.NoError(t, err) 118 119 // Cleanup 120 _ = os.Remove(f.Name()) 121 }