| 
									
										
										
										
											2017-05-11 06:36:49 +08:00
										 |  |  | /* | 
					
						
							|  |  |  |  * Minio Cloud Storage, (C) 2016 Minio, Inc. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * Licensed under the Apache License, Version 2.0 (the "License"); | 
					
						
							|  |  |  |  * you may not use this file except in compliance with the License. | 
					
						
							|  |  |  |  * You may obtain a copy of the License at | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  *     http://www.apache.org/licenses/LICENSE-2.0
 | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * Unless required by applicable law or agreed to in writing, software | 
					
						
							|  |  |  |  * distributed under the License is distributed on an "AS IS" BASIS, | 
					
						
							|  |  |  |  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | 
					
						
							|  |  |  |  * See the License for the specific language governing permissions and | 
					
						
							|  |  |  |  * limitations under the License. | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | package cmd | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-24 08:35:45 +08:00
										 |  |  | import ( | 
					
						
							| 
									
										
										
										
											2017-07-14 14:20:16 +08:00
										 |  |  | 	"fmt" | 
					
						
							| 
									
										
										
										
											2017-06-24 08:35:45 +08:00
										 |  |  | 	"reflect" | 
					
						
							|  |  |  | 	"testing" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	minio "github.com/minio/minio-go" | 
					
						
							|  |  |  | ) | 
					
						
							| 
									
										
										
										
											2017-05-11 06:36:49 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | func TestToGCSPageToken(t *testing.T) { | 
					
						
							|  |  |  | 	testCases := []struct { | 
					
						
							|  |  |  | 		Name  string | 
					
						
							|  |  |  | 		Token string | 
					
						
							|  |  |  | 	}{ | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 			Name:  "A", | 
					
						
							|  |  |  | 			Token: "CgFB", | 
					
						
							|  |  |  | 		}, | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 			Name:  "AAAAAAAAAA", | 
					
						
							|  |  |  | 			Token: "CgpBQUFBQUFBQUFB", | 
					
						
							|  |  |  | 		}, | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 			Name:  "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", | 
					
						
							|  |  |  | 			Token: "CmRBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB", | 
					
						
							|  |  |  | 		}, | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 			Name:  "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", | 
					
						
							|  |  |  | 			Token: "CpEDQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUE=", | 
					
						
							|  |  |  | 		}, | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 			Name:  "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", | 
					
						
							|  |  |  | 			Token: "CpIDQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB", | 
					
						
							|  |  |  | 		}, | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 			Name:  "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", | 
					
						
							|  |  |  | 			Token: "CpMDQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQQ==", | 
					
						
							|  |  |  | 		}, | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 			Name:  "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", | 
					
						
							|  |  |  | 			Token: "CvQDQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUE=", | 
					
						
							|  |  |  | 		}, | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	for i, testCase := range testCases { | 
					
						
							|  |  |  | 		if toGCSPageToken(testCase.Name) != testCase.Token { | 
					
						
							|  |  |  | 			t.Errorf("Test %d: Expected %s, got %s", i+1, toGCSPageToken(testCase.Name), testCase.Token) | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2017-05-25 09:39:45 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-24 13:10:29 +08:00
										 |  |  | // TestIsValidGCSProjectIDFormat tests isValidGCSProjectIDFormat
 | 
					
						
							|  |  |  | func TestValidGCSProjectIDFormat(t *testing.T) { | 
					
						
							| 
									
										
										
										
											2017-05-25 09:39:45 +08:00
										 |  |  | 	testCases := []struct { | 
					
						
							|  |  |  | 		ProjectID string | 
					
						
							|  |  |  | 		Valid     bool | 
					
						
							|  |  |  | 	}{ | 
					
						
							|  |  |  | 		{"", false}, | 
					
						
							|  |  |  | 		{"a", false}, | 
					
						
							|  |  |  | 		{"Abc", false}, | 
					
						
							|  |  |  | 		{"1bcd", false}, | 
					
						
							|  |  |  | 		// 5 chars
 | 
					
						
							|  |  |  | 		{"abcdb", false}, | 
					
						
							|  |  |  | 		// 6 chars
 | 
					
						
							|  |  |  | 		{"abcdbz", true}, | 
					
						
							|  |  |  | 		// 30 chars
 | 
					
						
							|  |  |  | 		{"project-id-1-project-id-more-1", true}, | 
					
						
							|  |  |  | 		// 31 chars
 | 
					
						
							|  |  |  | 		{"project-id-1-project-id-more-11", false}, | 
					
						
							|  |  |  | 		{"storage.googleapis.com", false}, | 
					
						
							|  |  |  | 		{"http://storage.googleapis.com", false}, | 
					
						
							|  |  |  | 		{"http://localhost:9000", false}, | 
					
						
							|  |  |  | 		{"project-id-1", true}, | 
					
						
							|  |  |  | 		{"project-id-1988832", true}, | 
					
						
							|  |  |  | 		{"projectid1414", true}, | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	for i, testCase := range testCases { | 
					
						
							| 
									
										
										
										
											2017-06-24 13:10:29 +08:00
										 |  |  | 		valid := isValidGCSProjectIDFormat(testCase.ProjectID) | 
					
						
							|  |  |  | 		if valid != testCase.Valid { | 
					
						
							|  |  |  | 			t.Errorf("Test %d: Expected %v, got %v", i+1, valid, testCase.Valid) | 
					
						
							| 
									
										
										
										
											2017-05-25 09:39:45 +08:00
										 |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2017-06-06 14:13:53 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-10 10:48:20 +08:00
										 |  |  | // Test for isGCSMarker.
 | 
					
						
							|  |  |  | func TestIsGCSMarker(t *testing.T) { | 
					
						
							|  |  |  | 	testCases := []struct { | 
					
						
							|  |  |  | 		marker   string | 
					
						
							|  |  |  | 		expected bool | 
					
						
							|  |  |  | 	}{ | 
					
						
							|  |  |  | 		{ | 
					
						
							| 
									
										
										
										
											2017-07-20 10:33:10 +08:00
										 |  |  | 			marker:   "{minio}gcs123", | 
					
						
							| 
									
										
										
										
											2017-06-10 10:48:20 +08:00
										 |  |  | 			expected: true, | 
					
						
							|  |  |  | 		}, | 
					
						
							|  |  |  | 		{ | 
					
						
							| 
									
										
										
										
											2017-07-20 10:33:10 +08:00
										 |  |  | 			marker:   "{mini_no}tgcs123", | 
					
						
							| 
									
										
										
										
											2017-06-10 10:48:20 +08:00
										 |  |  | 			expected: false, | 
					
						
							|  |  |  | 		}, | 
					
						
							|  |  |  | 		{ | 
					
						
							| 
									
										
										
										
											2017-07-20 10:33:10 +08:00
										 |  |  | 			marker:   "{minioagainnotgcs123", | 
					
						
							| 
									
										
										
										
											2017-06-10 10:48:20 +08:00
										 |  |  | 			expected: false, | 
					
						
							|  |  |  | 		}, | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 			marker:   "obj1", | 
					
						
							|  |  |  | 			expected: false, | 
					
						
							|  |  |  | 		}, | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	for i, tc := range testCases { | 
					
						
							|  |  |  | 		if actual := isGCSMarker(tc.marker); actual != tc.expected { | 
					
						
							|  |  |  | 			t.Errorf("Test %d: marker is %s, expected %v but got %v", | 
					
						
							|  |  |  | 				i+1, tc.marker, tc.expected, actual) | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2017-06-18 07:00:41 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | // Test for gcsMultipartMetaName.
 | 
					
						
							|  |  |  | func TestGCSMultipartMetaName(t *testing.T) { | 
					
						
							|  |  |  | 	uploadID := "a" | 
					
						
							| 
									
										
										
										
											2017-06-22 01:27:44 +08:00
										 |  |  | 	expected := pathJoin(gcsMinioMultipartPathV1, uploadID, gcsMinioMultipartMeta) | 
					
						
							| 
									
										
										
										
											2017-06-18 07:00:41 +08:00
										 |  |  | 	got := gcsMultipartMetaName(uploadID) | 
					
						
							|  |  |  | 	if expected != got { | 
					
						
							|  |  |  | 		t.Errorf("expected: %s, got: %s", expected, got) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // Test for gcsMultipartDataName.
 | 
					
						
							|  |  |  | func TestGCSMultipartDataName(t *testing.T) { | 
					
						
							| 
									
										
										
										
											2017-07-14 14:20:16 +08:00
										 |  |  | 	var ( | 
					
						
							|  |  |  | 		uploadID   = "a" | 
					
						
							|  |  |  | 		etag       = "b" | 
					
						
							|  |  |  | 		partNumber = 1 | 
					
						
							|  |  |  | 	) | 
					
						
							|  |  |  | 	expected := pathJoin(gcsMinioMultipartPathV1, uploadID, fmt.Sprintf("%05d.%s", partNumber, etag)) | 
					
						
							|  |  |  | 	got := gcsMultipartDataName(uploadID, partNumber, etag) | 
					
						
							| 
									
										
										
										
											2017-06-18 07:00:41 +08:00
										 |  |  | 	if expected != got { | 
					
						
							|  |  |  | 		t.Errorf("expected: %s, got: %s", expected, got) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2017-06-24 08:35:45 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | func TestFromMinioClientListBucketResultToV2Info(t *testing.T) { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	listBucketResult := minio.ListBucketResult{ | 
					
						
							|  |  |  | 		IsTruncated:    false, | 
					
						
							|  |  |  | 		Marker:         "testMarker", | 
					
						
							|  |  |  | 		NextMarker:     "testMarker2", | 
					
						
							|  |  |  | 		CommonPrefixes: []minio.CommonPrefix{{Prefix: "one"}, {Prefix: "two"}}, | 
					
						
							|  |  |  | 		Contents:       []minio.ObjectInfo{{Key: "testobj", ContentType: ""}}, | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	listBucketV2Info := ListObjectsV2Info{ | 
					
						
							|  |  |  | 		Prefixes:              []string{"one", "two"}, | 
					
						
							|  |  |  | 		Objects:               []ObjectInfo{{Name: "testobj", Bucket: "testbucket", UserDefined: map[string]string{"Content-Type": ""}}}, | 
					
						
							|  |  |  | 		IsTruncated:           false, | 
					
						
							|  |  |  | 		ContinuationToken:     "testMarker", | 
					
						
							|  |  |  | 		NextContinuationToken: "testMarker2", | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if got := fromMinioClientListBucketResultToV2Info("testbucket", listBucketResult); !reflect.DeepEqual(got, listBucketV2Info) { | 
					
						
							|  |  |  | 		t.Errorf("fromMinioClientListBucketResultToV2Info() = %v, want %v", got, listBucketV2Info) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } |