mirror of
https://github.com/minio/minio.git
synced 2024-12-25 22:55:54 -05:00
5f7565762e
This change is cleanup of the postPolicyHandler code primarily to address the flow and also converting certain critical parts into self contained functions.
172 lines
4.8 KiB
Go
172 lines
4.8 KiB
Go
/*
|
|
* Minio Cloud Storage, (C) 2015, 2016, 2017 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
|
|
|
|
import (
|
|
"bytes"
|
|
"encoding/xml"
|
|
"io/ioutil"
|
|
"net/http"
|
|
"reflect"
|
|
"strings"
|
|
"testing"
|
|
)
|
|
|
|
// Tests validate bucket LocationConstraint.
|
|
func TestIsValidLocationContraint(t *testing.T) {
|
|
path, err := newTestConfig(globalMinioDefaultRegion)
|
|
if err != nil {
|
|
t.Fatalf("unable initialize config file, %s", err)
|
|
}
|
|
defer removeAll(path)
|
|
|
|
// Test with corrupted XML
|
|
malformedReq := &http.Request{
|
|
Body: ioutil.NopCloser(bytes.NewBuffer([]byte("<>"))),
|
|
ContentLength: int64(len("<>")),
|
|
}
|
|
if err := isValidLocationConstraint(malformedReq); err != ErrMalformedXML {
|
|
t.Fatal("Unexpected error: ", err)
|
|
}
|
|
|
|
// generates the input request with XML bucket configuration set to the request body.
|
|
createExpectedRequest := func(req *http.Request, location string) (*http.Request, error) {
|
|
createBucketConfig := createBucketLocationConfiguration{}
|
|
createBucketConfig.Location = location
|
|
var createBucketConfigBytes []byte
|
|
createBucketConfigBytes, e := xml.Marshal(createBucketConfig)
|
|
if e != nil {
|
|
return nil, e
|
|
}
|
|
createBucketConfigBuffer := bytes.NewBuffer(createBucketConfigBytes)
|
|
req.Body = ioutil.NopCloser(createBucketConfigBuffer)
|
|
req.ContentLength = int64(createBucketConfigBuffer.Len())
|
|
return req, nil
|
|
}
|
|
|
|
testCases := []struct {
|
|
locationForInputRequest string
|
|
serverConfigRegion string
|
|
expectedCode APIErrorCode
|
|
}{
|
|
// Test case - 1.
|
|
{globalMinioDefaultRegion, globalMinioDefaultRegion, ErrNone},
|
|
// Test case - 2.
|
|
// In case of empty request body ErrNone is returned.
|
|
{"", globalMinioDefaultRegion, ErrNone},
|
|
// Test case - 3.
|
|
{"eu-central-1", globalMinioDefaultRegion, ErrInvalidRegion},
|
|
}
|
|
for i, testCase := range testCases {
|
|
inputRequest, e := createExpectedRequest(&http.Request{}, testCase.locationForInputRequest)
|
|
if e != nil {
|
|
t.Fatalf("Test %d: Failed to Marshal bucket configuration", i+1)
|
|
}
|
|
serverConfig.SetRegion(testCase.serverConfigRegion)
|
|
actualCode := isValidLocationConstraint(inputRequest)
|
|
if testCase.expectedCode != actualCode {
|
|
t.Errorf("Test %d: Expected the APIErrCode to be %d, but instead found %d", i+1, testCase.expectedCode, actualCode)
|
|
}
|
|
}
|
|
}
|
|
|
|
// Test validate form field size.
|
|
func TestValidateFormFieldSize(t *testing.T) {
|
|
testCases := []struct {
|
|
header http.Header
|
|
err error
|
|
}{
|
|
// Empty header returns error as nil,
|
|
{
|
|
header: nil,
|
|
err: nil,
|
|
},
|
|
// Valid header returns error as nil.
|
|
{
|
|
header: http.Header{
|
|
"Content-Type": []string{"image/png"},
|
|
},
|
|
err: nil,
|
|
},
|
|
// Invalid header value > maxFormFieldSize+1
|
|
{
|
|
header: http.Header{
|
|
"Garbage": []string{strings.Repeat("a", int(maxFormFieldSize)+1)},
|
|
},
|
|
err: errSizeUnexpected,
|
|
},
|
|
}
|
|
|
|
// Run validate form field size check under all test cases.
|
|
for i, testCase := range testCases {
|
|
err := validateFormFieldSize(testCase.header)
|
|
if err != nil {
|
|
if errorCause(err).Error() != testCase.err.Error() {
|
|
t.Errorf("Test %d: Expected error %s, got %s", i+1, testCase.err, err)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
// Tests validate metadata extraction from http headers.
|
|
func TestExtractMetadataHeaders(t *testing.T) {
|
|
testCases := []struct {
|
|
header http.Header
|
|
metadata map[string]string
|
|
}{
|
|
// Validate if there a known 'content-type'.
|
|
{
|
|
header: http.Header{
|
|
"Content-Type": []string{"image/png"},
|
|
},
|
|
metadata: map[string]string{
|
|
"content-type": "image/png",
|
|
},
|
|
},
|
|
// Validate if there are no keys to extract.
|
|
{
|
|
header: http.Header{
|
|
"test-1": []string{"123"},
|
|
},
|
|
metadata: map[string]string{},
|
|
},
|
|
// Validate if there are no keys to extract.
|
|
{
|
|
header: http.Header{
|
|
"X-Amz-Meta-Appid": []string{"amz-meta"},
|
|
"X-Minio-Meta-Appid": []string{"minio-meta"},
|
|
},
|
|
metadata: map[string]string{
|
|
"X-Amz-Meta-Appid": "amz-meta",
|
|
"X-Minio-Meta-Appid": "minio-meta"},
|
|
},
|
|
// Empty header input returns empty metadata.
|
|
{
|
|
header: nil,
|
|
metadata: nil,
|
|
},
|
|
}
|
|
|
|
// Validate if the extracting headers.
|
|
for i, testCase := range testCases {
|
|
metadata := extractMetadataFromHeader(testCase.header)
|
|
if !reflect.DeepEqual(metadata, testCase.metadata) {
|
|
t.Fatalf("Test %d failed: Expected \"%#v\", got \"%#v\"", i+1, testCase.metadata, metadata)
|
|
}
|
|
}
|
|
}
|