Skip to content

Commit 3f9a86a

Browse files
authored
Merge branch 'master' into feat-url-generator
2 parents 40936f2 + 4848d14 commit 3f9a86a

File tree

6 files changed

+45
-26
lines changed

6 files changed

+45
-26
lines changed

.github/workflows/ci.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ jobs:
99
name: CI
1010
strategy:
1111
matrix:
12-
go: ['1.13', '1.14', '1.15']
12+
go: ['1.14', '1.15', '1.16']
1313
os: ['ubuntu-latest', 'windows-latest', 'macOS-latest']
1414
runs-on: ${{ matrix.os }}
1515
steps:

engine.go

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -134,7 +134,7 @@ func checkTB(tb tb, prop func(*T)) {
134134
} else {
135135
failfile := failFileName(tb.Name())
136136
out := captureTestOutput(tb, prop, buf)
137-
err := saveFailFile(failfile, out, buf)
137+
err := saveFailFile(failfile, rapidVersion, out, buf)
138138
if err == nil {
139139
repr = fmt.Sprintf("-rapid.failfile=%q", failfile)
140140
} else {
@@ -195,11 +195,15 @@ func doCheck(tb tb, failfile string, checks int, seed uint64, prop func(*T)) (in
195195
func checkFailFile(tb tb, failfile string, prop func(*T)) ([]uint64, *testError, *testError) {
196196
tb.Helper()
197197

198-
buf, err := loadFailFile(failfile)
198+
version, buf, err := loadFailFile(failfile)
199199
if err != nil {
200200
tb.Logf("[rapid] ignoring fail file: %v", err)
201201
return nil, nil, nil
202202
}
203+
if version != rapidVersion {
204+
tb.Logf("[rapid] ignoring fail file: version %q differs from rapid version %q", version, rapidVersion)
205+
return nil, nil, nil
206+
}
203207

204208
s1 := newBufBitStream(buf, false)
205209
t1 := newT(tb, s1, flags.verbose, nil)

generator.go

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,10 @@
66

77
package rapid
88

9-
import "reflect"
9+
import (
10+
"reflect"
11+
"sync"
12+
)
1013

1114
type value interface{}
1215

@@ -17,9 +20,10 @@ type generatorImpl interface {
1720
}
1821

1922
type Generator struct {
20-
impl generatorImpl
21-
typ reflect.Type
22-
str string
23+
impl generatorImpl
24+
typ reflect.Type
25+
strOnce sync.Once
26+
str string
2327
}
2428

2529
func newGenerator(impl generatorImpl) *Generator {
@@ -30,9 +34,9 @@ func newGenerator(impl generatorImpl) *Generator {
3034
}
3135

3236
func (g *Generator) String() string {
33-
if g.str == "" {
37+
g.strOnce.Do(func() {
3438
g.str = g.impl.String()
35-
}
39+
})
3640

3741
return g.str
3842
}

persist.go

Lines changed: 15 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@ import (
1919
)
2020

2121
const (
22+
rapidVersion = "v0.4.4"
23+
2224
persistDirMode = 0775
2325
failfileTmpPattern = ".rapid-failfile-tmp-*"
2426
)
@@ -40,7 +42,7 @@ func failFileName(testName string) string {
4042
return fmt.Sprintf("%s-%s-%d.fail", kindaSafeFilename(testName), ts, os.Getpid())
4143
}
4244

43-
func saveFailFile(filename string, output []byte, buf []uint64) error {
45+
func saveFailFile(filename string, version string, output []byte, buf []uint64) error {
4446
dir := filepath.Dir(filename)
4547
err := os.MkdirAll(dir, persistDirMode)
4648
if err != nil {
@@ -62,7 +64,7 @@ func saveFailFile(filename string, output []byte, buf []uint64) error {
6264
}
6365
}
6466

65-
var bs []string
67+
bs := []string{version}
6668
for _, u := range buf {
6769
bs = append(bs, fmt.Sprintf("0x%x", u))
6870
}
@@ -81,10 +83,10 @@ func saveFailFile(filename string, output []byte, buf []uint64) error {
8183
return nil
8284
}
8385

84-
func loadFailFile(filename string) ([]uint64, error) {
86+
func loadFailFile(filename string) (string, []uint64, error) {
8587
f, err := os.Open(filename)
8688
if err != nil {
87-
return nil, fmt.Errorf("failed to open fail file: %w", err)
89+
return "", nil, fmt.Errorf("failed to open fail file: %w", err)
8890
}
8991
defer func() { _ = f.Close() }()
9092

@@ -98,18 +100,22 @@ func loadFailFile(filename string) ([]uint64, error) {
98100
data = s
99101
}
100102
if err := scanner.Err(); err != nil {
101-
return nil, fmt.Errorf("failed to load fail file %q: %w", filename, err)
103+
return "", nil, fmt.Errorf("failed to load fail file %q: %w", filename, err)
102104
}
103105

104-
var buf []uint64
105106
fields := strings.Fields(data)
106-
for _, b := range fields {
107+
if len(fields) == 0 {
108+
return "", nil, fmt.Errorf("no data in fail file %q", filename)
109+
}
110+
111+
var buf []uint64
112+
for _, b := range fields[1:] {
107113
u, err := strconv.ParseUint(b, 0, 64)
108114
if err != nil {
109-
return nil, fmt.Errorf("failed to load fail file %q: %w", filename, err)
115+
return "", nil, fmt.Errorf("failed to load fail file %q: %w", filename, err)
110116
}
111117
buf = append(buf, u)
112118
}
113119

114-
return buf, nil
120+
return fields[0], buf, nil
115121
}

persist_test.go

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,23 +16,28 @@ func TestFailFileRoundtrip(t *testing.T) {
1616

1717
Check(t, func(t *T) {
1818
var (
19-
testName = String().Draw(t, "testName").(string)
19+
// OS X seems to have issues with Go 1.16 and String(), reporting "illegal byte sequence" when trying to rename the file
20+
testName = StringMatching(`[a-zA-Z0-9._-]+`).Draw(t, "testName").(string)
21+
version = StringMatching(`[a-zA-Z0-9._-]+`).Draw(t, "version").(string)
2022
output = SliceOf(Byte()).Draw(t, "output").([]byte)
2123
buf = SliceOf(Uint64()).Draw(t, "buf").([]uint64)
2224
)
2325

2426
fileName := failFileName(testName)
25-
err := saveFailFile(fileName, output, buf)
27+
err := saveFailFile(fileName, version, output, buf)
2628
if err != nil {
2729
t.Fatal(err)
2830
}
2931
defer func() { _ = os.Remove(fileName) }()
3032

31-
buf2, err := loadFailFile(fileName)
33+
version2, buf2, err := loadFailFile(fileName)
3234
if err != nil {
3335
t.Fatal(err)
3436
}
3537

38+
if version2 != version {
39+
t.Fatalf("got version %q instead of %q", version2, version)
40+
}
3641
if len(buf2) != len(buf) {
3742
t.Fatalf("got buf of length %v instead of %v", len(buf2), len(buf))
3843
}

strings_example_test.go

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
// file, You can obtain one at https://mozilla.org/MPL/2.0/.
66

77
// String generation depends on the Unicode tables, which change with Go versions:
8-
// +build go1.14
8+
// +build go1.16
99

1010
package rapid_test
1111

@@ -31,8 +31,8 @@ func ExampleRune() {
3131
// '\\' '\ufeff' '?' '~' '-'
3232
// '0' '$' '!' '`' '\ue05d'
3333
// '"' '&' '#' '\u0604' 'A'
34-
// '&' '' '@' '#' '|'
35-
// '⊙' '𝩔' '$' '҈' '\r'
34+
// '&' '' '@' '#' '|'
35+
// '⊙' '𝩇' '$' '҈' '\r'
3636
}
3737

3838
func ExampleRuneFrom() {
@@ -67,7 +67,7 @@ func ExampleString() {
6767
}
6868
// Output:
6969
// "\\߾⃝!/?Ⱥ֍"
70-
// "\u2006𑨷"
70+
// "\u2006𑨃"
7171
// "?﹩\u0603ᾢ"
7272
// ".*%:<%৲"
7373
// ""
@@ -95,7 +95,7 @@ func ExampleStringN() {
9595
}
9696
// Output:
9797
// "\\߾⃝!/"
98-
// "\u2006𑨷%\v\ufeff"
98+
// "\u2006𑨃%\v\ufeff"
9999
// "?﹩\u0603ᾢÉ"
100100
// ".*%:<"
101101
// ":?\"~¤"

0 commit comments

Comments
 (0)