github.com/gnolang/gno@v0.0.0-20240520182011-228e9d0192ce/tm2/pkg/autofile/autofile_test.go (about)

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