github.com/aavshr/aws-sdk-go@v1.41.3/private/model/api/codegentest/service/restxmlservice/eventstream_test.go (about)

     1  // Code generated by private/model/cli/gen-api/main.go. DO NOT EDIT.
     2  
     3  //go:build go1.16
     4  // +build go1.16
     5  
     6  package restxmlservice
     7  
     8  import (
     9  	"bytes"
    10  	"context"
    11  	"io/ioutil"
    12  	"net/http"
    13  	"reflect"
    14  	"strings"
    15  	"sync"
    16  	"testing"
    17  	"time"
    18  
    19  	"github.com/aavshr/aws-sdk-go/aws"
    20  	"github.com/aavshr/aws-sdk-go/aws/awserr"
    21  	"github.com/aavshr/aws-sdk-go/aws/corehandlers"
    22  	"github.com/aavshr/aws-sdk-go/aws/request"
    23  	"github.com/aavshr/aws-sdk-go/awstesting/unit"
    24  	"github.com/aavshr/aws-sdk-go/private/protocol"
    25  	"github.com/aavshr/aws-sdk-go/private/protocol/eventstream"
    26  	"github.com/aavshr/aws-sdk-go/private/protocol/eventstream/eventstreamapi"
    27  	"github.com/aavshr/aws-sdk-go/private/protocol/eventstream/eventstreamtest"
    28  	"github.com/aavshr/aws-sdk-go/private/protocol/restxml"
    29  )
    30  
    31  var _ time.Time
    32  var _ awserr.Error
    33  var _ context.Context
    34  var _ sync.WaitGroup
    35  var _ strings.Reader
    36  
    37  func TestEmptyStream_Read(t *testing.T) {
    38  	expectEvents, eventMsgs := mockEmptyStreamReadEvents()
    39  	sess, cleanupFn, err := eventstreamtest.SetupEventStreamSession(t,
    40  		eventstreamtest.ServeEventStream{
    41  			T:      t,
    42  			Events: eventMsgs,
    43  		},
    44  		true,
    45  	)
    46  	if err != nil {
    47  		t.Fatalf("expect no error, %v", err)
    48  	}
    49  	defer cleanupFn()
    50  
    51  	svc := New(sess)
    52  	resp, err := svc.EmptyStream(nil)
    53  	if err != nil {
    54  		t.Fatalf("expect no error got, %v", err)
    55  	}
    56  	defer resp.GetStream().Close()
    57  
    58  	var i int
    59  	for event := range resp.GetStream().Events() {
    60  		if event == nil {
    61  			t.Errorf("%d, expect event, got nil", i)
    62  		}
    63  		if e, a := expectEvents[i], event; !reflect.DeepEqual(e, a) {
    64  			t.Errorf("%d, expect %T %v, got %T %v", i, e, e, a, a)
    65  		}
    66  		i++
    67  	}
    68  
    69  	if err := resp.GetStream().Err(); err != nil {
    70  		t.Errorf("expect no error, %v", err)
    71  	}
    72  }
    73  
    74  func TestEmptyStream_ReadClose(t *testing.T) {
    75  	_, eventMsgs := mockEmptyStreamReadEvents()
    76  	sess, cleanupFn, err := eventstreamtest.SetupEventStreamSession(t,
    77  		eventstreamtest.ServeEventStream{
    78  			T:      t,
    79  			Events: eventMsgs,
    80  		},
    81  		true,
    82  	)
    83  	if err != nil {
    84  		t.Fatalf("expect no error, %v", err)
    85  	}
    86  	defer cleanupFn()
    87  
    88  	svc := New(sess)
    89  	resp, err := svc.EmptyStream(nil)
    90  	if err != nil {
    91  		t.Fatalf("expect no error got, %v", err)
    92  	}
    93  
    94  	resp.GetStream().Close()
    95  	<-resp.GetStream().Events()
    96  
    97  	if err := resp.GetStream().Err(); err != nil {
    98  		t.Errorf("expect no error, %v", err)
    99  	}
   100  }
   101  
   102  func TestEmptyStream_ReadUnknownEvent(t *testing.T) {
   103  	expectEvents, eventMsgs := mockEmptyStreamReadEvents()
   104  	var eventOffset int
   105  
   106  	unknownEvent := eventstream.Message{
   107  		Headers: eventstream.Headers{
   108  			eventstreamtest.EventMessageTypeHeader,
   109  			{
   110  				Name:  eventstreamapi.EventTypeHeader,
   111  				Value: eventstream.StringValue("UnknownEventName"),
   112  			},
   113  		},
   114  		Payload: []byte("some unknown event"),
   115  	}
   116  
   117  	eventMsgs = append(eventMsgs[:eventOffset],
   118  		append([]eventstream.Message{unknownEvent}, eventMsgs[eventOffset:]...)...)
   119  
   120  	expectEvents = append(expectEvents[:eventOffset],
   121  		append([]EmptyEventStreamEvent{
   122  			&EmptyEventStreamUnknownEvent{
   123  				Type:    "UnknownEventName",
   124  				Message: unknownEvent,
   125  			},
   126  		},
   127  			expectEvents[eventOffset:]...)...)
   128  
   129  	sess, cleanupFn, err := eventstreamtest.SetupEventStreamSession(t,
   130  		eventstreamtest.ServeEventStream{
   131  			T:      t,
   132  			Events: eventMsgs,
   133  		},
   134  		true,
   135  	)
   136  	if err != nil {
   137  		t.Fatalf("expect no error, %v", err)
   138  	}
   139  	defer cleanupFn()
   140  
   141  	svc := New(sess)
   142  	resp, err := svc.EmptyStream(nil)
   143  	if err != nil {
   144  		t.Fatalf("expect no error got, %v", err)
   145  	}
   146  	defer resp.GetStream().Close()
   147  
   148  	var i int
   149  	for event := range resp.GetStream().Events() {
   150  		if event == nil {
   151  			t.Errorf("%d, expect event, got nil", i)
   152  		}
   153  		if e, a := expectEvents[i], event; !reflect.DeepEqual(e, a) {
   154  			t.Errorf("%d, expect %T %v, got %T %v", i, e, e, a, a)
   155  		}
   156  		i++
   157  	}
   158  
   159  	if err := resp.GetStream().Err(); err != nil {
   160  		t.Errorf("expect no error, %v", err)
   161  	}
   162  }
   163  
   164  func BenchmarkEmptyStream_Read(b *testing.B) {
   165  	_, eventMsgs := mockEmptyStreamReadEvents()
   166  	var buf bytes.Buffer
   167  	encoder := eventstream.NewEncoder(&buf)
   168  	for _, msg := range eventMsgs {
   169  		if err := encoder.Encode(msg); err != nil {
   170  			b.Fatalf("failed to encode message, %v", err)
   171  		}
   172  	}
   173  	stream := &loopReader{source: bytes.NewReader(buf.Bytes())}
   174  
   175  	sess := unit.Session
   176  	svc := New(sess, &aws.Config{
   177  		Endpoint:               aws.String("https://example.com"),
   178  		DisableParamValidation: aws.Bool(true),
   179  	})
   180  	svc.Handlers.Send.Swap(corehandlers.SendHandler.Name,
   181  		request.NamedHandler{Name: "mockSend",
   182  			Fn: func(r *request.Request) {
   183  				r.HTTPResponse = &http.Response{
   184  					Status:     "200 OK",
   185  					StatusCode: 200,
   186  					Header:     http.Header{},
   187  					Body:       ioutil.NopCloser(stream),
   188  				}
   189  			},
   190  		},
   191  	)
   192  
   193  	resp, err := svc.EmptyStream(nil)
   194  	if err != nil {
   195  		b.Fatalf("failed to create request, %v", err)
   196  	}
   197  	defer resp.GetStream().Close()
   198  	b.ResetTimer()
   199  
   200  	for i := 0; i < b.N; i++ {
   201  		if err = resp.GetStream().Err(); err != nil {
   202  			b.Fatalf("expect no error, got %v", err)
   203  		}
   204  		event := <-resp.GetStream().Events()
   205  		if event == nil {
   206  			b.Fatalf("expect event, got nil, %v, %d", resp.GetStream().Err(), i)
   207  		}
   208  	}
   209  }
   210  
   211  func mockEmptyStreamReadEvents() (
   212  	[]EmptyEventStreamEvent,
   213  	[]eventstream.Message,
   214  ) {
   215  	expectEvents := []EmptyEventStreamEvent{}
   216  
   217  	var marshalers request.HandlerList
   218  	marshalers.PushBackNamed(restxml.BuildHandler)
   219  	payloadMarshaler := protocol.HandlerPayloadMarshal{
   220  		Marshalers: marshalers,
   221  	}
   222  	_ = payloadMarshaler
   223  
   224  	eventMsgs := []eventstream.Message{}
   225  
   226  	return expectEvents, eventMsgs
   227  }
   228  
   229  func TestGetEventStream_Read(t *testing.T) {
   230  	expectEvents, eventMsgs := mockGetEventStreamReadEvents()
   231  	sess, cleanupFn, err := eventstreamtest.SetupEventStreamSession(t,
   232  		eventstreamtest.ServeEventStream{
   233  			T:      t,
   234  			Events: eventMsgs,
   235  		},
   236  		true,
   237  	)
   238  	if err != nil {
   239  		t.Fatalf("expect no error, %v", err)
   240  	}
   241  	defer cleanupFn()
   242  
   243  	svc := New(sess)
   244  	resp, err := svc.GetEventStream(nil)
   245  	if err != nil {
   246  		t.Fatalf("expect no error got, %v", err)
   247  	}
   248  	defer resp.GetStream().Close()
   249  
   250  	var i int
   251  	for event := range resp.GetStream().Events() {
   252  		if event == nil {
   253  			t.Errorf("%d, expect event, got nil", i)
   254  		}
   255  		if e, a := expectEvents[i], event; !reflect.DeepEqual(e, a) {
   256  			t.Errorf("%d, expect %T %v, got %T %v", i, e, e, a, a)
   257  		}
   258  		i++
   259  	}
   260  
   261  	if err := resp.GetStream().Err(); err != nil {
   262  		t.Errorf("expect no error, %v", err)
   263  	}
   264  }
   265  
   266  func TestGetEventStream_ReadClose(t *testing.T) {
   267  	_, eventMsgs := mockGetEventStreamReadEvents()
   268  	sess, cleanupFn, err := eventstreamtest.SetupEventStreamSession(t,
   269  		eventstreamtest.ServeEventStream{
   270  			T:      t,
   271  			Events: eventMsgs,
   272  		},
   273  		true,
   274  	)
   275  	if err != nil {
   276  		t.Fatalf("expect no error, %v", err)
   277  	}
   278  	defer cleanupFn()
   279  
   280  	svc := New(sess)
   281  	resp, err := svc.GetEventStream(nil)
   282  	if err != nil {
   283  		t.Fatalf("expect no error got, %v", err)
   284  	}
   285  
   286  	// Assert calling Err before close does not close the stream.
   287  	resp.GetStream().Err()
   288  	select {
   289  	case _, ok := <-resp.GetStream().Events():
   290  		if !ok {
   291  			t.Fatalf("expect stream not to be closed, but was")
   292  		}
   293  	default:
   294  	}
   295  
   296  	resp.GetStream().Close()
   297  	<-resp.GetStream().Events()
   298  
   299  	if err := resp.GetStream().Err(); err != nil {
   300  		t.Errorf("expect no error, %v", err)
   301  	}
   302  }
   303  
   304  func TestGetEventStream_ReadUnknownEvent(t *testing.T) {
   305  	expectEvents, eventMsgs := mockGetEventStreamReadEvents()
   306  	var eventOffset int
   307  
   308  	unknownEvent := eventstream.Message{
   309  		Headers: eventstream.Headers{
   310  			eventstreamtest.EventMessageTypeHeader,
   311  			{
   312  				Name:  eventstreamapi.EventTypeHeader,
   313  				Value: eventstream.StringValue("UnknownEventName"),
   314  			},
   315  		},
   316  		Payload: []byte("some unknown event"),
   317  	}
   318  
   319  	eventMsgs = append(eventMsgs[:eventOffset],
   320  		append([]eventstream.Message{unknownEvent}, eventMsgs[eventOffset:]...)...)
   321  
   322  	expectEvents = append(expectEvents[:eventOffset],
   323  		append([]EventStreamEvent{
   324  			&EventStreamUnknownEvent{
   325  				Type:    "UnknownEventName",
   326  				Message: unknownEvent,
   327  			},
   328  		},
   329  			expectEvents[eventOffset:]...)...)
   330  
   331  	sess, cleanupFn, err := eventstreamtest.SetupEventStreamSession(t,
   332  		eventstreamtest.ServeEventStream{
   333  			T:      t,
   334  			Events: eventMsgs,
   335  		},
   336  		true,
   337  	)
   338  	if err != nil {
   339  		t.Fatalf("expect no error, %v", err)
   340  	}
   341  	defer cleanupFn()
   342  
   343  	svc := New(sess)
   344  	resp, err := svc.GetEventStream(nil)
   345  	if err != nil {
   346  		t.Fatalf("expect no error got, %v", err)
   347  	}
   348  	defer resp.GetStream().Close()
   349  
   350  	var i int
   351  	for event := range resp.GetStream().Events() {
   352  		if event == nil {
   353  			t.Errorf("%d, expect event, got nil", i)
   354  		}
   355  		if e, a := expectEvents[i], event; !reflect.DeepEqual(e, a) {
   356  			t.Errorf("%d, expect %T %v, got %T %v", i, e, e, a, a)
   357  		}
   358  		i++
   359  	}
   360  
   361  	if err := resp.GetStream().Err(); err != nil {
   362  		t.Errorf("expect no error, %v", err)
   363  	}
   364  }
   365  
   366  func BenchmarkGetEventStream_Read(b *testing.B) {
   367  	_, eventMsgs := mockGetEventStreamReadEvents()
   368  	var buf bytes.Buffer
   369  	encoder := eventstream.NewEncoder(&buf)
   370  	for _, msg := range eventMsgs {
   371  		if err := encoder.Encode(msg); err != nil {
   372  			b.Fatalf("failed to encode message, %v", err)
   373  		}
   374  	}
   375  	stream := &loopReader{source: bytes.NewReader(buf.Bytes())}
   376  
   377  	sess := unit.Session
   378  	svc := New(sess, &aws.Config{
   379  		Endpoint:               aws.String("https://example.com"),
   380  		DisableParamValidation: aws.Bool(true),
   381  	})
   382  	svc.Handlers.Send.Swap(corehandlers.SendHandler.Name,
   383  		request.NamedHandler{Name: "mockSend",
   384  			Fn: func(r *request.Request) {
   385  				r.HTTPResponse = &http.Response{
   386  					Status:     "200 OK",
   387  					StatusCode: 200,
   388  					Header:     http.Header{},
   389  					Body:       ioutil.NopCloser(stream),
   390  				}
   391  			},
   392  		},
   393  	)
   394  
   395  	resp, err := svc.GetEventStream(nil)
   396  	if err != nil {
   397  		b.Fatalf("failed to create request, %v", err)
   398  	}
   399  	defer resp.GetStream().Close()
   400  	b.ResetTimer()
   401  
   402  	for i := 0; i < b.N; i++ {
   403  		if err = resp.GetStream().Err(); err != nil {
   404  			b.Fatalf("expect no error, got %v", err)
   405  		}
   406  		event := <-resp.GetStream().Events()
   407  		if event == nil {
   408  			b.Fatalf("expect event, got nil, %v, %d", resp.GetStream().Err(), i)
   409  		}
   410  	}
   411  }
   412  
   413  func mockGetEventStreamReadEvents() (
   414  	[]EventStreamEvent,
   415  	[]eventstream.Message,
   416  ) {
   417  	expectEvents := []EventStreamEvent{
   418  		&EmptyEvent{},
   419  		&ExplicitPayloadEvent{
   420  			LongVal: aws.Int64(1234),
   421  			NestedVal: &NestedShape{
   422  				IntVal: aws.Int64(123),
   423  				StrVal: aws.String("string value goes here"),
   424  			},
   425  			StringVal: aws.String("string value goes here"),
   426  		},
   427  		&HeaderOnlyEvent{
   428  			BlobVal:    []byte("blob value goes here"),
   429  			BoolVal:    aws.Bool(true),
   430  			ByteVal:    aws.Int64(1),
   431  			IntegerVal: aws.Int64(123),
   432  			LongVal:    aws.Int64(1234),
   433  			ShortVal:   aws.Int64(12),
   434  			StringVal:  aws.String("string value goes here"),
   435  			TimeVal:    aws.Time(time.Unix(1396594860, 0).UTC()),
   436  		},
   437  		&ImplicitPayloadEvent{
   438  			ByteVal:    aws.Int64(1),
   439  			IntegerVal: aws.Int64(123),
   440  			ShortVal:   aws.Int64(12),
   441  		},
   442  		&PayloadOnlyEvent{
   443  			NestedVal: &NestedShape{
   444  				IntVal: aws.Int64(123),
   445  				StrVal: aws.String("string value goes here"),
   446  			},
   447  		},
   448  		&PayloadOnlyBlobEvent{
   449  			BlobPayload: []byte("blob value goes here"),
   450  		},
   451  		&PayloadOnlyStringEvent{
   452  			StringPayload: aws.String("string value goes here"),
   453  		},
   454  	}
   455  
   456  	var marshalers request.HandlerList
   457  	marshalers.PushBackNamed(restxml.BuildHandler)
   458  	payloadMarshaler := protocol.HandlerPayloadMarshal{
   459  		Marshalers: marshalers,
   460  	}
   461  	_ = payloadMarshaler
   462  
   463  	eventMsgs := []eventstream.Message{
   464  		{
   465  			Headers: eventstream.Headers{
   466  				eventstreamtest.EventMessageTypeHeader,
   467  				{
   468  					Name:  eventstreamapi.EventTypeHeader,
   469  					Value: eventstream.StringValue("Empty"),
   470  				},
   471  			},
   472  		},
   473  		{
   474  			Headers: eventstream.Headers{
   475  				eventstreamtest.EventMessageTypeHeader,
   476  				{
   477  					Name:  eventstreamapi.EventTypeHeader,
   478  					Value: eventstream.StringValue("ExplicitPayload"),
   479  				},
   480  				{
   481  					Name:  "LongVal",
   482  					Value: eventstream.Int64Value(*expectEvents[1].(*ExplicitPayloadEvent).LongVal),
   483  				},
   484  				{
   485  					Name:  "StringVal",
   486  					Value: eventstream.StringValue(*expectEvents[1].(*ExplicitPayloadEvent).StringVal),
   487  				},
   488  			},
   489  			Payload: eventstreamtest.MarshalEventPayload(payloadMarshaler, expectEvents[1]),
   490  		},
   491  		{
   492  			Headers: eventstream.Headers{
   493  				eventstreamtest.EventMessageTypeHeader,
   494  				{
   495  					Name:  eventstreamapi.EventTypeHeader,
   496  					Value: eventstream.StringValue("Headers"),
   497  				},
   498  				{
   499  					Name:  "BlobVal",
   500  					Value: eventstream.BytesValue(expectEvents[2].(*HeaderOnlyEvent).BlobVal),
   501  				},
   502  				{
   503  					Name:  "BoolVal",
   504  					Value: eventstream.BoolValue(*expectEvents[2].(*HeaderOnlyEvent).BoolVal),
   505  				},
   506  				{
   507  					Name:  "ByteVal",
   508  					Value: eventstream.Int8Value(int8(*expectEvents[2].(*HeaderOnlyEvent).ByteVal)),
   509  				},
   510  				{
   511  					Name:  "IntegerVal",
   512  					Value: eventstream.Int32Value(int32(*expectEvents[2].(*HeaderOnlyEvent).IntegerVal)),
   513  				},
   514  				{
   515  					Name:  "LongVal",
   516  					Value: eventstream.Int64Value(*expectEvents[2].(*HeaderOnlyEvent).LongVal),
   517  				},
   518  				{
   519  					Name:  "ShortVal",
   520  					Value: eventstream.Int16Value(int16(*expectEvents[2].(*HeaderOnlyEvent).ShortVal)),
   521  				},
   522  				{
   523  					Name:  "StringVal",
   524  					Value: eventstream.StringValue(*expectEvents[2].(*HeaderOnlyEvent).StringVal),
   525  				},
   526  				{
   527  					Name:  "TimeVal",
   528  					Value: eventstream.TimestampValue(*expectEvents[2].(*HeaderOnlyEvent).TimeVal),
   529  				},
   530  			},
   531  		},
   532  		{
   533  			Headers: eventstream.Headers{
   534  				eventstreamtest.EventMessageTypeHeader,
   535  				{
   536  					Name:  eventstreamapi.EventTypeHeader,
   537  					Value: eventstream.StringValue("ImplicitPayload"),
   538  				},
   539  				{
   540  					Name:  "ByteVal",
   541  					Value: eventstream.Int8Value(int8(*expectEvents[3].(*ImplicitPayloadEvent).ByteVal)),
   542  				},
   543  			},
   544  			Payload: eventstreamtest.MarshalEventPayload(payloadMarshaler, expectEvents[3]),
   545  		},
   546  		{
   547  			Headers: eventstream.Headers{
   548  				eventstreamtest.EventMessageTypeHeader,
   549  				{
   550  					Name:  eventstreamapi.EventTypeHeader,
   551  					Value: eventstream.StringValue("PayloadOnly"),
   552  				},
   553  			},
   554  			Payload: eventstreamtest.MarshalEventPayload(payloadMarshaler, expectEvents[4]),
   555  		},
   556  		{
   557  			Headers: eventstream.Headers{
   558  				eventstreamtest.EventMessageTypeHeader,
   559  				{
   560  					Name:  eventstreamapi.EventTypeHeader,
   561  					Value: eventstream.StringValue("PayloadOnlyBlob"),
   562  				},
   563  			},
   564  			Payload: expectEvents[5].(*PayloadOnlyBlobEvent).BlobPayload,
   565  		},
   566  		{
   567  			Headers: eventstream.Headers{
   568  				eventstreamtest.EventMessageTypeHeader,
   569  				{
   570  					Name:  eventstreamapi.EventTypeHeader,
   571  					Value: eventstream.StringValue("PayloadOnlyString"),
   572  				},
   573  			},
   574  			Payload: []byte(*expectEvents[6].(*PayloadOnlyStringEvent).StringPayload),
   575  		},
   576  	}
   577  
   578  	return expectEvents, eventMsgs
   579  }
   580  func TestGetEventStream_ReadException(t *testing.T) {
   581  	expectEvents := []EventStreamEvent{
   582  		&ExceptionEvent{
   583  			RespMetadata: protocol.ResponseMetadata{
   584  				StatusCode: 200,
   585  			},
   586  			IntVal:   aws.Int64(123),
   587  			Message_: aws.String("string value goes here"),
   588  		},
   589  	}
   590  
   591  	var marshalers request.HandlerList
   592  	marshalers.PushBackNamed(restxml.BuildHandler)
   593  	payloadMarshaler := protocol.HandlerPayloadMarshal{
   594  		Marshalers: marshalers,
   595  	}
   596  
   597  	eventMsgs := []eventstream.Message{
   598  		{
   599  			Headers: eventstream.Headers{
   600  				eventstreamtest.EventExceptionTypeHeader,
   601  				{
   602  					Name:  eventstreamapi.ExceptionTypeHeader,
   603  					Value: eventstream.StringValue("Exception"),
   604  				},
   605  			},
   606  			Payload: eventstreamtest.MarshalEventPayload(payloadMarshaler, expectEvents[0]),
   607  		},
   608  	}
   609  
   610  	sess, cleanupFn, err := eventstreamtest.SetupEventStreamSession(t,
   611  		eventstreamtest.ServeEventStream{
   612  			T:      t,
   613  			Events: eventMsgs,
   614  		},
   615  		true,
   616  	)
   617  	if err != nil {
   618  		t.Fatalf("expect no error, %v", err)
   619  	}
   620  	defer cleanupFn()
   621  
   622  	svc := New(sess)
   623  	resp, err := svc.GetEventStream(nil)
   624  	if err != nil {
   625  		t.Fatalf("expect no error got, %v", err)
   626  	}
   627  
   628  	defer resp.GetStream().Close()
   629  
   630  	<-resp.GetStream().Events()
   631  
   632  	err = resp.GetStream().Err()
   633  	if err == nil {
   634  		t.Fatalf("expect err, got none")
   635  	}
   636  
   637  	expectErr := &ExceptionEvent{
   638  		RespMetadata: protocol.ResponseMetadata{
   639  			StatusCode: 200,
   640  		},
   641  		IntVal:   aws.Int64(123),
   642  		Message_: aws.String("string value goes here"),
   643  	}
   644  	aerr, ok := err.(awserr.Error)
   645  	if !ok {
   646  		t.Errorf("expect exception, got %T, %#v", err, err)
   647  	}
   648  	if e, a := expectErr.Code(), aerr.Code(); e != a {
   649  		t.Errorf("expect %v, got %v", e, a)
   650  	}
   651  	if e, a := expectErr.Message(), aerr.Message(); e != a {
   652  		t.Errorf("expect %v, got %v", e, a)
   653  	}
   654  
   655  	if e, a := expectErr, aerr; !reflect.DeepEqual(e, a) {
   656  		t.Errorf("expect error %+#v, got %+#v", e, a)
   657  	}
   658  }
   659  
   660  var _ awserr.Error = (*ExceptionEvent)(nil)
   661  var _ awserr.Error = (*ExceptionEvent2)(nil)
   662  
   663  type loopReader struct {
   664  	source *bytes.Reader
   665  }
   666  
   667  func (c *loopReader) Read(p []byte) (int, error) {
   668  	if c.source.Len() == 0 {
   669  		c.source.Seek(0, 0)
   670  	}
   671  
   672  	return c.source.Read(p)
   673  }