package internet import ( "context" "errors" "math/rand" "time" ) var ( // channel.go @ simulateAustralianInternet CanFail = true // 500ms ~ 3s MinLatency = 500 MaxLatency = 3000 ) // ErrTimedOut is returned when the simulated IO decides to fail. var ErrTimedOut = errors.New("Australian Internet unsupported.") // SimulateAustralian simulates network latency with errors. func SimulateAustralian() error { return SimulateAustralianCtx(context.Background()) } // SimulateAustralianCtx simulates network latency with errors. func SimulateAustralianCtx(ctx context.Context) (err error) { var ms = randClamp(MinLatency, MaxLatency) select { case <-time.After(time.Duration(ms) * time.Millisecond): // noop case <-ctx.Done(): return ctx.Err() } // because australia, drop packet 20% of the time if internetCanFail is // true. if CanFail && rand.Intn(100) < 20 { return ErrTimedOut } return nil } func randClamp(min, max int) int { return rand.Intn(max-min) + min }