syscall_freebsd_test.go 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. // Copyright 2018 The Go Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style
  3. // license that can be found in the LICENSE file.
  4. //go:build freebsd
  5. package syscall_test
  6. import (
  7. "fmt"
  8. "os"
  9. "syscall"
  10. "testing"
  11. "unsafe"
  12. )
  13. func TestConvertFromDirent11(t *testing.T) {
  14. const (
  15. filenameFmt = "%04d"
  16. numFiles = 64
  17. fixedHdrSize = int(unsafe.Offsetof(syscall.Dirent_freebsd11{}.Name))
  18. )
  19. namlen := len(fmt.Sprintf(filenameFmt, 0))
  20. reclen := syscall.Roundup(fixedHdrSize+namlen+1, 4)
  21. old := make([]byte, numFiles*reclen)
  22. for i := 0; i < numFiles; i++ {
  23. dent := syscall.Dirent_freebsd11{
  24. Fileno: uint32(i + 1),
  25. Reclen: uint16(reclen),
  26. Type: syscall.DT_REG,
  27. Namlen: uint8(namlen),
  28. }
  29. rec := make([]byte, reclen)
  30. copy(rec, (*[fixedHdrSize]byte)(unsafe.Pointer(&dent))[:])
  31. copy(rec[fixedHdrSize:], fmt.Sprintf(filenameFmt, i+1))
  32. copy(old[i*reclen:], rec)
  33. }
  34. buf := make([]byte, 2*len(old))
  35. n := syscall.ConvertFromDirents11(buf, old)
  36. names := make([]string, 0, numFiles)
  37. _, _, names = syscall.ParseDirent(buf[:n], -1, names)
  38. if len(names) != numFiles {
  39. t.Errorf("expected %d files, have %d; names: %q", numFiles, len(names), names)
  40. }
  41. for i, name := range names {
  42. if expected := fmt.Sprintf(filenameFmt, i+1); name != expected {
  43. t.Errorf("expected names[%d] to be %q; got %q", i, expected, name)
  44. }
  45. }
  46. }
  47. func TestMain(m *testing.M) {
  48. if os.Getenv("GO_DEATHSIG_PARENT") == "1" {
  49. deathSignalParent()
  50. } else if os.Getenv("GO_DEATHSIG_CHILD") == "1" {
  51. deathSignalChild()
  52. }
  53. os.Exit(m.Run())
  54. }