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