History

Use single global for flags

Gregory Petrosyan committed 6 years ago

Commit e5424da1 parent 8f0b7cb5 files · +38 −23Browse files

Unified · Split

5 files
  1. combinators.go +1 −1
  2. data.go +2 −2
  3. engine.go +28 −13
  4. shrink.go +6 −6
  5. statemachine.go +1 −1
combinators.go+1−1
@@ -50,7 +50,7 @@ func (g *customGen) value(t *T) value { · 49 unmodified lines
50}50}
51 51
52func (g *customGen) maybeValue(t *T) value {52func (g *customGen) maybeValue(t *T) value {
53 t = newT(t.tb, t.s, *debug, nil)53 t = newT(t.tb, t.s, flags.debug, nil)
54 54
55 defer func() {55 defer func() {
56 if r := recover(); r != nil {56 if r := recover(); r != nil {
data.go+2−2
@@ -22,8 +22,8 @@ type bitStream interface { · 21 unmodified lines
22}22}
23 23
24func baseSeed() uint64 {24func baseSeed() uint64 {
25 if *startSeed != 0 {25 if flags.startSeed != 0 {
26 return *startSeed26 return flags.startSeed
27 }27 }
28 28
29 return uint64(time.Now().UnixNano()) + uint64(atomic.AddUint32(&seedCounter, 1))29 return uint64(time.Now().UnixNano()) + uint64(atomic.AddUint32(&seedCounter, 1))
engine.go+28−13
@@ -31,14 +31,7 @@ const ( · 30 unmodified lines
31)31)
32 32
33var (33var (
34 checks = flag.Int("rapid.checks", 100, "rapid: number of checks to perform")34 flags cmdline
35 steps = flag.Int("rapid.steps", 100, "rapid: number of state machine steps to perform")
36 startSeed = flag.Uint64("rapid.seed", 0, "rapid: PRNG seed to start with (0 to use a random one)")
37 rapidLog = flag.Bool("rapid.log", false, "rapid: eager verbose output to stdout (to aid with unrecoverable test failures)")
38 verbose = flag.Bool("rapid.v", false, "rapid: verbose output")
39 debug = flag.Bool("rapid.debug", false, "rapid: debugging output")
40 debugvis = flag.Bool("rapid.debugvis", false, "rapid: debugging visualization")
41 shrinkTime = flag.Duration("rapid.shrinktime", 30*time.Second, "rapid: maximum time to spend on test case minimization")
42 35
43 emptyStructType = reflect.TypeOf(struct{}{})36 emptyStructType = reflect.TypeOf(struct{}{})
44 emptyStructValue = reflect.ValueOf(struct{}{})37 emptyStructValue = reflect.ValueOf(struct{}{})
@@ -49,6 +42,28 @@ var ( · 4 unmodified lines
49 }42 }
50)43)
51 44
45type cmdline struct {
46 checks int
47 steps int
48 startSeed uint64
49 rapidLog bool
50 verbose bool
51 debug bool
52 debugvis bool
53 shrinkTime time.Duration
54}
55
56func init() {
57 flag.IntVar(&flags.checks, "rapid.checks", 100, "rapid: number of checks to perform")
58 flag.IntVar(&flags.steps, "rapid.steps", 100, "rapid: number of state machine steps to perform")
59 flag.Uint64Var(&flags.startSeed, "rapid.seed", 0, "rapid: PRNG seed to start with (0 to use a random one)")
60 flag.BoolVar(&flags.rapidLog, "rapid.log", false, "rapid: eager verbose output to stdout (to aid with unrecoverable test failures)")
61 flag.BoolVar(&flags.verbose, "rapid.v", false, "rapid: verbose output")
62 flag.BoolVar(&flags.debug, "rapid.debug", false, "rapid: debugging output")
63 flag.BoolVar(&flags.debugvis, "rapid.debugvis", false, "rapid: debugging visualization")
64 flag.DurationVar(&flags.shrinkTime, "rapid.shrinktime", 30*time.Second, "rapid: maximum time to spend on test case minimization")
65}
66
52func assert(ok bool) {67func assert(ok bool) {
53 if !ok {68 if !ok {
54 panic("assertion failed")69 panic("assertion failed")
@@ -104,7 +119,7 @@ func checkTB(tb tb, prop func(*T)) { · 49 unmodified lines
104 dt := time.Since(start)119 dt := time.Since(start)
105 120
106 if err1 == nil && err2 == nil {121 if err1 == nil && err2 == nil {
107 if valid == *checks {122 if valid == flags.checks {
108 tb.Logf("[rapid] OK, passed %v tests (%v)", valid, dt)123 tb.Logf("[rapid] OK, passed %v tests (%v)", valid, dt)
109 } else {124 } else {
110 tb.Errorf("[rapid] only generated %v valid tests from %v total (%v)", valid, valid+invalid, dt)125 tb.Errorf("[rapid] only generated %v valid tests from %v total (%v)", valid, valid+invalid, dt)
@@ -140,7 +155,7 @@ func doCheck(tb tb, prop func(*T)) (int, int, uint64, []uint64, *testError, *tes · 29 unmodified lines
140 }155 }
141 156
142 s := newRandomBitStream(seed, true)157 s := newRandomBitStream(seed, true)
143 t := newT(tb, s, *verbose, nil)158 t := newT(tb, s, flags.verbose, nil)
144 t.Logf("[rapid] trying to reproduce the failure")159 t.Logf("[rapid] trying to reproduce the failure")
145 err2 := checkOnce(t, prop)160 err2 := checkOnce(t, prop)
146 if !sameError(err1, err2) {161 if !sameError(err1, err2) {
@@ -158,12 +173,12 @@ func findBug(tb tb, seed uint64, prop func(*T)) (uint64, int, int, *testError) { · 11 unmodified lines
158 173
159 var (174 var (
160 r = newRandomBitStream(0, false)175 r = newRandomBitStream(0, false)
161 t = newT(tb, r, *verbose, nil)176 t = newT(tb, r, flags.verbose, nil)
162 valid = 0177 valid = 0
163 invalid = 0178 invalid = 0
164 )179 )
165 180
166 for valid < *checks && invalid < *checks*invalidChecksMult {181 for valid < flags.checks && invalid < flags.checks*invalidChecksMult {
167 seed += uint64(valid) + uint64(invalid)182 seed += uint64(valid) + uint64(invalid)
168 r.init(seed)183 r.init(seed)
169 var start time.Time184 var start time.Time
@@ -319,7 +334,7 @@ func newT(tb tb, s bitStream, tbLog bool, rawLog *log.Logger, refDraws ...value) · 149 unmodified lines
319 refDraws: refDraws,334 refDraws: refDraws,
320 }335 }
321 336
322 if rawLog == nil && *rapidLog {337 if rawLog == nil && flags.rapidLog {
323 testName := "rapid test"338 testName := "rapid test"
324 if tb != nil {339 if tb != nil {
325 testName = tb.Name()340 testName = tb.Name()
shrink.go+6−6
@@ -46,7 +46,7 @@ func shrink(tb tb, rec recordedBits, err *testError, prop func(*T)) ([]uint64, * · 45 unmodified lines
46 46
47 buf, err := s.shrink()47 buf, err := s.shrink()
48 48
49 if *debugvis {49 if flags.debugvis {
50 name := fmt.Sprintf("vis-%v.html", strings.Replace(tb.Name(), "/", "_", -1))50 name := fmt.Sprintf("vis-%v.html", strings.Replace(tb.Name(), "/", "_", -1))
51 f, err := os.Create(name)51 f, err := os.Create(name)
52 if err != nil {52 if err != nil {
@@ -76,7 +76,7 @@ type shrinker struct { · 23 unmodified lines
76}76}
77 77
78func (s *shrinker) debugf(verbose_ bool, format string, args ...interface{}) {78func (s *shrinker) debugf(verbose_ bool, format string, args ...interface{}) {
79 if *debug && (!verbose_ || *verbose) {79 if flags.debug && (!verbose_ || flags.verbose) {
80 s.tb.Helper()80 s.tb.Helper()
81 s.tb.Logf("[shrink] "+format, args...)81 s.tb.Logf("[shrink] "+format, args...)
82 }82 }
@@ -90,7 +90,7 @@ func (s *shrinker) shrink() (buf []uint64, err *testError) { · 7 unmodified lines
90 }()90 }()
91 91
92 i := 092 i := 0
93 deadline := time.Now().Add(*shrinkTime)93 deadline := time.Now().Add(flags.shrinkTime)
94 for shrinks := -1; s.shrinks > shrinks && time.Now().Before(deadline); i++ {94 for shrinks := -1; s.shrinks > shrinks && time.Now().Before(deadline); i++ {
95 shrinks = s.shrinks95 shrinks = s.shrinks
96 96
@@ -259,7 +259,7 @@ func (s *shrinker) accept(buf []uint64, label string, format string, args ...int · 162 unmodified lines
259 s.debugf(true, label+": trying to reproduce the failure with a smaller test case: "+format, args...)259 s.debugf(true, label+": trying to reproduce the failure with a smaller test case: "+format, args...)
260 s.tries[label]++260 s.tries[label]++
261 s1 := newBufBitStream(buf, false)261 s1 := newBufBitStream(buf, false)
262 err1 := checkOnce(newT(s.tb, s1, *debug && *verbose, nil), s.prop)262 err1 := checkOnce(newT(s.tb, s1, flags.debug && flags.verbose, nil), s.prop)
263 if traceback(err1) != traceback(s.err) {263 if traceback(err1) != traceback(s.err) {
264 s.cache[bufStr] = struct{}{}264 s.cache[bufStr] = struct{}{}
265 return false265 return false
@@ -269,11 +269,11 @@ func (s *shrinker) accept(buf []uint64, label string, format string, args ...int · 3 unmodified lines
269 s.tries[label]++269 s.tries[label]++
270 s.err = err1270 s.err = err1
271 s2 := newBufBitStream(buf, true)271 s2 := newBufBitStream(buf, true)
272 err2 := checkOnce(newT(s.tb, s2, *debug && *verbose, nil), s.prop)272 err2 := checkOnce(newT(s.tb, s2, flags.debug && flags.verbose, nil), s.prop)
273 s.rec = s2.recordedBits273 s.rec = s2.recordedBits
274 s.rec.prune()274 s.rec.prune()
275 assert(compareData(s.rec.data, buf) <= 0)275 assert(compareData(s.rec.data, buf) <= 0)
276 if *debugvis {276 if flags.debugvis {
277 s.visBits = append(s.visBits, s.rec)277 s.visBits = append(s.visBits, s.rec)
278 }278 }
279 if !sameError(err1, err2) {279 if !sameError(err1, err2) {
statemachine.go+1−1
@@ -59,7 +59,7 @@ func Run(m StateMachine) func(*T) { · 58 unmodified lines
59 return func(t *T) {59 return func(t *T) {
60 t.Helper()60 t.Helper()
61 61
62 repeat := newRepeat(0, *steps, maxInt)62 repeat := newRepeat(0, flags.steps, maxInt)
63 63
64 sm := newStateMachine(typ)64 sm := newStateMachine(typ)
65 if sm.init != nil {65 if sm.init != nil {

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t