diff --git a/pkg/kubelet/dockertools/fake_docker_client.go b/pkg/kubelet/dockertools/fake_docker_client.go index ceb851ca4a1..ea6df4b1560 100644 --- a/pkg/kubelet/dockertools/fake_docker_client.go +++ b/pkg/kubelet/dockertools/fake_docker_client.go @@ -19,6 +19,7 @@ package dockertools import ( "fmt" "reflect" + "sort" "sync" "time" @@ -66,6 +67,23 @@ func (f *FakeDockerClient) AssertCalls(calls []string) (err error) { return } +func (f *FakeDockerClient) AssertUnorderedCalls(calls []string) (err error) { + f.Lock() + defer f.Unlock() + + var actual, expected []string + copy(actual, calls) + copy(expected, f.called) + + sort.StringSlice(actual).Sort() + sort.StringSlice(expected).Sort() + + if !reflect.DeepEqual(actual, expected) { + err = fmt.Errorf("expected(sorted) %#v, got(sorted) %#v", expected, actual) + } + return +} + // ListContainers is a test-spy implementation of DockerInterface.ListContainers. // It adds an entry "list" to the internal method call record. func (f *FakeDockerClient) ListContainers(options docker.ListContainersOptions) ([]docker.APIContainers, error) { diff --git a/pkg/kubelet/kubelet_test.go b/pkg/kubelet/kubelet_test.go index 9892f2fe323..533f1553abd 100644 --- a/pkg/kubelet/kubelet_test.go +++ b/pkg/kubelet/kubelet_test.go @@ -121,6 +121,13 @@ func verifyCalls(t *testing.T, fakeDocker *dockertools.FakeDockerClient, calls [ } } +func verifyUnorderedCalls(t *testing.T, fakeDocker *dockertools.FakeDockerClient, calls []string) { + err := fakeDocker.AssertUnorderedCalls(calls) + if err != nil { + t.Error(err) + } +} + func verifyStringArrayEquals(t *testing.T, actual, expected []string) { invalid := len(actual) != len(expected) if !invalid { @@ -819,7 +826,7 @@ func TestSyncPodsDeletesWithNoPodInfraContainer(t *testing.T) { } waitGroup.Wait() - verifyCalls(t, fakeDocker, []string{ + verifyUnorderedCalls(t, fakeDocker, []string{ "list", "list", "list", "list", "inspect_container", "inspect_container", "list", "inspect_container", "inspect_container", "stop", "create", "start", "inspect_container", "create", "start", "list", "inspect_container", "inspect_container"}) // A map iteration is used to delete containers, so must not depend on