mirror of
https://github.com/multipleof4/ntfy.git
synced 2026-10-08 21:05:21 +00:00
42 lines
1.5 KiB
Go
42 lines
1.5 KiB
Go
package pg
|
|
|
|
import (
|
|
"testing"
|
|
"time"
|
|
|
|
"github.com/stretchr/testify/require"
|
|
)
|
|
|
|
// The lease logic is pure time arithmetic, so it is unit-tested here without a database; the
|
|
// external leader tests cover the loop end to end.
|
|
|
|
func TestLeader_Lease_HoldoffMeansNoLeaderRatherThanTwo(t *testing.T) {
|
|
// Freshly acquired lock: belief must wait out the hold-off
|
|
l := &Leader{renewInterval: 20 * time.Second} // Lease duration 1m, hold-off 2m
|
|
l.acquiredAt = time.Now()
|
|
l.renewedAt = l.acquiredAt
|
|
require.False(t, l.IsLeader())
|
|
// Once the hold-off has passed (and verification is fresh), belief begins
|
|
l.acquiredAt = time.Now().Add(-3 * time.Minute)
|
|
l.renewedAt = time.Now()
|
|
require.True(t, l.IsLeader())
|
|
}
|
|
|
|
func TestLeader_Lease_ExpiredLeaseRevokesLeadership(t *testing.T) {
|
|
// A leader that cannot renew its lease (wedged process, long GC pause) must stop
|
|
// believing once the lease expires, even though the lock may still be held
|
|
l := &Leader{renewInterval: 20 * time.Second} // Lease duration 1m, hold-off 2m
|
|
l.acquiredAt = time.Now().Add(-time.Hour)
|
|
l.renewedAt = time.Now().Add(-2 * time.Minute) // Lease expired
|
|
require.False(t, l.IsLeader())
|
|
l.renewedAt = time.Now() // Fresh renewal restores belief
|
|
require.True(t, l.IsLeader())
|
|
}
|
|
|
|
func TestLeader_Lease_ReleasedIsNeverLeader(t *testing.T) {
|
|
// release() zeroes renewedAt, which fails the lease check no matter how old the tenure
|
|
l := &Leader{renewInterval: 20 * time.Second} // Lease duration 1m, hold-off 2m
|
|
l.acquiredAt = time.Now().Add(-time.Hour)
|
|
require.False(t, l.IsLeader())
|
|
}
|