213 lines
6.4 KiB
Go
213 lines
6.4 KiB
Go
package grace
|
|
|
|
import (
|
|
"testing"
|
|
"time"
|
|
)
|
|
|
|
func TestGetExpectations(t *testing.T) {
|
|
r := NewGraceExpectations()
|
|
|
|
now := time.Now()
|
|
r.controllerCache["testKey"] = timeCache{
|
|
Create: &now,
|
|
}
|
|
|
|
result := r.GetExpectations("testKey")
|
|
if result == nil || len(result) != 1 || result[Create] == nil {
|
|
t.Errorf("expected timeCache with one Create action, got %v", result)
|
|
}
|
|
}
|
|
|
|
func TestExpect(t *testing.T) {
|
|
r := NewGraceExpectations()
|
|
r.Expect("testKey", Create)
|
|
|
|
if _, exists := r.controllerCache["testKey"][Create]; !exists {
|
|
t.Errorf("expected Create action for testKey to be recorded")
|
|
}
|
|
}
|
|
|
|
func TestObserve(t *testing.T) {
|
|
r := NewGraceExpectations()
|
|
|
|
r.Expect("testKey", Create)
|
|
r.Observe("testKey", Create)
|
|
|
|
if _, exists := r.controllerCache["testKey"]; exists {
|
|
t.Errorf("expected testKey to be removed from cache after Observe")
|
|
}
|
|
}
|
|
|
|
func TestSatisfiedExpectations(t *testing.T) {
|
|
r := NewGraceExpectations()
|
|
r.Expect("testKey", Create)
|
|
|
|
// Should be unsatisfied if graceSeconds is 0 (immediate timeout)
|
|
satisfied, _ := r.SatisfiedExpectations("testKey", Create, 0)
|
|
if !satisfied {
|
|
t.Errorf("expected expectations to be satisfied immediately for 0 graceSeconds")
|
|
}
|
|
|
|
// Set a new expectation with some future grace period
|
|
r.Expect("testKey", Create)
|
|
satisfied, _ = r.SatisfiedExpectations("testKey", Create, 60)
|
|
if satisfied {
|
|
t.Errorf("expected expectations to be unsatisfied for 60 second grace period")
|
|
}
|
|
}
|
|
|
|
func TestDeleteExpectations(t *testing.T) {
|
|
r := NewGraceExpectations()
|
|
r.Expect("testKey", Create)
|
|
|
|
r.DeleteExpectations("testKey")
|
|
|
|
if _, exists := r.controllerCache["testKey"]; exists {
|
|
t.Errorf("expected testKey to be deleted from cache after DeleteExpectations")
|
|
}
|
|
}
|
|
|
|
func TestCleanOutdatedItems(t *testing.T) {
|
|
r := NewGraceExpectations()
|
|
|
|
// Set an expectation well in the past so it is outdated
|
|
past := time.Now().Add(-time.Hour)
|
|
r.controllerCache["testKey"] = timeCache{
|
|
Create: &past,
|
|
}
|
|
|
|
r.CleanOutdatedItems(ExpectationGraceTimeout)
|
|
|
|
if _, exists := r.controllerCache["testKey"]; exists {
|
|
t.Errorf("expected testKey to be removed by CleanOutdatedItems")
|
|
}
|
|
|
|
// Set a recent expectation to ensure it is not cleaned out
|
|
r.Expect("testKey", Create)
|
|
recent := time.Now()
|
|
r.controllerCache["testKey"][Create] = &recent
|
|
|
|
r.CleanOutdatedItems(ExpectationGraceTimeout)
|
|
|
|
if _, exists := r.controllerCache["testKey"]; !exists {
|
|
t.Errorf("expected testKey to not be removed by CleanOutdatedItems")
|
|
}
|
|
}
|
|
|
|
func TestResetExpectations(t *testing.T) {
|
|
r := NewGraceExpectations()
|
|
r.Expect("testKey", Create)
|
|
|
|
r.resetExpectations()
|
|
|
|
if _, exists := r.controllerCache["testKey"]; exists {
|
|
t.Errorf("expected controller cache to be empty after resetExpectations")
|
|
}
|
|
}
|
|
|
|
func TestComprehensive(t *testing.T) {
|
|
// Initialize realGraceExpectations
|
|
r := NewGraceExpectations()
|
|
|
|
// Add expectations
|
|
r.Expect("testController1", Create)
|
|
r.Expect("testController1", Delete)
|
|
r.Expect("testController2", Update)
|
|
|
|
// Validate that expectations are correctly added
|
|
if expectations := r.GetExpectations("testController1"); len(expectations) != 2 {
|
|
t.Errorf("expected 2 actions for testController1, got %d", len(expectations))
|
|
}
|
|
if expectations := r.GetExpectations("testController2"); len(expectations) != 1 {
|
|
t.Errorf("expected 1 action for testController2, got %d", len(expectations))
|
|
}
|
|
|
|
// Observe and remove a specific action
|
|
r.Observe("testController1", Create)
|
|
if expectations := r.GetExpectations("testController1"); len(expectations) != 1 {
|
|
t.Errorf("expected 1 action for testController1 after observation, got %d", len(expectations))
|
|
}
|
|
|
|
// Check satisfaction status for an existing expectation
|
|
satisfied, remaining := r.SatisfiedExpectations("testController1", Delete, 0)
|
|
if !satisfied || remaining > 0 {
|
|
t.Errorf("expected unsatisfied expectation for testController1 Delete action")
|
|
}
|
|
|
|
// Check satisfaction status for a non-existing action
|
|
satisfied, _ = r.SatisfiedExpectations("testController1", Create, 0)
|
|
if !satisfied {
|
|
t.Errorf("expected satisfied status for non-existing Create action on testController1")
|
|
}
|
|
|
|
// Advance the time and check satisfaction after timeout
|
|
r.Expect("testController3", Restore)
|
|
time.Sleep(2 * time.Second)
|
|
satisfied, _ = r.SatisfiedExpectations("testController3", Restore, 1) // 1 second grace period
|
|
if !satisfied {
|
|
t.Errorf("expected satisfied status for Restore action on testController3 after timeout")
|
|
}
|
|
|
|
// Delete expectations for a controller key
|
|
r.DeleteExpectations("testController1")
|
|
if expectations := r.GetExpectations("testController1"); len(expectations) != 0 {
|
|
t.Errorf("expected no actions for testController1 after deletion")
|
|
}
|
|
|
|
// Clean outdated items
|
|
r.Expect("testController4", Update)
|
|
outdated := time.Now().Add(-10 * time.Minute) // Set a past record time to be outdated
|
|
r.controllerCache["testController4"][Update] = &outdated
|
|
r.CleanOutdatedItems(ExpectationGraceTimeout)
|
|
if expectations := r.GetExpectations("testController4"); len(expectations) != 0 {
|
|
t.Errorf("expected no actions for testController4 after clean")
|
|
}
|
|
|
|
// Reset expectations
|
|
r.Expect("testController5", Delete)
|
|
r.resetExpectations()
|
|
if len(r.controllerCache) != 0 {
|
|
t.Errorf("expected empty controller cache after reset")
|
|
}
|
|
}
|
|
|
|
func TestStartCleaner(t *testing.T) {
|
|
// Shorten the interval for faster testing
|
|
testInterval := time.Millisecond * 100
|
|
|
|
// Initialize realGraceExpectations
|
|
r := NewGraceExpectations()
|
|
|
|
// Add mixed expectations
|
|
past := time.Now().Add(-10 * time.Minute)
|
|
recent := time.Now().Add(testInterval * 3)
|
|
|
|
r.controllerCache["testController1"] = timeCache{
|
|
Create: &past,
|
|
Update: &recent,
|
|
}
|
|
r.controllerCache["testController2"] = timeCache{
|
|
Delete: &past,
|
|
Restore: &recent,
|
|
}
|
|
|
|
// Start the cleaner with a short interval
|
|
r.StartCleaner(testInterval)
|
|
|
|
// Wait for the cleaner to run
|
|
time.Sleep(testInterval * 3)
|
|
|
|
r.Lock()
|
|
defer r.Unlock()
|
|
|
|
// Verify the outdated items have been cleaned and recent ones remain
|
|
if len(r.controllerCache["testController1"]) != 1 || r.controllerCache["testController1"][Update] != &recent {
|
|
t.Errorf("expected only recent Update action for testController1 to remain, found %d", len(r.controllerCache["testController1"]))
|
|
}
|
|
|
|
if len(r.controllerCache["testController2"]) != 1 || r.controllerCache["testController2"][Restore] != &recent {
|
|
t.Errorf("expected only recent Restore action for testController2 to remain, found %d", len(r.controllerCache["testController2"]))
|
|
}
|
|
}
|