rclone/fstest/test_all/run_test.go
2020-02-26 21:26:47 +00:00

181 lines
3.6 KiB
Go

package main
import (
"fmt"
"os/exec"
"regexp"
"testing"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)
func TestTestsToRegexp(t *testing.T) {
for _, test := range []struct {
in []string
want string
}{
{
in: []string{},
want: "",
},
{
in: []string{"TestOne"},
want: "^TestOne$",
},
{
in: []string{"TestOne", "TestTwo"},
want: "^(TestOne|TestTwo)$",
},
{
in: []string{"TestOne", "TestTwo", "TestThree"},
want: "^(TestOne|TestThree|TestTwo)$",
},
{
in: []string{"TestOne/Sub1"},
want: "^TestOne$/^Sub1$",
},
{
in: []string{
"TestOne/Sub1",
"TestTwo",
},
want: "^(TestOne|TestTwo)$/^Sub1$",
},
{
in: []string{
"TestOne/Sub1",
"TestOne/Sub2",
"TestTwo",
},
want: "^(TestOne|TestTwo)$/^(Sub1|Sub2)$",
},
{
in: []string{
"TestOne/Sub1",
"TestOne/Sub2/SubSub1",
"TestTwo",
},
want: "^(TestOne|TestTwo)$/^(Sub1|Sub2)$/^SubSub1$",
},
{
in: []string{
"TestTests/A1",
"TestTests/B/B1",
"TestTests/C/C3/C31",
},
want: "^TestTests$/^(A1|B|C)$/^(B1|C3)$/^C31$",
},
} {
got := testsToRegexp(test.in)
assert.Equal(t, test.want, got, fmt.Sprintf("in=%v want=%q got=%q", test.in, test.want, got))
}
}
var runRe = regexp.MustCompile(`(?m)^\s*=== RUN\s*(Test.*?)\s*$`)
// Test the regexp work with the -run flag in actually selecting the right tests
func TestTestsToRegexpLive(t *testing.T) {
for _, test := range []struct {
in []string
want []string
}{
{
in: []string{
"TestTests/A1",
"TestTests/C/C3",
},
want: []string{
"TestTests",
"TestTests/A1",
"TestTests/C",
"TestTests/C/C3",
"TestTests/C/C3/C31",
"TestTests/C/C3/C32",
},
},
{
in: []string{
"TestTests",
"TestTests/A1",
"TestTests/B",
"TestTests/B/B1",
"TestTests/C",
},
want: []string{
"TestTests",
"TestTests/A1",
"TestTests/B",
"TestTests/B/B1",
"TestTests/C",
// FIXME there doesn't seem to be a way to select a non-terminal test
// and all of its subtests if there is a longer path (in this case B/B1)
// "TestTests/C/C1",
// "TestTests/C/C2",
// "TestTests/C/C3",
// "TestTests/C/C3/C31",
// "TestTests/C/C3/C32",
},
},
{
in: []string{
"TestTests/A1",
"TestTests/B/B1",
"TestTests/C/C3/C31",
},
want: []string{
"TestTests",
"TestTests/A1",
"TestTests/B",
"TestTests/B/B1",
"TestTests/C",
"TestTests/C/C3",
"TestTests/C/C3/C31",
},
},
{
in: []string{
"TestTests/B/B1",
"TestTests/C/C3/C31",
},
want: []string{
"TestTests",
"TestTests/B",
"TestTests/B/B1",
"TestTests/C",
"TestTests/C/C3",
"TestTests/C/C3/C31",
},
},
} {
runRegexp := testsToRegexp(test.in)
cmd := exec.Command("go", "test", "-v", "-run", runRegexp)
out, err := cmd.CombinedOutput()
require.NoError(t, err)
var got []string
for _, match := range runRe.FindAllSubmatch(out, -1) {
got = append(got, string(match[1]))
}
assert.Equal(t, test.want, got, fmt.Sprintf("in=%v want=%v got=%v, runRegexp=%q", test.in, test.want, got, runRegexp))
}
}
var nilTest = func(t *testing.T) {}
// Nested tests for TestTestsToRegexpLive to run
func TestTests(t *testing.T) {
t.Run("A1", nilTest)
t.Run("A2", nilTest)
t.Run("B", func(t *testing.T) {
t.Run("B1", nilTest)
t.Run("B2", nilTest)
})
t.Run("C", func(t *testing.T) {
t.Run("C1", nilTest)
t.Run("C2", nilTest)
t.Run("C3", func(t *testing.T) {
t.Run("C31", nilTest)
t.Run("C32", nilTest)
})
})
}