| 
									
										
										
										
											2017-01-17 09:05:00 +08:00
										 |  |  | /* | 
					
						
							| 
									
										
										
										
											2019-04-10 02:39:42 +08:00
										 |  |  |  * MinIO Cloud Storage, (C) 2016, 2017 MinIO, Inc. | 
					
						
							| 
									
										
										
										
											2017-01-17 09:05:00 +08:00
										 |  |  |  * | 
					
						
							|  |  |  |  * Licensed under the Apache License, Version 2.0 (the "License"); | 
					
						
							|  |  |  |  * you may not use this file except in compliance with the License. | 
					
						
							|  |  |  |  * You may obtain a copy of the License at | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  *     http://www.apache.org/licenses/LICENSE-2.0
 | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * Unless required by applicable law or agreed to in writing, software | 
					
						
							|  |  |  |  * distributed under the License is distributed on an "AS IS" BASIS, | 
					
						
							|  |  |  |  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | 
					
						
							|  |  |  |  * See the License for the specific language governing permissions and | 
					
						
							|  |  |  |  * limitations under the License. | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | package cmd | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import ( | 
					
						
							|  |  |  | 	"bytes" | 
					
						
							| 
									
										
										
										
											2017-08-04 11:04:28 +08:00
										 |  |  | 	"io" | 
					
						
							| 
									
										
										
										
											2017-04-15 03:06:24 +08:00
										 |  |  | 	"io/ioutil" | 
					
						
							|  |  |  | 	"os" | 
					
						
							|  |  |  | 	"path" | 
					
						
							| 
									
										
										
										
											2017-01-17 09:05:00 +08:00
										 |  |  | 	"testing" | 
					
						
							| 
									
										
										
										
											2017-04-15 03:06:24 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	"github.com/minio/minio/pkg/lock" | 
					
						
							| 
									
										
										
										
											2017-01-17 09:05:00 +08:00
										 |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-05 23:49:09 +08:00
										 |  |  | func TestFSRenameFile(t *testing.T) { | 
					
						
							|  |  |  | 	// create posix test setup
 | 
					
						
							|  |  |  | 	_, path, err := newPosixTestSetup() | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		t.Fatalf("Unable to create posix test setup, %s", err) | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2017-08-13 10:25:43 +08:00
										 |  |  | 	defer os.RemoveAll(path) | 
					
						
							| 
									
										
										
										
											2017-05-05 23:49:09 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-04-10 00:30:02 +08:00
										 |  |  | 	if err = fsMkdir(GlobalContext, pathJoin(path, "testvolume1")); err != nil { | 
					
						
							| 
									
										
										
										
											2017-05-05 23:49:09 +08:00
										 |  |  | 		t.Fatal(err) | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2020-04-10 00:30:02 +08:00
										 |  |  | 	if err = fsRenameFile(GlobalContext, pathJoin(path, "testvolume1"), pathJoin(path, "testvolume2")); err != nil { | 
					
						
							| 
									
										
										
										
											2017-05-05 23:49:09 +08:00
										 |  |  | 		t.Fatal(err) | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2020-04-10 00:30:02 +08:00
										 |  |  | 	if err = fsRenameFile(GlobalContext, pathJoin(path, "testvolume1"), pathJoin(path, "testvolume2")); err != errFileNotFound { | 
					
						
							| 
									
										
										
										
											2017-05-05 23:49:09 +08:00
										 |  |  | 		t.Fatal(err) | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2020-04-10 00:30:02 +08:00
										 |  |  | 	if err = fsRenameFile(GlobalContext, pathJoin(path, "my-obj-del-0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001"), pathJoin(path, "testvolume2")); err != errFileNameTooLong { | 
					
						
							| 
									
										
										
										
											2017-05-05 23:49:09 +08:00
										 |  |  | 		t.Fatal("Unexpected error", err) | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2020-04-10 00:30:02 +08:00
										 |  |  | 	if err = fsRenameFile(GlobalContext, pathJoin(path, "testvolume1"), pathJoin(path, "my-obj-del-0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001")); err != errFileNameTooLong { | 
					
						
							| 
									
										
										
										
											2017-05-05 23:49:09 +08:00
										 |  |  | 		t.Fatal("Unexpected error", err) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-17 09:05:00 +08:00
										 |  |  | func TestFSStats(t *testing.T) { | 
					
						
							|  |  |  | 	// create posix test setup
 | 
					
						
							|  |  |  | 	_, path, err := newPosixTestSetup() | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		t.Fatalf("Unable to create posix test setup, %s", err) | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2017-08-13 10:25:43 +08:00
										 |  |  | 	defer os.RemoveAll(path) | 
					
						
							| 
									
										
										
										
											2017-01-17 09:05:00 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	// Setup test environment.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-04-10 00:30:02 +08:00
										 |  |  | 	if err = fsMkdir(GlobalContext, ""); err != errInvalidArgument { | 
					
						
							| 
									
										
										
										
											2017-01-17 09:05:00 +08:00
										 |  |  | 		t.Fatal("Unexpected error", err) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-04-10 00:30:02 +08:00
										 |  |  | 	if err = fsMkdir(GlobalContext, pathJoin(path, "my-obj-del-0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001")); err != errFileNameTooLong { | 
					
						
							| 
									
										
										
										
											2017-01-17 09:05:00 +08:00
										 |  |  | 		t.Fatal("Unexpected error", err) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-04-10 00:30:02 +08:00
										 |  |  | 	if err = fsMkdir(GlobalContext, pathJoin(path, "success-vol")); err != nil { | 
					
						
							| 
									
										
										
										
											2017-01-17 09:05:00 +08:00
										 |  |  | 		t.Fatalf("Unable to create volume, %s", err) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	var reader = bytes.NewReader([]byte("Hello, world")) | 
					
						
							| 
									
										
										
										
											2020-04-10 00:30:02 +08:00
										 |  |  | 	if _, err = fsCreateFile(GlobalContext, pathJoin(path, "success-vol", "success-file"), reader, nil, 0); err != nil { | 
					
						
							| 
									
										
										
										
											2017-01-17 09:05:00 +08:00
										 |  |  | 		t.Fatalf("Unable to create file, %s", err) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	// Seek back.
 | 
					
						
							|  |  |  | 	reader.Seek(0, 0) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-04-10 00:30:02 +08:00
										 |  |  | 	if err = fsMkdir(GlobalContext, pathJoin(path, "success-vol", "success-file")); err != errVolumeExists { | 
					
						
							| 
									
										
										
										
											2017-01-17 09:05:00 +08:00
										 |  |  | 		t.Fatal("Unexpected error", err) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-04-10 00:30:02 +08:00
										 |  |  | 	if _, err = fsCreateFile(GlobalContext, pathJoin(path, "success-vol", "path/to/success-file"), reader, nil, 0); err != nil { | 
					
						
							| 
									
										
										
										
											2017-01-17 09:05:00 +08:00
										 |  |  | 		t.Fatalf("Unable to create file, %s", err) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	// Seek back.
 | 
					
						
							|  |  |  | 	reader.Seek(0, 0) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	testCases := []struct { | 
					
						
							|  |  |  | 		srcFSPath   string | 
					
						
							|  |  |  | 		srcVol      string | 
					
						
							|  |  |  | 		srcPath     string | 
					
						
							|  |  |  | 		expectedErr error | 
					
						
							|  |  |  | 	}{ | 
					
						
							|  |  |  | 		// Test case - 1.
 | 
					
						
							|  |  |  | 		// Test case with valid inputs, expected to pass.
 | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 			srcFSPath:   path, | 
					
						
							|  |  |  | 			srcVol:      "success-vol", | 
					
						
							|  |  |  | 			srcPath:     "success-file", | 
					
						
							|  |  |  | 			expectedErr: nil, | 
					
						
							|  |  |  | 		}, | 
					
						
							|  |  |  | 		// Test case - 2.
 | 
					
						
							|  |  |  | 		// Test case with valid inputs, expected to pass.
 | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 			srcFSPath:   path, | 
					
						
							|  |  |  | 			srcVol:      "success-vol", | 
					
						
							|  |  |  | 			srcPath:     "path/to/success-file", | 
					
						
							|  |  |  | 			expectedErr: nil, | 
					
						
							|  |  |  | 		}, | 
					
						
							|  |  |  | 		// Test case - 3.
 | 
					
						
							|  |  |  | 		// Test case with non-existent file.
 | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 			srcFSPath:   path, | 
					
						
							|  |  |  | 			srcVol:      "success-vol", | 
					
						
							|  |  |  | 			srcPath:     "nonexistent-file", | 
					
						
							|  |  |  | 			expectedErr: errFileNotFound, | 
					
						
							|  |  |  | 		}, | 
					
						
							|  |  |  | 		// Test case - 4.
 | 
					
						
							|  |  |  | 		// Test case with non-existent file path.
 | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 			srcFSPath:   path, | 
					
						
							|  |  |  | 			srcVol:      "success-vol", | 
					
						
							|  |  |  | 			srcPath:     "path/2/success-file", | 
					
						
							|  |  |  | 			expectedErr: errFileNotFound, | 
					
						
							|  |  |  | 		}, | 
					
						
							|  |  |  | 		// Test case - 5.
 | 
					
						
							|  |  |  | 		// Test case with path being a directory.
 | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 			srcFSPath:   path, | 
					
						
							|  |  |  | 			srcVol:      "success-vol", | 
					
						
							|  |  |  | 			srcPath:     "path", | 
					
						
							| 
									
										
										
										
											2018-06-26 09:24:00 +08:00
										 |  |  | 			expectedErr: errFileNotFound, | 
					
						
							| 
									
										
										
										
											2017-01-17 09:05:00 +08:00
										 |  |  | 		}, | 
					
						
							|  |  |  | 		// Test case - 6.
 | 
					
						
							|  |  |  | 		// Test case with src path segment > 255.
 | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 			srcFSPath:   path, | 
					
						
							|  |  |  | 			srcVol:      "success-vol", | 
					
						
							|  |  |  | 			srcPath:     "my-obj-del-0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001", | 
					
						
							|  |  |  | 			expectedErr: errFileNameTooLong, | 
					
						
							|  |  |  | 		}, | 
					
						
							|  |  |  | 		// Test case - 7.
 | 
					
						
							|  |  |  | 		// Test case validate only srcVol exists.
 | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 			srcFSPath:   path, | 
					
						
							|  |  |  | 			srcVol:      "success-vol", | 
					
						
							|  |  |  | 			expectedErr: nil, | 
					
						
							|  |  |  | 		}, | 
					
						
							|  |  |  | 		// Test case - 8.
 | 
					
						
							|  |  |  | 		// Test case validate only srcVol doesn't exist.
 | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 			srcFSPath:   path, | 
					
						
							|  |  |  | 			srcVol:      "success-vol-non-existent", | 
					
						
							|  |  |  | 			expectedErr: errVolumeNotFound, | 
					
						
							|  |  |  | 		}, | 
					
						
							|  |  |  | 		// Test case - 9.
 | 
					
						
							|  |  |  | 		// Test case validate invalid argument.
 | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 			expectedErr: errInvalidArgument, | 
					
						
							|  |  |  | 		}, | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	for i, testCase := range testCases { | 
					
						
							|  |  |  | 		if testCase.srcPath != "" { | 
					
						
							| 
									
										
										
										
											2020-04-10 00:30:02 +08:00
										 |  |  | 			if _, err := fsStatFile(GlobalContext, pathJoin(testCase.srcFSPath, testCase.srcVol, | 
					
						
							| 
									
										
										
										
											2018-04-11 00:36:37 +08:00
										 |  |  | 				testCase.srcPath)); err != testCase.expectedErr { | 
					
						
							| 
									
										
										
										
											2017-01-17 09:05:00 +08:00
										 |  |  | 				t.Fatalf("TestPosix case %d: Expected: \"%s\", got: \"%s\"", i+1, testCase.expectedErr, err) | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		} else { | 
					
						
							| 
									
										
										
										
											2020-04-10 00:30:02 +08:00
										 |  |  | 			if _, err := fsStatVolume(GlobalContext, pathJoin(testCase.srcFSPath, testCase.srcVol)); err != testCase.expectedErr { | 
					
						
							| 
									
										
										
										
											2017-01-17 09:05:00 +08:00
										 |  |  | 				t.Fatalf("TestPosix case %d: Expected: \"%s\", got: \"%s\"", i+1, testCase.expectedErr, err) | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func TestFSCreateAndOpen(t *testing.T) { | 
					
						
							|  |  |  | 	// Setup test environment.
 | 
					
						
							|  |  |  | 	_, path, err := newPosixTestSetup() | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		t.Fatalf("Unable to create posix test setup, %s", err) | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2017-08-13 10:25:43 +08:00
										 |  |  | 	defer os.RemoveAll(path) | 
					
						
							| 
									
										
										
										
											2017-01-17 09:05:00 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-04-10 00:30:02 +08:00
										 |  |  | 	if err = fsMkdir(GlobalContext, pathJoin(path, "success-vol")); err != nil { | 
					
						
							| 
									
										
										
										
											2017-01-17 09:05:00 +08:00
										 |  |  | 		t.Fatalf("Unable to create directory, %s", err) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-04-10 00:30:02 +08:00
										 |  |  | 	if _, err = fsCreateFile(GlobalContext, "", nil, nil, 0); err != errInvalidArgument { | 
					
						
							| 
									
										
										
										
											2017-01-17 09:05:00 +08:00
										 |  |  | 		t.Fatal("Unexpected error", err) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-04-10 00:30:02 +08:00
										 |  |  | 	if _, _, err = fsOpenFile(GlobalContext, "", -1); err != errInvalidArgument { | 
					
						
							| 
									
										
										
										
											2017-01-17 09:05:00 +08:00
										 |  |  | 		t.Fatal("Unexpected error", err) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	var reader = bytes.NewReader([]byte("Hello, world")) | 
					
						
							| 
									
										
										
										
											2020-04-10 00:30:02 +08:00
										 |  |  | 	if _, err = fsCreateFile(GlobalContext, pathJoin(path, "success-vol", "success-file"), reader, nil, 0); err != nil { | 
					
						
							| 
									
										
										
										
											2017-01-17 09:05:00 +08:00
										 |  |  | 		t.Fatalf("Unable to create file, %s", err) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	// Seek back.
 | 
					
						
							|  |  |  | 	reader.Seek(0, 0) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	testCases := []struct { | 
					
						
							|  |  |  | 		srcVol      string | 
					
						
							|  |  |  | 		srcPath     string | 
					
						
							|  |  |  | 		expectedErr error | 
					
						
							|  |  |  | 	}{ | 
					
						
							|  |  |  | 		// Test case - 1.
 | 
					
						
							|  |  |  | 		// Test case with segment of the volume name > 255.
 | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 			srcVol:      "my-obj-del-0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001", | 
					
						
							|  |  |  | 			srcPath:     "success-file", | 
					
						
							|  |  |  | 			expectedErr: errFileNameTooLong, | 
					
						
							|  |  |  | 		}, | 
					
						
							|  |  |  | 		// Test case - 2.
 | 
					
						
							|  |  |  | 		// Test case with src path segment > 255.
 | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 			srcVol:      "success-vol", | 
					
						
							|  |  |  | 			srcPath:     "my-obj-del-0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001", | 
					
						
							|  |  |  | 			expectedErr: errFileNameTooLong, | 
					
						
							|  |  |  | 		}, | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	for i, testCase := range testCases { | 
					
						
							| 
									
										
										
										
											2020-04-10 00:30:02 +08:00
										 |  |  | 		_, err = fsCreateFile(GlobalContext, pathJoin(path, testCase.srcVol, testCase.srcPath), reader, nil, 0) | 
					
						
							| 
									
										
										
										
											2018-04-11 00:36:37 +08:00
										 |  |  | 		if err != testCase.expectedErr { | 
					
						
							| 
									
										
										
										
											2017-01-17 09:05:00 +08:00
										 |  |  | 			t.Errorf("Test case %d: Expected: \"%s\", got: \"%s\"", i+1, testCase.expectedErr, err) | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2020-04-10 00:30:02 +08:00
										 |  |  | 		_, _, err = fsOpenFile(GlobalContext, pathJoin(path, testCase.srcVol, testCase.srcPath), 0) | 
					
						
							| 
									
										
										
										
											2018-04-11 00:36:37 +08:00
										 |  |  | 		if err != testCase.expectedErr { | 
					
						
							| 
									
										
										
										
											2017-01-17 09:05:00 +08:00
										 |  |  | 			t.Errorf("Test case %d: Expected: \"%s\", got: \"%s\"", i+1, testCase.expectedErr, err) | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// Attempt to open a directory.
 | 
					
						
							| 
									
										
										
										
											2020-04-10 00:30:02 +08:00
										 |  |  | 	if _, _, err = fsOpenFile(GlobalContext, pathJoin(path), 0); err != errIsNotRegular { | 
					
						
							| 
									
										
										
										
											2017-01-17 09:05:00 +08:00
										 |  |  | 		t.Fatal("Unexpected error", err) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func TestFSDeletes(t *testing.T) { | 
					
						
							|  |  |  | 	// create posix test setup
 | 
					
						
							|  |  |  | 	_, path, err := newPosixTestSetup() | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		t.Fatalf("Unable to create posix test setup, %s", err) | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2017-08-13 10:25:43 +08:00
										 |  |  | 	defer os.RemoveAll(path) | 
					
						
							| 
									
										
										
										
											2017-01-17 09:05:00 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	// Setup test environment.
 | 
					
						
							| 
									
										
										
										
											2020-04-10 00:30:02 +08:00
										 |  |  | 	if err = fsMkdir(GlobalContext, pathJoin(path, "success-vol")); err != nil { | 
					
						
							| 
									
										
										
										
											2017-01-17 09:05:00 +08:00
										 |  |  | 		t.Fatalf("Unable to create directory, %s", err) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	var buf = make([]byte, 4096) | 
					
						
							|  |  |  | 	var reader = bytes.NewReader([]byte("Hello, world")) | 
					
						
							| 
									
										
										
										
											2020-04-10 00:30:02 +08:00
										 |  |  | 	if _, err = fsCreateFile(GlobalContext, pathJoin(path, "success-vol", "success-file"), reader, buf, reader.Size()); err != nil { | 
					
						
							| 
									
										
										
										
											2017-01-17 09:05:00 +08:00
										 |  |  | 		t.Fatalf("Unable to create file, %s", err) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	// Seek back.
 | 
					
						
							| 
									
										
										
										
											2017-08-04 11:04:28 +08:00
										 |  |  | 	reader.Seek(0, io.SeekStart) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// folder is not empty
 | 
					
						
							| 
									
										
										
										
											2020-04-10 00:30:02 +08:00
										 |  |  | 	err = fsMkdir(GlobalContext, pathJoin(path, "success-vol", "not-empty")) | 
					
						
							| 
									
										
										
										
											2017-08-04 11:04:28 +08:00
										 |  |  | 	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
 | 
					
						
							| 
									
										
										
										
											2020-04-10 00:30:02 +08:00
										 |  |  | 	if err = fsMkdir(GlobalContext, pathJoin(path, "success-vol", "parent")); err != nil { | 
					
						
							| 
									
										
										
										
											2017-08-04 11:04:28 +08:00
										 |  |  | 		t.Fatal(err) | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2020-04-10 00:30:02 +08:00
										 |  |  | 	if err = fsMkdir(GlobalContext, pathJoin(path, "success-vol", "parent", "dir")); err != nil { | 
					
						
							| 
									
										
										
										
											2017-08-04 11:04:28 +08:00
										 |  |  | 		t.Fatal(err) | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2017-01-17 09:05:00 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	testCases := []struct { | 
					
						
							| 
									
										
										
										
											2017-08-04 11:04:28 +08:00
										 |  |  | 		basePath    string | 
					
						
							| 
									
										
										
										
											2017-01-17 09:05:00 +08:00
										 |  |  | 		srcVol      string | 
					
						
							|  |  |  | 		srcPath     string | 
					
						
							|  |  |  | 		expectedErr error | 
					
						
							|  |  |  | 	}{ | 
					
						
							|  |  |  | 		// valid case with existing volume and file to delete.
 | 
					
						
							|  |  |  | 		{ | 
					
						
							| 
									
										
										
										
											2017-08-04 11:04:28 +08:00
										 |  |  | 			basePath:    path, | 
					
						
							| 
									
										
										
										
											2017-01-17 09:05:00 +08:00
										 |  |  | 			srcVol:      "success-vol", | 
					
						
							|  |  |  | 			srcPath:     "success-file", | 
					
						
							|  |  |  | 			expectedErr: nil, | 
					
						
							|  |  |  | 		}, | 
					
						
							|  |  |  | 		// The file was deleted in the last case, so DeleteFile should fail.
 | 
					
						
							|  |  |  | 		{ | 
					
						
							| 
									
										
										
										
											2017-08-04 11:04:28 +08:00
										 |  |  | 			basePath:    path, | 
					
						
							| 
									
										
										
										
											2017-01-17 09:05:00 +08:00
										 |  |  | 			srcVol:      "success-vol", | 
					
						
							|  |  |  | 			srcPath:     "success-file", | 
					
						
							|  |  |  | 			expectedErr: errFileNotFound, | 
					
						
							|  |  |  | 		}, | 
					
						
							|  |  |  | 		// Test case with segment of the volume name > 255.
 | 
					
						
							|  |  |  | 		{ | 
					
						
							| 
									
										
										
										
											2017-08-04 11:04:28 +08:00
										 |  |  | 			basePath:    path, | 
					
						
							| 
									
										
										
										
											2017-01-17 09:05:00 +08:00
										 |  |  | 			srcVol:      "my-obj-del-0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001", | 
					
						
							|  |  |  | 			srcPath:     "success-file", | 
					
						
							|  |  |  | 			expectedErr: errFileNameTooLong, | 
					
						
							|  |  |  | 		}, | 
					
						
							|  |  |  | 		// Test case with src path segment > 255.
 | 
					
						
							|  |  |  | 		{ | 
					
						
							| 
									
										
										
										
											2017-08-04 11:04:28 +08:00
										 |  |  | 			basePath:    path, | 
					
						
							| 
									
										
										
										
											2017-01-17 09:05:00 +08:00
										 |  |  | 			srcVol:      "success-vol", | 
					
						
							|  |  |  | 			srcPath:     "my-obj-del-0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001", | 
					
						
							|  |  |  | 			expectedErr: errFileNameTooLong, | 
					
						
							|  |  |  | 		}, | 
					
						
							| 
									
										
										
										
											2017-08-04 11:04:28 +08:00
										 |  |  | 		// 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, | 
					
						
							|  |  |  | 		}, | 
					
						
							| 
									
										
										
										
											2017-01-17 09:05:00 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	for i, testCase := range testCases { | 
					
						
							| 
									
										
										
										
											2020-04-10 00:30:02 +08:00
										 |  |  | 		if err = fsDeleteFile(GlobalContext, testCase.basePath, pathJoin(testCase.basePath, testCase.srcVol, testCase.srcPath)); err != testCase.expectedErr { | 
					
						
							| 
									
										
										
										
											2017-01-17 09:05:00 +08:00
										 |  |  | 			t.Errorf("Test case %d: Expected: \"%s\", got: \"%s\"", i+1, testCase.expectedErr, err) | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-08-04 11:04:28 +08:00
										 |  |  | 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) | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2017-08-13 10:25:43 +08:00
										 |  |  | 	defer os.RemoveAll(path) | 
					
						
							| 
									
										
										
										
											2017-08-04 11:04:28 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	// Setup test environment.
 | 
					
						
							| 
									
										
										
										
											2020-04-10 00:30:02 +08:00
										 |  |  | 	if err = fsMkdir(GlobalContext, pathJoin(path, "benchmark")); err != nil { | 
					
						
							| 
									
										
										
										
											2017-08-04 11:04:28 +08:00
										 |  |  | 		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() | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-04-10 00:30:02 +08:00
										 |  |  | 		err = fsDeleteFile(GlobalContext, benchDir, filename) | 
					
						
							| 
									
										
										
										
											2017-08-04 11:04:28 +08:00
										 |  |  | 		if err != nil { | 
					
						
							|  |  |  | 			b.Fatal(err) | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-17 09:05:00 +08:00
										 |  |  | // Tests fs removes.
 | 
					
						
							|  |  |  | func TestFSRemoves(t *testing.T) { | 
					
						
							|  |  |  | 	// create posix test setup
 | 
					
						
							|  |  |  | 	_, path, err := newPosixTestSetup() | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		t.Fatalf("Unable to create posix test setup, %s", err) | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2017-08-13 10:25:43 +08:00
										 |  |  | 	defer os.RemoveAll(path) | 
					
						
							| 
									
										
										
										
											2017-01-17 09:05:00 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	// Setup test environment.
 | 
					
						
							| 
									
										
										
										
											2020-04-10 00:30:02 +08:00
										 |  |  | 	if err = fsMkdir(GlobalContext, pathJoin(path, "success-vol")); err != nil { | 
					
						
							| 
									
										
										
										
											2017-01-17 09:05:00 +08:00
										 |  |  | 		t.Fatalf("Unable to create directory, %s", err) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	var reader = bytes.NewReader([]byte("Hello, world")) | 
					
						
							| 
									
										
										
										
											2020-04-10 00:30:02 +08:00
										 |  |  | 	if _, err = fsCreateFile(GlobalContext, pathJoin(path, "success-vol", "success-file"), reader, nil, 0); err != nil { | 
					
						
							| 
									
										
										
										
											2017-01-17 09:05:00 +08:00
										 |  |  | 		t.Fatalf("Unable to create file, %s", err) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	// Seek back.
 | 
					
						
							|  |  |  | 	reader.Seek(0, 0) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-04-10 00:30:02 +08:00
										 |  |  | 	if _, err = fsCreateFile(GlobalContext, pathJoin(path, "success-vol", "success-file-new"), reader, nil, 0); err != nil { | 
					
						
							| 
									
										
										
										
											2017-01-17 09:05:00 +08:00
										 |  |  | 		t.Fatalf("Unable to create file, %s", err) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	// Seek back.
 | 
					
						
							|  |  |  | 	reader.Seek(0, 0) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	testCases := []struct { | 
					
						
							|  |  |  | 		srcFSPath   string | 
					
						
							|  |  |  | 		srcVol      string | 
					
						
							|  |  |  | 		srcPath     string | 
					
						
							|  |  |  | 		expectedErr error | 
					
						
							|  |  |  | 	}{ | 
					
						
							|  |  |  | 		// Test case - 1.
 | 
					
						
							|  |  |  | 		// valid case with existing volume and file to delete.
 | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 			srcFSPath:   path, | 
					
						
							|  |  |  | 			srcVol:      "success-vol", | 
					
						
							|  |  |  | 			srcPath:     "success-file", | 
					
						
							|  |  |  | 			expectedErr: nil, | 
					
						
							|  |  |  | 		}, | 
					
						
							|  |  |  | 		// Test case - 2.
 | 
					
						
							|  |  |  | 		// The file was deleted in the last case, so DeleteFile should fail.
 | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 			srcFSPath:   path, | 
					
						
							|  |  |  | 			srcVol:      "success-vol", | 
					
						
							|  |  |  | 			srcPath:     "success-file", | 
					
						
							|  |  |  | 			expectedErr: errFileNotFound, | 
					
						
							|  |  |  | 		}, | 
					
						
							|  |  |  | 		// Test case - 3.
 | 
					
						
							|  |  |  | 		// Test case with segment of the volume name > 255.
 | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 			srcFSPath:   path, | 
					
						
							|  |  |  | 			srcVol:      "my-obj-del-0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001", | 
					
						
							|  |  |  | 			srcPath:     "success-file", | 
					
						
							|  |  |  | 			expectedErr: errFileNameTooLong, | 
					
						
							|  |  |  | 		}, | 
					
						
							|  |  |  | 		// Test case - 4.
 | 
					
						
							|  |  |  | 		// Test case with src path segment > 255.
 | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 			srcFSPath:   path, | 
					
						
							|  |  |  | 			srcVol:      "success-vol", | 
					
						
							|  |  |  | 			srcPath:     "my-obj-del-0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001", | 
					
						
							|  |  |  | 			expectedErr: errFileNameTooLong, | 
					
						
							|  |  |  | 		}, | 
					
						
							|  |  |  | 		// Test case - 5.
 | 
					
						
							|  |  |  | 		// Test case with src path empty.
 | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 			srcFSPath:   path, | 
					
						
							|  |  |  | 			srcVol:      "success-vol", | 
					
						
							|  |  |  | 			expectedErr: errVolumeNotEmpty, | 
					
						
							|  |  |  | 		}, | 
					
						
							|  |  |  | 		// Test case - 6.
 | 
					
						
							|  |  |  | 		// Test case with src path empty.
 | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 			srcFSPath:   path, | 
					
						
							|  |  |  | 			srcVol:      "my-obj-del-0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001", | 
					
						
							|  |  |  | 			expectedErr: errFileNameTooLong, | 
					
						
							|  |  |  | 		}, | 
					
						
							|  |  |  | 		// Test case - 7.
 | 
					
						
							|  |  |  | 		// Test case with src path empty.
 | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 			srcFSPath:   path, | 
					
						
							|  |  |  | 			srcVol:      "non-existent", | 
					
						
							|  |  |  | 			expectedErr: errVolumeNotFound, | 
					
						
							|  |  |  | 		}, | 
					
						
							|  |  |  | 		// Test case - 8.
 | 
					
						
							|  |  |  | 		// Test case with src and volume path empty.
 | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 			expectedErr: errInvalidArgument, | 
					
						
							|  |  |  | 		}, | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	for i, testCase := range testCases { | 
					
						
							|  |  |  | 		if testCase.srcPath != "" { | 
					
						
							| 
									
										
										
										
											2020-04-10 00:30:02 +08:00
										 |  |  | 			if err = fsRemoveFile(GlobalContext, pathJoin(testCase.srcFSPath, testCase.srcVol, testCase.srcPath)); err != testCase.expectedErr { | 
					
						
							| 
									
										
										
										
											2017-01-17 09:05:00 +08:00
										 |  |  | 				t.Errorf("Test case %d: Expected: \"%s\", got: \"%s\"", i+1, testCase.expectedErr, err) | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		} else { | 
					
						
							| 
									
										
										
										
											2020-04-10 00:30:02 +08:00
										 |  |  | 			if err = fsRemoveDir(GlobalContext, pathJoin(testCase.srcFSPath, testCase.srcVol, testCase.srcPath)); err != testCase.expectedErr { | 
					
						
							| 
									
										
										
										
											2017-01-17 09:05:00 +08:00
										 |  |  | 				t.Error(err) | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-04-10 00:30:02 +08:00
										 |  |  | 	if err = fsRemoveAll(GlobalContext, pathJoin(path, "success-vol")); err != nil { | 
					
						
							| 
									
										
										
										
											2017-01-17 09:05:00 +08:00
										 |  |  | 		t.Fatal(err) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-04-10 00:30:02 +08:00
										 |  |  | 	if err = fsRemoveAll(GlobalContext, ""); err != errInvalidArgument { | 
					
						
							| 
									
										
										
										
											2017-01-17 09:05:00 +08:00
										 |  |  | 		t.Fatal(err) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-04-10 00:30:02 +08:00
										 |  |  | 	if err = fsRemoveAll(GlobalContext, "my-obj-del-0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001"); err != errFileNameTooLong { | 
					
						
							| 
									
										
										
										
											2017-01-17 09:05:00 +08:00
										 |  |  | 		t.Fatal(err) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2017-04-15 03:06:24 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | func TestFSRemoveMeta(t *testing.T) { | 
					
						
							|  |  |  | 	// create posix test setup
 | 
					
						
							|  |  |  | 	_, fsPath, err := newPosixTestSetup() | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		t.Fatalf("Unable to create posix test setup, %s", err) | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2017-08-13 10:25:43 +08:00
										 |  |  | 	defer os.RemoveAll(fsPath) | 
					
						
							| 
									
										
										
										
											2017-04-15 03:06:24 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	// Setup test environment.
 | 
					
						
							| 
									
										
										
										
											2020-04-10 00:30:02 +08:00
										 |  |  | 	if err = fsMkdir(GlobalContext, pathJoin(fsPath, "success-vol")); err != nil { | 
					
						
							| 
									
										
										
										
											2017-04-15 03:06:24 +08:00
										 |  |  | 		t.Fatalf("Unable to create directory, %s", err) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	filePath := pathJoin(fsPath, "success-vol", "success-file") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	var reader = bytes.NewReader([]byte("Hello, world")) | 
					
						
							| 
									
										
										
										
											2020-04-10 00:30:02 +08:00
										 |  |  | 	if _, err = fsCreateFile(GlobalContext, filePath, reader, nil, 0); err != nil { | 
					
						
							| 
									
										
										
										
											2017-04-15 03:06:24 +08:00
										 |  |  | 		t.Fatalf("Unable to create file, %s", err) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	rwPool := &fsIOPool{ | 
					
						
							|  |  |  | 		readersMap: make(map[string]*lock.RLockedFile), | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if _, err := rwPool.Open(filePath); err != nil { | 
					
						
							|  |  |  | 		t.Fatalf("Unable to lock file %s", filePath) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	defer rwPool.Close(filePath) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	tmpDir, tmpErr := ioutil.TempDir(globalTestTmpDir, "minio-") | 
					
						
							|  |  |  | 	if tmpErr != nil { | 
					
						
							|  |  |  | 		t.Fatal(tmpErr) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-04-10 00:30:02 +08:00
										 |  |  | 	if err := fsRemoveMeta(GlobalContext, fsPath, filePath, tmpDir); err != nil { | 
					
						
							| 
									
										
										
										
											2017-04-15 03:06:24 +08:00
										 |  |  | 		t.Fatalf("Unable to remove file, %s", err) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-10-13 18:01:15 +08:00
										 |  |  | 	if _, err := os.Stat((filePath)); !os.IsNotExist(err) { | 
					
						
							| 
									
										
										
										
											2017-04-15 03:06:24 +08:00
										 |  |  | 		t.Fatalf("`%s` file found though it should have been deleted.", filePath) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-10-13 18:01:15 +08:00
										 |  |  | 	if _, err := os.Stat((path.Dir(filePath))); !os.IsNotExist(err) { | 
					
						
							| 
									
										
										
										
											2017-04-15 03:06:24 +08:00
										 |  |  | 		t.Fatalf("`%s` parent directory found though it should have been deleted.", filePath) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2018-05-09 10:09:15 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | func TestFSIsFile(t *testing.T) { | 
					
						
							|  |  |  | 	dirPath, err := ioutil.TempDir(globalTestTmpDir, "minio-") | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		t.Fatalf("Unable to create tmp directory %s", err) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	defer os.RemoveAll(dirPath) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	filePath := pathJoin(dirPath, "tmpfile") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if err = ioutil.WriteFile(filePath, nil, 0777); err != nil { | 
					
						
							|  |  |  | 		t.Fatalf("Unable to create file %s", filePath) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-04-10 00:30:02 +08:00
										 |  |  | 	if !fsIsFile(GlobalContext, filePath) { | 
					
						
							| 
									
										
										
										
											2018-05-09 10:09:15 +08:00
										 |  |  | 		t.Fatalf("Expected %s to be a file", filePath) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } |