// This test assumes that the client implementation backs off exponentially, for an individual request. func TestBackoffLifecycle(t *testing.T) { count := 0 testServer := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) { count++ t.Logf("Attempt %d", count) if count == 5 || count == 9 { w.WriteHeader(http.StatusOK) return } else { w.WriteHeader(http.StatusGatewayTimeout) return } })) // TODO: Uncomment when fix #19254 // defer testServer.Close() c := testRESTClient(t, testServer) // Test backoff recovery and increase. This correlates to the constants // which are used in the server implementation returning StatusOK above. seconds := []int{0, 1, 2, 4, 8, 0, 1, 2, 4, 0} request := c.Verb("POST").Prefix("backofftest").Suffix("abc") clock := util.FakeClock{} request.backoffMgr = &URLBackoff{ // Use a fake backoff here to avoid flakes and speed the test up. Backoff: util.NewFakeBackOff( time.Duration(1)*time.Second, time.Duration(200)*time.Second, &clock, )} for _, sec := range seconds { thisBackoff := request.backoffMgr.CalculateBackoff(request.URL()) t.Logf("Current backoff %v", thisBackoff) if thisBackoff != time.Duration(sec)*time.Second { t.Errorf("Backoff is %v instead of %v", thisBackoff, sec) } now := clock.Now() request.DoRaw() elapsed := clock.Since(now) if clock.Since(now) != thisBackoff { t.Errorf("CalculatedBackoff not honored by clock: Expected time of %v, but got %v ", thisBackoff, elapsed) } } }
func TestGarbageCollectImageNotOldEnough(t *testing.T) { policy := ImageGCPolicy{ HighThresholdPercent: 90, LowThresholdPercent: 80, } fakeRuntime := &container.FakeRuntime{} mockCadvisor := new(cadvisor.Mock) manager := &realImageManager{ runtime: fakeRuntime, policy: policy, minAge: defaultGCAge, imageRecords: make(map[string]*imageRecord), cadvisor: mockCadvisor, recorder: &record.FakeRecorder{}, } fakeRuntime.ImageList = []container.Image{ makeImage(0, 1024), makeImage(1, 2048), } // 1 image is in use, and another one is not old enough fakeRuntime.AllPodList = []*container.Pod{ { Containers: []*container.Container{ makeContainer(1), }, }, } fakeClock := util.FakeClock{Time: time.Now()} fmt.Println(fakeClock.Now()) require.NoError(t, manager.detectImages(fakeClock.Now())) require.Equal(t, manager.imageRecordsLen(), 2) // no space freed since one image is in used, and another one is not old enough spaceFreed, err := manager.freeSpace(1024, fakeClock.Now()) assert := assert.New(t) require.NoError(t, err) assert.EqualValues(0, spaceFreed) assert.Len(fakeRuntime.ImageList, 2) // move clock by minAge duration, then 1 image will be garbage collected fakeClock.Step(manager.minAge) spaceFreed, err = manager.freeSpace(1024, fakeClock.Now()) require.NoError(t, err) assert.EqualValues(1024, spaceFreed) assert.Len(fakeRuntime.ImageList, 1) }