Skip to content

Commit

Permalink
util: encapsulate FakeTimeSource better
Browse files Browse the repository at this point in the history
Firstly, need to have *util.FakeTimeSource implementing the util.TimeSource
interface, rather than util.FakeTimeSource, so the FakeTime value can
be changed.

Also, make it thread-safe.
  • Loading branch information
daviddrysdale committed Apr 20, 2017
1 parent 6736ea0 commit fba5ea0
Show file tree
Hide file tree
Showing 5 changed files with 61 additions and 8 deletions.
2 changes: 1 addition & 1 deletion examples/ct/handlers_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@ var fakeTimeMillis = uint64(fakeTime.UnixNano() / millisPerNano)

// The deadline should be the above bumped by 500ms
var fakeDeadlineTime = time.Date(2016, 7, 22, 11, 01, 13, 500*1000*1000, time.UTC)
var fakeTimeSource = util.FakeTimeSource{FakeTime: fakeTime}
var fakeTimeSource = util.NewFakeTimeSource(fakeTime)

const caCertB64 string = `MIIC0DCCAjmgAwIBAgIBADANBgkqhkiG9w0BAQUFADBVMQswCQYDVQQGEwJHQjEk
MCIGA1UEChMbQ2VydGlmaWNhdGUgVHJhbnNwYXJlbmN5IENBMQ4wDAYDVQQIEwVX
Expand Down
2 changes: 1 addition & 1 deletion log/sequencer_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -238,7 +238,7 @@ func createTestContext(ctrl *gomock.Controller, params testParameters) (testCont
}

signer := crypto.NewSHA256Signer(params.signer)
sequencer := NewSequencer(testonly.Hasher, util.FakeTimeSource{FakeTime: fakeTimeForTest}, mockStorage, signer)
sequencer := NewSequencer(testonly.Hasher, util.NewFakeTimeSource(fakeTimeForTest), mockStorage, signer)

return testContext{mockTx: mockTx, mockStorage: mockStorage, signer: signer, sequencer: sequencer}, context.Background()
}
Expand Down
2 changes: 1 addition & 1 deletion server/sequencer_manager_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ import (

// Arbitrary time for use in tests
var fakeTime = time.Date(2016, 6, 28, 13, 40, 12, 45, time.UTC)
var fakeTimeSource = util.FakeTimeSource{FakeTime: fakeTime}
var fakeTimeSource = util.NewFakeTimeSource(fakeTime)

// We use a size zero tree for testing, Merkle tree state restore is tested elsewhere
var testLogID1 = int64(1)
Expand Down
25 changes: 20 additions & 5 deletions util/timesource.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
package util

import (
"sync"
"time"
)

Expand All @@ -36,14 +37,28 @@ func (s SystemTimeSource) Now() time.Time {
// FakeTimeSource provides a time that can be any arbitrarily set value for use in tests.
// It should not be used in production code.
type FakeTimeSource struct {
// FakeTime is the value that this fake time source will return. It is public so
// tests can manipulate it.
FakeTime time.Time
// fakeTime is the value that this fake time source will return.
mu sync.Mutex
fakeTime time.Time
}

// NewFakeTimeSource creates a FakeTimeSource instance
func NewFakeTimeSource(t time.Time) *FakeTimeSource {
return &FakeTimeSource{fakeTime: t}
}

// Now returns the time value this instance contains
func (f FakeTimeSource) Now() time.Time {
return f.FakeTime
func (f *FakeTimeSource) Now() time.Time {
f.mu.Lock()
defer f.mu.Unlock()
return f.fakeTime
}

// Set gives the time that this instance will report
func (f *FakeTimeSource) Set(t time.Time) {
f.mu.Lock()
defer f.mu.Unlock()
f.fakeTime = t
}

// IncrementingFakeTimeSource takes a base time and several increments, which will be applied to
Expand Down
38 changes: 38 additions & 0 deletions util/timesource_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
// Copyright 2016 Google Inc. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

package util

import (
"testing"
"time"
)

func TestFakeTimeSource(t *testing.T) {
date1 := time.Date(1970, 9, 19, 12, 00, 00, 00, time.UTC)
date2 := time.Date(2007, 7, 7, 11, 35, 00, 00, time.UTC)
fake := NewFakeTimeSource(date1)

// Check that a FakeTimeSource can be used as a TimeSource.
var ts TimeSource
ts = fake
if got, want := ts.Now(), date1; got != want {
t.Errorf("ts.Now=%v; want %v", got, want)
}

fake.Set(date2)
if got, want := ts.Now(), date2; got != want {
t.Errorf("ts.Now=%v; want %v", got, want)
}
}

0 comments on commit fba5ea0

Please sign in to comment.