github.com/bpfs/defs@v0.0.15/afero/mem/file_test.go (about)

     1  package mem
     2  
     3  import (
     4  	"bytes"
     5  	"io"
     6  	"testing"
     7  	"time"
     8  )
     9  
    10  func TestFileDataNameRace(t *testing.T) {
    11  	t.Parallel()
    12  	const someName = "someName"
    13  	const someOtherName = "someOtherName"
    14  	d := FileData{
    15  		name: someName,
    16  	}
    17  
    18  	if d.Name() != someName {
    19  		t.Errorf("Failed to read correct Name, was %v", d.Name())
    20  	}
    21  
    22  	ChangeFileName(&d, someOtherName)
    23  	if d.Name() != someOtherName {
    24  		t.Errorf("Failed to set Name, was %v", d.Name())
    25  	}
    26  
    27  	go func() {
    28  		ChangeFileName(&d, someName)
    29  	}()
    30  
    31  	if d.Name() != someName && d.Name() != someOtherName {
    32  		t.Errorf("Failed to read either Name, was %v", d.Name())
    33  	}
    34  }
    35  
    36  func TestFileDataModTimeRace(t *testing.T) {
    37  	t.Parallel()
    38  	someTime := time.Now()
    39  	someOtherTime := someTime.Add(1 * time.Minute)
    40  
    41  	d := FileData{
    42  		modtime: someTime,
    43  	}
    44  
    45  	s := FileInfo{
    46  		FileData: &d,
    47  	}
    48  
    49  	if s.ModTime() != someTime {
    50  		t.Errorf("Failed to read correct value, was %v", s.ModTime())
    51  	}
    52  
    53  	SetModTime(&d, someOtherTime)
    54  	if s.ModTime() != someOtherTime {
    55  		t.Errorf("Failed to set ModTime, was %v", s.ModTime())
    56  	}
    57  
    58  	go func() {
    59  		SetModTime(&d, someTime)
    60  	}()
    61  
    62  	if s.ModTime() != someTime && s.ModTime() != someOtherTime {
    63  		t.Errorf("Failed to read either modtime, was %v", s.ModTime())
    64  	}
    65  }
    66  
    67  func TestFileDataModeRace(t *testing.T) {
    68  	t.Parallel()
    69  	const someMode = 0o777
    70  	const someOtherMode = 0o660
    71  
    72  	d := FileData{
    73  		mode: someMode,
    74  	}
    75  
    76  	s := FileInfo{
    77  		FileData: &d,
    78  	}
    79  
    80  	if s.Mode() != someMode {
    81  		t.Errorf("Failed to read correct value, was %v", s.Mode())
    82  	}
    83  
    84  	SetMode(&d, someOtherMode)
    85  	if s.Mode() != someOtherMode {
    86  		t.Errorf("Failed to set Mode, was %v", s.Mode())
    87  	}
    88  
    89  	go func() {
    90  		SetMode(&d, someMode)
    91  	}()
    92  
    93  	if s.Mode() != someMode && s.Mode() != someOtherMode {
    94  		t.Errorf("Failed to read either mode, was %v", s.Mode())
    95  	}
    96  }
    97  
    98  func TestFileWriteAt(t *testing.T) {
    99  	t.Parallel()
   100  
   101  	data := CreateFile("abc.txt")
   102  	f := NewFileHandle(data)
   103  
   104  	testData := []byte{1, 2, 3, 4, 5}
   105  	offset := len(testData)
   106  
   107  	// 5 zeros + testdata
   108  	_, err := f.WriteAt(testData, int64(offset))
   109  	if err != nil {
   110  		t.Fatal(err)
   111  	}
   112  
   113  	// 2 * testdata
   114  	_, err = f.WriteAt(testData, 0)
   115  	if err != nil {
   116  		t.Fatal(err)
   117  	}
   118  
   119  	// 3 * testdata
   120  	_, err = f.WriteAt(testData, int64(offset*2))
   121  	if err != nil {
   122  		t.Fatal(err)
   123  	}
   124  
   125  	// 3 * testdata + 5 zeros + testdata
   126  	_, err = f.WriteAt(testData, int64(offset*4))
   127  	if err != nil {
   128  		t.Fatal(err)
   129  	}
   130  
   131  	// 5 * testdata
   132  	_, err = f.WriteAt(testData, int64(offset*3))
   133  	if err != nil {
   134  		t.Fatal(err)
   135  	}
   136  
   137  	err = f.Close()
   138  	if err != nil {
   139  		t.Fatal(err)
   140  	}
   141  
   142  	expected := bytes.Repeat(testData, 5)
   143  	if !bytes.Equal(expected, data.data) {
   144  		t.Fatalf("expected: %v, got: %v", expected, data.data)
   145  	}
   146  }
   147  
   148  func TestFileDataIsDirRace(t *testing.T) {
   149  	t.Parallel()
   150  
   151  	d := FileData{
   152  		dir: true,
   153  	}
   154  
   155  	s := FileInfo{
   156  		FileData: &d,
   157  	}
   158  
   159  	if s.IsDir() != true {
   160  		t.Errorf("Failed to read correct value, was %v", s.IsDir())
   161  	}
   162  
   163  	go func() {
   164  		s.Lock()
   165  		d.dir = false
   166  		s.Unlock()
   167  	}()
   168  
   169  	// just logging the value to trigger a read:
   170  	t.Logf("Value is %v", s.IsDir())
   171  }
   172  
   173  func TestFileDataSizeRace(t *testing.T) {
   174  	t.Parallel()
   175  
   176  	const someData = "Hello"
   177  	const someOtherDataSize = "Hello World"
   178  
   179  	d := FileData{
   180  		data: []byte(someData),
   181  		dir:  false,
   182  	}
   183  
   184  	s := FileInfo{
   185  		FileData: &d,
   186  	}
   187  
   188  	if s.Size() != int64(len(someData)) {
   189  		t.Errorf("Failed to read correct value, was %v", s.Size())
   190  	}
   191  
   192  	go func() {
   193  		s.Lock()
   194  		d.data = []byte(someOtherDataSize)
   195  		s.Unlock()
   196  	}()
   197  
   198  	// just logging the value to trigger a read:
   199  	t.Logf("Value is %v", s.Size())
   200  
   201  	// Testing the Dir size case
   202  	d.dir = true
   203  	if s.Size() != int64(42) {
   204  		t.Errorf("Failed to read correct value for dir, was %v", s.Size())
   205  	}
   206  }
   207  
   208  func TestFileReadAtSeekOffset(t *testing.T) {
   209  	t.Parallel()
   210  
   211  	fd := CreateFile("foo")
   212  	f := NewFileHandle(fd)
   213  
   214  	_, err := f.WriteString("TEST")
   215  	if err != nil {
   216  		t.Fatal(err)
   217  	}
   218  	offset, err := f.Seek(0, io.SeekStart)
   219  	if err != nil {
   220  		t.Fatal(err)
   221  	}
   222  	if offset != 0 {
   223  		t.Fail()
   224  	}
   225  
   226  	offsetBeforeReadAt, err := f.Seek(0, io.SeekCurrent)
   227  	if err != nil {
   228  		t.Fatal(err)
   229  	}
   230  	if offsetBeforeReadAt != 0 {
   231  		t.Fatal("expected 0")
   232  	}
   233  
   234  	b := make([]byte, 4)
   235  	n, err := f.ReadAt(b, 0)
   236  	if err != nil {
   237  		t.Fatal(err)
   238  	}
   239  	if n != 4 {
   240  		t.Fail()
   241  	}
   242  	if string(b) != "TEST" {
   243  		t.Fail()
   244  	}
   245  
   246  	offsetAfterReadAt, err := f.Seek(0, io.SeekCurrent)
   247  	if err != nil {
   248  		t.Fatal(err)
   249  	}
   250  	if offsetAfterReadAt != offsetBeforeReadAt {
   251  		t.Fatal("ReadAt should not affect offset")
   252  	}
   253  
   254  	err = f.Close()
   255  	if err != nil {
   256  		t.Fatal(err)
   257  	}
   258  }
   259  
   260  func TestFileWriteAndSeek(t *testing.T) {
   261  	fd := CreateFile("foo")
   262  	f := NewFileHandle(fd)
   263  
   264  	assert := func(expected bool, v ...interface{}) {
   265  		if !expected {
   266  			t.Helper()
   267  			t.Fatal(v...)
   268  		}
   269  	}
   270  
   271  	data4 := []byte{0, 1, 2, 3}
   272  	data20 := bytes.Repeat(data4, 5)
   273  	var off int64
   274  
   275  	for i := 0; i < 100; i++ {
   276  		// write 20 bytes
   277  		n, err := f.Write(data20)
   278  		assert(err == nil, err)
   279  		off += int64(n)
   280  		assert(n == len(data20), n)
   281  		assert(off == int64((i+1)*len(data20)), off)
   282  
   283  		// rewind to start and write 4 bytes there
   284  		cur, err := f.Seek(-off, io.SeekCurrent)
   285  		assert(err == nil, err)
   286  		assert(cur == 0, cur)
   287  
   288  		n, err = f.Write(data4)
   289  		assert(err == nil, err)
   290  		assert(n == len(data4), n)
   291  
   292  		// back at the end
   293  		cur, err = f.Seek(off-int64(n), io.SeekCurrent)
   294  		assert(err == nil, err)
   295  		assert(cur == off, cur, off)
   296  	}
   297  }