StorageDriver: Test suite: improve cleanup
Verify that the file(s) have been deleted after calling Delete, and retry if this is not the case. Furthermore, report the error if a Delete operation fails. Signed-off-by: Arthur Baars <arthur@semmle.com>master
							parent
							
								
									47a064d419
								
							
						
					
					
						commit
						6ee339464c
					
				| 
						 | 
				
			
			@ -555,7 +555,16 @@ func (d *driver) Delete(context ctx.Context, path string) error {
 | 
			
		|||
	if len(keys) > 0 {
 | 
			
		||||
		sort.Sort(sort.Reverse(sort.StringSlice(keys)))
 | 
			
		||||
		for _, key := range keys {
 | 
			
		||||
			if err := storage.DeleteObject(gcsContext, d.bucket, key); err != nil {
 | 
			
		||||
			err := storage.DeleteObject(gcsContext, d.bucket, key)
 | 
			
		||||
			// GCS only guarantees eventual consistency, solistAll might return
 | 
			
		||||
			// paths that no longer exist. If this happens, just ignore any not
 | 
			
		||||
			// found error
 | 
			
		||||
			if status, ok := err.(*googleapi.Error); ok {
 | 
			
		||||
				if status.Code == http.StatusNotFound {
 | 
			
		||||
					err = nil
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
			if err != nil {
 | 
			
		||||
				return err
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -155,8 +155,12 @@ func TestEmptyRootList(t *testing.T) {
 | 
			
		|||
	if err != nil {
 | 
			
		||||
		t.Fatalf("unexpected error creating content: %v", err)
 | 
			
		||||
	}
 | 
			
		||||
	defer rootedDriver.Delete(ctx, filename)
 | 
			
		||||
 | 
			
		||||
	defer func() {
 | 
			
		||||
		err := rootedDriver.Delete(ctx, filename)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			t.Fatalf("failed to remove %v due to %v\n", filename, err)
 | 
			
		||||
		}
 | 
			
		||||
	}()
 | 
			
		||||
	keys, err := emptyRootDriver.List(ctx, "/")
 | 
			
		||||
	for _, path := range keys {
 | 
			
		||||
		if !storagedriver.PathRegexp.MatchString(path) {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -120,7 +120,7 @@ func (suite *DriverSuite) TestValidPaths(c *check.C) {
 | 
			
		|||
 | 
			
		||||
	for _, filename := range validFiles {
 | 
			
		||||
		err := suite.StorageDriver.PutContent(suite.ctx, filename, contents)
 | 
			
		||||
		defer suite.StorageDriver.Delete(suite.ctx, firstPart(filename))
 | 
			
		||||
		defer suite.deletePath(c, firstPart(filename))
 | 
			
		||||
		c.Assert(err, check.IsNil)
 | 
			
		||||
 | 
			
		||||
		received, err := suite.StorageDriver.GetContent(suite.ctx, filename)
 | 
			
		||||
| 
						 | 
				
			
			@ -129,6 +129,21 @@ func (suite *DriverSuite) TestValidPaths(c *check.C) {
 | 
			
		|||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (suite *DriverSuite) deletePath(c *check.C, path string) {
 | 
			
		||||
	for tries := 2; tries > 0; tries-- {
 | 
			
		||||
		err := suite.StorageDriver.Delete(suite.ctx, path)
 | 
			
		||||
		if _, ok := err.(storagedriver.PathNotFoundError); ok {
 | 
			
		||||
			err = nil
 | 
			
		||||
		}
 | 
			
		||||
		c.Assert(err, check.IsNil)
 | 
			
		||||
		paths, err := suite.StorageDriver.List(suite.ctx, path)
 | 
			
		||||
		if len(paths) == 0 {
 | 
			
		||||
			break
 | 
			
		||||
		}
 | 
			
		||||
		time.Sleep(time.Second * 2)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// TestInvalidPaths checks that various invalid file paths are rejected by the
 | 
			
		||||
// storage driver.
 | 
			
		||||
func (suite *DriverSuite) TestInvalidPaths(c *check.C) {
 | 
			
		||||
| 
						 | 
				
			
			@ -143,7 +158,10 @@ func (suite *DriverSuite) TestInvalidPaths(c *check.C) {
 | 
			
		|||
 | 
			
		||||
	for _, filename := range invalidFiles {
 | 
			
		||||
		err := suite.StorageDriver.PutContent(suite.ctx, filename, contents)
 | 
			
		||||
		defer suite.StorageDriver.Delete(suite.ctx, firstPart(filename))
 | 
			
		||||
		// only delete if file was succesfully written
 | 
			
		||||
		if err == nil {
 | 
			
		||||
			defer suite.deletePath(c, firstPart(filename))
 | 
			
		||||
		}
 | 
			
		||||
		c.Assert(err, check.NotNil)
 | 
			
		||||
		c.Assert(err, check.FitsTypeOf, storagedriver.InvalidPathError{})
 | 
			
		||||
		c.Assert(strings.Contains(err.Error(), suite.Name()), check.Equals, true)
 | 
			
		||||
| 
						 | 
				
			
			@ -258,7 +276,7 @@ func (suite *DriverSuite) TestWriteReadLargeStreams(c *check.C) {
 | 
			
		|||
	}
 | 
			
		||||
 | 
			
		||||
	filename := randomPath(32)
 | 
			
		||||
	defer suite.StorageDriver.Delete(suite.ctx, firstPart(filename))
 | 
			
		||||
	defer suite.deletePath(c, firstPart(filename))
 | 
			
		||||
 | 
			
		||||
	checksum := sha1.New()
 | 
			
		||||
	var fileSize int64 = 5 * 1024 * 1024 * 1024
 | 
			
		||||
| 
						 | 
				
			
			@ -282,7 +300,7 @@ func (suite *DriverSuite) TestWriteReadLargeStreams(c *check.C) {
 | 
			
		|||
// reading with a given offset.
 | 
			
		||||
func (suite *DriverSuite) TestReadStreamWithOffset(c *check.C) {
 | 
			
		||||
	filename := randomPath(32)
 | 
			
		||||
	defer suite.StorageDriver.Delete(suite.ctx, firstPart(filename))
 | 
			
		||||
	defer suite.deletePath(c, firstPart(filename))
 | 
			
		||||
 | 
			
		||||
	chunkSize := int64(32)
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -372,7 +390,7 @@ func (suite *DriverSuite) TestContinueStreamAppendSmall(c *check.C) {
 | 
			
		|||
 | 
			
		||||
func (suite *DriverSuite) testContinueStreamAppend(c *check.C, chunkSize int64) {
 | 
			
		||||
	filename := randomPath(32)
 | 
			
		||||
	defer suite.StorageDriver.Delete(suite.ctx, firstPart(filename))
 | 
			
		||||
	defer suite.deletePath(c, firstPart(filename))
 | 
			
		||||
 | 
			
		||||
	contentsChunk1 := randomContents(chunkSize)
 | 
			
		||||
	contentsChunk2 := randomContents(chunkSize)
 | 
			
		||||
| 
						 | 
				
			
			@ -470,7 +488,7 @@ func (suite *DriverSuite) TestReadNonexistentStream(c *check.C) {
 | 
			
		|||
// TestList checks the returned list of keys after populating a directory tree.
 | 
			
		||||
func (suite *DriverSuite) TestList(c *check.C) {
 | 
			
		||||
	rootDirectory := "/" + randomFilename(int64(8+rand.Intn(8)))
 | 
			
		||||
	defer suite.StorageDriver.Delete(suite.ctx, rootDirectory)
 | 
			
		||||
	defer suite.deletePath(c, rootDirectory)
 | 
			
		||||
 | 
			
		||||
	doesnotexist := path.Join(rootDirectory, "nonexistent")
 | 
			
		||||
	_, err := suite.StorageDriver.List(suite.ctx, doesnotexist)
 | 
			
		||||
| 
						 | 
				
			
			@ -516,8 +534,8 @@ func (suite *DriverSuite) TestMove(c *check.C) {
 | 
			
		|||
	sourcePath := randomPath(32)
 | 
			
		||||
	destPath := randomPath(32)
 | 
			
		||||
 | 
			
		||||
	defer suite.StorageDriver.Delete(suite.ctx, firstPart(sourcePath))
 | 
			
		||||
	defer suite.StorageDriver.Delete(suite.ctx, firstPart(destPath))
 | 
			
		||||
	defer suite.deletePath(c, firstPart(sourcePath))
 | 
			
		||||
	defer suite.deletePath(c, firstPart(destPath))
 | 
			
		||||
 | 
			
		||||
	err := suite.StorageDriver.PutContent(suite.ctx, sourcePath, contents)
 | 
			
		||||
	c.Assert(err, check.IsNil)
 | 
			
		||||
| 
						 | 
				
			
			@ -543,8 +561,8 @@ func (suite *DriverSuite) TestMoveOverwrite(c *check.C) {
 | 
			
		|||
	sourceContents := randomContents(32)
 | 
			
		||||
	destContents := randomContents(64)
 | 
			
		||||
 | 
			
		||||
	defer suite.StorageDriver.Delete(suite.ctx, firstPart(sourcePath))
 | 
			
		||||
	defer suite.StorageDriver.Delete(suite.ctx, firstPart(destPath))
 | 
			
		||||
	defer suite.deletePath(c, firstPart(sourcePath))
 | 
			
		||||
	defer suite.deletePath(c, firstPart(destPath))
 | 
			
		||||
 | 
			
		||||
	err := suite.StorageDriver.PutContent(suite.ctx, sourcePath, sourceContents)
 | 
			
		||||
	c.Assert(err, check.IsNil)
 | 
			
		||||
| 
						 | 
				
			
			@ -572,7 +590,7 @@ func (suite *DriverSuite) TestMoveNonexistent(c *check.C) {
 | 
			
		|||
	sourcePath := randomPath(32)
 | 
			
		||||
	destPath := randomPath(32)
 | 
			
		||||
 | 
			
		||||
	defer suite.StorageDriver.Delete(suite.ctx, firstPart(destPath))
 | 
			
		||||
	defer suite.deletePath(c, firstPart(destPath))
 | 
			
		||||
 | 
			
		||||
	err := suite.StorageDriver.PutContent(suite.ctx, destPath, contents)
 | 
			
		||||
	c.Assert(err, check.IsNil)
 | 
			
		||||
| 
						 | 
				
			
			@ -594,7 +612,7 @@ func (suite *DriverSuite) TestMoveInvalid(c *check.C) {
 | 
			
		|||
	// Create a regular file.
 | 
			
		||||
	err := suite.StorageDriver.PutContent(suite.ctx, "/notadir", contents)
 | 
			
		||||
	c.Assert(err, check.IsNil)
 | 
			
		||||
	defer suite.StorageDriver.Delete(suite.ctx, "/notadir")
 | 
			
		||||
	defer suite.deletePath(c, "/notadir")
 | 
			
		||||
 | 
			
		||||
	// Now try to move a non-existent file under it.
 | 
			
		||||
	err = suite.StorageDriver.Move(suite.ctx, "/notadir/foo", "/notadir/bar")
 | 
			
		||||
| 
						 | 
				
			
			@ -607,7 +625,7 @@ func (suite *DriverSuite) TestDelete(c *check.C) {
 | 
			
		|||
	filename := randomPath(32)
 | 
			
		||||
	contents := randomContents(32)
 | 
			
		||||
 | 
			
		||||
	defer suite.StorageDriver.Delete(suite.ctx, firstPart(filename))
 | 
			
		||||
	defer suite.deletePath(c, firstPart(filename))
 | 
			
		||||
 | 
			
		||||
	err := suite.StorageDriver.PutContent(suite.ctx, filename, contents)
 | 
			
		||||
	c.Assert(err, check.IsNil)
 | 
			
		||||
| 
						 | 
				
			
			@ -627,7 +645,7 @@ func (suite *DriverSuite) TestURLFor(c *check.C) {
 | 
			
		|||
	filename := randomPath(32)
 | 
			
		||||
	contents := randomContents(32)
 | 
			
		||||
 | 
			
		||||
	defer suite.StorageDriver.Delete(suite.ctx, firstPart(filename))
 | 
			
		||||
	defer suite.deletePath(c, firstPart(filename))
 | 
			
		||||
 | 
			
		||||
	err := suite.StorageDriver.PutContent(suite.ctx, filename, contents)
 | 
			
		||||
	c.Assert(err, check.IsNil)
 | 
			
		||||
| 
						 | 
				
			
			@ -674,7 +692,7 @@ func (suite *DriverSuite) TestDeleteFolder(c *check.C) {
 | 
			
		|||
	filename3 := randomPath(32)
 | 
			
		||||
	contents := randomContents(32)
 | 
			
		||||
 | 
			
		||||
	defer suite.StorageDriver.Delete(suite.ctx, firstPart(dirname))
 | 
			
		||||
	defer suite.deletePath(c, firstPart(dirname))
 | 
			
		||||
 | 
			
		||||
	err := suite.StorageDriver.PutContent(suite.ctx, path.Join(dirname, filename1), contents)
 | 
			
		||||
	c.Assert(err, check.IsNil)
 | 
			
		||||
| 
						 | 
				
			
			@ -725,7 +743,7 @@ func (suite *DriverSuite) TestStatCall(c *check.C) {
 | 
			
		|||
	fileName := randomFilename(32)
 | 
			
		||||
	filePath := path.Join(dirPath, fileName)
 | 
			
		||||
 | 
			
		||||
	defer suite.StorageDriver.Delete(suite.ctx, firstPart(dirPath))
 | 
			
		||||
	defer suite.deletePath(c, firstPart(dirPath))
 | 
			
		||||
 | 
			
		||||
	// Call on non-existent file/dir, check error.
 | 
			
		||||
	fi, err := suite.StorageDriver.Stat(suite.ctx, dirPath)
 | 
			
		||||
| 
						 | 
				
			
			@ -788,7 +806,7 @@ func (suite *DriverSuite) TestPutContentMultipleTimes(c *check.C) {
 | 
			
		|||
	filename := randomPath(32)
 | 
			
		||||
	contents := randomContents(4096)
 | 
			
		||||
 | 
			
		||||
	defer suite.StorageDriver.Delete(suite.ctx, firstPart(filename))
 | 
			
		||||
	defer suite.deletePath(c, firstPart(filename))
 | 
			
		||||
	err := suite.StorageDriver.PutContent(suite.ctx, filename, contents)
 | 
			
		||||
	c.Assert(err, check.IsNil)
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -814,7 +832,7 @@ func (suite *DriverSuite) TestConcurrentStreamReads(c *check.C) {
 | 
			
		|||
	filename := randomPath(32)
 | 
			
		||||
	contents := randomContents(filesize)
 | 
			
		||||
 | 
			
		||||
	defer suite.StorageDriver.Delete(suite.ctx, firstPart(filename))
 | 
			
		||||
	defer suite.deletePath(c, firstPart(filename))
 | 
			
		||||
 | 
			
		||||
	err := suite.StorageDriver.PutContent(suite.ctx, filename, contents)
 | 
			
		||||
	c.Assert(err, check.IsNil)
 | 
			
		||||
| 
						 | 
				
			
			@ -872,7 +890,7 @@ func (suite *DriverSuite) TestEventualConsistency(c *check.C) {
 | 
			
		|||
	}
 | 
			
		||||
 | 
			
		||||
	filename := randomPath(32)
 | 
			
		||||
	defer suite.StorageDriver.Delete(suite.ctx, firstPart(filename))
 | 
			
		||||
	defer suite.deletePath(c, firstPart(filename))
 | 
			
		||||
 | 
			
		||||
	var offset int64
 | 
			
		||||
	var misswrites int
 | 
			
		||||
| 
						 | 
				
			
			@ -1033,7 +1051,7 @@ func (suite *DriverSuite) BenchmarkDelete50Files(c *check.C) {
 | 
			
		|||
func (suite *DriverSuite) benchmarkDeleteFiles(c *check.C, numFiles int64) {
 | 
			
		||||
	for i := 0; i < c.N; i++ {
 | 
			
		||||
		parentDir := randomPath(8)
 | 
			
		||||
		defer suite.StorageDriver.Delete(suite.ctx, firstPart(parentDir))
 | 
			
		||||
		defer suite.deletePath(c, firstPart(parentDir))
 | 
			
		||||
 | 
			
		||||
		c.StopTimer()
 | 
			
		||||
		for j := int64(0); j < numFiles; j++ {
 | 
			
		||||
| 
						 | 
				
			
			@ -1055,7 +1073,7 @@ func (suite *DriverSuite) testFileStreams(c *check.C, size int64) {
 | 
			
		|||
	defer tf.Close()
 | 
			
		||||
 | 
			
		||||
	filename := randomPath(32)
 | 
			
		||||
	defer suite.StorageDriver.Delete(suite.ctx, firstPart(filename))
 | 
			
		||||
	defer suite.deletePath(c, firstPart(filename))
 | 
			
		||||
 | 
			
		||||
	contents := randomContents(size)
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -1080,7 +1098,7 @@ func (suite *DriverSuite) testFileStreams(c *check.C, size int64) {
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
func (suite *DriverSuite) writeReadCompare(c *check.C, filename string, contents []byte) {
 | 
			
		||||
	defer suite.StorageDriver.Delete(suite.ctx, firstPart(filename))
 | 
			
		||||
	defer suite.deletePath(c, firstPart(filename))
 | 
			
		||||
 | 
			
		||||
	err := suite.StorageDriver.PutContent(suite.ctx, filename, contents)
 | 
			
		||||
	c.Assert(err, check.IsNil)
 | 
			
		||||
| 
						 | 
				
			
			@ -1092,7 +1110,7 @@ func (suite *DriverSuite) writeReadCompare(c *check.C, filename string, contents
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
func (suite *DriverSuite) writeReadCompareStreams(c *check.C, filename string, contents []byte) {
 | 
			
		||||
	defer suite.StorageDriver.Delete(suite.ctx, firstPart(filename))
 | 
			
		||||
	defer suite.deletePath(c, firstPart(filename))
 | 
			
		||||
 | 
			
		||||
	nn, err := suite.StorageDriver.WriteStream(suite.ctx, filename, 0, bytes.NewReader(contents))
 | 
			
		||||
	c.Assert(err, check.IsNil)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue