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