package layer import ( "encoding/xml" "io" "strings" "testing" "git.frostfs.info/TrueCloudLab/frostfs-s3-gw/api/data" apierr "git.frostfs.info/TrueCloudLab/frostfs-s3-gw/api/errors" "github.com/stretchr/testify/require" ) func TestCorsCopiesNumber(t *testing.T) { tc := prepareCORSContext(t) body := ` GET http://www.example.com Authorization x-amz-request-id ` copies := []uint32{2, 0} err := tc.layer.PutBucketCORS(tc.ctx, &PutCORSParams{ BktInfo: tc.bktInfo, Reader: strings.NewReader(body), CopiesNumbers: copies, UserAgent: "", NewDecoder: NewXMLDecoder, }) require.NoError(t, err) objs := tc.testFrostFS.Objects() require.Len(t, objs, 1) require.EqualValues(t, copies, tc.testFrostFS.CopiesNumbers(addrFromObject(objs[0]).EncodeToString())) } func TestCheckCORS(t *testing.T) { for _, tc := range []struct { name string cfg *data.CORSConfiguration expectedCode apierr.ErrorCode }{ { name: "allowed origin wildcards", cfg: &data.CORSConfiguration{ CORSRules: []data.CORSRule{ { AllowedOrigins: []string{"https://*.example.*"}, AllowedMethods: []string{"GET"}, }, }, }, expectedCode: apierr.ErrCORSWildcardsAllowedOrigins, }, { name: "allowed header wildcards", cfg: &data.CORSConfiguration{ CORSRules: []data.CORSRule{ { AllowedOrigins: []string{"https://*.example.com"}, AllowedMethods: []string{"GET"}, AllowedHeaders: []string{"x-amz-*-*"}, }, }, }, expectedCode: apierr.ErrCORSWildcardsAllowedHeaders, }, { name: "invalid allowed method", cfg: &data.CORSConfiguration{ CORSRules: []data.CORSRule{ { AllowedOrigins: []string{"https://*.example.com"}, AllowedMethods: []string{"INVALID"}, AllowedHeaders: []string{"x-amz-*"}, }, }, }, expectedCode: apierr.ErrCORSUnsupportedMethod, }, { name: "expose header wildcard", cfg: &data.CORSConfiguration{ CORSRules: []data.CORSRule{ { AllowedOrigins: []string{"https://*.example.com"}, AllowedMethods: []string{"GET"}, AllowedHeaders: []string{"x-amz-*"}, ExposeHeaders: []string{"x-amz-*"}, }, }, }, expectedCode: apierr.ErrCORSWildcardExposeHeaders, }, } { t.Run(tc.name, func(t *testing.T) { require.True(t, apierr.IsS3Error(checkCORS(tc.cfg), tc.expectedCode)) }) } } func NewXMLDecoder(r io.Reader, _ string) *xml.Decoder { dec := xml.NewDecoder(r) return dec }