func (s *managedStorageSuite) checkPutResponse(c *gc.C, index int, wg *sync.WaitGroup, requestId int64, md5hash, sha256hash string, blob []byte) { // After a random time, respond to a previously queued put request and check the result. go func() { delay := rand.Intn(3) time.Sleep(time.Duration(delay) * time.Millisecond) expectError := index == 2 if expectError { md5hash = "bad" } response := storage.NewPutResponse(requestId, md5hash, sha256hash) err := s.managedStorage.ProofOfAccessResponse(response) if expectError { c.Check(err, gc.NotNil) } else { c.Check(err, gc.IsNil) if err == nil { r, length, err := s.managedStorage.GetForEnvironment("env", fmt.Sprintf("path/to/blob%d", index)) c.Check(err, gc.IsNil) if err == nil { data, err := ioutil.ReadAll(r) c.Check(err, gc.IsNil) c.Check(data, gc.DeepEquals, blob) c.Check(int(length), gc.DeepEquals, len(blob)) } } } wg.Done() }() }
func (s *managedStorageSuite) TestPutRequestResponseSHA256Mismatch(c *gc.C) { blob, md5hash, sha256hash := s.putTestBlob(c, "path/to/blob") hash := storage.ResourceHash{md5hash, sha256hash} reqResp, err := s.managedStorage.PutForEnvironmentRequest("env", "path/to/blob", hash) c.Assert(err, gc.IsNil) md5Response, _ := calculateCheckSums(c, reqResp.RangeStart, reqResp.RangeLength, blob) response := storage.NewPutResponse(reqResp.RequestId, md5Response, "notsha256") err = s.managedStorage.ProofOfAccessResponse(response) c.Assert(err, gc.Equals, storage.ErrResponseMismatch) c.Assert(storage.RequestQueueLength(s.managedStorage), gc.Equals, 0) }
func (s *managedStorageSuite) TestPutRequestDeleted(c *gc.C) { blob, md5hash, sha256hash := s.putTestBlob(c, "path/to/blob") hash := storage.ResourceHash{md5hash, sha256hash} reqResp, err := s.managedStorage.PutForEnvironmentRequest("env", "path/to/blob", hash) c.Assert(err, gc.IsNil) err = s.managedStorage.RemoveForEnvironment("env", "path/to/blob") c.Assert(err, gc.IsNil) md5Response, sha256Response := calculateCheckSums(c, reqResp.RangeStart, reqResp.RangeLength, blob) response := storage.NewPutResponse(reqResp.RequestId, md5Response, sha256Response) err = s.managedStorage.ProofOfAccessResponse(response) c.Assert(err, gc.Equals, storage.ErrResourceDeleted) }
func (s *managedStorageSuite) TestPutRequestExpiredMulti(c *gc.C) { ch := make(chan struct{}) s.PatchValue(storage.AfterFunc, patchedAfterFunc(ch)) blob, md5hash, sha256hash := s.putTestBlob(c, "path/to/blob") hash := storage.ResourceHash{md5hash, sha256hash} reqResp, err := s.managedStorage.PutForEnvironmentRequest("env", "path/to/blob", hash) c.Assert(err, gc.IsNil) md5Response, sha256Response := calculateCheckSums(c, reqResp.RangeStart, reqResp.RangeLength, blob) reqResp2, err := s.managedStorage.PutForEnvironmentRequest("env", "path/to/blob2", hash) c.Assert(err, gc.IsNil) md5Response2, sha256Response2 := calculateCheckSums(c, reqResp.RangeStart, reqResp.RangeLength, blob) // Trigger the request timeouts. ch <- trigger <-ch ch <- trigger <-ch c.Assert(storage.RequestQueueLength(s.managedStorage), gc.Equals, 0) response := storage.NewPutResponse(reqResp.RequestId, md5Response, sha256Response) response2 := storage.NewPutResponse(reqResp2.RequestId, md5Response2, sha256Response2) err = s.managedStorage.ProofOfAccessResponse(response) c.Assert(err, gc.Equals, storage.ErrRequestExpired) err = s.managedStorage.ProofOfAccessResponse(response2) c.Assert(err, gc.Equals, storage.ErrRequestExpired) }
// Run one simple test with the real time.AfterFunc to ensure it works. func (s *managedStorageSuite) TestPutRequestExpiredWithRealTimeAfter(c *gc.C) { s.PatchValue(storage.RequestExpiry, 5*time.Millisecond) blob, md5hash, sha256hash := s.putTestBlob(c, "path/to/blob") hash := storage.ResourceHash{md5hash, sha256hash} reqResp, err := s.managedStorage.PutForEnvironmentRequest("env", "path/to/blob", hash) c.Assert(err, gc.IsNil) md5Response, sha256Response := calculateCheckSums(c, reqResp.RangeStart, reqResp.RangeLength, blob) // Wait for request timer to trigger. time.Sleep(7 * time.Millisecond) response := storage.NewPutResponse(reqResp.RequestId, md5Response, sha256Response) err = s.managedStorage.ProofOfAccessResponse(response) c.Assert(err, gc.Equals, storage.ErrRequestExpired) c.Assert(storage.RequestQueueLength(s.managedStorage), gc.Equals, 0) c.Assert(storage.RequestQueueLength(s.managedStorage), gc.Equals, 0) }
func (s *managedStorageSuite) assertPutRequestSingle(c *gc.C, blob []byte, resourceCount int) { if blob == nil { id := bson.NewObjectId().Hex() blob = []byte(id) } rdr := bytes.NewReader(blob) err := s.managedStorage.PutForEnvironment("env", "path/to/blob", rdr, int64(len(blob))) c.Assert(err, gc.IsNil) md5hash, sha256hash := calculateCheckSums(c, 0, int64(len(blob)), blob) hash := storage.ResourceHash{md5hash, sha256hash} reqResp, err := s.managedStorage.PutForEnvironmentRequest("env", "path/to/blob", hash) c.Assert(err, gc.IsNil) md5Response, sha256Response := calculateCheckSums(c, reqResp.RangeStart, reqResp.RangeLength, blob) response := storage.NewPutResponse(reqResp.RequestId, md5Response, sha256Response) err = s.managedStorage.ProofOfAccessResponse(response) c.Assert(err, gc.IsNil) s.assertGet(c, "path/to/blob", blob) s.assertResourceCatalogCount(c, resourceCount) }