@@ -237,6 +237,19 @@ func TestDataSymlink(t *testing.T) {
237
237
}
238
238
}
239
239
240
+ func readDirStream (st DirStream ) (result []fuse.DirEntry , errno syscall.Errno ) {
241
+ for st .HasNext () {
242
+ var de fuse.DirEntry
243
+ de , errno = st .Next ()
244
+ if errno != 0 {
245
+ return
246
+ }
247
+
248
+ result = append (result , de )
249
+ }
250
+ return
251
+ }
252
+
240
253
func TestReaddirplusParallel (t * testing.T ) {
241
254
root := & Inode {}
242
255
N := 100
@@ -265,39 +278,45 @@ func TestReaddirplusParallel(t *testing.T) {
265
278
},
266
279
})
267
280
268
- read := func () (map [ string ] int64 , error ) {
269
- es , err := os . ReadDir (mntDir )
270
- if err != nil {
271
- return nil , err
281
+ read := func () ([]fuse. DirEntry , error ) {
282
+ ds , errno := NewLoopbackDirStream (mntDir )
283
+ if errno != 0 {
284
+ return nil , errno
272
285
}
273
-
274
- r := map [string ]int64 {}
275
- for _ , e := range es {
276
- inf , err := e .Info ()
277
- if err != nil {
278
- return nil , err
279
- }
280
- r [e .Name ()] = inf .Size ()
286
+ defer ds .Close ()
287
+ es , errno := readDirStream (ds )
288
+ if errno != 0 {
289
+ return nil , errno
281
290
}
282
- return r , nil
291
+ return es , nil
283
292
}
284
293
294
+ want , err := read ()
295
+ if err != nil {
296
+ t .Fatal (err )
297
+ }
298
+ if len (want ) != N {
299
+ t .Fatalf ("read back %d entries, want %d" , len (want ), N )
300
+ }
285
301
var wg sync.WaitGroup
286
302
for i := 0 ; i < P ; i ++ {
287
303
wg .Add (1 )
288
304
go func () {
289
305
defer wg .Done ()
290
- res , err := read ()
306
+ got , err := read ()
291
307
if err != nil {
292
308
t .Errorf ("readdir: %v" , err )
293
309
return
294
310
}
295
- if got , want := len (res ), len ( names ); got != want {
296
- t .Errorf ("got %d want %d" , got , want )
311
+ if len (got ) != len ( want ) {
312
+ t .Errorf ("got len %d, want %d" , len ( got ), len ( want ) )
297
313
return
298
314
}
299
- if ! reflect .DeepEqual (res , names ) {
300
- t .Errorf ("maps have different content" )
315
+ for i := 0 ; i < len (got ) && i < len (want ); i ++ {
316
+ if ! reflect .DeepEqual (got [i ], want [i ]) {
317
+ t .Errorf ("entry %d: got %v, want %v" , i , got [i ], want [i ])
318
+ return
319
+ }
301
320
}
302
321
}()
303
322
}
0 commit comments