// Copyright 2018 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. //go:build freebsd // +build freebsd package syscall_test import ( "fmt" "syscall" "testing" "unsafe" ) func TestConvertFromDirent11(t *testing.T) { const ( filenameFmt = "%04d" numFiles = 64 fixedHdrSize = int(unsafe.Offsetof(syscall.Dirent_freebsd11{}.Name)) ) namlen := len(fmt.Sprintf(filenameFmt, 0)) reclen := syscall.Roundup(fixedHdrSize+namlen+1, 4) old := make([]byte, numFiles*reclen) for i := 0; i < numFiles; i++ { dent := syscall.Dirent_freebsd11{ Fileno: uint32(i + 1), Reclen: uint16(reclen), Type: syscall.DT_REG, Namlen: uint8(namlen), } rec := make([]byte, reclen) copy(rec, (*[fixedHdrSize]byte)(unsafe.Pointer(&dent))[:]) copy(rec[fixedHdrSize:], fmt.Sprintf(filenameFmt, i+1)) copy(old[i*reclen:], rec) } buf := make([]byte, 2*len(old)) n := syscall.ConvertFromDirents11(buf, old) names := make([]string, 0, numFiles) _, _, names = syscall.ParseDirent(buf[:n], -1, names) if len(names) != numFiles { t.Errorf("expected %d files, have %d; names: %q", numFiles, len(names), names) } for i, name := range names { if expected := fmt.Sprintf(filenameFmt, i+1); name != expected { t.Errorf("expected names[%d] to be %q; got %q", i, expected, name) } } }