github.com/evdatsion/aphelion-dpos-bft@v0.32.1/libs/autofile/autofile_test.go (about)

     1  package autofile
     2  
     3  import (
     4  	"io/ioutil"
     5  	"os"
     6  	"syscall"
     7  	"testing"
     8  	"time"
     9  
    10  	"github.com/stretchr/testify/require"
    11  
    12  	cmn "github.com/evdatsion/aphelion-dpos-bft/libs/common"
    13  )
    14  
    15  func TestSIGHUP(t *testing.T) {
    16  	// First, create an AutoFile writing to a tempfile dir
    17  	file, err := ioutil.TempFile("", "sighup_test")
    18  	require.NoError(t, err)
    19  	err = file.Close()
    20  	require.NoError(t, err)
    21  	name := file.Name()
    22  
    23  	// Here is the actual AutoFile
    24  	af, err := OpenAutoFile(name)
    25  	require.NoError(t, err)
    26  
    27  	// Write to the file.
    28  	_, err = af.Write([]byte("Line 1\n"))
    29  	require.NoError(t, err)
    30  	_, err = af.Write([]byte("Line 2\n"))
    31  	require.NoError(t, err)
    32  
    33  	// Move the file over
    34  	err = os.Rename(name, name+"_old")
    35  	require.NoError(t, err)
    36  
    37  	// Send SIGHUP to self.
    38  	syscall.Kill(syscall.Getpid(), syscall.SIGHUP)
    39  
    40  	// Wait a bit... signals are not handled synchronously.
    41  	time.Sleep(time.Millisecond * 10)
    42  
    43  	// Write more to the file.
    44  	_, err = af.Write([]byte("Line 3\n"))
    45  	require.NoError(t, err)
    46  	_, err = af.Write([]byte("Line 4\n"))
    47  	require.NoError(t, err)
    48  	err = af.Close()
    49  	require.NoError(t, err)
    50  
    51  	// Both files should exist
    52  	if body := cmn.MustReadFile(name + "_old"); string(body) != "Line 1\nLine 2\n" {
    53  		t.Errorf("Unexpected body %s", body)
    54  	}
    55  	if body := cmn.MustReadFile(name); string(body) != "Line 3\nLine 4\n" {
    56  		t.Errorf("Unexpected body %s", body)
    57  	}
    58  }
    59  
    60  // // Manually modify file permissions, close, and reopen using autofile:
    61  // // We expect the file permissions to be changed back to the intended perms.
    62  // func TestOpenAutoFilePerms(t *testing.T) {
    63  // 	file, err := ioutil.TempFile("", "permission_test")
    64  // 	require.NoError(t, err)
    65  // 	err = file.Close()
    66  // 	require.NoError(t, err)
    67  // 	name := file.Name()
    68  
    69  // 	// open and change permissions
    70  // 	af, err := OpenAutoFile(name)
    71  // 	require.NoError(t, err)
    72  // 	err = af.file.Chmod(0755)
    73  // 	require.NoError(t, err)
    74  // 	err = af.Close()
    75  // 	require.NoError(t, err)
    76  
    77  // 	// reopen and expect an ErrPermissionsChanged as Cause
    78  // 	af, err = OpenAutoFile(name)
    79  // 	require.Error(t, err)
    80  // 	if e, ok := err.(*errors.ErrPermissionsChanged); ok {
    81  // 		t.Logf("%v", e)
    82  // 	} else {
    83  // 		t.Errorf("unexpected error %v", e)
    84  // 	}
    85  // }
    86  
    87  func TestAutoFileSize(t *testing.T) {
    88  	// First, create an AutoFile writing to a tempfile dir
    89  	f, err := ioutil.TempFile("", "sighup_test")
    90  	require.NoError(t, err)
    91  	err = f.Close()
    92  	require.NoError(t, err)
    93  
    94  	// Here is the actual AutoFile.
    95  	af, err := OpenAutoFile(f.Name())
    96  	require.NoError(t, err)
    97  
    98  	// 1. Empty file
    99  	size, err := af.Size()
   100  	require.Zero(t, size)
   101  	require.NoError(t, err)
   102  
   103  	// 2. Not empty file
   104  	data := []byte("Maniac\n")
   105  	_, err = af.Write(data)
   106  	require.NoError(t, err)
   107  	size, err = af.Size()
   108  	require.EqualValues(t, len(data), size)
   109  	require.NoError(t, err)
   110  
   111  	// 3. Not existing file
   112  	err = af.Close()
   113  	require.NoError(t, err)
   114  	err = os.Remove(f.Name())
   115  	require.NoError(t, err)
   116  	size, err = af.Size()
   117  	require.EqualValues(t, 0, size, "Expected a new file to be empty")
   118  	require.NoError(t, err)
   119  
   120  	// Cleanup
   121  	_ = os.Remove(f.Name())
   122  }