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 }