|  | // 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. | 
|  |  | 
|  | // +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) | 
|  | } | 
|  | } | 
|  | } |