github.com/docker/compose-on-kubernetes@v0.5.0/internal/controller/stackownercache_test.go (about) 1 package controller 2 3 import ( 4 "testing" 5 6 "github.com/docker/compose-on-kubernetes/api/compose/impersonation" 7 "github.com/docker/compose-on-kubernetes/api/compose/latest" 8 "github.com/docker/compose-on-kubernetes/internal/stackresources" 9 "github.com/stretchr/testify/assert" 10 kerrors "k8s.io/apimachinery/pkg/api/errors" 11 ) 12 13 type ownerGetterFunc struct { 14 getFunc func(*latest.Stack) (*latest.Owner, error) 15 } 16 17 func (o *ownerGetterFunc) get(stack *latest.Stack) (*latest.Owner, error) { 18 return o.getFunc(stack) 19 } 20 21 func TestUpdateDeleteSequence(t *testing.T) { 22 var return404 bool 23 getter := &ownerGetterFunc{ 24 getFunc: func(stack *latest.Stack) (*latest.Owner, error) { 25 if return404 { 26 return nil, kerrors.NewNotFound(latest.GroupResource("stacks"), stack.Name) 27 } 28 return &latest.Owner{ 29 Owner: impersonation.Config{ 30 UserName: "test", 31 }, 32 }, nil 33 }, 34 } 35 testee := &stackOwnerCache{data: make(map[string]stackOwnerCacheEntry), getter: getter} 36 37 testStack := &latest.Stack{} 38 testStack.Name = "test" 39 testStack.Namespace = "ns" 40 // as of create 41 cfg, _ := testee.getWithRetries(testStack, false) 42 assert.Equal(t, "test", cfg.UserName) 43 // as of update 44 testee.setDirty(stackresources.ObjKey(testStack.Namespace, testStack.Name)) 45 cfg, _ = testee.getWithRetries(testStack, false) 46 assert.Equal(t, "test", cfg.UserName) 47 // as of update followed by delete 48 testee.setDirty(stackresources.ObjKey(testStack.Namespace, testStack.Name)) 49 return404 = true 50 cfg, _ = testee.getWithRetries(testStack, false) 51 assert.Equal(t, "test", cfg.UserName) 52 // as of delete 53 cfg, _ = testee.getWithRetries(testStack, true) 54 assert.Equal(t, "test", cfg.UserName) 55 testee.remove(stackresources.ObjKey(testStack.Namespace, testStack.Name)) 56 57 } 58 59 // this is a test to reproduce the hang of DockerCon EU 2018 60 // that occurred because of an informer's "delete" event missed triggered by 61 // the demo machine going to sleep at a particularly bad time, and etcd compaction occurring 62 // just after. 63 func TestStackOwnerCachePanicOnUnresolvableOwner(t *testing.T) { 64 getter := &ownerGetterFunc{ 65 getFunc: func(stack *latest.Stack) (*latest.Owner, error) { 66 return nil, kerrors.NewNotFound(latest.GroupResource("stacks"), stack.Name) 67 }, 68 } 69 testee := &stackOwnerCache{data: make(map[string]stackOwnerCacheEntry), getter: getter} 70 testStack := &latest.Stack{} 71 testStack.Name = "test" 72 testStack.Namespace = "ns" 73 _, err := testee.getWithRetries(testStack, true) 74 assert.Error(t, err) 75 }