github.com/lazyledger/lazyledger-core@v0.35.0-dev.0.20210613111200-4c651f053571/libs/autofile/autofile_test.go (about) 1 package autofile 2 3 import ( 4 "io/ioutil" 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 origDir, err := os.Getwd() 17 require.NoError(t, err) 18 t.Cleanup(func() { 19 if err := os.Chdir(origDir); err != nil { 20 t.Error(err) 21 } 22 }) 23 24 // First, create a temporary directory and move into it 25 dir, err := ioutil.TempDir("", "sighup_test") 26 require.NoError(t, err) 27 t.Cleanup(func() { 28 _ = os.RemoveAll(dir) 29 }) 30 require.NoError(t, os.Chdir(dir)) 31 32 // Create an AutoFile in the temporary directory 33 name := "sighup_test" 34 af, err := OpenAutoFile(name) 35 require.NoError(t, err) 36 require.True(t, filepath.IsAbs(af.Path)) 37 38 // Write to the file. 39 _, err = af.Write([]byte("Line 1\n")) 40 require.NoError(t, err) 41 _, err = af.Write([]byte("Line 2\n")) 42 require.NoError(t, err) 43 44 // Move the file over 45 require.NoError(t, os.Rename(name, name+"_old")) 46 47 // Move into a different temporary directory 48 otherDir, err := ioutil.TempDir("", "sighup_test_other") 49 require.NoError(t, err) 50 t.Cleanup(func() { os.RemoveAll(otherDir) }) 51 require.NoError(t, os.Chdir(otherDir)) 52 53 // Send SIGHUP to self. 54 require.NoError(t, syscall.Kill(syscall.Getpid(), syscall.SIGHUP)) 55 56 // Wait a bit... signals are not handled synchronously. 57 time.Sleep(time.Millisecond * 10) 58 59 // Write more to the file. 60 _, err = af.Write([]byte("Line 3\n")) 61 require.NoError(t, err) 62 _, err = af.Write([]byte("Line 4\n")) 63 require.NoError(t, err) 64 require.NoError(t, af.Close()) 65 66 // Both files should exist 67 if body := mustReadFile(t, filepath.Join(dir, name+"_old")); string(body) != "Line 1\nLine 2\n" { 68 t.Errorf("unexpected body %s", body) 69 } 70 if body := mustReadFile(t, filepath.Join(dir, name)); string(body) != "Line 3\nLine 4\n" { 71 t.Errorf("unexpected body %s", body) 72 } 73 74 // The current directory should be empty 75 files, err := ioutil.ReadDir(".") 76 require.NoError(t, err) 77 assert.Empty(t, files) 78 } 79 80 // // Manually modify file permissions, close, and reopen using autofile: 81 // // We expect the file permissions to be changed back to the intended perms. 82 // func TestOpenAutoFilePerms(t *testing.T) { 83 // file, err := ioutil.TempFile("", "permission_test") 84 // require.NoError(t, err) 85 // err = file.Close() 86 // require.NoError(t, err) 87 // name := file.Name() 88 89 // // open and change permissions 90 // af, err := OpenAutoFile(name) 91 // require.NoError(t, err) 92 // err = af.file.Chmod(0755) 93 // require.NoError(t, err) 94 // err = af.Close() 95 // require.NoError(t, err) 96 97 // // reopen and expect an ErrPermissionsChanged as Cause 98 // af, err = OpenAutoFile(name) 99 // require.Error(t, err) 100 // if e, ok := err.(*errors.ErrPermissionsChanged); ok { 101 // t.Logf("%v", e) 102 // } else { 103 // t.Errorf("unexpected error %v", e) 104 // } 105 // } 106 107 func TestAutoFileSize(t *testing.T) { 108 // First, create an AutoFile writing to a tempfile dir 109 f, err := ioutil.TempFile("", "sighup_test") 110 require.NoError(t, err) 111 require.NoError(t, f.Close()) 112 113 // Here is the actual AutoFile. 114 af, err := OpenAutoFile(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.Close()) 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 := ioutil.ReadFile(filePath) 143 require.NoError(t, err) 144 145 return fileBytes 146 }