2021-07-02 08:43:15 +00:00
# clockwork
2019-01-12 04:58:27 +00:00
2021-07-02 08:43:15 +00:00
[![Mentioned in Awesome Go ](https://awesome.re/mentioned-badge-flat.svg )](https://github.com/avelino/awesome-go#utilities)
2019-09-27 21:51:53 +00:00
2021-07-02 08:43:15 +00:00
[![GitHub Workflow Status ](https://img.shields.io/github/workflow/status/jonboulle/clockwork/CI?style=flat-square )](https://github.com/jonboulle/clockwork/actions?query=workflow%3ACI)
[![Go Report Card ](https://goreportcard.com/badge/github.com/jonboulle/clockwork?style=flat-square )](https://goreportcard.com/report/github.com/jonboulle/clockwork)
![Go Version ](https://img.shields.io/badge/go%20version-%3E=1.11-61CFDD.svg?style=flat-square )
[![go.dev reference ](https://img.shields.io/badge/go.dev-reference-007d9c?logo=go&logoColor=white&style=flat-square )](https://pkg.go.dev/mod/github.com/jonboulle/clockwork)
2019-01-12 04:58:27 +00:00
2021-07-02 08:43:15 +00:00
**A simple fake clock for Go.**
## Usage
2019-01-12 04:58:27 +00:00
Replace uses of the `time` package with the `clockwork.Clock` interface instead.
For example, instead of using `time.Sleep` directly:
2021-07-02 08:43:15 +00:00
```go
func myFunc() {
2019-01-12 04:58:27 +00:00
time.Sleep(3 * time.Second)
2021-07-02 08:43:15 +00:00
doSomething()
2019-01-12 04:58:27 +00:00
}
```
2021-07-02 08:43:15 +00:00
Inject a clock and use its `Sleep` method instead:
2019-01-12 04:58:27 +00:00
2021-07-02 08:43:15 +00:00
```go
func myFunc(clock clockwork.Clock) {
2019-01-12 04:58:27 +00:00
clock.Sleep(3 * time.Second)
2021-07-02 08:43:15 +00:00
doSomething()
2019-01-12 04:58:27 +00:00
}
```
2021-07-02 08:43:15 +00:00
Now you can easily test `myFunc` with a `FakeClock` :
2019-01-12 04:58:27 +00:00
2021-07-02 08:43:15 +00:00
```go
2019-01-12 04:58:27 +00:00
func TestMyFunc(t *testing.T) {
c := clockwork.NewFakeClock()
// Start our sleepy function
2021-07-02 08:43:15 +00:00
var wg sync.WaitGroup
wg.Add(1)
go func() {
myFunc(c)
wg.Done()
}()
// Ensure we wait until myFunc is sleeping
2019-01-12 04:58:27 +00:00
c.BlockUntil(1)
2021-07-02 08:43:15 +00:00
assertState()
2019-01-12 04:58:27 +00:00
// Advance the FakeClock forward in time
2021-07-02 08:43:15 +00:00
c.Advance(3 * time.Second)
// Wait until the function completes
wg.Wait()
2019-01-12 04:58:27 +00:00
2021-07-02 08:43:15 +00:00
assertState()
2019-01-12 04:58:27 +00:00
}
```
and in production builds, simply inject the real clock instead:
2021-07-02 08:43:15 +00:00
```go
myFunc(clockwork.NewRealClock())
2019-01-12 04:58:27 +00:00
```
See [example_test.go ](example_test.go ) for a full example.
2021-07-02 08:43:15 +00:00
2019-01-12 04:58:27 +00:00
# Credits
2021-07-02 08:43:15 +00:00
clockwork is inspired by @wickman 's [threaded fake clock ](https://gist.github.com/wickman/3840816 ), and the [Golang playground ](https://blog.golang.org/playground#TOC_3.1. )
## License
Apache License, Version 2.0. Please see [License File ](LICENSE ) for more information.