-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathshm_test.go
124 lines (111 loc) · 2.02 KB
/
shm_test.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
package shm
import (
"io"
"os"
"testing"
)
const (
size = 1024 * 1024
flag = os.O_RDWR | os.O_CREATE | os.O_EXCL
perm = 0666
)
func TestPosixSharedMemory(t *testing.T) {
mem, err := NewPosix(size, flag, perm)
if err != nil {
t.Fatal(err)
}
if mem.Fd() < 0 {
t.Fatalf("invalid fd")
}
if mem.Raw() == nil {
t.Fatal("nil raw pointer")
}
if mem.Size() != size {
t.Fatal("wrong size")
}
if mem.Offset() != 0 {
t.Fatal("wrong offset")
}
data := []byte("hello world")
n, err := mem.Write(data)
if n != len(data) {
t.Fatal("short write")
}
if mem.Offset() != int64(len(data)) {
t.Fatal("invalid offset")
}
offset, err := mem.Seek(0, io.SeekStart)
if err != nil {
t.Fatal(err)
}
if offset != 0 {
t.Fatal("seek failed")
}
buf := make([]byte, len(data))
n, err = mem.Read(buf)
if n != len(buf) {
t.Fatal("read failed")
}
if string(buf) != string(data) {
t.Fatal("read failed")
}
err = mem.Close()
if err != nil {
t.Fatal(err)
}
}
func TestSystemVSharedMemory(t *testing.T) {
mem, err := NewSystemVPrivate(size, IPCCreate|IPCExclusive, perm)
if err != nil {
t.Fatal(err)
}
if mem.Fd() != ^uintptr(0) {
t.Fatalf("invalid fd")
}
if mem.Raw() == nil {
t.Fatal("nil raw pointer")
}
if mem.Size() != size {
t.Fatal("wrong size")
}
if mem.Offset() != 0 {
t.Fatal("wrong offset")
}
data := []byte("hello world")
n, err := mem.Write(data)
if n != len(data) {
t.Fatal("short write")
}
if mem.Offset() != int64(len(data)) {
t.Fatal("invalid offset")
}
offset, err := mem.Seek(0, io.SeekStart)
if err != nil {
t.Fatal(err)
}
if offset != 0 {
t.Fatal("seek failed")
}
buf := make([]byte, len(data))
n, err = mem.Read(buf)
if n != len(buf) {
t.Fatal("read failed")
}
if string(buf) != string(data) {
t.Fatal("read failed")
}
err = mem.Close()
if err != nil {
t.Fatal(err)
}
}
func TestRandomName(t *testing.T) {
name1 := randomName()
name2 := randomName()
if len(name1) != 26 {
t.Fatal("unexpected name length")
}
if name1 == name2 {
t.Fatal("same name")
}
}