github.com/vipernet-xyz/tm@v0.34.24/libs/autofile/autofile_test.go (about) 1 package autofile 2 3 import ( 4 "os" 5 "path/filepath" 6 "syscall" 7 "testing" 8 "time" 9 10 "github.com/stretchr/testify/assert" 11 "github.com/stretchr/testify/require" 12 13 tmos "github.com/vipernet-xyz/tm/libs/os" 14 ) 15 16 func TestSIGHUP(t *testing.T) { 17 origDir, err := os.Getwd() 18 require.NoError(t, err) 19 t.Cleanup(func() { 20 if err := os.Chdir(origDir); err != nil { 21 t.Error(err) 22 } 23 }) 24 25 // First, create a temporary directory and move into it 26 dir, err := os.MkdirTemp("", "sighup_test") 27 require.NoError(t, err) 28 t.Cleanup(func() { 29 os.RemoveAll(dir) 30 }) 31 err = os.Chdir(dir) 32 require.NoError(t, err) 33 34 // Create an AutoFile in the temporary directory 35 name := "sighup_test" 36 af, err := OpenAutoFile(name) 37 require.NoError(t, err) 38 require.True(t, filepath.IsAbs(af.Path)) 39 40 // Write to the file. 41 _, err = af.Write([]byte("Line 1\n")) 42 require.NoError(t, err) 43 _, err = af.Write([]byte("Line 2\n")) 44 require.NoError(t, err) 45 46 // Move the file over 47 err = os.Rename(name, name+"_old") 48 require.NoError(t, err) 49 50 // Move into a different temporary directory 51 otherDir, err := os.MkdirTemp("", "sighup_test_other") 52 require.NoError(t, err) 53 defer os.RemoveAll(otherDir) 54 err = os.Chdir(otherDir) 55 require.NoError(t, err) 56 57 // Send SIGHUP to self. 58 err = syscall.Kill(syscall.Getpid(), syscall.SIGHUP) 59 require.NoError(t, err) 60 61 // Wait a bit... signals are not handled synchronously. 62 time.Sleep(time.Millisecond * 10) 63 64 // Write more to the file. 65 _, err = af.Write([]byte("Line 3\n")) 66 require.NoError(t, err) 67 _, err = af.Write([]byte("Line 4\n")) 68 require.NoError(t, err) 69 err = af.Close() 70 require.NoError(t, err) 71 72 // Both files should exist 73 if body := tmos.MustReadFile(filepath.Join(dir, name+"_old")); string(body) != "Line 1\nLine 2\n" { 74 t.Errorf("unexpected body %s", body) 75 } 76 if body := tmos.MustReadFile(filepath.Join(dir, name)); string(body) != "Line 3\nLine 4\n" { 77 t.Errorf("unexpected body %s", body) 78 } 79 80 // The current directory should be empty 81 files, err := os.ReadDir(".") 82 require.NoError(t, err) 83 assert.Empty(t, files) 84 } 85 86 // // Manually modify file permissions, close, and reopen using autofile: 87 // // We expect the file permissions to be changed back to the intended perms. 88 // func TestOpenAutoFilePerms(t *testing.T) { 89 // file, err := os.CreateTemp("", "permission_test") 90 // require.NoError(t, err) 91 // err = file.Close() 92 // require.NoError(t, err) 93 // name := file.Name() 94 95 // // open and change permissions 96 // af, err := OpenAutoFile(name) 97 // require.NoError(t, err) 98 // err = af.file.Chmod(0755) 99 // require.NoError(t, err) 100 // err = af.Close() 101 // require.NoError(t, err) 102 103 // // reopen and expect an ErrPermissionsChanged as Cause 104 // af, err = OpenAutoFile(name) 105 // require.Error(t, err) 106 // if e, ok := err.(*errors.ErrPermissionsChanged); ok { 107 // t.Logf("%v", e) 108 // } else { 109 // t.Errorf("unexpected error %v", e) 110 // } 111 // } 112 113 func TestAutoFileSize(t *testing.T) { 114 // First, create an AutoFile writing to a tempfile dir 115 f, err := os.CreateTemp("", "sighup_test") 116 require.NoError(t, err) 117 err = f.Close() 118 require.NoError(t, err) 119 120 // Here is the actual AutoFile. 121 af, err := OpenAutoFile(f.Name()) 122 require.NoError(t, err) 123 124 // 1. Empty file 125 size, err := af.Size() 126 require.Zero(t, size) 127 require.NoError(t, err) 128 129 // 2. Not empty file 130 data := []byte("Maniac\n") 131 _, err = af.Write(data) 132 require.NoError(t, err) 133 size, err = af.Size() 134 require.EqualValues(t, len(data), size) 135 require.NoError(t, err) 136 137 // 3. Not existing file 138 err = af.Close() 139 require.NoError(t, err) 140 err = os.Remove(f.Name()) 141 require.NoError(t, err) 142 size, err = af.Size() 143 require.EqualValues(t, 0, size, "Expected a new file to be empty") 144 require.NoError(t, err) 145 146 // Cleanup 147 _ = os.Remove(f.Name()) 148 }