package autofile
|
|
|
|
import (
|
|
"io/ioutil"
|
|
"os"
|
|
"sync/atomic"
|
|
"syscall"
|
|
"testing"
|
|
"time"
|
|
|
|
"github.com/stretchr/testify/require"
|
|
|
|
cmn "github.com/tendermint/tendermint/libs/common"
|
|
"github.com/tendermint/tendermint/libs/errors"
|
|
)
|
|
|
|
func TestSIGHUP(t *testing.T) {
|
|
// First, create an AutoFile writing to a tempfile dir
|
|
file, err := ioutil.TempFile("", "sighup_test")
|
|
require.NoError(t, err)
|
|
err = file.Close()
|
|
require.NoError(t, err)
|
|
name := file.Name()
|
|
|
|
// Here is the actual AutoFile
|
|
af, err := OpenAutoFile(name)
|
|
require.NoError(t, err)
|
|
|
|
// Write to the file.
|
|
_, err = af.Write([]byte("Line 1\n"))
|
|
require.NoError(t, err)
|
|
_, err = af.Write([]byte("Line 2\n"))
|
|
require.NoError(t, err)
|
|
|
|
// Move the file over
|
|
err = os.Rename(name, name+"_old")
|
|
require.NoError(t, err)
|
|
|
|
// Send SIGHUP to self.
|
|
oldSighupCounter := atomic.LoadInt32(&sighupCounter)
|
|
syscall.Kill(syscall.Getpid(), syscall.SIGHUP)
|
|
|
|
// Wait a bit... signals are not handled synchronously.
|
|
for atomic.LoadInt32(&sighupCounter) == oldSighupCounter {
|
|
time.Sleep(time.Millisecond * 10)
|
|
}
|
|
|
|
// Write more to the file.
|
|
_, err = af.Write([]byte("Line 3\n"))
|
|
require.NoError(t, err)
|
|
_, err = af.Write([]byte("Line 4\n"))
|
|
require.NoError(t, err)
|
|
err = af.Close()
|
|
require.NoError(t, err)
|
|
|
|
// Both files should exist
|
|
if body := cmn.MustReadFile(name + "_old"); string(body) != "Line 1\nLine 2\n" {
|
|
t.Errorf("Unexpected body %s", body)
|
|
}
|
|
if body := cmn.MustReadFile(name); string(body) != "Line 3\nLine 4\n" {
|
|
t.Errorf("Unexpected body %s", body)
|
|
}
|
|
}
|
|
|
|
// Manually modify file permissions, close, and reopen using autofile:
|
|
// We expect the file permissions to be changed back to the intended perms.
|
|
func TestOpenAutoFilePerms(t *testing.T) {
|
|
file, err := ioutil.TempFile("", "permission_test")
|
|
require.NoError(t, err)
|
|
err = file.Close()
|
|
require.NoError(t, err)
|
|
name := file.Name()
|
|
|
|
// open and change permissions
|
|
af, err := OpenAutoFile(name)
|
|
require.NoError(t, err)
|
|
err = af.file.Chmod(0755)
|
|
require.NoError(t, err)
|
|
err = af.Close()
|
|
require.NoError(t, err)
|
|
|
|
// reopen and expect an ErrPermissionsChanged as Cause
|
|
af, err = OpenAutoFile(name)
|
|
require.Error(t, err)
|
|
if e, ok := err.(*errors.ErrPermissionsChanged); ok {
|
|
t.Logf("%v", e)
|
|
} else {
|
|
t.Errorf("unexpected error %v", e)
|
|
}
|
|
|
|
err = af.Close()
|
|
require.NoError(t, err)
|
|
}
|