package main import ( "bytes" "fmt" "io" "log" "net/http" "time" . "gopkg.in/check.v1" ) type AlbumCoverCacheSuite struct{} var _ = Suite(&AlbumCoverCacheSuite{}) // a simple HTTPGetter that will never GET anything type errorGetter struct{} func (g *errorGetter) Get(URL string) (*http.Response, error) { return nil, fmt.Errorf("I will always have an error") } func (s *AlbumCoverCacheSuite) TestCanFetchCache(c *C) { cache := NewAlbumCoverCache(c.MkDir(), 10, 10*time.Second) cache.getter = testGetter var resData = []bytes.Buffer{} start := time.Now() for _, a := range albumsDataTest { cover, err := cache.GetCover(&a) var buf bytes.Buffer if c.Check(err, IsNil) == true { _, err := io.Copy(&buf, cover) c.Check(err, IsNil) c.Check(cover.Close(), IsNil) } resData = append(resData, buf) } cache.getter = &errorGetter{} // now we check that we get it again, but from the disk, not // hitting the web for i, a := range albumsDataTest { cover, err := cache.GetCover(&a) var buf bytes.Buffer if c.Check(err, IsNil) == true { _, err := io.Copy(&buf, cover) if c.Check(err, IsNil) == true { c.Check(buf.Bytes(), DeepEquals, resData[i].Bytes()) } c.Check(cover.Close(), IsNil) } } // now if we it the TTL, we will reftech and get error cache.TTL = 0 for _, a := range albumsDataTest { cover, err := cache.GetCover(&a) c.Check(cover, IsNil) c.Check(err, ErrorMatches, "I will always have an error") } log.Printf("%s: %s", c.TestName(), time.Since(start)) }