367 lines
11 KiB
Go
367 lines
11 KiB
Go
|
// +build bench
|
||
|
|
||
|
package restxml_test
|
||
|
|
||
|
import (
|
||
|
"net/http"
|
||
|
"net/http/httptest"
|
||
|
"os"
|
||
|
"testing"
|
||
|
|
||
|
"bytes"
|
||
|
"encoding/xml"
|
||
|
|
||
|
"github.com/aws/aws-sdk-go/aws"
|
||
|
"github.com/aws/aws-sdk-go/aws/credentials"
|
||
|
"github.com/aws/aws-sdk-go/aws/endpoints"
|
||
|
"github.com/aws/aws-sdk-go/aws/request"
|
||
|
"github.com/aws/aws-sdk-go/aws/session"
|
||
|
"github.com/aws/aws-sdk-go/private/protocol/restxml"
|
||
|
"github.com/aws/aws-sdk-go/service/cloudfront"
|
||
|
"github.com/aws/aws-sdk-go/service/s3"
|
||
|
)
|
||
|
|
||
|
var (
|
||
|
cloudfrontSvc *cloudfront.CloudFront
|
||
|
s3Svc *s3.S3
|
||
|
)
|
||
|
|
||
|
func TestMain(m *testing.M) {
|
||
|
server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
||
|
w.WriteHeader(http.StatusOK)
|
||
|
}))
|
||
|
|
||
|
sess := session.Must(session.NewSession(&aws.Config{
|
||
|
Credentials: credentials.NewStaticCredentials("Key", "Secret", "Token"),
|
||
|
Endpoint: aws.String(server.URL),
|
||
|
S3ForcePathStyle: aws.Bool(true),
|
||
|
DisableSSL: aws.Bool(true),
|
||
|
Region: aws.String(endpoints.UsWest2RegionID),
|
||
|
}))
|
||
|
cloudfrontSvc = cloudfront.New(sess)
|
||
|
s3Svc = s3.New(sess)
|
||
|
|
||
|
c := m.Run()
|
||
|
server.Close()
|
||
|
os.Exit(c)
|
||
|
}
|
||
|
|
||
|
func BenchmarkRESTXMLBuild_Complex_CFCreateDistro(b *testing.B) {
|
||
|
params := cloudfrontCreateDistributionInput()
|
||
|
|
||
|
benchRESTXMLBuild(b, func() *request.Request {
|
||
|
req, _ := cloudfrontSvc.CreateDistributionRequest(params)
|
||
|
return req
|
||
|
})
|
||
|
}
|
||
|
|
||
|
func BenchmarkRESTXMLBuild_Simple_CFDeleteDistro(b *testing.B) {
|
||
|
params := cloudfrontDeleteDistributionInput()
|
||
|
|
||
|
benchRESTXMLBuild(b, func() *request.Request {
|
||
|
req, _ := cloudfrontSvc.DeleteDistributionRequest(params)
|
||
|
return req
|
||
|
})
|
||
|
}
|
||
|
|
||
|
func BenchmarkRESTXMLBuild_REST_S3HeadObject(b *testing.B) {
|
||
|
params := s3HeadObjectInput()
|
||
|
|
||
|
benchRESTXMLBuild(b, func() *request.Request {
|
||
|
req, _ := s3Svc.HeadObjectRequest(params)
|
||
|
return req
|
||
|
})
|
||
|
}
|
||
|
|
||
|
func BenchmarkRESTXMLBuild_XML_S3PutObjectAcl(b *testing.B) {
|
||
|
params := s3PutObjectAclInput()
|
||
|
|
||
|
benchRESTXMLBuild(b, func() *request.Request {
|
||
|
req, _ := s3Svc.PutObjectAclRequest(params)
|
||
|
return req
|
||
|
})
|
||
|
}
|
||
|
|
||
|
func BenchmarkRESTXMLRequest_Complex_CFCreateDistro(b *testing.B) {
|
||
|
benchRESTXMLRequest(b, func() *request.Request {
|
||
|
req, _ := cloudfrontSvc.CreateDistributionRequest(cloudfrontCreateDistributionInput())
|
||
|
return req
|
||
|
})
|
||
|
}
|
||
|
|
||
|
func BenchmarkRESTXMLRequest_Simple_CFDeleteDistro(b *testing.B) {
|
||
|
benchRESTXMLRequest(b, func() *request.Request {
|
||
|
req, _ := cloudfrontSvc.DeleteDistributionRequest(cloudfrontDeleteDistributionInput())
|
||
|
return req
|
||
|
})
|
||
|
}
|
||
|
|
||
|
func BenchmarkRESTXMLRequest_REST_S3HeadObject(b *testing.B) {
|
||
|
benchRESTXMLRequest(b, func() *request.Request {
|
||
|
req, _ := s3Svc.HeadObjectRequest(s3HeadObjectInput())
|
||
|
return req
|
||
|
})
|
||
|
}
|
||
|
|
||
|
func BenchmarkRESTXMLRequest_XML_S3PutObjectAcl(b *testing.B) {
|
||
|
benchRESTXMLRequest(b, func() *request.Request {
|
||
|
req, _ := s3Svc.PutObjectAclRequest(s3PutObjectAclInput())
|
||
|
return req
|
||
|
})
|
||
|
}
|
||
|
|
||
|
func BenchmarkEncodingXML_Simple(b *testing.B) {
|
||
|
params := cloudfrontDeleteDistributionInput()
|
||
|
|
||
|
for i := 0; i < b.N; i++ {
|
||
|
buf := &bytes.Buffer{}
|
||
|
encoder := xml.NewEncoder(buf)
|
||
|
if err := encoder.Encode(params); err != nil {
|
||
|
b.Fatal("Unexpected error", err)
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func benchRESTXMLBuild(b *testing.B, reqFn func() *request.Request) {
|
||
|
b.ResetTimer()
|
||
|
|
||
|
for i := 0; i < b.N; i++ {
|
||
|
req := reqFn()
|
||
|
restxml.Build(req)
|
||
|
if req.Error != nil {
|
||
|
b.Fatal("Unexpected error", req.Error)
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func benchRESTXMLRequest(b *testing.B, reqFn func() *request.Request) {
|
||
|
b.ResetTimer()
|
||
|
|
||
|
for i := 0; i < b.N; i++ {
|
||
|
err := reqFn().Send()
|
||
|
if err != nil {
|
||
|
b.Fatal("Unexpected error", err)
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func cloudfrontCreateDistributionInput() *cloudfront.CreateDistributionInput {
|
||
|
return &cloudfront.CreateDistributionInput{
|
||
|
DistributionConfig: &cloudfront.DistributionConfig{ // Required
|
||
|
CallerReference: aws.String("string"), // Required
|
||
|
Comment: aws.String("string"), // Required
|
||
|
DefaultCacheBehavior: &cloudfront.DefaultCacheBehavior{ // Required
|
||
|
ForwardedValues: &cloudfront.ForwardedValues{ // Required
|
||
|
Cookies: &cloudfront.CookiePreference{ // Required
|
||
|
Forward: aws.String("ItemSelection"), // Required
|
||
|
WhitelistedNames: &cloudfront.CookieNames{
|
||
|
Quantity: aws.Int64(1), // Required
|
||
|
Items: []*string{
|
||
|
aws.String("string"), // Required
|
||
|
// More values...
|
||
|
},
|
||
|
},
|
||
|
},
|
||
|
QueryString: aws.Bool(true), // Required
|
||
|
Headers: &cloudfront.Headers{
|
||
|
Quantity: aws.Int64(1), // Required
|
||
|
Items: []*string{
|
||
|
aws.String("string"), // Required
|
||
|
// More values...
|
||
|
},
|
||
|
},
|
||
|
},
|
||
|
MinTTL: aws.Int64(1), // Required
|
||
|
TargetOriginId: aws.String("string"), // Required
|
||
|
TrustedSigners: &cloudfront.TrustedSigners{ // Required
|
||
|
Enabled: aws.Bool(true), // Required
|
||
|
Quantity: aws.Int64(1), // Required
|
||
|
Items: []*string{
|
||
|
aws.String("string"), // Required
|
||
|
// More values...
|
||
|
},
|
||
|
},
|
||
|
ViewerProtocolPolicy: aws.String("ViewerProtocolPolicy"), // Required
|
||
|
AllowedMethods: &cloudfront.AllowedMethods{
|
||
|
Items: []*string{ // Required
|
||
|
aws.String("Method"), // Required
|
||
|
// More values...
|
||
|
},
|
||
|
Quantity: aws.Int64(1), // Required
|
||
|
CachedMethods: &cloudfront.CachedMethods{
|
||
|
Items: []*string{ // Required
|
||
|
aws.String("Method"), // Required
|
||
|
// More values...
|
||
|
},
|
||
|
Quantity: aws.Int64(1), // Required
|
||
|
},
|
||
|
},
|
||
|
DefaultTTL: aws.Int64(1),
|
||
|
MaxTTL: aws.Int64(1),
|
||
|
SmoothStreaming: aws.Bool(true),
|
||
|
},
|
||
|
Enabled: aws.Bool(true), // Required
|
||
|
Origins: &cloudfront.Origins{ // Required
|
||
|
Quantity: aws.Int64(1), // Required
|
||
|
Items: []*cloudfront.Origin{
|
||
|
{ // Required
|
||
|
DomainName: aws.String("string"), // Required
|
||
|
Id: aws.String("string"), // Required
|
||
|
CustomOriginConfig: &cloudfront.CustomOriginConfig{
|
||
|
HTTPPort: aws.Int64(1), // Required
|
||
|
HTTPSPort: aws.Int64(1), // Required
|
||
|
OriginProtocolPolicy: aws.String("OriginProtocolPolicy"), // Required
|
||
|
},
|
||
|
OriginPath: aws.String("string"),
|
||
|
S3OriginConfig: &cloudfront.S3OriginConfig{
|
||
|
OriginAccessIdentity: aws.String("string"), // Required
|
||
|
},
|
||
|
},
|
||
|
// More values...
|
||
|
},
|
||
|
},
|
||
|
Aliases: &cloudfront.Aliases{
|
||
|
Quantity: aws.Int64(1), // Required
|
||
|
Items: []*string{
|
||
|
aws.String("string"), // Required
|
||
|
// More values...
|
||
|
},
|
||
|
},
|
||
|
CacheBehaviors: &cloudfront.CacheBehaviors{
|
||
|
Quantity: aws.Int64(1), // Required
|
||
|
Items: []*cloudfront.CacheBehavior{
|
||
|
{ // Required
|
||
|
ForwardedValues: &cloudfront.ForwardedValues{ // Required
|
||
|
Cookies: &cloudfront.CookiePreference{ // Required
|
||
|
Forward: aws.String("ItemSelection"), // Required
|
||
|
WhitelistedNames: &cloudfront.CookieNames{
|
||
|
Quantity: aws.Int64(1), // Required
|
||
|
Items: []*string{
|
||
|
aws.String("string"), // Required
|
||
|
// More values...
|
||
|
},
|
||
|
},
|
||
|
},
|
||
|
QueryString: aws.Bool(true), // Required
|
||
|
Headers: &cloudfront.Headers{
|
||
|
Quantity: aws.Int64(1), // Required
|
||
|
Items: []*string{
|
||
|
aws.String("string"), // Required
|
||
|
// More values...
|
||
|
},
|
||
|
},
|
||
|
},
|
||
|
MinTTL: aws.Int64(1), // Required
|
||
|
PathPattern: aws.String("string"), // Required
|
||
|
TargetOriginId: aws.String("string"), // Required
|
||
|
TrustedSigners: &cloudfront.TrustedSigners{ // Required
|
||
|
Enabled: aws.Bool(true), // Required
|
||
|
Quantity: aws.Int64(1), // Required
|
||
|
Items: []*string{
|
||
|
aws.String("string"), // Required
|
||
|
// More values...
|
||
|
},
|
||
|
},
|
||
|
ViewerProtocolPolicy: aws.String("ViewerProtocolPolicy"), // Required
|
||
|
AllowedMethods: &cloudfront.AllowedMethods{
|
||
|
Items: []*string{ // Required
|
||
|
aws.String("Method"), // Required
|
||
|
// More values...
|
||
|
},
|
||
|
Quantity: aws.Int64(1), // Required
|
||
|
CachedMethods: &cloudfront.CachedMethods{
|
||
|
Items: []*string{ // Required
|
||
|
aws.String("Method"), // Required
|
||
|
// More values...
|
||
|
},
|
||
|
Quantity: aws.Int64(1), // Required
|
||
|
},
|
||
|
},
|
||
|
DefaultTTL: aws.Int64(1),
|
||
|
MaxTTL: aws.Int64(1),
|
||
|
SmoothStreaming: aws.Bool(true),
|
||
|
},
|
||
|
// More values...
|
||
|
},
|
||
|
},
|
||
|
CustomErrorResponses: &cloudfront.CustomErrorResponses{
|
||
|
Quantity: aws.Int64(1), // Required
|
||
|
Items: []*cloudfront.CustomErrorResponse{
|
||
|
{ // Required
|
||
|
ErrorCode: aws.Int64(1), // Required
|
||
|
ErrorCachingMinTTL: aws.Int64(1),
|
||
|
ResponseCode: aws.String("string"),
|
||
|
ResponsePagePath: aws.String("string"),
|
||
|
},
|
||
|
// More values...
|
||
|
},
|
||
|
},
|
||
|
DefaultRootObject: aws.String("string"),
|
||
|
Logging: &cloudfront.LoggingConfig{
|
||
|
Bucket: aws.String("string"), // Required
|
||
|
Enabled: aws.Bool(true), // Required
|
||
|
IncludeCookies: aws.Bool(true), // Required
|
||
|
Prefix: aws.String("string"), // Required
|
||
|
},
|
||
|
PriceClass: aws.String("PriceClass"),
|
||
|
Restrictions: &cloudfront.Restrictions{
|
||
|
GeoRestriction: &cloudfront.GeoRestriction{ // Required
|
||
|
Quantity: aws.Int64(1), // Required
|
||
|
RestrictionType: aws.String("GeoRestrictionType"), // Required
|
||
|
Items: []*string{
|
||
|
aws.String("string"), // Required
|
||
|
// More values...
|
||
|
},
|
||
|
},
|
||
|
},
|
||
|
ViewerCertificate: &cloudfront.ViewerCertificate{
|
||
|
CloudFrontDefaultCertificate: aws.Bool(true),
|
||
|
IAMCertificateId: aws.String("string"),
|
||
|
MinimumProtocolVersion: aws.String("MinimumProtocolVersion"),
|
||
|
SSLSupportMethod: aws.String("SSLSupportMethod"),
|
||
|
},
|
||
|
},
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func cloudfrontDeleteDistributionInput() *cloudfront.DeleteDistributionInput {
|
||
|
return &cloudfront.DeleteDistributionInput{
|
||
|
Id: aws.String("string"), // Required
|
||
|
IfMatch: aws.String("string"),
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func s3HeadObjectInput() *s3.HeadObjectInput {
|
||
|
return &s3.HeadObjectInput{
|
||
|
Bucket: aws.String("somebucketname"),
|
||
|
Key: aws.String("keyname"),
|
||
|
VersionId: aws.String("someVersion"),
|
||
|
IfMatch: aws.String("IfMatch"),
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func s3PutObjectAclInput() *s3.PutObjectAclInput {
|
||
|
return &s3.PutObjectAclInput{
|
||
|
Bucket: aws.String("somebucketname"),
|
||
|
Key: aws.String("keyname"),
|
||
|
AccessControlPolicy: &s3.AccessControlPolicy{
|
||
|
Grants: []*s3.Grant{
|
||
|
{
|
||
|
Grantee: &s3.Grantee{
|
||
|
DisplayName: aws.String("someName"),
|
||
|
EmailAddress: aws.String("someAddr"),
|
||
|
ID: aws.String("someID"),
|
||
|
Type: aws.String(s3.TypeCanonicalUser),
|
||
|
URI: aws.String("someURI"),
|
||
|
},
|
||
|
Permission: aws.String(s3.PermissionWrite),
|
||
|
},
|
||
|
},
|
||
|
Owner: &s3.Owner{
|
||
|
DisplayName: aws.String("howdy"),
|
||
|
ID: aws.String("someID"),
|
||
|
},
|
||
|
},
|
||
|
}
|
||
|
}
|