mirror of
https://github.com/minio/minio.git
synced 2025-01-11 23:13:23 -05:00
parent
0b3eb7f218
commit
aa3fde1784
@ -107,6 +107,7 @@ func runAllTests(suite *TestSuiteCommon, c *check) {
|
||||
suite.TestListObjectsHandler(c)
|
||||
suite.TestListObjectVersionsOutputOrderHandler(c)
|
||||
suite.TestListObjectsHandlerErrors(c)
|
||||
suite.TestListObjectsV2HadoopUAHandler(c)
|
||||
suite.TestPutBucketErrors(c)
|
||||
suite.TestGetObjectLarge10MiB(c)
|
||||
suite.TestGetObjectLarge11MiB(c)
|
||||
@ -1604,23 +1605,23 @@ func (s *TestSuiteCommon) TestListObjectsHandler(c *check) {
|
||||
{getListObjectsV1URL(s.endPoint, bucketName, "", "1000", ""), []string{"<Key>foo bar 1</Key>", "<Key>foo bar 2</Key>"}},
|
||||
{getListObjectsV1URL(s.endPoint, bucketName, "", "1000", "url"), []string{"<Key>foo+bar+1</Key>", "<Key>foo+bar+2</Key>"}},
|
||||
{
|
||||
getListObjectsV2URL(s.endPoint, bucketName, "", "1000", "", ""),
|
||||
getListObjectsV2URL(s.endPoint, bucketName, "", "1000", "", "", ""),
|
||||
[]string{
|
||||
"<Key>foo bar 1</Key>",
|
||||
"<Key>foo bar 2</Key>",
|
||||
},
|
||||
},
|
||||
{
|
||||
getListObjectsV2URL(s.endPoint, bucketName, "", "1000", "true", ""),
|
||||
getListObjectsV2URL(s.endPoint, bucketName, "", "1000", "true", "", ""),
|
||||
[]string{
|
||||
"<Key>foo bar 1</Key>",
|
||||
"<Key>foo bar 2</Key>",
|
||||
fmt.Sprintf("<Owner><ID>%s</ID><DisplayName>minio</DisplayName></Owner>", globalMinioDefaultOwnerID),
|
||||
},
|
||||
},
|
||||
{getListObjectsV2URL(s.endPoint, bucketName, "", "1000", "", "url"), []string{"<Key>foo+bar+1</Key>", "<Key>foo+bar+2</Key>"}},
|
||||
{getListObjectsV2URL(s.endPoint, bucketName, "", "1000", "", "url", ""), []string{"<Key>foo+bar+1</Key>", "<Key>foo+bar+2</Key>"}},
|
||||
{
|
||||
getListObjectsV2URL(s.endPoint, bucketName, "", "1000", "", ""),
|
||||
getListObjectsV2URL(s.endPoint, bucketName, "", "1000", "", "", ""),
|
||||
[]string{
|
||||
"<Key>obj2</Key>",
|
||||
"<Key>obj2/</Key>",
|
||||
@ -1646,6 +1647,131 @@ func (s *TestSuiteCommon) TestListObjectsHandler(c *check) {
|
||||
}
|
||||
}
|
||||
|
||||
// TestListObjectsV2HadoopUAHandler - Test ListObjectsV2 call with max-keys=2 and Hadoop User-Agent
|
||||
func (s *TestSuiteCommon) TestListObjectsV2HadoopUAHandler(c *check) {
|
||||
// generate a random bucket name.
|
||||
bucketName := getRandomBucketName()
|
||||
// HTTP request to create the bucket.
|
||||
request, err := newTestSignedRequest(http.MethodPut, getMakeBucketURL(s.endPoint, bucketName),
|
||||
0, nil, s.accessKey, s.secretKey, s.signer)
|
||||
c.Assert(err, nil)
|
||||
|
||||
// execute the HTTP request to create bucket.
|
||||
response, err := s.client.Do(request)
|
||||
c.Assert(err, nil)
|
||||
c.Assert(response.StatusCode, http.StatusOK)
|
||||
|
||||
// enable versioning on the bucket.
|
||||
enableVersioningBody := []byte("<VersioningConfiguration><Status>Enabled</Status></VersioningConfiguration>")
|
||||
enableVersioningBucketRequest, err := newTestSignedRequest(http.MethodPut, getBucketVersioningConfigURL(s.endPoint, bucketName),
|
||||
int64(len(enableVersioningBody)), bytes.NewReader(enableVersioningBody), s.accessKey, s.secretKey, s.signer)
|
||||
c.Assert(err, nil)
|
||||
// execute the HTTP request to create bucket.
|
||||
response, err = s.client.Do(enableVersioningBucketRequest)
|
||||
c.Assert(err, nil)
|
||||
c.Assert(response.StatusCode, http.StatusOK)
|
||||
|
||||
for _, objectName := range []string{"pfx/a/1.txt", "pfx/b/2.txt", "pfx/", "pfx2/c/3.txt", "pfx2/d/3.txt", "pfx1/1.txt", "pfx2/"} {
|
||||
buffer := bytes.NewReader([]byte(""))
|
||||
request, err = newTestSignedRequest(http.MethodPut, getPutObjectURL(s.endPoint, bucketName, objectName),
|
||||
int64(buffer.Len()), buffer, s.accessKey, s.secretKey, s.signer)
|
||||
c.Assert(err, nil)
|
||||
response, err = s.client.Do(request)
|
||||
c.Assert(err, nil)
|
||||
c.Assert(response.StatusCode, http.StatusOK)
|
||||
}
|
||||
for _, objectName := range []string{"pfx2/c/3.txt", "pfx2/d/3.txt", "pfx2/"} {
|
||||
delRequest, err := newTestSignedRequest(http.MethodDelete, getDeleteObjectURL(s.endPoint, bucketName, objectName),
|
||||
0, nil, s.accessKey, s.secretKey, s.signer)
|
||||
c.Assert(err, nil)
|
||||
response, err = s.client.Do(delRequest)
|
||||
c.Assert(err, nil)
|
||||
c.Assert(response.StatusCode, http.StatusNoContent)
|
||||
}
|
||||
testCases := []struct {
|
||||
getURL string
|
||||
expectedStrings []string
|
||||
userAgent string
|
||||
}{
|
||||
{
|
||||
getListObjectsV2URL(s.endPoint, bucketName, "pfx/a/", "2", "", "", "/"),
|
||||
[]string{
|
||||
"<Contents><Key>pfx/a/1.txt</Key>",
|
||||
"<CommonPrefixes><Prefix>pfx/a</Prefix></CommonPrefixes>",
|
||||
},
|
||||
"Hadoop 3.3.2, aws-sdk-java/1.12.262 Linux/5.14.0-362.24.1.el9_3.x86_64 OpenJDK_64-Bit_Server_VM/11.0.22+7 java/11.0.22 scala/2.12.15 vendor/Eclipse_Adoptium cfg/retry-mode/legacy",
|
||||
},
|
||||
{
|
||||
getListObjectsV2URL(s.endPoint, bucketName, "pfx/a/", "2", "", "", "/"),
|
||||
[]string{
|
||||
"<Prefix>pfx/a/</Prefix>",
|
||||
"<Contents><Key>pfx/a/1.txt</Key>",
|
||||
},
|
||||
"",
|
||||
},
|
||||
{
|
||||
getListObjectsV2URL(s.endPoint, bucketName, "pfx2/c", "2", "true", "", "/"),
|
||||
[]string{
|
||||
"<Prefix>pfx2/c</Prefix><KeyCount>1</KeyCount><MaxKeys>2</MaxKeys><Delimiter>/</Delimiter><IsTruncated>false</IsTruncated><CommonPrefixes><Prefix>pfx2/c/</Prefix></CommonPrefixes>",
|
||||
},
|
||||
"",
|
||||
},
|
||||
|
||||
{
|
||||
getListObjectsV2URL(s.endPoint, bucketName, "pfx2/c", "2", "true", "", "/"),
|
||||
[]string{
|
||||
"<Prefix>pfx2/c</Prefix><KeyCount>0</KeyCount><MaxKeys>2</MaxKeys><Delimiter>/</Delimiter><IsTruncated>false</IsTruncated>",
|
||||
},
|
||||
"Hadoop 3.3.2, aws-sdk-java/1.12.262 Linux/5.14.0-362.24.1.el9_3.x86_64 OpenJDK_64-Bit_Server_VM/11.0.22+7 java/11.0.22 scala/2.12.15 vendor/Eclipse_Adoptium cfg/retry-mode/legacy",
|
||||
},
|
||||
{
|
||||
getListObjectsV2URL(s.endPoint, bucketName, "pfx2/c", "2", "true", "", "/"),
|
||||
[]string{
|
||||
"<Prefix>pfx2/c</Prefix><KeyCount>0</KeyCount><MaxKeys>2</MaxKeys><Delimiter>/</Delimiter><IsTruncated>false</IsTruncated>",
|
||||
},
|
||||
"Hadoop 3.3.2, aws-sdk-java/1.12.262 Linux/5.14.0-362.24.1.el9_3.x86_64 OpenJDK_64-Bit_Server_VM/11.0.22+7 java/11.0.22 scala/2.12.15 vendor/Eclipse_Adoptium cfg/retry-mode/legacy",
|
||||
},
|
||||
{
|
||||
getListObjectsV2URL(s.endPoint, bucketName, "pfx2/", "2", "false", "", "/"),
|
||||
[]string{
|
||||
"<Prefix>pfx2/</Prefix><KeyCount>0</KeyCount><MaxKeys>2</MaxKeys><Delimiter>/</Delimiter><IsTruncated>false</IsTruncated>",
|
||||
},
|
||||
"Hadoop 3.3.2, aws-sdk-java/1.12.262 Linux/5.14.0-362.24.1.el9_3.x86_64 OpenJDK_64-Bit_Server_VM/11.0.22+7 java/11.0.22 scala/2.12.15 vendor/Eclipse_Adoptium cfg/retry-mode/legacy",
|
||||
},
|
||||
{
|
||||
getListObjectsV2URL(s.endPoint, bucketName, "pfx2/", "2", "false", "", "/"),
|
||||
[]string{
|
||||
"<CommonPrefixes><Prefix>pfx2/c/</Prefix></CommonPrefixes>",
|
||||
},
|
||||
"",
|
||||
},
|
||||
{
|
||||
getListObjectsV2URL(s.endPoint, bucketName, "pfx2/", "2", "false", "", "/"),
|
||||
[]string{
|
||||
"<Prefix>pfx2/</Prefix><KeyCount>0</KeyCount><MaxKeys>2</MaxKeys><Delimiter>/</Delimiter><IsTruncated>false</IsTruncated>",
|
||||
},
|
||||
"Hadoop 3.3.2, aws-sdk-java/1.12.262 Linux/5.14.0-362.24.1.el9_3.x86_64 OpenJDK_64-Bit_Server_VM/11.0.22+7 java/11.0.22 scala/2.12.15 vendor/Eclipse_Adoptium cfg/retry-mode/legacy",
|
||||
},
|
||||
}
|
||||
for _, testCase := range testCases {
|
||||
// create listObjectsV1 request with valid parameters
|
||||
request, err = newTestSignedRequest(http.MethodGet, testCase.getURL, 0, nil, s.accessKey, s.secretKey, s.signer)
|
||||
request.Header.Set("User-Agent", testCase.userAgent)
|
||||
c.Assert(err, nil)
|
||||
// execute the HTTP request.
|
||||
response, err = s.client.Do(request)
|
||||
c.Assert(err, nil)
|
||||
c.Assert(response.StatusCode, http.StatusOK)
|
||||
|
||||
getContent, err := io.ReadAll(response.Body)
|
||||
c.Assert(err, nil)
|
||||
|
||||
for _, expectedStr := range testCase.expectedStrings {
|
||||
c.Assert(strings.Contains(string(getContent), expectedStr), true)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// TestListObjectVersionsHandler - checks the order of <Version>
|
||||
// and <DeleteMarker> XML tags in a version listing
|
||||
func (s *TestSuiteCommon) TestListObjectVersionsOutputOrderHandler(c *check) {
|
||||
@ -1747,7 +1873,7 @@ func (s *TestSuiteCommon) TestListObjectsSpecialCharactersHandler(c *check) {
|
||||
{getListObjectsV1URL(s.endPoint, bucketName, "", "1000", ""), []string{"<Key>foo bar 1</Key>", "<Key>foo bar 2</Key>", "<Key>foo  bar</Key>"}},
|
||||
{getListObjectsV1URL(s.endPoint, bucketName, "", "1000", "url"), []string{"<Key>foo+bar+1</Key>", "<Key>foo+bar+2</Key>", "<Key>foo+%01+bar</Key>"}},
|
||||
{
|
||||
getListObjectsV2URL(s.endPoint, bucketName, "", "1000", "", ""),
|
||||
getListObjectsV2URL(s.endPoint, bucketName, "", "1000", "", "", ""),
|
||||
[]string{
|
||||
"<Key>foo bar 1</Key>",
|
||||
"<Key>foo bar 2</Key>",
|
||||
@ -1756,7 +1882,7 @@ func (s *TestSuiteCommon) TestListObjectsSpecialCharactersHandler(c *check) {
|
||||
},
|
||||
},
|
||||
{
|
||||
getListObjectsV2URL(s.endPoint, bucketName, "", "1000", "true", ""),
|
||||
getListObjectsV2URL(s.endPoint, bucketName, "", "1000", "true", "", ""),
|
||||
[]string{
|
||||
"<Key>foo bar 1</Key>",
|
||||
"<Key>foo bar 2</Key>",
|
||||
@ -1764,7 +1890,7 @@ func (s *TestSuiteCommon) TestListObjectsSpecialCharactersHandler(c *check) {
|
||||
fmt.Sprintf("<Owner><ID>%s</ID><DisplayName>minio</DisplayName></Owner>", globalMinioDefaultOwnerID),
|
||||
},
|
||||
},
|
||||
{getListObjectsV2URL(s.endPoint, bucketName, "", "1000", "", "url"), []string{"<Key>foo+bar+1</Key>", "<Key>foo+bar+2</Key>", "<Key>foo+%01+bar</Key>"}},
|
||||
{getListObjectsV2URL(s.endPoint, bucketName, "", "1000", "", "url", ""), []string{"<Key>foo+bar+1</Key>", "<Key>foo+bar+2</Key>", "<Key>foo+%01+bar</Key>"}},
|
||||
}
|
||||
|
||||
for _, testCase := range testCases {
|
||||
@ -1811,7 +1937,7 @@ func (s *TestSuiteCommon) TestListObjectsHandlerErrors(c *check) {
|
||||
verifyError(c, response, "InvalidArgument", "Argument maxKeys must be an integer between 0 and 2147483647", http.StatusBadRequest)
|
||||
|
||||
// create listObjectsV2 request with invalid value of max-keys parameter. max-keys is set to -2.
|
||||
request, err = newTestSignedRequest(http.MethodGet, getListObjectsV2URL(s.endPoint, bucketName, "", "-2", "", ""),
|
||||
request, err = newTestSignedRequest(http.MethodGet, getListObjectsV2URL(s.endPoint, bucketName, "", "-2", "", "", ""),
|
||||
0, nil, s.accessKey, s.secretKey, s.signer)
|
||||
c.Assert(err, nil)
|
||||
// execute the HTTP request.
|
||||
|
@ -1399,7 +1399,7 @@ func getListObjectVersionsURL(endPoint, bucketName, prefix, maxKeys, encodingTyp
|
||||
}
|
||||
|
||||
// return URL for listing objects in the bucket with V2 API.
|
||||
func getListObjectsV2URL(endPoint, bucketName, prefix, maxKeys, fetchOwner, encodingType string) string {
|
||||
func getListObjectsV2URL(endPoint, bucketName, prefix, maxKeys, fetchOwner, encodingType, delimiter string) string {
|
||||
queryValue := url.Values{}
|
||||
queryValue.Set("list-type", "2") // Enables list objects V2 URL.
|
||||
if maxKeys != "" {
|
||||
@ -1411,7 +1411,13 @@ func getListObjectsV2URL(endPoint, bucketName, prefix, maxKeys, fetchOwner, enco
|
||||
if encodingType != "" {
|
||||
queryValue.Set("encoding-type", encodingType)
|
||||
}
|
||||
return makeTestTargetURL(endPoint, bucketName, prefix, queryValue)
|
||||
if prefix != "" {
|
||||
queryValue.Set("prefix", prefix)
|
||||
}
|
||||
if delimiter != "" {
|
||||
queryValue.Set("delimiter", delimiter)
|
||||
}
|
||||
return makeTestTargetURL(endPoint, bucketName, "", queryValue)
|
||||
}
|
||||
|
||||
// return URL for a new multipart upload.
|
||||
|
Loading…
Reference in New Issue
Block a user