func checkFileHasContents(c *C, storage environs.StorageReader, name string, contents []byte, attempt trivial.AttemptStrategy) { r, err := storage.Get(name) c.Assert(err, IsNil) c.Check(r, NotNil) defer r.Close() data, err := ioutil.ReadAll(r) c.Check(err, IsNil) c.Check(data, DeepEquals, contents) url, err := storage.URL(name) c.Assert(err, IsNil) var resp *http.Response for a := attempt.Start(); a.Next(); { resp, err = http.Get(url) c.Assert(err, IsNil) if resp.StatusCode != 404 { break } c.Logf("get retrying after earlier get succeeded. *sigh*.") } c.Assert(err, IsNil) data, err = ioutil.ReadAll(resp.Body) c.Assert(err, IsNil) defer resp.Body.Close() c.Assert(resp.StatusCode, Equals, 200, Commentf("error response: %s", data)) c.Check(data, DeepEquals, contents) }
func checkFileDoesNotExist(c *C, storage environs.StorageReader, name string, attempt trivial.AttemptStrategy) { var r io.ReadCloser var err error for a := attempt.Start(); a.Next(); { r, err = storage.Get(name) if err != nil { break } } c.Assert(r, IsNil) var notFoundError *environs.NotFoundError c.Assert(err, FitsTypeOf, notFoundError) }
func (trivialSuite) TestAttemptTiming(c *C) { const delta = 0.01e9 testAttempt := trivial.AttemptStrategy{ Total: 0.25e9, Delay: 0.1e9, } want := []time.Duration{0, 0.1e9, 0.2e9, 0.2e9} got := make([]time.Duration, 0, len(want)) // avoid allocation when testing timing t0 := time.Now() for a := testAttempt.Start(); a.Next(); { got = append(got, time.Now().Sub(t0)) } got = append(got, time.Now().Sub(t0)) c.Assert(got, HasLen, len(want)) for i, got := range want { lo := want[i] - delta hi := want[i] + delta if got < lo || got > hi { c.Errorf("attempt %d want %g got %g", i, want[i].Seconds(), got.Seconds()) } } }