@ -18,6 +18,7 @@ package cmd
import (
import (
"bytes"
"bytes"
"io"
"io/ioutil"
"io/ioutil"
"os"
"os"
"path"
"path"
@ -263,50 +264,123 @@ func TestFSDeletes(t *testing.T) {
t . Fatalf ( "Unable to create file, %s" , err )
t . Fatalf ( "Unable to create file, %s" , err )
}
}
// Seek back.
// Seek back.
reader . Seek ( 0 , 0 )
reader . Seek ( 0 , io . SeekStart )
// folder is not empty
err = fsMkdir ( pathJoin ( path , "success-vol" , "not-empty" ) )
if err != nil {
t . Fatal ( err )
}
err = ioutil . WriteFile ( pathJoin ( path , "success-vol" , "not-empty" , "file" ) , [ ] byte ( "data" ) , 0777 )
if err != nil {
t . Fatal ( err )
}
// recursive
if err = fsMkdir ( pathJoin ( path , "success-vol" , "parent" ) ) ; err != nil {
t . Fatal ( err )
}
if err = fsMkdir ( pathJoin ( path , "success-vol" , "parent" , "dir" ) ) ; err != nil {
t . Fatal ( err )
}
testCases := [ ] struct {
testCases := [ ] struct {
basePath string
srcVol string
srcVol string
srcPath string
srcPath string
expectedErr error
expectedErr error
} {
} {
// Test case - 1.
// valid case with existing volume and file to delete.
// valid case with existing volume and file to delete.
{
{
basePath : path ,
srcVol : "success-vol" ,
srcVol : "success-vol" ,
srcPath : "success-file" ,
srcPath : "success-file" ,
expectedErr : nil ,
expectedErr : nil ,
} ,
} ,
// Test case - 2.
// The file was deleted in the last case, so DeleteFile should fail.
// The file was deleted in the last case, so DeleteFile should fail.
{
{
basePath : path ,
srcVol : "success-vol" ,
srcVol : "success-vol" ,
srcPath : "success-file" ,
srcPath : "success-file" ,
expectedErr : errFileNotFound ,
expectedErr : errFileNotFound ,
} ,
} ,
// Test case - 3.
// Test case with segment of the volume name > 255.
// Test case with segment of the volume name > 255.
{
{
basePath : path ,
srcVol : "my-obj-del-0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001" ,
srcVol : "my-obj-del-0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001" ,
srcPath : "success-file" ,
srcPath : "success-file" ,
expectedErr : errFileNameTooLong ,
expectedErr : errFileNameTooLong ,
} ,
} ,
// Test case - 4.
// Test case with src path segment > 255.
// Test case with src path segment > 255.
{
{
basePath : path ,
srcVol : "success-vol" ,
srcVol : "success-vol" ,
srcPath : "my-obj-del-0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001" ,
srcPath : "my-obj-del-0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001" ,
expectedErr : errFileNameTooLong ,
expectedErr : errFileNameTooLong ,
} ,
} ,
// Base path is way too long.
{
basePath : "path03333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333" ,
srcVol : "success-vol" ,
srcPath : "object" ,
expectedErr : errFileNameTooLong ,
} ,
// Directory is not empty. Should give nil, but won't delete.
{
basePath : path ,
srcVol : "success-vol" ,
srcPath : "not-empty" ,
expectedErr : nil ,
} ,
// Should delete recursively.
{
basePath : path ,
srcVol : "success-vol" ,
srcPath : pathJoin ( "parent" , "dir" ) ,
expectedErr : nil ,
} ,
}
}
for i , testCase := range testCases {
for i , testCase := range testCases {
if err = fsDeleteFile ( path , pathJoin ( path , testCase . srcVol , testCase . srcPath ) ) ; errorCause ( err ) != testCase . expectedErr {
if err = fsDeleteFile ( testCase . baseP ath, pathJoin ( testCase . baseP ath, testCase . srcVol , testCase . srcPath ) ) ; errorCause ( err ) != testCase . expectedErr {
t . Errorf ( "Test case %d: Expected: \"%s\", got: \"%s\"" , i + 1 , testCase . expectedErr , err )
t . Errorf ( "Test case %d: Expected: \"%s\", got: \"%s\"" , i + 1 , testCase . expectedErr , err )
}
}
}
}
}
}
func BenchmarkFSDeleteFile ( b * testing . B ) {
// create posix test setup
_ , path , err := newPosixTestSetup ( )
if err != nil {
b . Fatalf ( "Unable to create posix test setup, %s" , err )
}
defer removeAll ( path )
// Setup test environment.
if err = fsMkdir ( pathJoin ( path , "benchmark" ) ) ; err != nil {
b . Fatalf ( "Unable to create directory, %s" , err )
}
benchDir := pathJoin ( path , "benchmark" )
filename := pathJoin ( benchDir , "file.txt" )
b . ResetTimer ( )
// We need to create and delete the file sequentially inside the benchmark.
for i := 0 ; i < b . N ; i ++ {
b . StopTimer ( )
err = ioutil . WriteFile ( filename , [ ] byte ( "data" ) , 0777 )
if err != nil {
b . Fatal ( err )
}
b . StartTimer ( )
err = fsDeleteFile ( benchDir , filename )
if err != nil {
b . Fatal ( err )
}
}
}
// Tests fs removes.
// Tests fs removes.
func TestFSRemoves ( t * testing . T ) {
func TestFSRemoves ( t * testing . T ) {
// create posix test setup
// create posix test setup