1
2
3
4
5
6
7 package ld
8
9 import (
10 "errors"
11 "os"
12 "path/filepath"
13 "runtime"
14 "syscall"
15 "testing"
16 )
17
18 func TestFallocate(t *testing.T) {
19 dir := t.TempDir()
20 filename := filepath.Join(dir, "a.out")
21 out := NewOutBuf(nil)
22 err := out.Open(filename)
23 if err != nil {
24 t.Fatalf("Open file failed: %v", err)
25 }
26 defer out.Close()
27
28
29 for {
30 err = out.fallocate(1 << 10)
31 if errors.Is(err, errors.ErrUnsupported) || err == errNoFallocate {
32 t.Skip("fallocate is not supported")
33 }
34 if err == syscall.EINTR {
35 continue
36 }
37 if err != nil {
38 t.Fatalf("fallocate failed: %v", err)
39 }
40 break
41 }
42
43
44
45 for _, sz := range []int64{1 << 20, 2 << 20, 3 << 20} {
46 err = out.Mmap(uint64(sz))
47 if err != nil {
48 t.Fatalf("Mmap failed: %v", err)
49 }
50 stat, err := os.Stat(filename)
51 if err != nil {
52 t.Fatalf("Stat failed: %v", err)
53 }
54 if got := stat.Size(); got != sz {
55 t.Errorf("unexpected file size: got %d, want %d", got, sz)
56 }
57 if runtime.GOOS == "darwin" {
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72 if got, want := stat.Sys().(*syscall.Stat_t).Blocks, (sz+511)/512; got < want {
73 t.Errorf("unexpected disk usage: got %d blocks, want at least %d", got, want)
74 }
75 }
76 out.munmap()
77 }
78 }
79
View as plain text