1package mem
2
3import (
4	"testing"
5	"time"
6)
7
8func TestFileDataNameRace(t *testing.T) {
9	t.Parallel()
10	const someName = "someName"
11	const someOtherName = "someOtherName"
12	d := FileData{
13		name: someName,
14	}
15
16	if d.Name() != someName {
17		t.Errorf("Failed to read correct Name, was %v", d.Name())
18	}
19
20	ChangeFileName(&d, someOtherName)
21	if d.Name() != someOtherName {
22		t.Errorf("Failed to set Name, was %v", d.Name())
23	}
24
25	go func() {
26		ChangeFileName(&d, someName)
27	}()
28
29	if d.Name() != someName && d.Name() != someOtherName {
30		t.Errorf("Failed to read either Name, was %v", d.Name())
31	}
32}
33
34func TestFileDataModTimeRace(t *testing.T) {
35	t.Parallel()
36	someTime := time.Now()
37	someOtherTime := someTime.Add(1 * time.Minute)
38
39	d := FileData{
40		modtime: someTime,
41	}
42
43	s := FileInfo{
44		FileData: &d,
45	}
46
47	if s.ModTime() != someTime {
48		t.Errorf("Failed to read correct value, was %v", s.ModTime())
49	}
50
51	SetModTime(&d, someOtherTime)
52	if s.ModTime() != someOtherTime {
53		t.Errorf("Failed to set ModTime, was %v", s.ModTime())
54	}
55
56	go func() {
57		SetModTime(&d, someTime)
58	}()
59
60	if s.ModTime() != someTime && s.ModTime() != someOtherTime {
61		t.Errorf("Failed to read either modtime, was %v", s.ModTime())
62	}
63}
64
65func TestFileDataModeRace(t *testing.T) {
66	t.Parallel()
67	const someMode = 0777
68	const someOtherMode = 0660
69
70	d := FileData{
71		mode: someMode,
72	}
73
74	s := FileInfo{
75		FileData: &d,
76	}
77
78	if s.Mode() != someMode {
79		t.Errorf("Failed to read correct value, was %v", s.Mode())
80	}
81
82	SetMode(&d, someOtherMode)
83	if s.Mode() != someOtherMode {
84		t.Errorf("Failed to set Mode, was %v", s.Mode())
85	}
86
87	go func() {
88		SetMode(&d, someMode)
89	}()
90
91	if s.Mode() != someMode && s.Mode() != someOtherMode {
92		t.Errorf("Failed to read either mode, was %v", s.Mode())
93	}
94}
95
96func TestFileDataIsDirRace(t *testing.T) {
97	t.Parallel()
98
99	d := FileData{
100		dir: true,
101	}
102
103	s := FileInfo{
104		FileData: &d,
105	}
106
107	if s.IsDir() != true {
108		t.Errorf("Failed to read correct value, was %v", s.IsDir())
109	}
110
111	go func() {
112		s.Lock()
113		d.dir = false
114		s.Unlock()
115	}()
116
117	//just logging the value to trigger a read:
118	t.Logf("Value is %v", s.IsDir())
119}
120
121func TestFileDataSizeRace(t *testing.T) {
122	t.Parallel()
123
124	const someData = "Hello"
125	const someOtherDataSize = "Hello World"
126
127	d := FileData{
128		data: []byte(someData),
129		dir:  false,
130	}
131
132	s := FileInfo{
133		FileData: &d,
134	}
135
136	if s.Size() != int64(len(someData)) {
137		t.Errorf("Failed to read correct value, was %v", s.Size())
138	}
139
140	go func() {
141		s.Lock()
142		d.data = []byte(someOtherDataSize)
143		s.Unlock()
144	}()
145
146	//just logging the value to trigger a read:
147	t.Logf("Value is %v", s.Size())
148
149	//Testing the Dir size case
150	d.dir = true
151	if s.Size() != int64(42) {
152		t.Errorf("Failed to read correct value for dir, was %v", s.Size())
153	}
154}
155