| 
									
										
										
										
											2016-06-26 05:51:06 +08:00
										 |  |  | /* | 
					
						
							| 
									
										
										
										
											2017-01-19 04:24:34 +08:00
										 |  |  |  * Minio Cloud Storage, (C) 2016, 2017 Minio, Inc. | 
					
						
							| 
									
										
										
										
											2016-06-26 05:51:06 +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. | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-19 07:23:42 +08:00
										 |  |  | package cmd | 
					
						
							| 
									
										
										
										
											2016-06-26 05:51:06 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | import ( | 
					
						
							| 
									
										
										
										
											2016-07-29 12:57:11 +08:00
										 |  |  | 	"bytes" | 
					
						
							|  |  |  | 	"io" | 
					
						
							| 
									
										
										
										
											2016-06-26 05:51:06 +08:00
										 |  |  | 	"io/ioutil" | 
					
						
							|  |  |  | 	"os" | 
					
						
							| 
									
										
										
										
											2016-07-04 02:17:08 +08:00
										 |  |  | 	slashpath "path" | 
					
						
							|  |  |  | 	"runtime" | 
					
						
							| 
									
										
										
										
											2016-08-12 10:57:14 +08:00
										 |  |  | 	"strings" | 
					
						
							| 
									
										
										
										
											2016-07-02 16:59:28 +08:00
										 |  |  | 	"syscall" | 
					
						
							| 
									
										
										
										
											2016-06-26 05:51:06 +08:00
										 |  |  | 	"testing" | 
					
						
							|  |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-07-30 16:26:19 +08:00
										 |  |  | // creates a temp dir and sets up posix layer.
 | 
					
						
							|  |  |  | // returns posix layer, temp dir path to be used for the purpose of tests.
 | 
					
						
							|  |  |  | func newPosixTestSetup() (StorageAPI, string, error) { | 
					
						
							| 
									
										
										
										
											2016-12-16 14:25:05 +08:00
										 |  |  | 	diskPath, err := ioutil.TempDir(globalTestTmpDir, "minio-") | 
					
						
							| 
									
										
										
										
											2016-07-30 16:26:19 +08:00
										 |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		return nil, "", err | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2016-10-27 18:30:52 +08:00
										 |  |  | 	// Initialize a new posix layer.
 | 
					
						
							| 
									
										
										
										
											2016-07-30 16:26:19 +08:00
										 |  |  | 	posixStorage, err := newPosix(diskPath) | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		return nil, "", err | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	return posixStorage, diskPath, nil | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-17 09:05:00 +08:00
										 |  |  | // TestPosixs posix.getDiskInfo()
 | 
					
						
							|  |  |  | func TestPosixGetDiskInfo(t *testing.T) { | 
					
						
							| 
									
										
										
										
											2016-12-16 14:25:05 +08:00
										 |  |  | 	path, err := ioutil.TempDir(globalTestTmpDir, "minio-") | 
					
						
							| 
									
										
										
										
											2016-06-30 02:25:35 +08:00
										 |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		t.Fatalf("Unable to create a temporary directory, %s", err) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	defer removeAll(path) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	testCases := []struct { | 
					
						
							|  |  |  | 		diskPath    string | 
					
						
							|  |  |  | 		expectedErr error | 
					
						
							|  |  |  | 	}{ | 
					
						
							|  |  |  | 		{path, nil}, | 
					
						
							|  |  |  | 		{"/nonexistent-dir", errDiskNotFound}, | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// Check test cases.
 | 
					
						
							|  |  |  | 	for _, testCase := range testCases { | 
					
						
							|  |  |  | 		if _, err := getDiskInfo(testCase.diskPath); err != testCase.expectedErr { | 
					
						
							|  |  |  | 			t.Fatalf("expected: %s, got: %s", testCase.expectedErr, err) | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-17 09:05:00 +08:00
										 |  |  | // TestPosixReadAll - TestPosixs the functionality implemented by posix ReadAll storage API.
 | 
					
						
							|  |  |  | func TestPosixReadAll(t *testing.T) { | 
					
						
							| 
									
										
										
										
											2016-07-30 16:26:19 +08:00
										 |  |  | 	// create posix test setup
 | 
					
						
							| 
									
										
										
										
											2016-08-12 10:57:14 +08:00
										 |  |  | 	posixStorage, path, err := newPosixTestSetup() | 
					
						
							| 
									
										
										
										
											2016-06-26 05:51:06 +08:00
										 |  |  | 	if err != nil { | 
					
						
							| 
									
										
										
										
											2016-07-30 16:26:19 +08:00
										 |  |  | 		t.Fatalf("Unable to create posix test setup, %s", err) | 
					
						
							| 
									
										
										
										
											2016-06-26 05:51:06 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-07-30 16:26:19 +08:00
										 |  |  | 	defer removeAll(path) | 
					
						
							| 
									
										
										
										
											2016-06-26 05:51:06 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	// Create files for the test cases.
 | 
					
						
							| 
									
										
										
										
											2016-08-12 10:57:14 +08:00
										 |  |  | 	if err = posixStorage.MakeVol("exists"); err != nil { | 
					
						
							| 
									
										
										
										
											2016-06-26 05:51:06 +08:00
										 |  |  | 		t.Fatalf("Unable to create a volume \"exists\", %s", err) | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2016-08-12 10:57:14 +08:00
										 |  |  | 	if err = posixStorage.AppendFile("exists", "as-directory/as-file", []byte("Hello, World")); err != nil { | 
					
						
							| 
									
										
										
										
											2016-06-26 05:51:06 +08:00
										 |  |  | 		t.Fatalf("Unable to create a file \"as-directory/as-file\", %s", err) | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2016-08-12 10:57:14 +08:00
										 |  |  | 	if err = posixStorage.AppendFile("exists", "as-file", []byte("Hello, World")); err != nil { | 
					
						
							| 
									
										
										
										
											2016-06-26 05:51:06 +08:00
										 |  |  | 		t.Fatalf("Unable to create a file \"as-file\", %s", err) | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2016-08-12 10:57:14 +08:00
										 |  |  | 	if err = posixStorage.AppendFile("exists", "as-file-parent", []byte("Hello, World")); err != nil { | 
					
						
							| 
									
										
										
										
											2016-07-11 15:15:37 +08:00
										 |  |  | 		t.Fatalf("Unable to create a file \"as-file-parent\", %s", err) | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2016-06-26 05:51:06 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-17 09:05:00 +08:00
										 |  |  | 	// TestPosixcases to validate different conditions for ReadAll API.
 | 
					
						
							| 
									
										
										
										
											2016-06-26 05:51:06 +08:00
										 |  |  | 	testCases := []struct { | 
					
						
							|  |  |  | 		volume string | 
					
						
							|  |  |  | 		path   string | 
					
						
							|  |  |  | 		err    error | 
					
						
							|  |  |  | 	}{ | 
					
						
							| 
									
										
										
										
											2017-01-17 09:05:00 +08:00
										 |  |  | 		// TestPosix case - 1.
 | 
					
						
							| 
									
										
										
										
											2016-06-26 05:51:06 +08:00
										 |  |  | 		// Validate volume does not exist.
 | 
					
						
							|  |  |  | 		{ | 
					
						
							| 
									
										
										
										
											2016-08-12 10:57:14 +08:00
										 |  |  | 			volume: "i-dont-exist", | 
					
						
							|  |  |  | 			path:   "", | 
					
						
							|  |  |  | 			err:    errVolumeNotFound, | 
					
						
							| 
									
										
										
										
											2016-06-26 05:51:06 +08:00
										 |  |  | 		}, | 
					
						
							| 
									
										
										
										
											2017-01-17 09:05:00 +08:00
										 |  |  | 		// TestPosix case - 2.
 | 
					
						
							| 
									
										
										
										
											2016-06-26 05:51:06 +08:00
										 |  |  | 		// Validate bad condition file does not exist.
 | 
					
						
							|  |  |  | 		{ | 
					
						
							| 
									
										
										
										
											2016-08-12 10:57:14 +08:00
										 |  |  | 			volume: "exists", | 
					
						
							|  |  |  | 			path:   "as-file-not-found", | 
					
						
							|  |  |  | 			err:    errFileNotFound, | 
					
						
							| 
									
										
										
										
											2016-06-26 05:51:06 +08:00
										 |  |  | 		}, | 
					
						
							| 
									
										
										
										
											2017-01-17 09:05:00 +08:00
										 |  |  | 		// TestPosix case - 3.
 | 
					
						
							| 
									
										
										
										
											2016-06-26 05:51:06 +08:00
										 |  |  | 		// Validate bad condition file exists as prefix/directory and
 | 
					
						
							|  |  |  | 		// we are attempting to read it.
 | 
					
						
							|  |  |  | 		{ | 
					
						
							| 
									
										
										
										
											2016-08-12 10:57:14 +08:00
										 |  |  | 			volume: "exists", | 
					
						
							|  |  |  | 			path:   "as-directory", | 
					
						
							|  |  |  | 			err:    errFileNotFound, | 
					
						
							| 
									
										
										
										
											2016-06-26 05:51:06 +08:00
										 |  |  | 		}, | 
					
						
							| 
									
										
										
										
											2017-01-17 09:05:00 +08:00
										 |  |  | 		// TestPosix case - 4.
 | 
					
						
							| 
									
										
										
										
											2016-07-11 15:15:37 +08:00
										 |  |  | 		{ | 
					
						
							| 
									
										
										
										
											2016-08-12 10:57:14 +08:00
										 |  |  | 			volume: "exists", | 
					
						
							|  |  |  | 			path:   "as-file-parent/as-file", | 
					
						
							|  |  |  | 			err:    errFileNotFound, | 
					
						
							| 
									
										
										
										
											2016-07-11 15:15:37 +08:00
										 |  |  | 		}, | 
					
						
							| 
									
										
										
										
											2017-01-17 09:05:00 +08:00
										 |  |  | 		// TestPosix case - 5.
 | 
					
						
							| 
									
										
										
										
											2016-07-11 15:15:37 +08:00
										 |  |  | 		// Validate the good condition file exists and we are able to read it.
 | 
					
						
							| 
									
										
										
										
											2016-06-26 05:51:06 +08:00
										 |  |  | 		{ | 
					
						
							| 
									
										
										
										
											2016-08-12 10:57:14 +08:00
										 |  |  | 			volume: "exists", | 
					
						
							|  |  |  | 			path:   "as-file", | 
					
						
							|  |  |  | 			err:    nil, | 
					
						
							|  |  |  | 		}, | 
					
						
							| 
									
										
										
										
											2017-01-17 09:05:00 +08:00
										 |  |  | 		// TestPosix case - 6.
 | 
					
						
							|  |  |  | 		// TestPosix case with invalid volume name.
 | 
					
						
							| 
									
										
										
										
											2016-08-12 10:57:14 +08:00
										 |  |  | 		{ | 
					
						
							|  |  |  | 			volume: "ab", | 
					
						
							|  |  |  | 			path:   "as-file", | 
					
						
							|  |  |  | 			err:    errInvalidArgument, | 
					
						
							| 
									
										
										
										
											2016-06-26 05:51:06 +08:00
										 |  |  | 		}, | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-12 10:57:14 +08:00
										 |  |  | 	var dataRead []byte | 
					
						
							| 
									
										
										
										
											2016-06-26 05:51:06 +08:00
										 |  |  | 	// Run through all the test cases and validate for ReadAll.
 | 
					
						
							|  |  |  | 	for i, testCase := range testCases { | 
					
						
							| 
									
										
										
										
											2016-08-12 10:57:14 +08:00
										 |  |  | 		dataRead, err = posixStorage.ReadAll(testCase.volume, testCase.path) | 
					
						
							| 
									
										
										
										
											2016-06-26 05:51:06 +08:00
										 |  |  | 		if err != testCase.err { | 
					
						
							| 
									
										
										
										
											2017-01-17 09:05:00 +08:00
										 |  |  | 			t.Fatalf("TestPosix %d: Expected err \"%s\", got err \"%s\"", i+1, testCase.err, err) | 
					
						
							| 
									
										
										
										
											2016-06-26 05:51:06 +08:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2016-08-12 10:57:14 +08:00
										 |  |  | 		if err == nil { | 
					
						
							|  |  |  | 			if string(dataRead) != string([]byte("Hello, World")) { | 
					
						
							| 
									
										
										
										
											2017-01-17 09:05:00 +08:00
										 |  |  | 				t.Errorf("TestPosix %d: Expected the data read to be \"%s\", but instead got \"%s\"", i+1, "Hello, World", string(dataRead)) | 
					
						
							| 
									
										
										
										
											2016-08-12 10:57:14 +08:00
										 |  |  | 			} | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2017-01-17 09:05:00 +08:00
										 |  |  | 	// TestPosixing for faulty disk.
 | 
					
						
							| 
									
										
										
										
											2016-08-12 10:57:14 +08:00
										 |  |  | 	// Setting ioErrCount > maxAllowedIOError.
 | 
					
						
							|  |  |  | 	if posixType, ok := posixStorage.(*posix); ok { | 
					
						
							|  |  |  | 		// setting the io error count from as specified in the test case.
 | 
					
						
							|  |  |  | 		posixType.ioErrCount = int32(6) | 
					
						
							|  |  |  | 	} else { | 
					
						
							|  |  |  | 		t.Errorf("Expected the StorageAPI to be of type *posix") | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	_, err = posixStorage.ReadAll("abcd", "efg") | 
					
						
							|  |  |  | 	if err != errFaultyDisk { | 
					
						
							|  |  |  | 		t.Errorf("Expected err \"%s\", got err \"%s\"", errFaultyDisk, err) | 
					
						
							| 
									
										
										
										
											2016-06-26 05:51:06 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2016-07-02 16:59:28 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-17 09:05:00 +08:00
										 |  |  | // TestPosixNewPosix all the cases handled in posix storage layer initialization.
 | 
					
						
							|  |  |  | func TestPosixNewPosix(t *testing.T) { | 
					
						
							| 
									
										
										
										
											2016-07-02 16:59:28 +08:00
										 |  |  | 	// Temporary dir name.
 | 
					
						
							| 
									
										
										
										
											2016-12-16 14:25:05 +08:00
										 |  |  | 	tmpDirName := globalTestTmpDir + "/" + "minio-" + nextSuffix() | 
					
						
							| 
									
										
										
										
											2016-07-02 16:59:28 +08:00
										 |  |  | 	// Temporary file name.
 | 
					
						
							| 
									
										
										
										
											2016-12-16 14:25:05 +08:00
										 |  |  | 	tmpFileName := globalTestTmpDir + "/" + "minio-" + nextSuffix() | 
					
						
							| 
									
										
										
										
											2016-07-02 16:59:28 +08:00
										 |  |  | 	f, _ := os.Create(tmpFileName) | 
					
						
							|  |  |  | 	f.Close() | 
					
						
							|  |  |  | 	defer os.Remove(tmpFileName) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// List of all tests for posix initialization.
 | 
					
						
							|  |  |  | 	testCases := []struct { | 
					
						
							| 
									
										
										
										
											2016-10-27 18:30:52 +08:00
										 |  |  | 		name string | 
					
						
							|  |  |  | 		err  error | 
					
						
							| 
									
										
										
										
											2016-07-02 16:59:28 +08:00
										 |  |  | 	}{ | 
					
						
							|  |  |  | 		// Validates input argument cannot be empty.
 | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 			"", | 
					
						
							|  |  |  | 			errInvalidArgument, | 
					
						
							|  |  |  | 		}, | 
					
						
							|  |  |  | 		// Validates if the directory does not exist and
 | 
					
						
							|  |  |  | 		// gets automatically created.
 | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 			tmpDirName, | 
					
						
							|  |  |  | 			nil, | 
					
						
							|  |  |  | 		}, | 
					
						
							|  |  |  | 		// Validates if the disk exists as file and returns error
 | 
					
						
							|  |  |  | 		// not a directory.
 | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 			tmpFileName, | 
					
						
							|  |  |  | 			syscall.ENOTDIR, | 
					
						
							|  |  |  | 		}, | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// Validate all test cases.
 | 
					
						
							|  |  |  | 	for i, testCase := range testCases { | 
					
						
							| 
									
										
										
										
											2016-10-27 18:30:52 +08:00
										 |  |  | 		// Initialize a new posix layer.
 | 
					
						
							|  |  |  | 		_, err := newPosix(testCase.name) | 
					
						
							| 
									
										
										
										
											2016-07-02 16:59:28 +08:00
										 |  |  | 		if err != testCase.err { | 
					
						
							| 
									
										
										
										
											2017-01-17 09:05:00 +08:00
										 |  |  | 			t.Fatalf("TestPosix %d failed wanted: %s, got: %s", i+1, err, testCase.err) | 
					
						
							| 
									
										
										
										
											2016-07-02 16:59:28 +08:00
										 |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2016-07-04 02:17:08 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-17 09:05:00 +08:00
										 |  |  | // TestPosixMakeVol - TestPosix validate the logic for creation of new posix volume.
 | 
					
						
							| 
									
										
										
										
											2016-08-12 10:57:14 +08:00
										 |  |  | // Asserts the failures too against the expected failures.
 | 
					
						
							| 
									
										
										
										
											2017-01-17 09:05:00 +08:00
										 |  |  | func TestPosixMakeVol(t *testing.T) { | 
					
						
							| 
									
										
										
										
											2016-07-30 16:26:19 +08:00
										 |  |  | 	// create posix test setup
 | 
					
						
							| 
									
										
										
										
											2016-08-12 10:57:14 +08:00
										 |  |  | 	posixStorage, path, err := newPosixTestSetup() | 
					
						
							| 
									
										
										
										
											2016-07-04 02:17:08 +08:00
										 |  |  | 	if err != nil { | 
					
						
							| 
									
										
										
										
											2016-07-30 16:26:19 +08:00
										 |  |  | 		t.Fatalf("Unable to create posix test setup, %s", err) | 
					
						
							| 
									
										
										
										
											2016-07-04 02:17:08 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | 	defer removeAll(path) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// Setup test environment.
 | 
					
						
							|  |  |  | 	// Create a file.
 | 
					
						
							|  |  |  | 	if err := ioutil.WriteFile(slashpath.Join(path, "vol-as-file"), []byte{}, os.ModePerm); err != nil { | 
					
						
							|  |  |  | 		t.Fatalf("Unable to create file, %s", err) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	// Create a directory.
 | 
					
						
							|  |  |  | 	if err := os.Mkdir(slashpath.Join(path, "existing-vol"), 0777); err != nil { | 
					
						
							|  |  |  | 		t.Fatalf("Unable to create directory, %s", err) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	testCases := []struct { | 
					
						
							|  |  |  | 		volName     string | 
					
						
							| 
									
										
										
										
											2016-08-12 10:57:14 +08:00
										 |  |  | 		ioErrCount  int | 
					
						
							| 
									
										
										
										
											2016-07-04 02:17:08 +08:00
										 |  |  | 		expectedErr error | 
					
						
							|  |  |  | 	}{ | 
					
						
							| 
									
										
										
										
											2017-01-17 09:05:00 +08:00
										 |  |  | 		// TestPosix case - 1.
 | 
					
						
							| 
									
										
										
										
											2016-08-12 10:57:14 +08:00
										 |  |  | 		// A valid case, volume creation is expected to succeed.
 | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 			volName:     "success-vol", | 
					
						
							|  |  |  | 			ioErrCount:  0, | 
					
						
							|  |  |  | 			expectedErr: nil, | 
					
						
							|  |  |  | 		}, | 
					
						
							| 
									
										
										
										
											2017-01-17 09:05:00 +08:00
										 |  |  | 		// TestPosix case - 2.
 | 
					
						
							| 
									
										
										
										
											2016-08-12 10:57:14 +08:00
										 |  |  | 		// Case where a file exists by the name of the volume to be created.
 | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 			volName:     "vol-as-file", | 
					
						
							|  |  |  | 			ioErrCount:  0, | 
					
						
							|  |  |  | 			expectedErr: errVolumeExists, | 
					
						
							|  |  |  | 		}, | 
					
						
							| 
									
										
										
										
											2017-01-17 09:05:00 +08:00
										 |  |  | 		// TestPosix case - 3.
 | 
					
						
							| 
									
										
										
										
											2016-08-12 10:57:14 +08:00
										 |  |  | 		{ | 
					
						
							|  |  |  | 			volName:     "existing-vol", | 
					
						
							|  |  |  | 			ioErrCount:  0, | 
					
						
							|  |  |  | 			expectedErr: errVolumeExists, | 
					
						
							|  |  |  | 		}, | 
					
						
							| 
									
										
										
										
											2017-01-17 09:05:00 +08:00
										 |  |  | 		// TestPosix case - 4.
 | 
					
						
							| 
									
										
										
										
											2016-08-12 10:57:14 +08:00
										 |  |  | 		// IO error > maxAllowedIOError, should fail with errFaultyDisk.
 | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 			volName:     "vol", | 
					
						
							|  |  |  | 			ioErrCount:  6, | 
					
						
							|  |  |  | 			expectedErr: errFaultyDisk, | 
					
						
							|  |  |  | 		}, | 
					
						
							| 
									
										
										
										
											2017-01-17 09:05:00 +08:00
										 |  |  | 		// TestPosix case - 5.
 | 
					
						
							|  |  |  | 		// TestPosix case with invalid volume name.
 | 
					
						
							| 
									
										
										
										
											2016-08-12 10:57:14 +08:00
										 |  |  | 		{ | 
					
						
							|  |  |  | 			volName:     "ab", | 
					
						
							|  |  |  | 			ioErrCount:  0, | 
					
						
							|  |  |  | 			expectedErr: errInvalidArgument, | 
					
						
							|  |  |  | 		}, | 
					
						
							| 
									
										
										
										
											2016-07-04 02:17:08 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-12 10:57:14 +08:00
										 |  |  | 	for i, testCase := range testCases { | 
					
						
							|  |  |  | 		if posixType, ok := posixStorage.(*posix); ok { | 
					
						
							|  |  |  | 			// setting the io error count from as specified in the test case.
 | 
					
						
							|  |  |  | 			posixType.ioErrCount = int32(testCase.ioErrCount) | 
					
						
							|  |  |  | 		} else { | 
					
						
							|  |  |  | 			t.Errorf("Expected the StorageAPI to be of type *posix") | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		if err := posixStorage.MakeVol(testCase.volName); err != testCase.expectedErr { | 
					
						
							| 
									
										
										
										
											2017-01-17 09:05:00 +08:00
										 |  |  | 			t.Fatalf("TestPosix %d: Expected: \"%s\", got: \"%s\"", i+1, testCase.expectedErr, err) | 
					
						
							| 
									
										
										
										
											2016-07-04 02:17:08 +08:00
										 |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-17 09:05:00 +08:00
										 |  |  | 	// TestPosix for permission denied.
 | 
					
						
							| 
									
										
										
										
											2017-01-19 04:24:34 +08:00
										 |  |  | 	if runtime.GOOS != globalWindowsOSName { | 
					
						
							| 
									
										
										
										
											2016-07-04 02:17:08 +08:00
										 |  |  | 		// Initialize posix storage layer for permission denied error.
 | 
					
						
							|  |  |  | 		posix, err := newPosix("/usr") | 
					
						
							|  |  |  | 		if err != nil { | 
					
						
							|  |  |  | 			t.Fatalf("Unable to initialize posix, %s", err) | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		if err := posix.MakeVol("test-vol"); err != errDiskAccessDenied { | 
					
						
							|  |  |  | 			t.Fatalf("expected: %s, got: %s", errDiskAccessDenied, err) | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-17 09:05:00 +08:00
										 |  |  | // TestPosixDeleteVol - Validates the expected behaviour of posix.DeleteVol for various cases.
 | 
					
						
							|  |  |  | func TestPosixDeleteVol(t *testing.T) { | 
					
						
							| 
									
										
										
										
											2016-07-30 16:26:19 +08:00
										 |  |  | 	// create posix test setup
 | 
					
						
							| 
									
										
										
										
											2016-08-12 10:57:14 +08:00
										 |  |  | 	posixStorage, path, err := newPosixTestSetup() | 
					
						
							| 
									
										
										
										
											2016-07-04 02:17:08 +08:00
										 |  |  | 	if err != nil { | 
					
						
							| 
									
										
										
										
											2016-07-30 16:26:19 +08:00
										 |  |  | 		t.Fatalf("Unable to create posix test setup, %s", err) | 
					
						
							| 
									
										
										
										
											2016-07-04 02:17:08 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | 	defer removeAll(path) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// Setup test environment.
 | 
					
						
							| 
									
										
										
										
											2016-08-12 10:57:14 +08:00
										 |  |  | 	if err = posixStorage.MakeVol("success-vol"); err != nil { | 
					
						
							| 
									
										
										
										
											2016-07-04 02:17:08 +08:00
										 |  |  | 		t.Fatalf("Unable to create volume, %s", err) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-17 09:05:00 +08:00
										 |  |  | 	// TestPosix failure cases.
 | 
					
						
							| 
									
										
										
										
											2016-07-04 02:17:08 +08:00
										 |  |  | 	vol := slashpath.Join(path, "nonempty-vol") | 
					
						
							| 
									
										
										
										
											2016-08-12 10:57:14 +08:00
										 |  |  | 	if err = os.Mkdir(vol, 0777); err != nil { | 
					
						
							| 
									
										
										
										
											2016-07-04 02:17:08 +08:00
										 |  |  | 		t.Fatalf("Unable to create directory, %s", err) | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2016-08-12 10:57:14 +08:00
										 |  |  | 	if err = ioutil.WriteFile(slashpath.Join(vol, "test-file"), []byte{}, os.ModePerm); err != nil { | 
					
						
							| 
									
										
										
										
											2016-07-04 02:17:08 +08:00
										 |  |  | 		t.Fatalf("Unable to create file, %s", err) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	testCases := []struct { | 
					
						
							|  |  |  | 		volName     string | 
					
						
							| 
									
										
										
										
											2016-08-12 10:57:14 +08:00
										 |  |  | 		ioErrCount  int | 
					
						
							| 
									
										
										
										
											2016-07-04 02:17:08 +08:00
										 |  |  | 		expectedErr error | 
					
						
							|  |  |  | 	}{ | 
					
						
							| 
									
										
										
										
											2017-01-17 09:05:00 +08:00
										 |  |  | 		// TestPosix case  - 1.
 | 
					
						
							| 
									
										
										
										
											2016-08-12 10:57:14 +08:00
										 |  |  | 		// A valida case. Empty vol, should be possible to delete.
 | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 			volName:     "success-vol", | 
					
						
							|  |  |  | 			ioErrCount:  0, | 
					
						
							|  |  |  | 			expectedErr: nil, | 
					
						
							|  |  |  | 		}, | 
					
						
							| 
									
										
										
										
											2017-01-17 09:05:00 +08:00
										 |  |  | 		// TestPosix case - 2.
 | 
					
						
							| 
									
										
										
										
											2016-08-12 10:57:14 +08:00
										 |  |  | 		// volume is non-existent.
 | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 			volName:     "nonexistent-vol", | 
					
						
							|  |  |  | 			ioErrCount:  0, | 
					
						
							|  |  |  | 			expectedErr: errVolumeNotFound, | 
					
						
							|  |  |  | 		}, | 
					
						
							| 
									
										
										
										
											2017-01-17 09:05:00 +08:00
										 |  |  | 		// TestPosix case - 3.
 | 
					
						
							| 
									
										
										
										
											2016-08-12 10:57:14 +08:00
										 |  |  | 		// It shouldn't be possible to delete an non-empty volume, validating the same.
 | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 			volName:     "nonempty-vol", | 
					
						
							|  |  |  | 			ioErrCount:  0, | 
					
						
							|  |  |  | 			expectedErr: errVolumeNotEmpty, | 
					
						
							|  |  |  | 		}, | 
					
						
							| 
									
										
										
										
											2017-01-17 09:05:00 +08:00
										 |  |  | 		// TestPosix case - 4.
 | 
					
						
							| 
									
										
										
										
											2016-08-12 10:57:14 +08:00
										 |  |  | 		// IO error > maxAllowedIOError, should fail with errFaultyDisk.
 | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 			volName:     "my-disk", | 
					
						
							|  |  |  | 			ioErrCount:  6, | 
					
						
							|  |  |  | 			expectedErr: errFaultyDisk, | 
					
						
							|  |  |  | 		}, | 
					
						
							| 
									
										
										
										
											2017-01-17 09:05:00 +08:00
										 |  |  | 		// TestPosix case - 5.
 | 
					
						
							| 
									
										
										
										
											2016-08-12 10:57:14 +08:00
										 |  |  | 		// Invalid volume name.
 | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 			volName:     "ab", | 
					
						
							|  |  |  | 			ioErrCount:  0, | 
					
						
							|  |  |  | 			expectedErr: errInvalidArgument, | 
					
						
							|  |  |  | 		}, | 
					
						
							| 
									
										
										
										
											2016-07-04 02:17:08 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-12 10:57:14 +08:00
										 |  |  | 	for i, testCase := range testCases { | 
					
						
							|  |  |  | 		if posixType, ok := posixStorage.(*posix); ok { | 
					
						
							|  |  |  | 			// setting the io error count from as specified in the test case.
 | 
					
						
							|  |  |  | 			posixType.ioErrCount = int32(testCase.ioErrCount) | 
					
						
							|  |  |  | 		} else { | 
					
						
							|  |  |  | 			t.Errorf("Expected the StorageAPI to be of type *posix") | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		if err = posixStorage.DeleteVol(testCase.volName); err != testCase.expectedErr { | 
					
						
							| 
									
										
										
										
											2017-01-17 09:05:00 +08:00
										 |  |  | 			t.Fatalf("TestPosix: %d, expected: %s, got: %s", i+1, testCase.expectedErr, err) | 
					
						
							| 
									
										
										
										
											2016-07-04 02:17:08 +08:00
										 |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-17 09:05:00 +08:00
										 |  |  | 	// TestPosix for permission denied.
 | 
					
						
							| 
									
										
										
										
											2017-01-19 04:24:34 +08:00
										 |  |  | 	if runtime.GOOS != globalWindowsOSName { | 
					
						
							| 
									
										
										
										
											2016-07-04 02:17:08 +08:00
										 |  |  | 		// Initialize posix storage layer for permission denied error.
 | 
					
						
							| 
									
										
										
										
											2016-08-12 10:57:14 +08:00
										 |  |  | 		posixStorage, err = newPosix("/usr") | 
					
						
							| 
									
										
										
										
											2016-07-04 02:17:08 +08:00
										 |  |  | 		if err != nil { | 
					
						
							|  |  |  | 			t.Fatalf("Unable to initialize posix, %s", err) | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-12 10:57:14 +08:00
										 |  |  | 		if err = posixStorage.DeleteVol("bin"); !os.IsPermission(err) { | 
					
						
							| 
									
										
										
										
											2016-07-04 02:17:08 +08:00
										 |  |  | 			t.Fatalf("expected: Permission error, got: %s", err) | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2016-08-12 10:57:14 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	posixDeletedStorage, diskPath, err := newPosixTestSetup() | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		t.Fatalf("Unable to create posix test setup, %s", err) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	// removing the disk, used to recreate disk not found error.
 | 
					
						
							|  |  |  | 	removeAll(diskPath) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-17 09:05:00 +08:00
										 |  |  | 	// TestPosix for delete on an removed disk.
 | 
					
						
							| 
									
										
										
										
											2016-08-12 10:57:14 +08:00
										 |  |  | 	// should fail with disk not found.
 | 
					
						
							|  |  |  | 	err = posixDeletedStorage.DeleteVol("Del-Vol") | 
					
						
							|  |  |  | 	if err != errDiskNotFound { | 
					
						
							|  |  |  | 		t.Errorf("Expected: \"Disk not found\", got \"%s\"", err) | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2016-07-04 02:17:08 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-17 09:05:00 +08:00
										 |  |  | // TestPosixStatVol - TestPosixs validate the volume info returned by posix.StatVol() for various inputs.
 | 
					
						
							|  |  |  | func TestPosixStatVol(t *testing.T) { | 
					
						
							| 
									
										
										
										
											2016-07-30 16:26:19 +08:00
										 |  |  | 	// create posix test setup
 | 
					
						
							| 
									
										
										
										
											2016-08-12 10:57:14 +08:00
										 |  |  | 	posixStorage, path, err := newPosixTestSetup() | 
					
						
							| 
									
										
										
										
											2016-07-04 02:17:08 +08:00
										 |  |  | 	if err != nil { | 
					
						
							| 
									
										
										
										
											2016-07-30 16:26:19 +08:00
										 |  |  | 		t.Fatalf("Unable to create posix test setup, %s", err) | 
					
						
							| 
									
										
										
										
											2016-07-04 02:17:08 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | 	defer removeAll(path) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// Setup test environment.
 | 
					
						
							| 
									
										
										
										
											2016-08-12 10:57:14 +08:00
										 |  |  | 	if err = posixStorage.MakeVol("success-vol"); err != nil { | 
					
						
							| 
									
										
										
										
											2016-07-04 02:17:08 +08:00
										 |  |  | 		t.Fatalf("Unable to create volume, %s", err) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	testCases := []struct { | 
					
						
							|  |  |  | 		volName     string | 
					
						
							| 
									
										
										
										
											2016-08-12 10:57:14 +08:00
										 |  |  | 		ioErrCount  int | 
					
						
							| 
									
										
										
										
											2016-07-04 02:17:08 +08:00
										 |  |  | 		expectedErr error | 
					
						
							|  |  |  | 	}{ | 
					
						
							| 
									
										
										
										
											2017-01-17 09:05:00 +08:00
										 |  |  | 		// TestPosix case - 1.
 | 
					
						
							| 
									
										
										
										
											2016-08-12 10:57:14 +08:00
										 |  |  | 		{ | 
					
						
							|  |  |  | 			volName:     "success-vol", | 
					
						
							|  |  |  | 			ioErrCount:  0, | 
					
						
							|  |  |  | 			expectedErr: nil, | 
					
						
							|  |  |  | 		}, | 
					
						
							| 
									
										
										
										
											2017-01-17 09:05:00 +08:00
										 |  |  | 		// TestPosix case - 2.
 | 
					
						
							| 
									
										
										
										
											2016-08-12 10:57:14 +08:00
										 |  |  | 		{ | 
					
						
							|  |  |  | 			volName:     "nonexistent-vol", | 
					
						
							|  |  |  | 			ioErrCount:  0, | 
					
						
							|  |  |  | 			expectedErr: errVolumeNotFound, | 
					
						
							|  |  |  | 		}, | 
					
						
							| 
									
										
										
										
											2017-01-17 09:05:00 +08:00
										 |  |  | 		// TestPosix case - 3.
 | 
					
						
							| 
									
										
										
										
											2016-08-12 10:57:14 +08:00
										 |  |  | 		{ | 
					
						
							|  |  |  | 			volName:     "success-vol", | 
					
						
							|  |  |  | 			ioErrCount:  6, | 
					
						
							|  |  |  | 			expectedErr: errFaultyDisk, | 
					
						
							|  |  |  | 		}, | 
					
						
							| 
									
										
										
										
											2017-01-17 09:05:00 +08:00
										 |  |  | 		// TestPosix case - 4.
 | 
					
						
							| 
									
										
										
										
											2016-08-12 10:57:14 +08:00
										 |  |  | 		{ | 
					
						
							|  |  |  | 			volName:     "ab", | 
					
						
							|  |  |  | 			ioErrCount:  0, | 
					
						
							|  |  |  | 			expectedErr: errInvalidArgument, | 
					
						
							|  |  |  | 		}, | 
					
						
							| 
									
										
										
										
											2016-07-04 02:17:08 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-12 10:57:14 +08:00
										 |  |  | 	for i, testCase := range testCases { | 
					
						
							|  |  |  | 		var volInfo VolInfo | 
					
						
							|  |  |  | 		// setting ioErrCnt from the test case.
 | 
					
						
							|  |  |  | 		if posixType, ok := posixStorage.(*posix); ok { | 
					
						
							|  |  |  | 			// setting the io error count from as specified in the test case.
 | 
					
						
							|  |  |  | 			posixType.ioErrCount = int32(testCase.ioErrCount) | 
					
						
							|  |  |  | 		} else { | 
					
						
							|  |  |  | 			t.Errorf("Expected the StorageAPI to be of type *posix") | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		volInfo, err = posixStorage.StatVol(testCase.volName) | 
					
						
							|  |  |  | 		if 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) | 
					
						
							| 
									
										
										
										
											2016-08-12 10:57:14 +08:00
										 |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		if err == nil { | 
					
						
							|  |  |  | 			if volInfo.Name != volInfo.Name { | 
					
						
							| 
									
										
										
										
											2017-01-17 09:05:00 +08:00
										 |  |  | 				t.Errorf("TestPosix case %d: Expected the volume name to be \"%s\", instead found \"%s\"", i+1, volInfo.Name, volInfo.Name) | 
					
						
							| 
									
										
										
										
											2016-08-12 10:57:14 +08:00
										 |  |  | 			} | 
					
						
							| 
									
										
										
										
											2016-07-04 02:17:08 +08:00
										 |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2016-08-12 10:57:14 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	posixDeletedStorage, diskPath, err := newPosixTestSetup() | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		t.Fatalf("Unable to create posix test setup, %s", err) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	// removing the disk, used to recreate disk not found error.
 | 
					
						
							|  |  |  | 	removeAll(diskPath) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-17 09:05:00 +08:00
										 |  |  | 	// TestPosix for delete on an removed disk.
 | 
					
						
							| 
									
										
										
										
											2016-08-12 10:57:14 +08:00
										 |  |  | 	// should fail with disk not found.
 | 
					
						
							|  |  |  | 	_, err = posixDeletedStorage.StatVol("Stat vol") | 
					
						
							|  |  |  | 	if err != errDiskNotFound { | 
					
						
							|  |  |  | 		t.Errorf("Expected: \"Disk not found\", got \"%s\"", err) | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2016-07-04 02:17:08 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-17 09:05:00 +08:00
										 |  |  | // TestPosixListVols - Validates the result and the error output for posix volume listing functionality posix.ListVols().
 | 
					
						
							|  |  |  | func TestPosixListVols(t *testing.T) { | 
					
						
							| 
									
										
										
										
											2016-07-30 16:26:19 +08:00
										 |  |  | 	// create posix test setup
 | 
					
						
							| 
									
										
										
										
											2016-08-12 10:57:14 +08:00
										 |  |  | 	posixStorage, path, err := newPosixTestSetup() | 
					
						
							| 
									
										
										
										
											2016-07-04 02:17:08 +08:00
										 |  |  | 	if err != nil { | 
					
						
							| 
									
										
										
										
											2016-07-30 16:26:19 +08:00
										 |  |  | 		t.Fatalf("Unable to create posix test setup, %s", err) | 
					
						
							| 
									
										
										
										
											2016-07-04 02:17:08 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-12 10:57:14 +08:00
										 |  |  | 	var volInfo []VolInfo | 
					
						
							| 
									
										
										
										
											2017-01-17 09:05:00 +08:00
										 |  |  | 	// TestPosix empty list vols.
 | 
					
						
							| 
									
										
										
										
											2016-08-12 10:57:14 +08:00
										 |  |  | 	if volInfo, err = posixStorage.ListVols(); err != nil { | 
					
						
							| 
									
										
										
										
											2016-07-04 02:17:08 +08:00
										 |  |  | 		t.Fatalf("expected: <nil>, got: %s", err) | 
					
						
							|  |  |  | 	} else if len(volInfo) != 0 { | 
					
						
							|  |  |  | 		t.Fatalf("expected: [], got: %s", volInfo) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-17 09:05:00 +08:00
										 |  |  | 	// TestPosix non-empty list vols.
 | 
					
						
							| 
									
										
										
										
											2016-08-12 10:57:14 +08:00
										 |  |  | 	if err = posixStorage.MakeVol("success-vol"); err != nil { | 
					
						
							| 
									
										
										
										
											2016-07-04 02:17:08 +08:00
										 |  |  | 		t.Fatalf("Unable to create volume, %s", err) | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2016-08-12 10:57:14 +08:00
										 |  |  | 	if volInfo, err = posixStorage.ListVols(); err != nil { | 
					
						
							| 
									
										
										
										
											2016-07-04 02:17:08 +08:00
										 |  |  | 		t.Fatalf("expected: <nil>, got: %s", err) | 
					
						
							|  |  |  | 	} else if len(volInfo) != 1 { | 
					
						
							|  |  |  | 		t.Fatalf("expected: 1, got: %d", len(volInfo)) | 
					
						
							|  |  |  | 	} else if volInfo[0].Name != "success-vol" { | 
					
						
							| 
									
										
										
										
											2016-08-12 10:57:14 +08:00
										 |  |  | 		t.Errorf("expected: success-vol, got: %s", volInfo[0].Name) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	// setting ioErrCnt to be > maxAllowedIOError.
 | 
					
						
							|  |  |  | 	// should fail with errFaultyDisk.
 | 
					
						
							|  |  |  | 	if posixType, ok := posixStorage.(*posix); ok { | 
					
						
							|  |  |  | 		// setting the io error count from as specified in the test case.
 | 
					
						
							|  |  |  | 		posixType.ioErrCount = int32(6) | 
					
						
							|  |  |  | 	} else { | 
					
						
							|  |  |  | 		t.Errorf("Expected the StorageAPI to be of type *posix") | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	if _, err = posixStorage.ListVols(); err != errFaultyDisk { | 
					
						
							|  |  |  | 		t.Errorf("Expected to fail with \"%s\", but instead failed with \"%s\"", errFaultyDisk, err) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	// removing the path and simulating disk failure
 | 
					
						
							|  |  |  | 	removeAll(path) | 
					
						
							|  |  |  | 	// Resetting the IO error.
 | 
					
						
							|  |  |  | 	// should fail with errDiskNotFound.
 | 
					
						
							|  |  |  | 	if posixType, ok := posixStorage.(*posix); ok { | 
					
						
							|  |  |  | 		// setting the io error count from as specified in the test case.
 | 
					
						
							|  |  |  | 		posixType.ioErrCount = int32(0) | 
					
						
							|  |  |  | 	} else { | 
					
						
							|  |  |  | 		t.Errorf("Expected the StorageAPI to be of type *posix") | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	if _, err = posixStorage.ListVols(); err != errDiskNotFound { | 
					
						
							|  |  |  | 		t.Errorf("Expected to fail with \"%s\", but instead failed with \"%s\"", errDiskNotFound, err) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-17 09:05:00 +08:00
										 |  |  | // TestPosixPosixListDir -  TestPosixs validate the directory listing functionality provided by posix.ListDir .
 | 
					
						
							|  |  |  | func TestPosixPosixListDir(t *testing.T) { | 
					
						
							| 
									
										
										
										
											2016-08-12 10:57:14 +08:00
										 |  |  | 	// create posix test setup
 | 
					
						
							|  |  |  | 	posixStorage, path, err := newPosixTestSetup() | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		t.Fatalf("Unable to create posix test setup, %s", err) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	defer removeAll(path) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// create posix test setup.
 | 
					
						
							|  |  |  | 	posixDeletedStorage, diskPath, err := newPosixTestSetup() | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		t.Fatalf("Unable to create posix test setup, %s", err) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	// removing the disk, used to recreate disk not found error.
 | 
					
						
							|  |  |  | 	removeAll(diskPath) | 
					
						
							|  |  |  | 	// Setup test environment.
 | 
					
						
							|  |  |  | 	if err = posixStorage.MakeVol("success-vol"); err != nil { | 
					
						
							|  |  |  | 		t.Fatalf("Unable to create volume, %s", err) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	if err = posixStorage.AppendFile("success-vol", "abc/def/ghi/success-file", []byte("Hello, world")); err != nil { | 
					
						
							|  |  |  | 		t.Fatalf("Unable to create file, %s", err) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	if err = posixStorage.AppendFile("success-vol", "abc/xyz/ghi/success-file", []byte("Hello, world")); err != nil { | 
					
						
							|  |  |  | 		t.Fatalf("Unable to create file, %s", err) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	testCases := []struct { | 
					
						
							|  |  |  | 		srcVol   string | 
					
						
							|  |  |  | 		srcPath  string | 
					
						
							|  |  |  | 		ioErrCnt int | 
					
						
							|  |  |  | 		// expected result.
 | 
					
						
							|  |  |  | 		expectedListDir []string | 
					
						
							|  |  |  | 		expectedErr     error | 
					
						
							|  |  |  | 	}{ | 
					
						
							| 
									
										
										
										
											2017-01-17 09:05:00 +08:00
										 |  |  | 		// TestPosix case - 1.
 | 
					
						
							| 
									
										
										
										
											2016-08-12 10:57:14 +08:00
										 |  |  | 		// valid case with existing volume and file to delete.
 | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 			srcVol:          "success-vol", | 
					
						
							|  |  |  | 			srcPath:         "abc", | 
					
						
							|  |  |  | 			ioErrCnt:        0, | 
					
						
							|  |  |  | 			expectedListDir: []string{"def/", "xyz/"}, | 
					
						
							|  |  |  | 			expectedErr:     nil, | 
					
						
							|  |  |  | 		}, | 
					
						
							| 
									
										
										
										
											2017-01-17 09:05:00 +08:00
										 |  |  | 		// TestPosix case - 1.
 | 
					
						
							| 
									
										
										
										
											2016-08-12 10:57:14 +08:00
										 |  |  | 		// valid case with existing volume and file to delete.
 | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 			srcVol:          "success-vol", | 
					
						
							|  |  |  | 			srcPath:         "abc/def", | 
					
						
							|  |  |  | 			ioErrCnt:        0, | 
					
						
							|  |  |  | 			expectedListDir: []string{"ghi/"}, | 
					
						
							|  |  |  | 			expectedErr:     nil, | 
					
						
							|  |  |  | 		}, | 
					
						
							| 
									
										
										
										
											2017-01-17 09:05:00 +08:00
										 |  |  | 		// TestPosix case - 1.
 | 
					
						
							| 
									
										
										
										
											2016-08-12 10:57:14 +08:00
										 |  |  | 		// valid case with existing volume and file to delete.
 | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 			srcVol:          "success-vol", | 
					
						
							|  |  |  | 			srcPath:         "abc/def/ghi", | 
					
						
							|  |  |  | 			ioErrCnt:        0, | 
					
						
							|  |  |  | 			expectedListDir: []string{"success-file"}, | 
					
						
							|  |  |  | 			expectedErr:     nil, | 
					
						
							|  |  |  | 		}, | 
					
						
							| 
									
										
										
										
											2017-01-17 09:05:00 +08:00
										 |  |  | 		// TestPosix case - 2.
 | 
					
						
							| 
									
										
										
										
											2016-08-12 10:57:14 +08:00
										 |  |  | 		{ | 
					
						
							|  |  |  | 			srcVol:      "success-vol", | 
					
						
							|  |  |  | 			srcPath:     "abcdef", | 
					
						
							|  |  |  | 			ioErrCnt:    0, | 
					
						
							|  |  |  | 			expectedErr: errFileNotFound, | 
					
						
							|  |  |  | 		}, | 
					
						
							| 
									
										
										
										
											2017-01-17 09:05:00 +08:00
										 |  |  | 		// TestPosix case - 3.
 | 
					
						
							|  |  |  | 		// TestPosix case with invalid volume name.
 | 
					
						
							| 
									
										
										
										
											2016-08-12 10:57:14 +08:00
										 |  |  | 		{ | 
					
						
							|  |  |  | 			srcVol:      "ab", | 
					
						
							|  |  |  | 			srcPath:     "success-file", | 
					
						
							|  |  |  | 			ioErrCnt:    0, | 
					
						
							|  |  |  | 			expectedErr: errInvalidArgument, | 
					
						
							|  |  |  | 		}, | 
					
						
							| 
									
										
										
										
											2017-01-17 09:05:00 +08:00
										 |  |  | 		// TestPosix case - 4.
 | 
					
						
							|  |  |  | 		// TestPosix case with io error count > max limit.
 | 
					
						
							| 
									
										
										
										
											2016-08-12 10:57:14 +08:00
										 |  |  | 		{ | 
					
						
							|  |  |  | 			srcVol:      "success-vol", | 
					
						
							|  |  |  | 			srcPath:     "success-file", | 
					
						
							|  |  |  | 			ioErrCnt:    6, | 
					
						
							|  |  |  | 			expectedErr: errFaultyDisk, | 
					
						
							|  |  |  | 		}, | 
					
						
							| 
									
										
										
										
											2017-01-17 09:05:00 +08:00
										 |  |  | 		// TestPosix case - 5.
 | 
					
						
							|  |  |  | 		// TestPosix case with non existent volume.
 | 
					
						
							| 
									
										
										
										
											2016-08-12 10:57:14 +08:00
										 |  |  | 		{ | 
					
						
							|  |  |  | 			srcVol:      "non-existent-vol", | 
					
						
							|  |  |  | 			srcPath:     "success-file", | 
					
						
							|  |  |  | 			ioErrCnt:    0, | 
					
						
							|  |  |  | 			expectedErr: errVolumeNotFound, | 
					
						
							|  |  |  | 		}, | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	for i, testCase := range testCases { | 
					
						
							|  |  |  | 		var dirList []string | 
					
						
							|  |  |  | 		// setting ioErrCnt from the test case.
 | 
					
						
							|  |  |  | 		if posixType, ok := posixStorage.(*posix); ok { | 
					
						
							|  |  |  | 			// setting the io error count from as specified in the test case.
 | 
					
						
							|  |  |  | 			posixType.ioErrCount = int32(testCase.ioErrCnt) | 
					
						
							|  |  |  | 		} else { | 
					
						
							|  |  |  | 			t.Errorf("Expected the StorageAPI to be of type *posix") | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		dirList, err = posixStorage.ListDir(testCase.srcVol, testCase.srcPath) | 
					
						
							|  |  |  | 		if 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) | 
					
						
							| 
									
										
										
										
											2016-08-12 10:57:14 +08:00
										 |  |  | 		} | 
					
						
							|  |  |  | 		if err == nil { | 
					
						
							|  |  |  | 			for _, expected := range testCase.expectedListDir { | 
					
						
							|  |  |  | 				if !strings.Contains(strings.Join(dirList, ","), expected) { | 
					
						
							| 
									
										
										
										
											2017-01-17 09:05:00 +08:00
										 |  |  | 					t.Errorf("TestPosix case %d: Expected the directory listing to be \"%v\", but got \"%v\"", i+1, testCase.expectedListDir, dirList) | 
					
						
							| 
									
										
										
										
											2016-08-12 10:57:14 +08:00
										 |  |  | 				} | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-17 09:05:00 +08:00
										 |  |  | 	// TestPosix for permission denied.
 | 
					
						
							| 
									
										
										
										
											2017-01-19 04:24:34 +08:00
										 |  |  | 	if runtime.GOOS != globalWindowsOSName { | 
					
						
							| 
									
										
										
										
											2016-08-12 10:57:14 +08:00
										 |  |  | 		// Initialize posix storage layer for permission denied error.
 | 
					
						
							|  |  |  | 		posixStorage, err = newPosix("/usr") | 
					
						
							|  |  |  | 		if err != nil { | 
					
						
							|  |  |  | 			t.Errorf("Unable to initialize posix, %s", err) | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-10-18 07:38:46 +08:00
										 |  |  | 		if err = posixStorage.DeleteFile("bin", "yes"); err != errFileAccessDenied { | 
					
						
							|  |  |  | 			t.Errorf("expected: %s, got: %s", errFileAccessDenied, err) | 
					
						
							| 
									
										
										
										
											2016-08-12 10:57:14 +08:00
										 |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-17 09:05:00 +08:00
										 |  |  | 	// TestPosix for delete on an removed disk.
 | 
					
						
							| 
									
										
										
										
											2016-08-12 10:57:14 +08:00
										 |  |  | 	// should fail with disk not found.
 | 
					
						
							|  |  |  | 	err = posixDeletedStorage.DeleteFile("del-vol", "my-file") | 
					
						
							|  |  |  | 	if err != errDiskNotFound { | 
					
						
							|  |  |  | 		t.Errorf("Expected: \"Disk not found\", got \"%s\"", err) | 
					
						
							| 
									
										
										
										
											2016-07-04 02:17:08 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-17 09:05:00 +08:00
										 |  |  | // TestPosixDeleteFile - Series of test cases construct valid and invalid input data and validates the result and the error response.
 | 
					
						
							|  |  |  | func TestPosixDeleteFile(t *testing.T) { | 
					
						
							| 
									
										
										
										
											2016-07-30 16:26:19 +08:00
										 |  |  | 	// create posix test setup
 | 
					
						
							| 
									
										
										
										
											2016-08-12 10:57:14 +08:00
										 |  |  | 	posixStorage, path, err := newPosixTestSetup() | 
					
						
							| 
									
										
										
										
											2016-07-04 02:17:08 +08:00
										 |  |  | 	if err != nil { | 
					
						
							| 
									
										
										
										
											2016-07-30 16:26:19 +08:00
										 |  |  | 		t.Fatalf("Unable to create posix test setup, %s", err) | 
					
						
							| 
									
										
										
										
											2016-07-04 02:17:08 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | 	defer removeAll(path) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-12 10:57:14 +08:00
										 |  |  | 	// create posix test setup
 | 
					
						
							|  |  |  | 	posixDeletedStorage, diskPath, err := newPosixTestSetup() | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		t.Fatalf("Unable to create posix test setup, %s", err) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	// removing the disk, used to recreate disk not found error.
 | 
					
						
							|  |  |  | 	removeAll(diskPath) | 
					
						
							| 
									
										
										
										
											2016-07-04 02:17:08 +08:00
										 |  |  | 	// Setup test environment.
 | 
					
						
							| 
									
										
										
										
											2016-08-12 10:57:14 +08:00
										 |  |  | 	if err = posixStorage.MakeVol("success-vol"); err != nil { | 
					
						
							| 
									
										
										
										
											2016-07-04 02:17:08 +08:00
										 |  |  | 		t.Fatalf("Unable to create volume, %s", err) | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2016-08-12 10:57:14 +08:00
										 |  |  | 	if err = posixStorage.AppendFile("success-vol", "success-file", []byte("Hello, world")); err != nil { | 
					
						
							| 
									
										
										
										
											2016-07-04 02:17:08 +08:00
										 |  |  | 		t.Fatalf("Unable to create file, %s", err) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	testCases := []struct { | 
					
						
							| 
									
										
										
										
											2016-08-12 10:57:14 +08:00
										 |  |  | 		srcVol      string | 
					
						
							|  |  |  | 		srcPath     string | 
					
						
							|  |  |  | 		ioErrCnt    int | 
					
						
							| 
									
										
										
										
											2016-07-04 02:17:08 +08:00
										 |  |  | 		expectedErr error | 
					
						
							|  |  |  | 	}{ | 
					
						
							| 
									
										
										
										
											2017-01-17 09:05:00 +08:00
										 |  |  | 		// TestPosix case - 1.
 | 
					
						
							| 
									
										
										
										
											2016-08-12 10:57:14 +08:00
										 |  |  | 		// valid case with existing volume and file to delete.
 | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 			srcVol:      "success-vol", | 
					
						
							|  |  |  | 			srcPath:     "success-file", | 
					
						
							|  |  |  | 			ioErrCnt:    0, | 
					
						
							|  |  |  | 			expectedErr: nil, | 
					
						
							|  |  |  | 		}, | 
					
						
							| 
									
										
										
										
											2017-01-17 09:05:00 +08:00
										 |  |  | 		// TestPosix case - 2.
 | 
					
						
							| 
									
										
										
										
											2016-08-12 10:57:14 +08:00
										 |  |  | 		// The file was deleted in the last  case, so DeleteFile should fail.
 | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 			srcVol:      "success-vol", | 
					
						
							|  |  |  | 			srcPath:     "success-file", | 
					
						
							|  |  |  | 			ioErrCnt:    0, | 
					
						
							|  |  |  | 			expectedErr: errFileNotFound, | 
					
						
							|  |  |  | 		}, | 
					
						
							| 
									
										
										
										
											2017-01-17 09:05:00 +08:00
										 |  |  | 		// TestPosix case - 3.
 | 
					
						
							|  |  |  | 		// TestPosix case with io error count > max limit.
 | 
					
						
							| 
									
										
										
										
											2016-08-12 10:57:14 +08:00
										 |  |  | 		{ | 
					
						
							|  |  |  | 			srcVol:      "success-vol", | 
					
						
							|  |  |  | 			srcPath:     "success-file", | 
					
						
							|  |  |  | 			ioErrCnt:    6, | 
					
						
							|  |  |  | 			expectedErr: errFaultyDisk, | 
					
						
							|  |  |  | 		}, | 
					
						
							| 
									
										
										
										
											2017-01-17 09:05:00 +08:00
										 |  |  | 		// TestPosix case - 4.
 | 
					
						
							|  |  |  | 		// TestPosix case with segment of the volume name > 255.
 | 
					
						
							| 
									
										
										
										
											2016-08-12 10:57:14 +08:00
										 |  |  | 		{ | 
					
						
							|  |  |  | 			srcVol:      "my-obj-del-0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001", | 
					
						
							|  |  |  | 			srcPath:     "success-file", | 
					
						
							|  |  |  | 			ioErrCnt:    0, | 
					
						
							|  |  |  | 			expectedErr: errInvalidArgument, | 
					
						
							|  |  |  | 		}, | 
					
						
							| 
									
										
										
										
											2017-01-17 09:05:00 +08:00
										 |  |  | 		// TestPosix case - 5.
 | 
					
						
							|  |  |  | 		// TestPosix case with non-existent volume.
 | 
					
						
							| 
									
										
										
										
											2016-08-12 10:57:14 +08:00
										 |  |  | 		{ | 
					
						
							|  |  |  | 			srcVol:      "non-existent-vol", | 
					
						
							|  |  |  | 			srcPath:     "success-file", | 
					
						
							|  |  |  | 			ioErrCnt:    0, | 
					
						
							|  |  |  | 			expectedErr: errVolumeNotFound, | 
					
						
							|  |  |  | 		}, | 
					
						
							| 
									
										
										
										
											2017-01-17 09:05:00 +08:00
										 |  |  | 		// TestPosix case - 6.
 | 
					
						
							|  |  |  | 		// TestPosix case with src path segment > 255.
 | 
					
						
							| 
									
										
										
										
											2016-08-12 10:57:14 +08:00
										 |  |  | 		{ | 
					
						
							|  |  |  | 			srcVol:      "success-vol", | 
					
						
							|  |  |  | 			srcPath:     "my-obj-del-0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001", | 
					
						
							|  |  |  | 			ioErrCnt:    0, | 
					
						
							|  |  |  | 			expectedErr: errFileNameTooLong, | 
					
						
							|  |  |  | 		}, | 
					
						
							| 
									
										
										
										
											2016-07-04 02:17:08 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-12 10:57:14 +08:00
										 |  |  | 	for i, testCase := range testCases { | 
					
						
							|  |  |  | 		// setting ioErrCnt from the test case.
 | 
					
						
							|  |  |  | 		if posixType, ok := posixStorage.(*posix); ok { | 
					
						
							|  |  |  | 			// setting the io error count from as specified in the test case.
 | 
					
						
							|  |  |  | 			posixType.ioErrCount = int32(testCase.ioErrCnt) | 
					
						
							|  |  |  | 		} else { | 
					
						
							|  |  |  | 			t.Errorf("Expected the StorageAPI to be of type *posix") | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		if err = posixStorage.DeleteFile(testCase.srcVol, testCase.srcPath); err != testCase.expectedErr { | 
					
						
							| 
									
										
										
										
											2017-01-17 09:05:00 +08:00
										 |  |  | 			t.Errorf("TestPosix case %d: Expected: \"%s\", got: \"%s\"", i+1, testCase.expectedErr, err) | 
					
						
							| 
									
										
										
										
											2016-07-04 02:17:08 +08:00
										 |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-17 09:05:00 +08:00
										 |  |  | 	// TestPosix for permission denied.
 | 
					
						
							| 
									
										
										
										
											2017-01-19 04:24:34 +08:00
										 |  |  | 	if runtime.GOOS != globalWindowsOSName { | 
					
						
							| 
									
										
										
										
											2016-07-04 02:17:08 +08:00
										 |  |  | 		// Initialize posix storage layer for permission denied error.
 | 
					
						
							| 
									
										
										
										
											2016-08-12 10:57:14 +08:00
										 |  |  | 		posixStorage, err = newPosix("/usr") | 
					
						
							| 
									
										
										
										
											2016-07-04 02:17:08 +08:00
										 |  |  | 		if err != nil { | 
					
						
							| 
									
										
										
										
											2016-08-12 10:57:14 +08:00
										 |  |  | 			t.Errorf("Unable to initialize posix, %s", err) | 
					
						
							| 
									
										
										
										
											2016-07-04 02:17:08 +08:00
										 |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-10-18 07:38:46 +08:00
										 |  |  | 		if err = posixStorage.DeleteFile("bin", "yes"); err != errFileAccessDenied { | 
					
						
							|  |  |  | 			t.Errorf("expected: %s, got: %s", errFileAccessDenied, err) | 
					
						
							| 
									
										
										
										
											2016-07-04 02:17:08 +08:00
										 |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2016-08-12 10:57:14 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-17 09:05:00 +08:00
										 |  |  | 	// TestPosix for delete on an removed disk.
 | 
					
						
							| 
									
										
										
										
											2016-08-12 10:57:14 +08:00
										 |  |  | 	// should fail with disk not found.
 | 
					
						
							|  |  |  | 	err = posixDeletedStorage.DeleteFile("del-vol", "my-file") | 
					
						
							|  |  |  | 	if err != errDiskNotFound { | 
					
						
							|  |  |  | 		t.Errorf("Expected: \"Disk not found\", got \"%s\"", err) | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2016-07-04 02:17:08 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-17 09:05:00 +08:00
										 |  |  | // TestPosixReadFile - TestPosixs posix.ReadFile with wide range of cases and asserts the result and error response.
 | 
					
						
							|  |  |  | func TestPosixReadFile(t *testing.T) { | 
					
						
							| 
									
										
										
										
											2016-07-30 16:26:19 +08:00
										 |  |  | 	// create posix test setup
 | 
					
						
							| 
									
										
										
										
											2016-08-12 10:57:14 +08:00
										 |  |  | 	posixStorage, path, err := newPosixTestSetup() | 
					
						
							| 
									
										
										
										
											2016-07-29 12:57:11 +08:00
										 |  |  | 	if err != nil { | 
					
						
							| 
									
										
										
										
											2016-07-30 16:26:19 +08:00
										 |  |  | 		t.Fatalf("Unable to create posix test setup, %s", err) | 
					
						
							| 
									
										
										
										
											2016-07-29 12:57:11 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | 	defer removeAll(path) | 
					
						
							| 
									
										
										
										
											2016-08-12 10:57:14 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-07-30 16:26:19 +08:00
										 |  |  | 	volume := "success-vol" | 
					
						
							| 
									
										
										
										
											2016-07-29 12:57:11 +08:00
										 |  |  | 	// Setup test environment.
 | 
					
						
							| 
									
										
										
										
											2016-08-12 10:57:14 +08:00
										 |  |  | 	if err = posixStorage.MakeVol(volume); err != nil { | 
					
						
							| 
									
										
										
										
											2016-07-29 12:57:11 +08:00
										 |  |  | 		t.Fatalf("Unable to create volume, %s", err) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// Create directory to make errIsNotRegular
 | 
					
						
							|  |  |  | 	if err = os.Mkdir(slashpath.Join(path, "success-vol", "object-as-dir"), 0777); err != nil { | 
					
						
							|  |  |  | 		t.Fatalf("Unable to create directory, %s", err) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	testCases := []struct { | 
					
						
							| 
									
										
										
										
											2016-07-30 16:26:19 +08:00
										 |  |  | 		volume      string | 
					
						
							| 
									
										
										
										
											2016-07-29 12:57:11 +08:00
										 |  |  | 		fileName    string | 
					
						
							|  |  |  | 		offset      int64 | 
					
						
							|  |  |  | 		bufSize     int | 
					
						
							|  |  |  | 		expectedBuf []byte | 
					
						
							|  |  |  | 		expectedErr error | 
					
						
							|  |  |  | 	}{ | 
					
						
							|  |  |  | 		// Successful read at offset 0 and proper buffer size. - 1
 | 
					
						
							|  |  |  | 		{ | 
					
						
							| 
									
										
										
										
											2016-07-30 16:26:19 +08:00
										 |  |  | 			volume, "myobject", 0, 5, | 
					
						
							| 
									
										
										
										
											2016-07-29 12:57:11 +08:00
										 |  |  | 			[]byte("hello"), nil, | 
					
						
							|  |  |  | 		}, | 
					
						
							|  |  |  | 		// Success read at hierarchy. - 2
 | 
					
						
							|  |  |  | 		{ | 
					
						
							| 
									
										
										
										
											2016-07-30 16:26:19 +08:00
										 |  |  | 			volume, "path/to/my/object", 0, 5, | 
					
						
							| 
									
										
										
										
											2016-07-29 12:57:11 +08:00
										 |  |  | 			[]byte("hello"), nil, | 
					
						
							|  |  |  | 		}, | 
					
						
							|  |  |  | 		// One path segment length is 255 chars long. - 3
 | 
					
						
							|  |  |  | 		{ | 
					
						
							| 
									
										
										
										
											2016-07-30 16:26:19 +08:00
										 |  |  | 			volume, "path/to/my/object000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001", | 
					
						
							| 
									
										
										
										
											2016-07-29 12:57:11 +08:00
										 |  |  | 			0, 5, []byte("hello"), nil}, | 
					
						
							|  |  |  | 		// Whole path is 1024 characters long, success case. - 4
 | 
					
						
							|  |  |  | 		{ | 
					
						
							| 
									
										
										
										
											2016-07-30 16:26:19 +08:00
										 |  |  | 			volume, "level0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001/level0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002/level0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003/object000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001", | 
					
						
							| 
									
										
										
										
											2016-07-29 12:57:11 +08:00
										 |  |  | 			0, 5, []byte("hello"), | 
					
						
							|  |  |  | 			func() error { | 
					
						
							|  |  |  | 				// On darwin HFS does not support > 1024 characters.
 | 
					
						
							|  |  |  | 				if runtime.GOOS == "darwin" { | 
					
						
							|  |  |  | 					return errFileNameTooLong | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 				// On all other platforms return success.
 | 
					
						
							|  |  |  | 				return nil | 
					
						
							|  |  |  | 			}(), | 
					
						
							|  |  |  | 		}, | 
					
						
							|  |  |  | 		// Object is a directory. - 5
 | 
					
						
							|  |  |  | 		{ | 
					
						
							| 
									
										
										
										
											2016-07-30 16:26:19 +08:00
										 |  |  | 			volume, "object-as-dir", | 
					
						
							| 
									
										
										
										
											2016-07-29 12:57:11 +08:00
										 |  |  | 			0, 5, nil, errIsNotRegular}, | 
					
						
							|  |  |  | 		// One path segment length is > 255 chars long. - 6
 | 
					
						
							|  |  |  | 		{ | 
					
						
							| 
									
										
										
										
											2016-07-30 16:26:19 +08:00
										 |  |  | 			volume, "path/to/my/object0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001", | 
					
						
							| 
									
										
										
										
											2016-07-29 12:57:11 +08:00
										 |  |  | 			0, 5, nil, errFileNameTooLong}, | 
					
						
							|  |  |  | 		// Path length is > 1024 chars long. - 7
 | 
					
						
							|  |  |  | 		{ | 
					
						
							| 
									
										
										
										
											2016-07-30 16:26:19 +08:00
										 |  |  | 			volume, "level0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001/level0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002/level0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003/object000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001", | 
					
						
							| 
									
										
										
										
											2016-07-29 12:57:11 +08:00
										 |  |  | 			0, 5, nil, errFileNameTooLong}, | 
					
						
							|  |  |  | 		// Buffer size greater than object size. - 8
 | 
					
						
							|  |  |  | 		{ | 
					
						
							| 
									
										
										
										
											2016-07-30 16:26:19 +08:00
										 |  |  | 			volume, "myobject", 0, 16, | 
					
						
							| 
									
										
										
										
											2016-07-29 12:57:11 +08:00
										 |  |  | 			[]byte("hello, world"), | 
					
						
							|  |  |  | 			io.ErrUnexpectedEOF, | 
					
						
							|  |  |  | 		}, | 
					
						
							|  |  |  | 		// Reading from an offset success. - 9
 | 
					
						
							|  |  |  | 		{ | 
					
						
							| 
									
										
										
										
											2016-07-30 16:26:19 +08:00
										 |  |  | 			volume, "myobject", 7, 5, | 
					
						
							| 
									
										
										
										
											2016-07-29 12:57:11 +08:00
										 |  |  | 			[]byte("world"), nil, | 
					
						
							|  |  |  | 		}, | 
					
						
							|  |  |  | 		// Reading from an object but buffer size greater. - 10
 | 
					
						
							|  |  |  | 		{ | 
					
						
							| 
									
										
										
										
											2016-07-30 16:26:19 +08:00
										 |  |  | 			volume, "myobject", | 
					
						
							| 
									
										
										
										
											2016-07-29 12:57:11 +08:00
										 |  |  | 			7, 8, | 
					
						
							|  |  |  | 			[]byte("world"), | 
					
						
							|  |  |  | 			io.ErrUnexpectedEOF, | 
					
						
							|  |  |  | 		}, | 
					
						
							|  |  |  | 		// Seeking into a wrong offset, return PathError. - 11
 | 
					
						
							|  |  |  | 		{ | 
					
						
							| 
									
										
										
										
											2016-07-30 16:26:19 +08:00
										 |  |  | 			volume, "myobject", | 
					
						
							| 
									
										
										
										
											2016-07-29 12:57:11 +08:00
										 |  |  | 			-1, 5, | 
					
						
							|  |  |  | 			nil, | 
					
						
							|  |  |  | 			func() error { | 
					
						
							| 
									
										
										
										
											2017-01-19 04:24:34 +08:00
										 |  |  | 				if runtime.GOOS == globalWindowsOSName { | 
					
						
							| 
									
										
										
										
											2016-07-29 12:57:11 +08:00
										 |  |  | 					return &os.PathError{ | 
					
						
							|  |  |  | 						Op:   "seek", | 
					
						
							|  |  |  | 						Path: preparePath(slashpath.Join(path, "success-vol", "myobject")), | 
					
						
							| 
									
										
										
										
											2016-09-01 05:43:20 +08:00
										 |  |  | 						Err:  syscall.Errno(0x83), // ERROR_NEGATIVE_SEEK
 | 
					
						
							| 
									
										
										
										
											2016-07-29 12:57:11 +08:00
										 |  |  | 					} | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 				return &os.PathError{ | 
					
						
							|  |  |  | 					Op:   "seek", | 
					
						
							|  |  |  | 					Path: preparePath(slashpath.Join(path, "success-vol", "myobject")), | 
					
						
							|  |  |  | 					Err:  os.ErrInvalid, | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 			}(), | 
					
						
							|  |  |  | 		}, | 
					
						
							|  |  |  | 		// Seeking ahead returns io.EOF. - 12
 | 
					
						
							|  |  |  | 		{ | 
					
						
							| 
									
										
										
										
											2016-07-30 16:26:19 +08:00
										 |  |  | 			volume, "myobject", 14, 1, nil, io.EOF, | 
					
						
							|  |  |  | 		}, | 
					
						
							|  |  |  | 		// Empty volume name. - 13
 | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 			"", "myobject", 14, 1, nil, errInvalidArgument, | 
					
						
							|  |  |  | 		}, | 
					
						
							|  |  |  | 		// Empty filename name. - 14
 | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 			volume, "", 14, 1, nil, errIsNotRegular, | 
					
						
							|  |  |  | 		}, | 
					
						
							|  |  |  | 		// Non existent volume name - 15.
 | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 			"abcd", "", 14, 1, nil, errVolumeNotFound, | 
					
						
							|  |  |  | 		}, | 
					
						
							|  |  |  | 		// Non existent filename - 16.
 | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 			volume, "abcd", 14, 1, nil, errFileNotFound, | 
					
						
							| 
									
										
										
										
											2016-07-29 12:57:11 +08:00
										 |  |  | 		}, | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// Create all files needed during testing.
 | 
					
						
							|  |  |  | 	appendFiles := testCases[:4] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// Create test files for further reading.
 | 
					
						
							|  |  |  | 	for i, appendFile := range appendFiles { | 
					
						
							| 
									
										
										
										
											2016-08-12 10:57:14 +08:00
										 |  |  | 		err = posixStorage.AppendFile(volume, appendFile.fileName, []byte("hello, world")) | 
					
						
							| 
									
										
										
										
											2016-07-29 12:57:11 +08:00
										 |  |  | 		if err != appendFile.expectedErr { | 
					
						
							|  |  |  | 			t.Fatalf("Creating file failed: %d %#v, expected: %s, got: %s", i+1, appendFile, appendFile.expectedErr, err) | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// Following block validates all ReadFile test cases.
 | 
					
						
							|  |  |  | 	for i, testCase := range testCases { | 
					
						
							| 
									
										
										
										
											2016-08-12 10:57:14 +08:00
										 |  |  | 		var n int64 | 
					
						
							| 
									
										
										
										
											2016-07-29 12:57:11 +08:00
										 |  |  | 		// Common read buffer.
 | 
					
						
							|  |  |  | 		var buf = make([]byte, testCase.bufSize) | 
					
						
							| 
									
										
										
										
											2016-08-12 10:57:14 +08:00
										 |  |  | 		n, err = posixStorage.ReadFile(testCase.volume, testCase.fileName, testCase.offset, buf) | 
					
						
							| 
									
										
										
										
											2016-07-29 12:57:11 +08:00
										 |  |  | 		if err != nil && testCase.expectedErr != nil { | 
					
						
							|  |  |  | 			// Validate if the type string of the errors are an exact match.
 | 
					
						
							|  |  |  | 			if err.Error() != testCase.expectedErr.Error() { | 
					
						
							| 
									
										
										
										
											2017-01-19 04:24:34 +08:00
										 |  |  | 				if runtime.GOOS != globalWindowsOSName { | 
					
						
							| 
									
										
										
										
											2016-09-01 05:43:20 +08:00
										 |  |  | 					t.Errorf("Case: %d %#v, expected: %s, got: %s", i+1, testCase, testCase.expectedErr, err) | 
					
						
							|  |  |  | 				} else { | 
					
						
							|  |  |  | 					var resultErrno, expectErrno uintptr | 
					
						
							|  |  |  | 					if pathErr, ok := err.(*os.PathError); ok { | 
					
						
							|  |  |  | 						if errno, pok := pathErr.Err.(syscall.Errno); pok { | 
					
						
							|  |  |  | 							resultErrno = uintptr(errno) | 
					
						
							|  |  |  | 						} | 
					
						
							|  |  |  | 					} | 
					
						
							|  |  |  | 					if pathErr, ok := testCase.expectedErr.(*os.PathError); ok { | 
					
						
							|  |  |  | 						if errno, pok := pathErr.Err.(syscall.Errno); pok { | 
					
						
							|  |  |  | 							expectErrno = uintptr(errno) | 
					
						
							|  |  |  | 						} | 
					
						
							|  |  |  | 					} | 
					
						
							|  |  |  | 					if !(expectErrno != 0 && resultErrno != 0 && expectErrno == resultErrno) { | 
					
						
							|  |  |  | 						t.Errorf("Case: %d %#v, expected: %s, got: %s", i+1, testCase, testCase.expectedErr, err) | 
					
						
							|  |  |  | 					} | 
					
						
							|  |  |  | 				} | 
					
						
							| 
									
										
										
										
											2016-07-29 12:57:11 +08:00
										 |  |  | 			} | 
					
						
							|  |  |  | 			// Err unexpected EOF special case, where we verify we have provided a larger
 | 
					
						
							|  |  |  | 			// buffer than the data itself, but the results are in-fact valid. So we validate
 | 
					
						
							|  |  |  | 			// this error condition specifically treating it as a good condition with valid
 | 
					
						
							|  |  |  | 			// results. In this scenario return 'n' is always lesser than the input buffer.
 | 
					
						
							|  |  |  | 			if err == io.ErrUnexpectedEOF { | 
					
						
							|  |  |  | 				if !bytes.Equal(testCase.expectedBuf, buf[:n]) { | 
					
						
							|  |  |  | 					t.Errorf("Case: %d %#v, expected: \"%s\", got: \"%s\"", i+1, testCase, string(testCase.expectedBuf), string(buf[:testCase.bufSize])) | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 				if n > int64(len(buf)) { | 
					
						
							|  |  |  | 					t.Errorf("Case: %d %#v, expected: %d, got: %d", i+1, testCase, testCase.bufSize, n) | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		// ReadFile has returned success, but our expected error is non 'nil'.
 | 
					
						
							|  |  |  | 		if err == nil && err != testCase.expectedErr { | 
					
						
							|  |  |  | 			t.Errorf("Case: %d %#v, expected: %s, got :%s", i+1, testCase, testCase.expectedErr, err) | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		// Expected error retured, proceed further to validate the returned results.
 | 
					
						
							|  |  |  | 		if err == nil && err == testCase.expectedErr { | 
					
						
							|  |  |  | 			if !bytes.Equal(testCase.expectedBuf, buf) { | 
					
						
							|  |  |  | 				t.Errorf("Case: %d %#v, expected: \"%s\", got: \"%s\"", i+1, testCase, string(testCase.expectedBuf), string(buf[:testCase.bufSize])) | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 			if n != int64(testCase.bufSize) { | 
					
						
							|  |  |  | 				t.Errorf("Case: %d %#v, expected: %d, got: %d", i+1, testCase, testCase.bufSize, n) | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-17 09:05:00 +08:00
										 |  |  | 	// TestPosix for permission denied.
 | 
					
						
							| 
									
										
										
										
											2016-07-29 12:57:11 +08:00
										 |  |  | 	if runtime.GOOS == "linux" { | 
					
						
							|  |  |  | 		// Initialize posix storage layer for permission denied error.
 | 
					
						
							| 
									
										
										
										
											2016-08-12 10:57:14 +08:00
										 |  |  | 		posixStorage, err = newPosix("/") | 
					
						
							| 
									
										
										
										
											2016-07-29 12:57:11 +08:00
										 |  |  | 		if err != nil { | 
					
						
							|  |  |  | 			t.Errorf("Unable to initialize posix, %s", err) | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		if err == nil { | 
					
						
							|  |  |  | 			// Common read buffer.
 | 
					
						
							|  |  |  | 			var buf = make([]byte, 10) | 
					
						
							| 
									
										
										
										
											2016-08-12 10:57:14 +08:00
										 |  |  | 			if _, err = posixStorage.ReadFile("proc", "1/fd", 0, buf); err != errFileAccessDenied { | 
					
						
							| 
									
										
										
										
											2016-07-29 12:57:11 +08:00
										 |  |  | 				t.Errorf("expected: %s, got: %s", errFileAccessDenied, err) | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2016-08-12 10:57:14 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-17 09:05:00 +08:00
										 |  |  | 	// TestPosixing for faulty disk.
 | 
					
						
							| 
									
										
										
										
											2016-08-12 10:57:14 +08:00
										 |  |  | 	// setting ioErrCnt to 6.
 | 
					
						
							|  |  |  | 	// should fail with errFaultyDisk.
 | 
					
						
							|  |  |  | 	if posixType, ok := posixStorage.(*posix); ok { | 
					
						
							|  |  |  | 		// setting the io error count from as specified in the test case.
 | 
					
						
							|  |  |  | 		posixType.ioErrCount = int32(6) | 
					
						
							|  |  |  | 		// Common read buffer.
 | 
					
						
							|  |  |  | 		var buf = make([]byte, 10) | 
					
						
							|  |  |  | 		_, err = posixType.ReadFile("abc", "yes", 0, buf) | 
					
						
							|  |  |  | 		if err != errFaultyDisk { | 
					
						
							|  |  |  | 			t.Fatalf("Expected \"Faulty Disk\", got: \"%s\"", err) | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} else { | 
					
						
							|  |  |  | 		t.Fatalf("Expected the StorageAPI to be of type *posix") | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2016-07-29 12:57:11 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-17 09:05:00 +08:00
										 |  |  | // TestPosix posix.AppendFile()
 | 
					
						
							|  |  |  | func TestPosixAppendFile(t *testing.T) { | 
					
						
							| 
									
										
										
										
											2016-07-30 16:26:19 +08:00
										 |  |  | 	// create posix test setup
 | 
					
						
							| 
									
										
										
										
											2016-08-12 10:57:14 +08:00
										 |  |  | 	posixStorage, path, err := newPosixTestSetup() | 
					
						
							| 
									
										
										
										
											2016-07-04 02:17:08 +08:00
										 |  |  | 	if err != nil { | 
					
						
							| 
									
										
										
										
											2016-07-30 16:26:19 +08:00
										 |  |  | 		t.Fatalf("Unable to create posix test setup, %s", err) | 
					
						
							| 
									
										
										
										
											2016-07-04 02:17:08 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | 	defer removeAll(path) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// Setup test environment.
 | 
					
						
							| 
									
										
										
										
											2016-08-12 10:57:14 +08:00
										 |  |  | 	if err = posixStorage.MakeVol("success-vol"); err != nil { | 
					
						
							| 
									
										
										
										
											2016-07-04 02:17:08 +08:00
										 |  |  | 		t.Fatalf("Unable to create volume, %s", err) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// Create directory to make errIsNotRegular
 | 
					
						
							|  |  |  | 	if err = os.Mkdir(slashpath.Join(path, "success-vol", "object-as-dir"), 0777); err != nil { | 
					
						
							|  |  |  | 		t.Fatalf("Unable to create directory, %s", err) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	testCases := []struct { | 
					
						
							|  |  |  | 		fileName    string | 
					
						
							|  |  |  | 		expectedErr error | 
					
						
							|  |  |  | 	}{ | 
					
						
							|  |  |  | 		{"myobject", nil}, | 
					
						
							|  |  |  | 		{"path/to/my/object", nil}, | 
					
						
							| 
									
										
										
										
											2017-01-17 09:05:00 +08:00
										 |  |  | 		// TestPosix to append to previously created file.
 | 
					
						
							| 
									
										
										
										
											2016-07-04 02:17:08 +08:00
										 |  |  | 		{"myobject", nil}, | 
					
						
							| 
									
										
										
										
											2017-01-17 09:05:00 +08:00
										 |  |  | 		// TestPosix to use same path of previously created file.
 | 
					
						
							| 
									
										
										
										
											2016-07-04 02:17:08 +08:00
										 |  |  | 		{"path/to/my/testobject", nil}, | 
					
						
							|  |  |  | 		// One path segment length is 255 chars long.
 | 
					
						
							|  |  |  | 		{"path/to/my/object000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001", nil}, | 
					
						
							|  |  |  | 		{"object-as-dir", errIsNotRegular}, | 
					
						
							|  |  |  | 		// path segment uses previously uploaded object.
 | 
					
						
							|  |  |  | 		{"myobject/testobject", errFileAccessDenied}, | 
					
						
							|  |  |  | 		// One path segment length is > 255 chars long.
 | 
					
						
							|  |  |  | 		{"path/to/my/object0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001", errFileNameTooLong}, | 
					
						
							|  |  |  | 		// path length is > 1024 chars long.
 | 
					
						
							|  |  |  | 		{"level0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001/level0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002/level0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003/object000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001", errFileNameTooLong}, | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// Add path length > 1024 test specially as OS X system does not support 1024 long path.
 | 
					
						
							|  |  |  | 	err = errFileNameTooLong | 
					
						
							|  |  |  | 	if runtime.GOOS != "darwin" { | 
					
						
							|  |  |  | 		err = nil | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	// path length is 1024 chars long.
 | 
					
						
							|  |  |  | 	testCases = append(testCases, struct { | 
					
						
							|  |  |  | 		fileName    string | 
					
						
							|  |  |  | 		expectedErr error | 
					
						
							|  |  |  | 	}{"level0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001/level0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002/level0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003/object000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001", err}) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	for _, testCase := range testCases { | 
					
						
							| 
									
										
										
										
											2016-08-12 10:57:14 +08:00
										 |  |  | 		if err = posixStorage.AppendFile("success-vol", testCase.fileName, []byte("hello, world")); err != testCase.expectedErr { | 
					
						
							|  |  |  | 			t.Errorf("Case: %s, expected: %s, got: %s", testCase, testCase.expectedErr, err) | 
					
						
							| 
									
										
										
										
											2016-07-04 02:17:08 +08:00
										 |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-17 09:05:00 +08:00
										 |  |  | 	// TestPosix for permission denied.
 | 
					
						
							| 
									
										
										
										
											2017-01-19 04:24:34 +08:00
										 |  |  | 	if runtime.GOOS != globalWindowsOSName { | 
					
						
							| 
									
										
										
										
											2016-07-04 02:17:08 +08:00
										 |  |  | 		// Initialize posix storage layer for permission denied error.
 | 
					
						
							| 
									
										
										
										
											2016-08-12 10:57:14 +08:00
										 |  |  | 		posixStorage, err = newPosix("/usr") | 
					
						
							| 
									
										
										
										
											2016-07-04 02:17:08 +08:00
										 |  |  | 		if err != nil { | 
					
						
							|  |  |  | 			t.Fatalf("Unable to initialize posix, %s", err) | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-12 10:57:14 +08:00
										 |  |  | 		if err = posixStorage.AppendFile("bin", "yes", []byte("hello, world")); !os.IsPermission(err) { | 
					
						
							|  |  |  | 			t.Errorf("expected: Permission error, got: %s", err) | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2017-01-17 09:05:00 +08:00
										 |  |  | 	// TestPosix case with invalid volume name.
 | 
					
						
							| 
									
										
										
										
											2016-08-12 10:57:14 +08:00
										 |  |  | 	// A valid volume name should be atleast of size 3.
 | 
					
						
							|  |  |  | 	err = posixStorage.AppendFile("bn", "yes", []byte("hello, world")) | 
					
						
							|  |  |  | 	if err != errInvalidArgument { | 
					
						
							|  |  |  | 		t.Fatalf("expected: \"Invalid argument error\", got: \"%s\"", err) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-17 09:05:00 +08:00
										 |  |  | 	// TestPosix case with IO error count > max limit.
 | 
					
						
							| 
									
										
										
										
											2016-08-12 10:57:14 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	// setting ioErrCnt to 6.
 | 
					
						
							|  |  |  | 	// should fail with errFaultyDisk.
 | 
					
						
							|  |  |  | 	if posixType, ok := posixStorage.(*posix); ok { | 
					
						
							|  |  |  | 		// setting the io error count from as specified in the test case.
 | 
					
						
							|  |  |  | 		posixType.ioErrCount = int32(6) | 
					
						
							|  |  |  | 		err = posixType.AppendFile("abc", "yes", []byte("hello, world")) | 
					
						
							|  |  |  | 		if err != errFaultyDisk { | 
					
						
							|  |  |  | 			t.Fatalf("Expected \"Faulty Disk\", got: \"%s\"", err) | 
					
						
							| 
									
										
										
										
											2016-07-04 02:17:08 +08:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2016-08-12 10:57:14 +08:00
										 |  |  | 	} else { | 
					
						
							|  |  |  | 		t.Fatalf("Expected the StorageAPI to be of type *posix") | 
					
						
							| 
									
										
										
										
											2016-10-30 03:44:44 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-17 09:05:00 +08:00
										 |  |  | // TestPosix posix.PrepareFile()
 | 
					
						
							|  |  |  | func TestPosixPrepareFile(t *testing.T) { | 
					
						
							| 
									
										
										
										
											2016-10-30 03:44:44 +08:00
										 |  |  | 	// create posix test setup
 | 
					
						
							|  |  |  | 	posixStorage, path, err := newPosixTestSetup() | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		t.Fatalf("Unable to create posix test setup, %s", err) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	defer removeAll(path) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// Setup test environment.
 | 
					
						
							|  |  |  | 	if err = posixStorage.MakeVol("success-vol"); err != nil { | 
					
						
							|  |  |  | 		t.Fatalf("Unable to create volume, %s", err) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if err = os.Mkdir(slashpath.Join(path, "success-vol", "object-as-dir"), 0777); err != nil { | 
					
						
							|  |  |  | 		t.Fatalf("Unable to create directory, %s", err) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	testCases := []struct { | 
					
						
							|  |  |  | 		fileName    string | 
					
						
							|  |  |  | 		expectedErr error | 
					
						
							|  |  |  | 	}{ | 
					
						
							|  |  |  | 		{"myobject", nil}, | 
					
						
							|  |  |  | 		{"path/to/my/object", nil}, | 
					
						
							| 
									
										
										
										
											2017-01-17 09:05:00 +08:00
										 |  |  | 		// TestPosix to append to previously created file.
 | 
					
						
							| 
									
										
										
										
											2016-10-30 03:44:44 +08:00
										 |  |  | 		{"myobject", nil}, | 
					
						
							| 
									
										
										
										
											2017-01-17 09:05:00 +08:00
										 |  |  | 		// TestPosix to use same path of previously created file.
 | 
					
						
							| 
									
										
										
										
											2016-10-30 03:44:44 +08:00
										 |  |  | 		{"path/to/my/testobject", nil}, | 
					
						
							|  |  |  | 		{"object-as-dir", errIsNotRegular}, | 
					
						
							|  |  |  | 		// path segment uses previously uploaded object.
 | 
					
						
							|  |  |  | 		{"myobject/testobject", errFileAccessDenied}, | 
					
						
							|  |  |  | 		// One path segment length is > 255 chars long.
 | 
					
						
							|  |  |  | 		{"path/to/my/object0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001", errFileNameTooLong}, | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// Add path length > 1024 test specially as OS X system does not support 1024 long path.
 | 
					
						
							|  |  |  | 	err = errFileNameTooLong | 
					
						
							|  |  |  | 	if runtime.GOOS != "darwin" { | 
					
						
							|  |  |  | 		err = nil | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	// path length is 1024 chars long.
 | 
					
						
							|  |  |  | 	testCases = append(testCases, struct { | 
					
						
							|  |  |  | 		fileName    string | 
					
						
							|  |  |  | 		expectedErr error | 
					
						
							|  |  |  | 	}{"level0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001/level0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002/level0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003/object000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001", err}) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	for _, testCase := range testCases { | 
					
						
							|  |  |  | 		if err = posixStorage.PrepareFile("success-vol", testCase.fileName, 16); err != testCase.expectedErr { | 
					
						
							|  |  |  | 			t.Errorf("Case: %s, expected: %s, got: %s", testCase, testCase.expectedErr, err) | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-17 09:05:00 +08:00
										 |  |  | 	// TestPosix for permission denied.
 | 
					
						
							| 
									
										
										
										
											2017-01-19 04:24:34 +08:00
										 |  |  | 	if runtime.GOOS != globalWindowsOSName { | 
					
						
							| 
									
										
										
										
											2016-10-30 03:44:44 +08:00
										 |  |  | 		// Initialize posix storage layer for permission denied error.
 | 
					
						
							|  |  |  | 		posixStorage, err = newPosix("/usr") | 
					
						
							|  |  |  | 		if err != nil { | 
					
						
							|  |  |  | 			t.Fatalf("Unable to initialize posix, %s", err) | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		if err = posixStorage.PrepareFile("bin", "yes", 16); !os.IsPermission(err) { | 
					
						
							|  |  |  | 			t.Errorf("expected: Permission error, got: %s", err) | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-17 09:05:00 +08:00
										 |  |  | 	// TestPosix case with invalid file size which should be strictly positive
 | 
					
						
							| 
									
										
										
										
											2016-10-30 03:44:44 +08:00
										 |  |  | 	err = posixStorage.PrepareFile("bn", "yes", -3) | 
					
						
							|  |  |  | 	if err != errInvalidArgument { | 
					
						
							|  |  |  | 		t.Fatalf("should fail: %v", err) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-17 09:05:00 +08:00
										 |  |  | 	// TestPosix case with invalid volume name.
 | 
					
						
							| 
									
										
										
										
											2016-10-30 03:44:44 +08:00
										 |  |  | 	// A valid volume name should be atleast of size 3.
 | 
					
						
							|  |  |  | 	err = posixStorage.PrepareFile("bn", "yes", 16) | 
					
						
							|  |  |  | 	if err != errInvalidArgument { | 
					
						
							|  |  |  | 		t.Fatalf("expected: \"Invalid argument error\", got: \"%s\"", err) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-17 09:05:00 +08:00
										 |  |  | 	// TestPosix case with IO error count > max limit.
 | 
					
						
							| 
									
										
										
										
											2016-10-30 03:44:44 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	// setting ioErrCnt to 6.
 | 
					
						
							|  |  |  | 	// should fail with errFaultyDisk.
 | 
					
						
							|  |  |  | 	if posixType, ok := posixStorage.(*posix); ok { | 
					
						
							|  |  |  | 		// setting the io error count from as specified in the test case.
 | 
					
						
							|  |  |  | 		posixType.ioErrCount = int32(6) | 
					
						
							|  |  |  | 		err = posixType.PrepareFile("abc", "yes", 16) | 
					
						
							|  |  |  | 		if err != errFaultyDisk { | 
					
						
							|  |  |  | 			t.Fatalf("Expected \"Faulty Disk\", got: \"%s\"", err) | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} else { | 
					
						
							|  |  |  | 		t.Fatalf("Expected the StorageAPI to be of type *posix") | 
					
						
							| 
									
										
										
										
											2016-07-04 02:17:08 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-17 09:05:00 +08:00
										 |  |  | // TestPosix posix.RenameFile()
 | 
					
						
							|  |  |  | func TestPosixRenameFile(t *testing.T) { | 
					
						
							| 
									
										
										
										
											2016-07-30 16:26:19 +08:00
										 |  |  | 	// create posix test setup
 | 
					
						
							| 
									
										
										
										
											2016-08-12 10:57:14 +08:00
										 |  |  | 	posixStorage, path, err := newPosixTestSetup() | 
					
						
							| 
									
										
										
										
											2016-07-04 02:17:08 +08:00
										 |  |  | 	if err != nil { | 
					
						
							| 
									
										
										
										
											2016-07-30 16:26:19 +08:00
										 |  |  | 		t.Fatalf("Unable to create posix test setup, %s", err) | 
					
						
							| 
									
										
										
										
											2016-07-04 02:17:08 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | 	defer removeAll(path) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// Setup test environment.
 | 
					
						
							| 
									
										
										
										
											2016-08-12 10:57:14 +08:00
										 |  |  | 	if err := posixStorage.MakeVol("src-vol"); err != nil { | 
					
						
							| 
									
										
										
										
											2016-07-04 02:17:08 +08:00
										 |  |  | 		t.Fatalf("Unable to create volume, %s", err) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-12 10:57:14 +08:00
										 |  |  | 	if err := posixStorage.MakeVol("dest-vol"); err != nil { | 
					
						
							| 
									
										
										
										
											2016-07-04 02:17:08 +08:00
										 |  |  | 		t.Fatalf("Unable to create volume, %s", err) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-12 10:57:14 +08:00
										 |  |  | 	if err := posixStorage.AppendFile("src-vol", "file1", []byte("Hello, world")); err != nil { | 
					
						
							| 
									
										
										
										
											2016-07-04 02:17:08 +08:00
										 |  |  | 		t.Fatalf("Unable to create file, %s", err) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-12 10:57:14 +08:00
										 |  |  | 	if err := posixStorage.AppendFile("src-vol", "file2", []byte("Hello, world")); err != nil { | 
					
						
							|  |  |  | 		t.Fatalf("Unable to create file, %s", err) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	if err := posixStorage.AppendFile("src-vol", "file3", []byte("Hello, world")); err != nil { | 
					
						
							|  |  |  | 		t.Fatalf("Unable to create file, %s", err) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	if err := posixStorage.AppendFile("src-vol", "file4", []byte("Hello, world")); err != nil { | 
					
						
							| 
									
										
										
										
											2016-07-04 02:17:08 +08:00
										 |  |  | 		t.Fatalf("Unable to create file, %s", err) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-12 10:57:14 +08:00
										 |  |  | 	if err := posixStorage.AppendFile("src-vol", "file5", []byte("Hello, world")); err != nil { | 
					
						
							|  |  |  | 		t.Fatalf("Unable to create file, %s", err) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	if err := posixStorage.AppendFile("src-vol", "path/to/file1", []byte("Hello, world")); err != nil { | 
					
						
							| 
									
										
										
										
											2016-07-04 02:17:08 +08:00
										 |  |  | 		t.Fatalf("Unable to create file, %s", err) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	testCases := []struct { | 
					
						
							| 
									
										
										
										
											2016-08-12 10:57:14 +08:00
										 |  |  | 		srcVol      string | 
					
						
							|  |  |  | 		destVol     string | 
					
						
							| 
									
										
										
										
											2016-07-04 02:17:08 +08:00
										 |  |  | 		srcPath     string | 
					
						
							|  |  |  | 		destPath    string | 
					
						
							| 
									
										
										
										
											2016-08-12 10:57:14 +08:00
										 |  |  | 		ioErrCnt    int | 
					
						
							| 
									
										
										
										
											2016-07-04 02:17:08 +08:00
										 |  |  | 		expectedErr error | 
					
						
							|  |  |  | 	}{ | 
					
						
							| 
									
										
										
										
											2017-01-17 09:05:00 +08:00
										 |  |  | 		// TestPosix case - 1.
 | 
					
						
							| 
									
										
										
										
											2016-08-12 10:57:14 +08:00
										 |  |  | 		{ | 
					
						
							|  |  |  | 			srcVol:      "src-vol", | 
					
						
							|  |  |  | 			destVol:     "dest-vol", | 
					
						
							|  |  |  | 			srcPath:     "file1", | 
					
						
							|  |  |  | 			destPath:    "file-one", | 
					
						
							|  |  |  | 			ioErrCnt:    0, | 
					
						
							|  |  |  | 			expectedErr: nil, | 
					
						
							|  |  |  | 		}, | 
					
						
							| 
									
										
										
										
											2017-01-17 09:05:00 +08:00
										 |  |  | 		// TestPosix case - 2.
 | 
					
						
							| 
									
										
										
										
											2016-08-12 10:57:14 +08:00
										 |  |  | 		{ | 
					
						
							|  |  |  | 			srcVol:      "src-vol", | 
					
						
							|  |  |  | 			destVol:     "dest-vol", | 
					
						
							|  |  |  | 			srcPath:     "path/", | 
					
						
							|  |  |  | 			destPath:    "new-path/", | 
					
						
							|  |  |  | 			ioErrCnt:    0, | 
					
						
							|  |  |  | 			expectedErr: nil, | 
					
						
							|  |  |  | 		}, | 
					
						
							| 
									
										
										
										
											2017-01-17 09:05:00 +08:00
										 |  |  | 		// TestPosix case - 3.
 | 
					
						
							|  |  |  | 		// TestPosix to overwrite destination file.
 | 
					
						
							| 
									
										
										
										
											2016-08-12 10:57:14 +08:00
										 |  |  | 		{ | 
					
						
							|  |  |  | 			srcVol:      "src-vol", | 
					
						
							|  |  |  | 			destVol:     "dest-vol", | 
					
						
							|  |  |  | 			srcPath:     "file2", | 
					
						
							|  |  |  | 			destPath:    "file-one", | 
					
						
							|  |  |  | 			ioErrCnt:    0, | 
					
						
							|  |  |  | 			expectedErr: nil, | 
					
						
							|  |  |  | 		}, | 
					
						
							| 
									
										
										
										
											2017-01-17 09:05:00 +08:00
										 |  |  | 		// TestPosix case - 4.
 | 
					
						
							|  |  |  | 		// TestPosix case with io error count set to 1.
 | 
					
						
							| 
									
										
										
										
											2016-08-12 10:57:14 +08:00
										 |  |  | 		// expected not to fail.
 | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 			srcVol:      "src-vol", | 
					
						
							|  |  |  | 			destVol:     "dest-vol", | 
					
						
							|  |  |  | 			srcPath:     "file3", | 
					
						
							|  |  |  | 			destPath:    "file-two", | 
					
						
							|  |  |  | 			ioErrCnt:    1, | 
					
						
							|  |  |  | 			expectedErr: nil, | 
					
						
							|  |  |  | 		}, | 
					
						
							| 
									
										
										
										
											2017-01-17 09:05:00 +08:00
										 |  |  | 		// TestPosix case - 5.
 | 
					
						
							|  |  |  | 		// TestPosix case with io error count set to maximum allowed count.
 | 
					
						
							| 
									
										
										
										
											2016-08-12 10:57:14 +08:00
										 |  |  | 		// expected not to fail.
 | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 			srcVol:      "src-vol", | 
					
						
							|  |  |  | 			destVol:     "dest-vol", | 
					
						
							|  |  |  | 			srcPath:     "file4", | 
					
						
							|  |  |  | 			destPath:    "file-three", | 
					
						
							|  |  |  | 			ioErrCnt:    5, | 
					
						
							|  |  |  | 			expectedErr: nil, | 
					
						
							|  |  |  | 		}, | 
					
						
							| 
									
										
										
										
											2017-01-17 09:05:00 +08:00
										 |  |  | 		// TestPosix case - 6.
 | 
					
						
							|  |  |  | 		// TestPosix case with non-existent source file.
 | 
					
						
							| 
									
										
										
										
											2016-08-12 10:57:14 +08:00
										 |  |  | 		{ | 
					
						
							|  |  |  | 			srcVol:      "src-vol", | 
					
						
							|  |  |  | 			destVol:     "dest-vol", | 
					
						
							|  |  |  | 			srcPath:     "non-existent-file", | 
					
						
							|  |  |  | 			destPath:    "file-three", | 
					
						
							|  |  |  | 			ioErrCnt:    0, | 
					
						
							|  |  |  | 			expectedErr: errFileNotFound, | 
					
						
							|  |  |  | 		}, | 
					
						
							| 
									
										
										
										
											2017-01-17 09:05:00 +08:00
										 |  |  | 		// TestPosix case - 7.
 | 
					
						
							|  |  |  | 		// TestPosix to check failure of source and destination are not same type.
 | 
					
						
							| 
									
										
										
										
											2016-08-12 10:57:14 +08:00
										 |  |  | 		{ | 
					
						
							|  |  |  | 			srcVol:      "src-vol", | 
					
						
							|  |  |  | 			destVol:     "dest-vol", | 
					
						
							|  |  |  | 			srcPath:     "path/", | 
					
						
							|  |  |  | 			destPath:    "file-one", | 
					
						
							|  |  |  | 			ioErrCnt:    0, | 
					
						
							|  |  |  | 			expectedErr: errFileAccessDenied, | 
					
						
							|  |  |  | 		}, | 
					
						
							| 
									
										
										
										
											2017-01-17 09:05:00 +08:00
										 |  |  | 		// TestPosix case - 8.
 | 
					
						
							|  |  |  | 		// TestPosix to check failure of destination directory exists.
 | 
					
						
							| 
									
										
										
										
											2016-08-12 10:57:14 +08:00
										 |  |  | 		{ | 
					
						
							|  |  |  | 			srcVol:      "src-vol", | 
					
						
							|  |  |  | 			destVol:     "dest-vol", | 
					
						
							|  |  |  | 			srcPath:     "path/", | 
					
						
							|  |  |  | 			destPath:    "new-path/", | 
					
						
							|  |  |  | 			ioErrCnt:    0, | 
					
						
							|  |  |  | 			expectedErr: errFileAccessDenied, | 
					
						
							|  |  |  | 		}, | 
					
						
							| 
									
										
										
										
											2017-01-17 09:05:00 +08:00
										 |  |  | 		// TestPosix case - 9.
 | 
					
						
							|  |  |  | 		// TestPosix case with io error count is greater than maxAllowedIOError.
 | 
					
						
							| 
									
										
										
										
											2016-08-12 10:57:14 +08:00
										 |  |  | 		{ | 
					
						
							|  |  |  | 			srcVol:      "src-vol", | 
					
						
							|  |  |  | 			destVol:     "dest-vol", | 
					
						
							|  |  |  | 			srcPath:     "path/", | 
					
						
							|  |  |  | 			destPath:    "new-path/", | 
					
						
							|  |  |  | 			ioErrCnt:    6, | 
					
						
							|  |  |  | 			expectedErr: errFaultyDisk, | 
					
						
							|  |  |  | 		}, | 
					
						
							| 
									
										
										
										
											2017-01-17 09:05:00 +08:00
										 |  |  | 		// TestPosix case - 10.
 | 
					
						
							|  |  |  | 		// TestPosix case with source being a file and destination being a directory.
 | 
					
						
							| 
									
										
										
										
											2016-08-12 10:57:14 +08:00
										 |  |  | 		// Either both have to be files or directories.
 | 
					
						
							|  |  |  | 		// Expecting to fail with `errFileAccessDenied`.
 | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 			srcVol:      "src-vol", | 
					
						
							|  |  |  | 			destVol:     "dest-vol", | 
					
						
							|  |  |  | 			srcPath:     "file4", | 
					
						
							|  |  |  | 			destPath:    "new-path/", | 
					
						
							|  |  |  | 			ioErrCnt:    0, | 
					
						
							|  |  |  | 			expectedErr: errFileAccessDenied, | 
					
						
							|  |  |  | 		}, | 
					
						
							| 
									
										
										
										
											2017-01-17 09:05:00 +08:00
										 |  |  | 		// TestPosix case - 11.
 | 
					
						
							|  |  |  | 		// TestPosix case with non-existent source volume.
 | 
					
						
							| 
									
										
										
										
											2016-08-12 10:57:14 +08:00
										 |  |  | 		// Expecting to fail with `errVolumeNotFound`.
 | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 			srcVol:      "src-vol-non-existent", | 
					
						
							|  |  |  | 			destVol:     "dest-vol", | 
					
						
							|  |  |  | 			srcPath:     "file4", | 
					
						
							|  |  |  | 			destPath:    "new-path/", | 
					
						
							|  |  |  | 			ioErrCnt:    0, | 
					
						
							|  |  |  | 			expectedErr: errVolumeNotFound, | 
					
						
							|  |  |  | 		}, | 
					
						
							| 
									
										
										
										
											2017-01-17 09:05:00 +08:00
										 |  |  | 		// TestPosix case - 12.
 | 
					
						
							|  |  |  | 		// TestPosix case with non-existent destination volume.
 | 
					
						
							| 
									
										
										
										
											2016-08-12 10:57:14 +08:00
										 |  |  | 		// Expecting to fail with `errVolumeNotFound`.
 | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 			srcVol:      "src-vol", | 
					
						
							|  |  |  | 			destVol:     "dest-vol-non-existent", | 
					
						
							|  |  |  | 			srcPath:     "file4", | 
					
						
							|  |  |  | 			destPath:    "new-path/", | 
					
						
							|  |  |  | 			ioErrCnt:    0, | 
					
						
							|  |  |  | 			expectedErr: errVolumeNotFound, | 
					
						
							|  |  |  | 		}, | 
					
						
							| 
									
										
										
										
											2017-01-17 09:05:00 +08:00
										 |  |  | 		// TestPosix case - 13.
 | 
					
						
							|  |  |  | 		// TestPosix case with invalid src volume name. Length should be atleast 3.
 | 
					
						
							| 
									
										
										
										
											2016-08-12 10:57:14 +08:00
										 |  |  | 		// Expecting to fail with `errInvalidArgument`.
 | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 			srcVol:      "ab", | 
					
						
							|  |  |  | 			destVol:     "dest-vol-non-existent", | 
					
						
							|  |  |  | 			srcPath:     "file4", | 
					
						
							|  |  |  | 			destPath:    "new-path/", | 
					
						
							|  |  |  | 			ioErrCnt:    0, | 
					
						
							|  |  |  | 			expectedErr: errInvalidArgument, | 
					
						
							|  |  |  | 		}, | 
					
						
							| 
									
										
										
										
											2017-01-17 09:05:00 +08:00
										 |  |  | 		// TestPosix case - 14.
 | 
					
						
							|  |  |  | 		// TestPosix case with invalid destination volume name. Length should be atleast 3.
 | 
					
						
							| 
									
										
										
										
											2016-08-12 10:57:14 +08:00
										 |  |  | 		// Expecting to fail with `errInvalidArgument`.
 | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 			srcVol:      "abcd", | 
					
						
							|  |  |  | 			destVol:     "ef", | 
					
						
							|  |  |  | 			srcPath:     "file4", | 
					
						
							|  |  |  | 			destPath:    "new-path/", | 
					
						
							|  |  |  | 			ioErrCnt:    0, | 
					
						
							|  |  |  | 			expectedErr: errInvalidArgument, | 
					
						
							|  |  |  | 		}, | 
					
						
							| 
									
										
										
										
											2017-01-17 09:05:00 +08:00
										 |  |  | 		// TestPosix case - 15.
 | 
					
						
							|  |  |  | 		// TestPosix case with invalid destination volume name. Length should be atleast 3.
 | 
					
						
							| 
									
										
										
										
											2016-08-12 10:57:14 +08:00
										 |  |  | 		// Expecting to fail with `errInvalidArgument`.
 | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 			srcVol:      "abcd", | 
					
						
							|  |  |  | 			destVol:     "ef", | 
					
						
							|  |  |  | 			srcPath:     "file4", | 
					
						
							|  |  |  | 			destPath:    "new-path/", | 
					
						
							|  |  |  | 			ioErrCnt:    0, | 
					
						
							|  |  |  | 			expectedErr: errInvalidArgument, | 
					
						
							|  |  |  | 		}, | 
					
						
							| 
									
										
										
										
											2017-01-17 09:05:00 +08:00
										 |  |  | 		// TestPosix case - 16.
 | 
					
						
							|  |  |  | 		// TestPosix case with the parent of the destination being a file.
 | 
					
						
							| 
									
										
										
										
											2016-08-12 10:57:14 +08:00
										 |  |  | 		// expected to fail with `errFileAccessDenied`.
 | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 			srcVol:      "src-vol", | 
					
						
							|  |  |  | 			destVol:     "dest-vol", | 
					
						
							|  |  |  | 			srcPath:     "file5", | 
					
						
							|  |  |  | 			destPath:    "file-one/parent-is-file", | 
					
						
							|  |  |  | 			ioErrCnt:    0, | 
					
						
							|  |  |  | 			expectedErr: errFileAccessDenied, | 
					
						
							|  |  |  | 		}, | 
					
						
							| 
									
										
										
										
											2017-01-17 09:05:00 +08:00
										 |  |  | 		// TestPosix case - 17.
 | 
					
						
							|  |  |  | 		// TestPosix case with segment of source file name more than 255.
 | 
					
						
							| 
									
										
										
										
											2016-08-12 10:57:14 +08:00
										 |  |  | 		// expected not to fail.
 | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 			srcVol:      "src-vol", | 
					
						
							|  |  |  | 			destVol:     "dest-vol", | 
					
						
							|  |  |  | 			srcPath:     "path/to/my/object0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001", | 
					
						
							|  |  |  | 			destPath:    "file-six", | 
					
						
							|  |  |  | 			ioErrCnt:    0, | 
					
						
							|  |  |  | 			expectedErr: errFileNameTooLong, | 
					
						
							|  |  |  | 		}, | 
					
						
							| 
									
										
										
										
											2017-01-17 09:05:00 +08:00
										 |  |  | 		// TestPosix case - 18.
 | 
					
						
							|  |  |  | 		// TestPosix case with segment of destination file name more than 255.
 | 
					
						
							| 
									
										
										
										
											2016-08-12 10:57:14 +08:00
										 |  |  | 		// expected not to fail.
 | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 			srcVol:      "src-vol", | 
					
						
							|  |  |  | 			destVol:     "dest-vol", | 
					
						
							|  |  |  | 			srcPath:     "file6", | 
					
						
							|  |  |  | 			destPath:    "path/to/my/object0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001", | 
					
						
							|  |  |  | 			ioErrCnt:    0, | 
					
						
							|  |  |  | 			expectedErr: errFileNameTooLong, | 
					
						
							|  |  |  | 		}, | 
					
						
							| 
									
										
										
										
											2016-07-04 02:17:08 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-12 10:57:14 +08:00
										 |  |  | 	for i, testCase := range testCases { | 
					
						
							|  |  |  | 		// setting ioErrCnt from the test case.
 | 
					
						
							|  |  |  | 		if posixType, ok := posixStorage.(*posix); ok { | 
					
						
							|  |  |  | 			// setting the io error count from as specified in the test case.
 | 
					
						
							|  |  |  | 			posixType.ioErrCount = int32(testCase.ioErrCnt) | 
					
						
							|  |  |  | 		} else { | 
					
						
							|  |  |  | 			t.Fatalf("Expected the StorageAPI to be of type *posix") | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		if err := posixStorage.RenameFile(testCase.srcVol, testCase.srcPath, testCase.destVol, testCase.destPath); err != testCase.expectedErr { | 
					
						
							| 
									
										
										
										
											2017-01-17 09:05:00 +08:00
										 |  |  | 			t.Fatalf("TestPosix %d:  Expected the error to be : \"%v\", got: \"%v\".", i+1, testCase.expectedErr, err) | 
					
						
							| 
									
										
										
										
											2016-07-04 02:17:08 +08:00
										 |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-17 09:05:00 +08:00
										 |  |  | // TestPosix posix.StatFile()
 | 
					
						
							|  |  |  | func TestPosixStatFile(t *testing.T) { | 
					
						
							| 
									
										
										
										
											2016-07-30 16:26:19 +08:00
										 |  |  | 	// create posix test setup
 | 
					
						
							| 
									
										
										
										
											2016-08-12 10:57:14 +08:00
										 |  |  | 	posixStorage, path, err := newPosixTestSetup() | 
					
						
							| 
									
										
										
										
											2016-07-04 02:17:08 +08:00
										 |  |  | 	if err != nil { | 
					
						
							| 
									
										
										
										
											2016-07-30 16:26:19 +08:00
										 |  |  | 		t.Fatalf("Unable to create posix test setup, %s", err) | 
					
						
							| 
									
										
										
										
											2016-07-04 02:17:08 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | 	defer removeAll(path) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// Setup test environment.
 | 
					
						
							| 
									
										
										
										
											2016-08-12 10:57:14 +08:00
										 |  |  | 	if err := posixStorage.MakeVol("success-vol"); err != nil { | 
					
						
							| 
									
										
										
										
											2016-07-04 02:17:08 +08:00
										 |  |  | 		t.Fatalf("Unable to create volume, %s", err) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-12 10:57:14 +08:00
										 |  |  | 	if err := posixStorage.AppendFile("success-vol", "success-file", []byte("Hello, world")); err != nil { | 
					
						
							| 
									
										
										
										
											2016-07-04 02:17:08 +08:00
										 |  |  | 		t.Fatalf("Unable to create file, %s", err) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-12 10:57:14 +08:00
										 |  |  | 	if err := posixStorage.AppendFile("success-vol", "path/to/success-file", []byte("Hello, world")); err != nil { | 
					
						
							| 
									
										
										
										
											2016-07-04 02:17:08 +08:00
										 |  |  | 		t.Fatalf("Unable to create file, %s", err) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	testCases := []struct { | 
					
						
							| 
									
										
										
										
											2016-08-12 10:57:14 +08:00
										 |  |  | 		srcVol      string | 
					
						
							|  |  |  | 		srcPath     string | 
					
						
							|  |  |  | 		ioErrCnt    int | 
					
						
							| 
									
										
										
										
											2016-07-04 02:17:08 +08:00
										 |  |  | 		expectedErr error | 
					
						
							|  |  |  | 	}{ | 
					
						
							| 
									
										
										
										
											2017-01-17 09:05:00 +08:00
										 |  |  | 		// TestPosix case - 1.
 | 
					
						
							|  |  |  | 		// TestPosix case with valid inputs, expected to pass.
 | 
					
						
							| 
									
										
										
										
											2016-08-12 10:57:14 +08:00
										 |  |  | 		{ | 
					
						
							|  |  |  | 			srcVol:      "success-vol", | 
					
						
							|  |  |  | 			srcPath:     "success-file", | 
					
						
							|  |  |  | 			ioErrCnt:    0, | 
					
						
							|  |  |  | 			expectedErr: nil, | 
					
						
							|  |  |  | 		}, | 
					
						
							| 
									
										
										
										
											2017-01-17 09:05:00 +08:00
										 |  |  | 		// TestPosix case - 2.
 | 
					
						
							|  |  |  | 		// TestPosix case with valid inputs, expected to pass.
 | 
					
						
							| 
									
										
										
										
											2016-08-12 10:57:14 +08:00
										 |  |  | 		{ | 
					
						
							|  |  |  | 			srcVol:      "success-vol", | 
					
						
							|  |  |  | 			srcPath:     "path/to/success-file", | 
					
						
							|  |  |  | 			ioErrCnt:    0, | 
					
						
							|  |  |  | 			expectedErr: nil, | 
					
						
							|  |  |  | 		}, | 
					
						
							| 
									
										
										
										
											2017-01-17 09:05:00 +08:00
										 |  |  | 		// TestPosix case - 3.
 | 
					
						
							|  |  |  | 		// TestPosix case with non-existent file.
 | 
					
						
							| 
									
										
										
										
											2016-08-12 10:57:14 +08:00
										 |  |  | 		{ | 
					
						
							|  |  |  | 			srcVol:      "success-vol", | 
					
						
							|  |  |  | 			srcPath:     "nonexistent-file", | 
					
						
							|  |  |  | 			ioErrCnt:    0, | 
					
						
							|  |  |  | 			expectedErr: errFileNotFound, | 
					
						
							|  |  |  | 		}, | 
					
						
							| 
									
										
										
										
											2017-01-17 09:05:00 +08:00
										 |  |  | 		// TestPosix case - 4.
 | 
					
						
							|  |  |  | 		// TestPosix case with non-existent file path.
 | 
					
						
							| 
									
										
										
										
											2016-08-12 10:57:14 +08:00
										 |  |  | 		{ | 
					
						
							|  |  |  | 			srcVol:      "success-vol", | 
					
						
							|  |  |  | 			srcPath:     "path/2/success-file", | 
					
						
							|  |  |  | 			ioErrCnt:    0, | 
					
						
							|  |  |  | 			expectedErr: errFileNotFound, | 
					
						
							|  |  |  | 		}, | 
					
						
							| 
									
										
										
										
											2017-01-17 09:05:00 +08:00
										 |  |  | 		// TestPosix case - 5.
 | 
					
						
							|  |  |  | 		// TestPosix case with path being a directory.
 | 
					
						
							| 
									
										
										
										
											2016-08-12 10:57:14 +08:00
										 |  |  | 		{ | 
					
						
							|  |  |  | 			srcVol:      "success-vol", | 
					
						
							|  |  |  | 			srcPath:     "path", | 
					
						
							|  |  |  | 			ioErrCnt:    0, | 
					
						
							|  |  |  | 			expectedErr: errFileNotFound, | 
					
						
							|  |  |  | 		}, | 
					
						
							| 
									
										
										
										
											2017-01-17 09:05:00 +08:00
										 |  |  | 		// TestPosix case - 6.
 | 
					
						
							|  |  |  | 		// TestPosix case with io error count > max limit.
 | 
					
						
							| 
									
										
										
										
											2016-08-12 10:57:14 +08:00
										 |  |  | 		{ | 
					
						
							|  |  |  | 			srcVol:      "success-vol", | 
					
						
							|  |  |  | 			srcPath:     "success-file", | 
					
						
							|  |  |  | 			ioErrCnt:    6, | 
					
						
							|  |  |  | 			expectedErr: errFaultyDisk, | 
					
						
							|  |  |  | 		}, | 
					
						
							| 
									
										
										
										
											2017-01-17 09:05:00 +08:00
										 |  |  | 		// TestPosix case - 7.
 | 
					
						
							|  |  |  | 		// TestPosix case with non existent volume.
 | 
					
						
							| 
									
										
										
										
											2016-08-12 10:57:14 +08:00
										 |  |  | 		{ | 
					
						
							|  |  |  | 			srcVol:      "non-existent-vol", | 
					
						
							|  |  |  | 			srcPath:     "success-file", | 
					
						
							|  |  |  | 			ioErrCnt:    0, | 
					
						
							|  |  |  | 			expectedErr: errVolumeNotFound, | 
					
						
							|  |  |  | 		}, | 
					
						
							| 
									
										
										
										
											2016-07-04 02:17:08 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-12 10:57:14 +08:00
										 |  |  | 	for i, testCase := range testCases { | 
					
						
							|  |  |  | 		// setting ioErrCnt from the test case.
 | 
					
						
							|  |  |  | 		if posixType, ok := posixStorage.(*posix); ok { | 
					
						
							|  |  |  | 			// setting the io error count from as specified in the test case.
 | 
					
						
							|  |  |  | 			posixType.ioErrCount = int32(testCase.ioErrCnt) | 
					
						
							|  |  |  | 		} else { | 
					
						
							|  |  |  | 			t.Errorf("Expected the StorageAPI to be of type *posix") | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		if _, err := posixStorage.StatFile(testCase.srcVol, 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) | 
					
						
							| 
									
										
										
										
											2016-07-04 02:17:08 +08:00
										 |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } |