Files
2025-08-01 19:57:54 -05:00

51 lines
894 B
Go

// (c) 2020-2020, Lux Industries, Inc. All rights reserved.
// See the file LICENSE for licensing terms.
package utils
import (
"sync"
"time"
)
// MockableClock implements MockableTimer
type MockableClock struct {
mu sync.RWMutex
time time.Time
}
// NewMockableClock creates a new mockable clock
func NewMockableClock() MockableTimer {
return &MockableClock{
time: time.Now(),
}
}
// Time returns the current time
func (c *MockableClock) Time() time.Time {
c.mu.RLock()
defer c.mu.RUnlock()
if c.time.IsZero() {
return time.Now()
}
return c.time
}
// Set sets the current time
func (c *MockableClock) Set(t time.Time) {
c.mu.Lock()
defer c.mu.Unlock()
c.time = t
}
// Advance advances the time by duration
func (c *MockableClock) Advance(d time.Duration) {
c.mu.Lock()
defer c.mu.Unlock()
if c.time.IsZero() {
c.time = time.Now()
}
c.time = c.time.Add(d)
}