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 }