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
|
// Tests run for (almost all) combinations of openssl, aessiv, plaintextnames.
//
// File reading, writing, modification, truncate, ...
//
// Runs all tests N times, for the combinations of different flags specified
// in the `matrix` variable.
package matrix
import (
"flag"
"fmt"
"os"
"testing"
"time"
"github.com/rfjakob/gocryptfs/v2/internal/stupidgcm"
"github.com/rfjakob/gocryptfs/v2/tests/test_helpers"
)
// Several tests need to be aware if plaintextnames is active or not, so make this
// a global variable
var testcase testcaseMatrix
var ctlsockPath string
type testcaseMatrix struct {
plaintextnames bool
openssl string
aessiv bool
raw64 bool
extraArgs []string
}
// isSet finds out if `extraArg` is set in `tc.extraArgs`
func (tc *testcaseMatrix) isSet(extraArg string) bool {
for _, v := range tc.extraArgs {
if v == extraArg {
return true
}
}
return false
}
// This is the entry point for the tests
func TestMain(m *testing.M) {
var matrix = []testcaseMatrix{
// Normal
{false, "auto", false, false, nil},
{false, "true", false, false, nil},
{false, "false", false, false, nil},
// Plaintextnames
{true, "true", false, false, nil},
{true, "false", false, false, nil},
// AES-SIV (does not use openssl, no need to test permutations)
{false, "auto", true, false, nil},
{true, "auto", true, false, nil},
// Raw64
{false, "auto", false, true, nil},
// -serialize_reads
{false, "auto", false, false, []string{"-serialize_reads"}},
{false, "auto", false, false, []string{"-sharedstorage"}},
{false, "auto", false, false, []string{"-deterministic-names"}},
// Test xchacha with and without openssl
{false, "true", false, true, []string{"-xchacha"}},
{false, "false", false, true, []string{"-xchacha"}},
}
// Make "testing.Verbose()" return the correct value
flag.Parse()
var i int
for i, testcase = range matrix {
if testcase.openssl == "true" && stupidgcm.BuiltWithoutOpenssl {
continue
}
if testing.Verbose() {
fmt.Printf("matrix: testcase = %#v\n", testcase)
}
createDirIV := true
if testcase.plaintextnames {
createDirIV = false
} else if testcase.isSet("-deterministic-names") {
createDirIV = false
}
ctlsockPath = fmt.Sprintf("%s/ctlsock.%d", test_helpers.TmpDir, i)
test_helpers.ResetTmpDir(createDirIV)
opts := []string{"-zerokey", "-ctlsock", ctlsockPath}
//opts = append(opts, "-fusedebug")
opts = append(opts, fmt.Sprintf("-openssl=%v", testcase.openssl))
opts = append(opts, fmt.Sprintf("-plaintextnames=%v", testcase.plaintextnames))
opts = append(opts, fmt.Sprintf("-aessiv=%v", testcase.aessiv))
opts = append(opts, fmt.Sprintf("-raw64=%v", testcase.raw64))
opts = append(opts, testcase.extraArgs...)
test_helpers.MountOrExit(test_helpers.DefaultCipherDir, test_helpers.DefaultPlainDir, opts...)
before := test_helpers.ListFds(0, test_helpers.TmpDir)
t0 := time.Now()
r := m.Run()
if testing.Verbose() {
fmt.Printf("matrix[%d]: run took %v\n", i, time.Since(t0))
}
// Catch fd leaks in the tests. NOTE: this does NOT catch leaks in
// the gocryptfs FUSE process, but only in the tests that access it!
// All fds that point outside TmpDir are not interesting (the Go test
// infrastucture creates temporary log files we don't care about).
after := test_helpers.ListFds(0, test_helpers.TmpDir)
if len(before) != len(after) {
fmt.Printf("fd leak in test process? before, after:\n%v\n%v\n", before, after)
os.Exit(1)
}
test_helpers.UnmountPanic(test_helpers.DefaultPlainDir)
if r != 0 {
fmt.Printf("TestMain: matrix[%d] = %#v failed\n", i, testcase)
os.Exit(r)
}
// The ctlsock file is deleted asynchronously after unmount.
// Ensure it is delete here so it does not race (and trip up) ResetTmpDir() of the next
// loop iteration.
os.Remove(ctlsockPath)
}
os.Exit(0)
}
|