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 6package transcribestreamingservice 7 8import ( 9 "bytes" 10 "context" 11 "io/ioutil" 12 "net/http" 13 "reflect" 14 "strings" 15 "sync" 16 "testing" 17 "time" 18 19 "github.com/aws/aws-sdk-go/aws" 20 "github.com/aws/aws-sdk-go/aws/awserr" 21 "github.com/aws/aws-sdk-go/aws/corehandlers" 22 "github.com/aws/aws-sdk-go/aws/request" 23 "github.com/aws/aws-sdk-go/awstesting/unit" 24 "github.com/aws/aws-sdk-go/private/protocol" 25 "github.com/aws/aws-sdk-go/private/protocol/eventstream" 26 "github.com/aws/aws-sdk-go/private/protocol/eventstream/eventstreamapi" 27 "github.com/aws/aws-sdk-go/private/protocol/eventstream/eventstreamtest" 28 "github.com/aws/aws-sdk-go/private/protocol/restjson" 29) 30 31var _ time.Time 32var _ awserr.Error 33var _ context.Context 34var _ sync.WaitGroup 35var _ strings.Reader 36 37func TestStartMedicalStreamTranscription_Read(t *testing.T) { 38 expectEvents, eventMsgs := mockStartMedicalStreamTranscriptionReadEvents() 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.StartMedicalStreamTranscription(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 74func TestStartMedicalStreamTranscription_ReadClose(t *testing.T) { 75 _, eventMsgs := mockStartMedicalStreamTranscriptionReadEvents() 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.StartMedicalStreamTranscription(nil) 90 if err != nil { 91 t.Fatalf("expect no error got, %v", err) 92 } 93 94 // Assert calling Err before close does not close the stream. 95 resp.GetStream().Err() 96 select { 97 case _, ok := <-resp.GetStream().Events(): 98 if !ok { 99 t.Fatalf("expect stream not to be closed, but was") 100 } 101 default: 102 } 103 104 resp.GetStream().Close() 105 <-resp.GetStream().Events() 106 107 if err := resp.GetStream().Err(); err != nil { 108 t.Errorf("expect no error, %v", err) 109 } 110} 111 112func TestStartMedicalStreamTranscription_ReadUnknownEvent(t *testing.T) { 113 expectEvents, eventMsgs := mockStartMedicalStreamTranscriptionReadEvents() 114 var eventOffset int 115 116 unknownEvent := eventstream.Message{ 117 Headers: eventstream.Headers{ 118 eventstreamtest.EventMessageTypeHeader, 119 { 120 Name: eventstreamapi.EventTypeHeader, 121 Value: eventstream.StringValue("UnknownEventName"), 122 }, 123 }, 124 Payload: []byte("some unknown event"), 125 } 126 127 eventMsgs = append(eventMsgs[:eventOffset], 128 append([]eventstream.Message{unknownEvent}, eventMsgs[eventOffset:]...)...) 129 130 expectEvents = append(expectEvents[:eventOffset], 131 append([]MedicalTranscriptResultStreamEvent{ 132 &MedicalTranscriptResultStreamUnknownEvent{ 133 Type: "UnknownEventName", 134 Message: unknownEvent, 135 }, 136 }, 137 expectEvents[eventOffset:]...)...) 138 139 sess, cleanupFn, err := eventstreamtest.SetupEventStreamSession(t, 140 eventstreamtest.ServeEventStream{ 141 T: t, 142 Events: eventMsgs, 143 }, 144 true, 145 ) 146 if err != nil { 147 t.Fatalf("expect no error, %v", err) 148 } 149 defer cleanupFn() 150 151 svc := New(sess) 152 resp, err := svc.StartMedicalStreamTranscription(nil) 153 if err != nil { 154 t.Fatalf("expect no error got, %v", err) 155 } 156 defer resp.GetStream().Close() 157 158 var i int 159 for event := range resp.GetStream().Events() { 160 if event == nil { 161 t.Errorf("%d, expect event, got nil", i) 162 } 163 if e, a := expectEvents[i], event; !reflect.DeepEqual(e, a) { 164 t.Errorf("%d, expect %T %v, got %T %v", i, e, e, a, a) 165 } 166 i++ 167 } 168 169 if err := resp.GetStream().Err(); err != nil { 170 t.Errorf("expect no error, %v", err) 171 } 172} 173 174func BenchmarkStartMedicalStreamTranscription_Read(b *testing.B) { 175 _, eventMsgs := mockStartMedicalStreamTranscriptionReadEvents() 176 var buf bytes.Buffer 177 encoder := eventstream.NewEncoder(&buf) 178 for _, msg := range eventMsgs { 179 if err := encoder.Encode(msg); err != nil { 180 b.Fatalf("failed to encode message, %v", err) 181 } 182 } 183 stream := &loopReader{source: bytes.NewReader(buf.Bytes())} 184 185 sess := unit.Session 186 svc := New(sess, &aws.Config{ 187 Endpoint: aws.String("https://example.com"), 188 DisableParamValidation: aws.Bool(true), 189 }) 190 svc.Handlers.Send.Swap(corehandlers.SendHandler.Name, 191 request.NamedHandler{Name: "mockSend", 192 Fn: func(r *request.Request) { 193 r.HTTPResponse = &http.Response{ 194 Status: "200 OK", 195 StatusCode: 200, 196 Header: http.Header{}, 197 Body: ioutil.NopCloser(stream), 198 } 199 }, 200 }, 201 ) 202 203 resp, err := svc.StartMedicalStreamTranscription(nil) 204 if err != nil { 205 b.Fatalf("failed to create request, %v", err) 206 } 207 defer resp.GetStream().Close() 208 b.ResetTimer() 209 210 for i := 0; i < b.N; i++ { 211 if err = resp.GetStream().Err(); err != nil { 212 b.Fatalf("expect no error, got %v", err) 213 } 214 event := <-resp.GetStream().Events() 215 if event == nil { 216 b.Fatalf("expect event, got nil, %v, %d", resp.GetStream().Err(), i) 217 } 218 } 219} 220 221func mockStartMedicalStreamTranscriptionReadEvents() ( 222 []MedicalTranscriptResultStreamEvent, 223 []eventstream.Message, 224) { 225 expectEvents := []MedicalTranscriptResultStreamEvent{ 226 &MedicalTranscriptEvent{ 227 Transcript: &MedicalTranscript{ 228 Results: []*MedicalResult{ 229 { 230 Alternatives: []*MedicalAlternative{ 231 { 232 Entities: []*MedicalEntity{ 233 { 234 Category: aws.String("string value goes here"), 235 Confidence: aws.Float64(123.45), 236 Content: aws.String("string value goes here"), 237 EndTime: aws.Float64(123.45), 238 StartTime: aws.Float64(123.45), 239 }, 240 { 241 Category: aws.String("string value goes here"), 242 Confidence: aws.Float64(123.45), 243 Content: aws.String("string value goes here"), 244 EndTime: aws.Float64(123.45), 245 StartTime: aws.Float64(123.45), 246 }, 247 { 248 Category: aws.String("string value goes here"), 249 Confidence: aws.Float64(123.45), 250 Content: aws.String("string value goes here"), 251 EndTime: aws.Float64(123.45), 252 StartTime: aws.Float64(123.45), 253 }, 254 }, 255 Items: []*MedicalItem{ 256 { 257 Confidence: aws.Float64(123.45), 258 Content: aws.String("string value goes here"), 259 EndTime: aws.Float64(123.45), 260 Speaker: aws.String("string value goes here"), 261 StartTime: aws.Float64(123.45), 262 Type: aws.String("string value goes here"), 263 }, 264 { 265 Confidence: aws.Float64(123.45), 266 Content: aws.String("string value goes here"), 267 EndTime: aws.Float64(123.45), 268 Speaker: aws.String("string value goes here"), 269 StartTime: aws.Float64(123.45), 270 Type: aws.String("string value goes here"), 271 }, 272 { 273 Confidence: aws.Float64(123.45), 274 Content: aws.String("string value goes here"), 275 EndTime: aws.Float64(123.45), 276 Speaker: aws.String("string value goes here"), 277 StartTime: aws.Float64(123.45), 278 Type: aws.String("string value goes here"), 279 }, 280 }, 281 Transcript: aws.String("string value goes here"), 282 }, 283 { 284 Entities: []*MedicalEntity{ 285 { 286 Category: aws.String("string value goes here"), 287 Confidence: aws.Float64(123.45), 288 Content: aws.String("string value goes here"), 289 EndTime: aws.Float64(123.45), 290 StartTime: aws.Float64(123.45), 291 }, 292 { 293 Category: aws.String("string value goes here"), 294 Confidence: aws.Float64(123.45), 295 Content: aws.String("string value goes here"), 296 EndTime: aws.Float64(123.45), 297 StartTime: aws.Float64(123.45), 298 }, 299 { 300 Category: aws.String("string value goes here"), 301 Confidence: aws.Float64(123.45), 302 Content: aws.String("string value goes here"), 303 EndTime: aws.Float64(123.45), 304 StartTime: aws.Float64(123.45), 305 }, 306 }, 307 Items: []*MedicalItem{ 308 { 309 Confidence: aws.Float64(123.45), 310 Content: aws.String("string value goes here"), 311 EndTime: aws.Float64(123.45), 312 Speaker: aws.String("string value goes here"), 313 StartTime: aws.Float64(123.45), 314 Type: aws.String("string value goes here"), 315 }, 316 { 317 Confidence: aws.Float64(123.45), 318 Content: aws.String("string value goes here"), 319 EndTime: aws.Float64(123.45), 320 Speaker: aws.String("string value goes here"), 321 StartTime: aws.Float64(123.45), 322 Type: aws.String("string value goes here"), 323 }, 324 { 325 Confidence: aws.Float64(123.45), 326 Content: aws.String("string value goes here"), 327 EndTime: aws.Float64(123.45), 328 Speaker: aws.String("string value goes here"), 329 StartTime: aws.Float64(123.45), 330 Type: aws.String("string value goes here"), 331 }, 332 }, 333 Transcript: aws.String("string value goes here"), 334 }, 335 { 336 Entities: []*MedicalEntity{ 337 { 338 Category: aws.String("string value goes here"), 339 Confidence: aws.Float64(123.45), 340 Content: aws.String("string value goes here"), 341 EndTime: aws.Float64(123.45), 342 StartTime: aws.Float64(123.45), 343 }, 344 { 345 Category: aws.String("string value goes here"), 346 Confidence: aws.Float64(123.45), 347 Content: aws.String("string value goes here"), 348 EndTime: aws.Float64(123.45), 349 StartTime: aws.Float64(123.45), 350 }, 351 { 352 Category: aws.String("string value goes here"), 353 Confidence: aws.Float64(123.45), 354 Content: aws.String("string value goes here"), 355 EndTime: aws.Float64(123.45), 356 StartTime: aws.Float64(123.45), 357 }, 358 }, 359 Items: []*MedicalItem{ 360 { 361 Confidence: aws.Float64(123.45), 362 Content: aws.String("string value goes here"), 363 EndTime: aws.Float64(123.45), 364 Speaker: aws.String("string value goes here"), 365 StartTime: aws.Float64(123.45), 366 Type: aws.String("string value goes here"), 367 }, 368 { 369 Confidence: aws.Float64(123.45), 370 Content: aws.String("string value goes here"), 371 EndTime: aws.Float64(123.45), 372 Speaker: aws.String("string value goes here"), 373 StartTime: aws.Float64(123.45), 374 Type: aws.String("string value goes here"), 375 }, 376 { 377 Confidence: aws.Float64(123.45), 378 Content: aws.String("string value goes here"), 379 EndTime: aws.Float64(123.45), 380 Speaker: aws.String("string value goes here"), 381 StartTime: aws.Float64(123.45), 382 Type: aws.String("string value goes here"), 383 }, 384 }, 385 Transcript: aws.String("string value goes here"), 386 }, 387 }, 388 ChannelId: aws.String("string value goes here"), 389 EndTime: aws.Float64(123.45), 390 IsPartial: aws.Bool(true), 391 ResultId: aws.String("string value goes here"), 392 StartTime: aws.Float64(123.45), 393 }, 394 { 395 Alternatives: []*MedicalAlternative{ 396 { 397 Entities: []*MedicalEntity{ 398 { 399 Category: aws.String("string value goes here"), 400 Confidence: aws.Float64(123.45), 401 Content: aws.String("string value goes here"), 402 EndTime: aws.Float64(123.45), 403 StartTime: aws.Float64(123.45), 404 }, 405 { 406 Category: aws.String("string value goes here"), 407 Confidence: aws.Float64(123.45), 408 Content: aws.String("string value goes here"), 409 EndTime: aws.Float64(123.45), 410 StartTime: aws.Float64(123.45), 411 }, 412 { 413 Category: aws.String("string value goes here"), 414 Confidence: aws.Float64(123.45), 415 Content: aws.String("string value goes here"), 416 EndTime: aws.Float64(123.45), 417 StartTime: aws.Float64(123.45), 418 }, 419 }, 420 Items: []*MedicalItem{ 421 { 422 Confidence: aws.Float64(123.45), 423 Content: aws.String("string value goes here"), 424 EndTime: aws.Float64(123.45), 425 Speaker: aws.String("string value goes here"), 426 StartTime: aws.Float64(123.45), 427 Type: aws.String("string value goes here"), 428 }, 429 { 430 Confidence: aws.Float64(123.45), 431 Content: aws.String("string value goes here"), 432 EndTime: aws.Float64(123.45), 433 Speaker: aws.String("string value goes here"), 434 StartTime: aws.Float64(123.45), 435 Type: aws.String("string value goes here"), 436 }, 437 { 438 Confidence: aws.Float64(123.45), 439 Content: aws.String("string value goes here"), 440 EndTime: aws.Float64(123.45), 441 Speaker: aws.String("string value goes here"), 442 StartTime: aws.Float64(123.45), 443 Type: aws.String("string value goes here"), 444 }, 445 }, 446 Transcript: aws.String("string value goes here"), 447 }, 448 { 449 Entities: []*MedicalEntity{ 450 { 451 Category: aws.String("string value goes here"), 452 Confidence: aws.Float64(123.45), 453 Content: aws.String("string value goes here"), 454 EndTime: aws.Float64(123.45), 455 StartTime: aws.Float64(123.45), 456 }, 457 { 458 Category: aws.String("string value goes here"), 459 Confidence: aws.Float64(123.45), 460 Content: aws.String("string value goes here"), 461 EndTime: aws.Float64(123.45), 462 StartTime: aws.Float64(123.45), 463 }, 464 { 465 Category: aws.String("string value goes here"), 466 Confidence: aws.Float64(123.45), 467 Content: aws.String("string value goes here"), 468 EndTime: aws.Float64(123.45), 469 StartTime: aws.Float64(123.45), 470 }, 471 }, 472 Items: []*MedicalItem{ 473 { 474 Confidence: aws.Float64(123.45), 475 Content: aws.String("string value goes here"), 476 EndTime: aws.Float64(123.45), 477 Speaker: aws.String("string value goes here"), 478 StartTime: aws.Float64(123.45), 479 Type: aws.String("string value goes here"), 480 }, 481 { 482 Confidence: aws.Float64(123.45), 483 Content: aws.String("string value goes here"), 484 EndTime: aws.Float64(123.45), 485 Speaker: aws.String("string value goes here"), 486 StartTime: aws.Float64(123.45), 487 Type: aws.String("string value goes here"), 488 }, 489 { 490 Confidence: aws.Float64(123.45), 491 Content: aws.String("string value goes here"), 492 EndTime: aws.Float64(123.45), 493 Speaker: aws.String("string value goes here"), 494 StartTime: aws.Float64(123.45), 495 Type: aws.String("string value goes here"), 496 }, 497 }, 498 Transcript: aws.String("string value goes here"), 499 }, 500 { 501 Entities: []*MedicalEntity{ 502 { 503 Category: aws.String("string value goes here"), 504 Confidence: aws.Float64(123.45), 505 Content: aws.String("string value goes here"), 506 EndTime: aws.Float64(123.45), 507 StartTime: aws.Float64(123.45), 508 }, 509 { 510 Category: aws.String("string value goes here"), 511 Confidence: aws.Float64(123.45), 512 Content: aws.String("string value goes here"), 513 EndTime: aws.Float64(123.45), 514 StartTime: aws.Float64(123.45), 515 }, 516 { 517 Category: aws.String("string value goes here"), 518 Confidence: aws.Float64(123.45), 519 Content: aws.String("string value goes here"), 520 EndTime: aws.Float64(123.45), 521 StartTime: aws.Float64(123.45), 522 }, 523 }, 524 Items: []*MedicalItem{ 525 { 526 Confidence: aws.Float64(123.45), 527 Content: aws.String("string value goes here"), 528 EndTime: aws.Float64(123.45), 529 Speaker: aws.String("string value goes here"), 530 StartTime: aws.Float64(123.45), 531 Type: aws.String("string value goes here"), 532 }, 533 { 534 Confidence: aws.Float64(123.45), 535 Content: aws.String("string value goes here"), 536 EndTime: aws.Float64(123.45), 537 Speaker: aws.String("string value goes here"), 538 StartTime: aws.Float64(123.45), 539 Type: aws.String("string value goes here"), 540 }, 541 { 542 Confidence: aws.Float64(123.45), 543 Content: aws.String("string value goes here"), 544 EndTime: aws.Float64(123.45), 545 Speaker: aws.String("string value goes here"), 546 StartTime: aws.Float64(123.45), 547 Type: aws.String("string value goes here"), 548 }, 549 }, 550 Transcript: aws.String("string value goes here"), 551 }, 552 }, 553 ChannelId: aws.String("string value goes here"), 554 EndTime: aws.Float64(123.45), 555 IsPartial: aws.Bool(true), 556 ResultId: aws.String("string value goes here"), 557 StartTime: aws.Float64(123.45), 558 }, 559 { 560 Alternatives: []*MedicalAlternative{ 561 { 562 Entities: []*MedicalEntity{ 563 { 564 Category: aws.String("string value goes here"), 565 Confidence: aws.Float64(123.45), 566 Content: aws.String("string value goes here"), 567 EndTime: aws.Float64(123.45), 568 StartTime: aws.Float64(123.45), 569 }, 570 { 571 Category: aws.String("string value goes here"), 572 Confidence: aws.Float64(123.45), 573 Content: aws.String("string value goes here"), 574 EndTime: aws.Float64(123.45), 575 StartTime: aws.Float64(123.45), 576 }, 577 { 578 Category: aws.String("string value goes here"), 579 Confidence: aws.Float64(123.45), 580 Content: aws.String("string value goes here"), 581 EndTime: aws.Float64(123.45), 582 StartTime: aws.Float64(123.45), 583 }, 584 }, 585 Items: []*MedicalItem{ 586 { 587 Confidence: aws.Float64(123.45), 588 Content: aws.String("string value goes here"), 589 EndTime: aws.Float64(123.45), 590 Speaker: aws.String("string value goes here"), 591 StartTime: aws.Float64(123.45), 592 Type: aws.String("string value goes here"), 593 }, 594 { 595 Confidence: aws.Float64(123.45), 596 Content: aws.String("string value goes here"), 597 EndTime: aws.Float64(123.45), 598 Speaker: aws.String("string value goes here"), 599 StartTime: aws.Float64(123.45), 600 Type: aws.String("string value goes here"), 601 }, 602 { 603 Confidence: aws.Float64(123.45), 604 Content: aws.String("string value goes here"), 605 EndTime: aws.Float64(123.45), 606 Speaker: aws.String("string value goes here"), 607 StartTime: aws.Float64(123.45), 608 Type: aws.String("string value goes here"), 609 }, 610 }, 611 Transcript: aws.String("string value goes here"), 612 }, 613 { 614 Entities: []*MedicalEntity{ 615 { 616 Category: aws.String("string value goes here"), 617 Confidence: aws.Float64(123.45), 618 Content: aws.String("string value goes here"), 619 EndTime: aws.Float64(123.45), 620 StartTime: aws.Float64(123.45), 621 }, 622 { 623 Category: aws.String("string value goes here"), 624 Confidence: aws.Float64(123.45), 625 Content: aws.String("string value goes here"), 626 EndTime: aws.Float64(123.45), 627 StartTime: aws.Float64(123.45), 628 }, 629 { 630 Category: aws.String("string value goes here"), 631 Confidence: aws.Float64(123.45), 632 Content: aws.String("string value goes here"), 633 EndTime: aws.Float64(123.45), 634 StartTime: aws.Float64(123.45), 635 }, 636 }, 637 Items: []*MedicalItem{ 638 { 639 Confidence: aws.Float64(123.45), 640 Content: aws.String("string value goes here"), 641 EndTime: aws.Float64(123.45), 642 Speaker: aws.String("string value goes here"), 643 StartTime: aws.Float64(123.45), 644 Type: aws.String("string value goes here"), 645 }, 646 { 647 Confidence: aws.Float64(123.45), 648 Content: aws.String("string value goes here"), 649 EndTime: aws.Float64(123.45), 650 Speaker: aws.String("string value goes here"), 651 StartTime: aws.Float64(123.45), 652 Type: aws.String("string value goes here"), 653 }, 654 { 655 Confidence: aws.Float64(123.45), 656 Content: aws.String("string value goes here"), 657 EndTime: aws.Float64(123.45), 658 Speaker: aws.String("string value goes here"), 659 StartTime: aws.Float64(123.45), 660 Type: aws.String("string value goes here"), 661 }, 662 }, 663 Transcript: aws.String("string value goes here"), 664 }, 665 { 666 Entities: []*MedicalEntity{ 667 { 668 Category: aws.String("string value goes here"), 669 Confidence: aws.Float64(123.45), 670 Content: aws.String("string value goes here"), 671 EndTime: aws.Float64(123.45), 672 StartTime: aws.Float64(123.45), 673 }, 674 { 675 Category: aws.String("string value goes here"), 676 Confidence: aws.Float64(123.45), 677 Content: aws.String("string value goes here"), 678 EndTime: aws.Float64(123.45), 679 StartTime: aws.Float64(123.45), 680 }, 681 { 682 Category: aws.String("string value goes here"), 683 Confidence: aws.Float64(123.45), 684 Content: aws.String("string value goes here"), 685 EndTime: aws.Float64(123.45), 686 StartTime: aws.Float64(123.45), 687 }, 688 }, 689 Items: []*MedicalItem{ 690 { 691 Confidence: aws.Float64(123.45), 692 Content: aws.String("string value goes here"), 693 EndTime: aws.Float64(123.45), 694 Speaker: aws.String("string value goes here"), 695 StartTime: aws.Float64(123.45), 696 Type: aws.String("string value goes here"), 697 }, 698 { 699 Confidence: aws.Float64(123.45), 700 Content: aws.String("string value goes here"), 701 EndTime: aws.Float64(123.45), 702 Speaker: aws.String("string value goes here"), 703 StartTime: aws.Float64(123.45), 704 Type: aws.String("string value goes here"), 705 }, 706 { 707 Confidence: aws.Float64(123.45), 708 Content: aws.String("string value goes here"), 709 EndTime: aws.Float64(123.45), 710 Speaker: aws.String("string value goes here"), 711 StartTime: aws.Float64(123.45), 712 Type: aws.String("string value goes here"), 713 }, 714 }, 715 Transcript: aws.String("string value goes here"), 716 }, 717 }, 718 ChannelId: aws.String("string value goes here"), 719 EndTime: aws.Float64(123.45), 720 IsPartial: aws.Bool(true), 721 ResultId: aws.String("string value goes here"), 722 StartTime: aws.Float64(123.45), 723 }, 724 }, 725 }, 726 }, 727 } 728 729 var marshalers request.HandlerList 730 marshalers.PushBackNamed(restjson.BuildHandler) 731 payloadMarshaler := protocol.HandlerPayloadMarshal{ 732 Marshalers: marshalers, 733 } 734 _ = payloadMarshaler 735 736 eventMsgs := []eventstream.Message{ 737 { 738 Headers: eventstream.Headers{ 739 eventstreamtest.EventMessageTypeHeader, 740 { 741 Name: eventstreamapi.EventTypeHeader, 742 Value: eventstream.StringValue("TranscriptEvent"), 743 }, 744 }, 745 Payload: eventstreamtest.MarshalEventPayload(payloadMarshaler, expectEvents[0]), 746 }, 747 } 748 749 return expectEvents, eventMsgs 750} 751func TestStartMedicalStreamTranscription_ReadException(t *testing.T) { 752 expectEvents := []MedicalTranscriptResultStreamEvent{ 753 &BadRequestException{ 754 RespMetadata: protocol.ResponseMetadata{ 755 StatusCode: 200, 756 }, 757 Message_: aws.String("string value goes here"), 758 }, 759 } 760 761 var marshalers request.HandlerList 762 marshalers.PushBackNamed(restjson.BuildHandler) 763 payloadMarshaler := protocol.HandlerPayloadMarshal{ 764 Marshalers: marshalers, 765 } 766 767 eventMsgs := []eventstream.Message{ 768 { 769 Headers: eventstream.Headers{ 770 eventstreamtest.EventExceptionTypeHeader, 771 { 772 Name: eventstreamapi.ExceptionTypeHeader, 773 Value: eventstream.StringValue("BadRequestException"), 774 }, 775 }, 776 Payload: eventstreamtest.MarshalEventPayload(payloadMarshaler, expectEvents[0]), 777 }, 778 } 779 780 sess, cleanupFn, err := eventstreamtest.SetupEventStreamSession(t, 781 eventstreamtest.ServeEventStream{ 782 T: t, 783 Events: eventMsgs, 784 }, 785 true, 786 ) 787 if err != nil { 788 t.Fatalf("expect no error, %v", err) 789 } 790 defer cleanupFn() 791 792 svc := New(sess) 793 resp, err := svc.StartMedicalStreamTranscription(nil) 794 if err != nil { 795 t.Fatalf("expect no error got, %v", err) 796 } 797 798 defer resp.GetStream().Close() 799 800 <-resp.GetStream().Events() 801 802 err = resp.GetStream().Err() 803 if err == nil { 804 t.Fatalf("expect err, got none") 805 } 806 807 expectErr := &BadRequestException{ 808 RespMetadata: protocol.ResponseMetadata{ 809 StatusCode: 200, 810 }, 811 Message_: aws.String("string value goes here"), 812 } 813 aerr, ok := err.(awserr.Error) 814 if !ok { 815 t.Errorf("expect exception, got %T, %#v", err, err) 816 } 817 if e, a := expectErr.Code(), aerr.Code(); e != a { 818 t.Errorf("expect %v, got %v", e, a) 819 } 820 if e, a := expectErr.Message(), aerr.Message(); e != a { 821 t.Errorf("expect %v, got %v", e, a) 822 } 823 824 if e, a := expectErr, aerr; !reflect.DeepEqual(e, a) { 825 t.Errorf("expect error %+#v, got %+#v", e, a) 826 } 827} 828 829var _ awserr.Error = (*BadRequestException)(nil) 830var _ awserr.Error = (*ConflictException)(nil) 831var _ awserr.Error = (*InternalFailureException)(nil) 832var _ awserr.Error = (*LimitExceededException)(nil) 833var _ awserr.Error = (*ServiceUnavailableException)(nil) 834 835func TestStartStreamTranscription_Read(t *testing.T) { 836 expectEvents, eventMsgs := mockStartStreamTranscriptionReadEvents() 837 sess, cleanupFn, err := eventstreamtest.SetupEventStreamSession(t, 838 eventstreamtest.ServeEventStream{ 839 T: t, 840 Events: eventMsgs, 841 }, 842 true, 843 ) 844 if err != nil { 845 t.Fatalf("expect no error, %v", err) 846 } 847 defer cleanupFn() 848 849 svc := New(sess) 850 resp, err := svc.StartStreamTranscription(nil) 851 if err != nil { 852 t.Fatalf("expect no error got, %v", err) 853 } 854 defer resp.GetStream().Close() 855 856 var i int 857 for event := range resp.GetStream().Events() { 858 if event == nil { 859 t.Errorf("%d, expect event, got nil", i) 860 } 861 if e, a := expectEvents[i], event; !reflect.DeepEqual(e, a) { 862 t.Errorf("%d, expect %T %v, got %T %v", i, e, e, a, a) 863 } 864 i++ 865 } 866 867 if err := resp.GetStream().Err(); err != nil { 868 t.Errorf("expect no error, %v", err) 869 } 870} 871 872func TestStartStreamTranscription_ReadClose(t *testing.T) { 873 _, eventMsgs := mockStartStreamTranscriptionReadEvents() 874 sess, cleanupFn, err := eventstreamtest.SetupEventStreamSession(t, 875 eventstreamtest.ServeEventStream{ 876 T: t, 877 Events: eventMsgs, 878 }, 879 true, 880 ) 881 if err != nil { 882 t.Fatalf("expect no error, %v", err) 883 } 884 defer cleanupFn() 885 886 svc := New(sess) 887 resp, err := svc.StartStreamTranscription(nil) 888 if err != nil { 889 t.Fatalf("expect no error got, %v", err) 890 } 891 892 // Assert calling Err before close does not close the stream. 893 resp.GetStream().Err() 894 select { 895 case _, ok := <-resp.GetStream().Events(): 896 if !ok { 897 t.Fatalf("expect stream not to be closed, but was") 898 } 899 default: 900 } 901 902 resp.GetStream().Close() 903 <-resp.GetStream().Events() 904 905 if err := resp.GetStream().Err(); err != nil { 906 t.Errorf("expect no error, %v", err) 907 } 908} 909 910func TestStartStreamTranscription_ReadUnknownEvent(t *testing.T) { 911 expectEvents, eventMsgs := mockStartStreamTranscriptionReadEvents() 912 var eventOffset int 913 914 unknownEvent := eventstream.Message{ 915 Headers: eventstream.Headers{ 916 eventstreamtest.EventMessageTypeHeader, 917 { 918 Name: eventstreamapi.EventTypeHeader, 919 Value: eventstream.StringValue("UnknownEventName"), 920 }, 921 }, 922 Payload: []byte("some unknown event"), 923 } 924 925 eventMsgs = append(eventMsgs[:eventOffset], 926 append([]eventstream.Message{unknownEvent}, eventMsgs[eventOffset:]...)...) 927 928 expectEvents = append(expectEvents[:eventOffset], 929 append([]TranscriptResultStreamEvent{ 930 &TranscriptResultStreamUnknownEvent{ 931 Type: "UnknownEventName", 932 Message: unknownEvent, 933 }, 934 }, 935 expectEvents[eventOffset:]...)...) 936 937 sess, cleanupFn, err := eventstreamtest.SetupEventStreamSession(t, 938 eventstreamtest.ServeEventStream{ 939 T: t, 940 Events: eventMsgs, 941 }, 942 true, 943 ) 944 if err != nil { 945 t.Fatalf("expect no error, %v", err) 946 } 947 defer cleanupFn() 948 949 svc := New(sess) 950 resp, err := svc.StartStreamTranscription(nil) 951 if err != nil { 952 t.Fatalf("expect no error got, %v", err) 953 } 954 defer resp.GetStream().Close() 955 956 var i int 957 for event := range resp.GetStream().Events() { 958 if event == nil { 959 t.Errorf("%d, expect event, got nil", i) 960 } 961 if e, a := expectEvents[i], event; !reflect.DeepEqual(e, a) { 962 t.Errorf("%d, expect %T %v, got %T %v", i, e, e, a, a) 963 } 964 i++ 965 } 966 967 if err := resp.GetStream().Err(); err != nil { 968 t.Errorf("expect no error, %v", err) 969 } 970} 971 972func BenchmarkStartStreamTranscription_Read(b *testing.B) { 973 _, eventMsgs := mockStartStreamTranscriptionReadEvents() 974 var buf bytes.Buffer 975 encoder := eventstream.NewEncoder(&buf) 976 for _, msg := range eventMsgs { 977 if err := encoder.Encode(msg); err != nil { 978 b.Fatalf("failed to encode message, %v", err) 979 } 980 } 981 stream := &loopReader{source: bytes.NewReader(buf.Bytes())} 982 983 sess := unit.Session 984 svc := New(sess, &aws.Config{ 985 Endpoint: aws.String("https://example.com"), 986 DisableParamValidation: aws.Bool(true), 987 }) 988 svc.Handlers.Send.Swap(corehandlers.SendHandler.Name, 989 request.NamedHandler{Name: "mockSend", 990 Fn: func(r *request.Request) { 991 r.HTTPResponse = &http.Response{ 992 Status: "200 OK", 993 StatusCode: 200, 994 Header: http.Header{}, 995 Body: ioutil.NopCloser(stream), 996 } 997 }, 998 }, 999 ) 1000 1001 resp, err := svc.StartStreamTranscription(nil) 1002 if err != nil { 1003 b.Fatalf("failed to create request, %v", err) 1004 } 1005 defer resp.GetStream().Close() 1006 b.ResetTimer() 1007 1008 for i := 0; i < b.N; i++ { 1009 if err = resp.GetStream().Err(); err != nil { 1010 b.Fatalf("expect no error, got %v", err) 1011 } 1012 event := <-resp.GetStream().Events() 1013 if event == nil { 1014 b.Fatalf("expect event, got nil, %v, %d", resp.GetStream().Err(), i) 1015 } 1016 } 1017} 1018 1019func mockStartStreamTranscriptionReadEvents() ( 1020 []TranscriptResultStreamEvent, 1021 []eventstream.Message, 1022) { 1023 expectEvents := []TranscriptResultStreamEvent{ 1024 &TranscriptEvent{ 1025 Transcript: &Transcript{ 1026 Results: []*Result{ 1027 { 1028 Alternatives: []*Alternative{ 1029 { 1030 Items: []*Item{ 1031 { 1032 Confidence: aws.Float64(123.45), 1033 Content: aws.String("string value goes here"), 1034 EndTime: aws.Float64(123.45), 1035 Speaker: aws.String("string value goes here"), 1036 Stable: aws.Bool(true), 1037 StartTime: aws.Float64(123.45), 1038 Type: aws.String("string value goes here"), 1039 VocabularyFilterMatch: aws.Bool(true), 1040 }, 1041 { 1042 Confidence: aws.Float64(123.45), 1043 Content: aws.String("string value goes here"), 1044 EndTime: aws.Float64(123.45), 1045 Speaker: aws.String("string value goes here"), 1046 Stable: aws.Bool(true), 1047 StartTime: aws.Float64(123.45), 1048 Type: aws.String("string value goes here"), 1049 VocabularyFilterMatch: aws.Bool(true), 1050 }, 1051 { 1052 Confidence: aws.Float64(123.45), 1053 Content: aws.String("string value goes here"), 1054 EndTime: aws.Float64(123.45), 1055 Speaker: aws.String("string value goes here"), 1056 Stable: aws.Bool(true), 1057 StartTime: aws.Float64(123.45), 1058 Type: aws.String("string value goes here"), 1059 VocabularyFilterMatch: aws.Bool(true), 1060 }, 1061 }, 1062 Transcript: aws.String("string value goes here"), 1063 }, 1064 { 1065 Items: []*Item{ 1066 { 1067 Confidence: aws.Float64(123.45), 1068 Content: aws.String("string value goes here"), 1069 EndTime: aws.Float64(123.45), 1070 Speaker: aws.String("string value goes here"), 1071 Stable: aws.Bool(true), 1072 StartTime: aws.Float64(123.45), 1073 Type: aws.String("string value goes here"), 1074 VocabularyFilterMatch: aws.Bool(true), 1075 }, 1076 { 1077 Confidence: aws.Float64(123.45), 1078 Content: aws.String("string value goes here"), 1079 EndTime: aws.Float64(123.45), 1080 Speaker: aws.String("string value goes here"), 1081 Stable: aws.Bool(true), 1082 StartTime: aws.Float64(123.45), 1083 Type: aws.String("string value goes here"), 1084 VocabularyFilterMatch: aws.Bool(true), 1085 }, 1086 { 1087 Confidence: aws.Float64(123.45), 1088 Content: aws.String("string value goes here"), 1089 EndTime: aws.Float64(123.45), 1090 Speaker: aws.String("string value goes here"), 1091 Stable: aws.Bool(true), 1092 StartTime: aws.Float64(123.45), 1093 Type: aws.String("string value goes here"), 1094 VocabularyFilterMatch: aws.Bool(true), 1095 }, 1096 }, 1097 Transcript: aws.String("string value goes here"), 1098 }, 1099 { 1100 Items: []*Item{ 1101 { 1102 Confidence: aws.Float64(123.45), 1103 Content: aws.String("string value goes here"), 1104 EndTime: aws.Float64(123.45), 1105 Speaker: aws.String("string value goes here"), 1106 Stable: aws.Bool(true), 1107 StartTime: aws.Float64(123.45), 1108 Type: aws.String("string value goes here"), 1109 VocabularyFilterMatch: aws.Bool(true), 1110 }, 1111 { 1112 Confidence: aws.Float64(123.45), 1113 Content: aws.String("string value goes here"), 1114 EndTime: aws.Float64(123.45), 1115 Speaker: aws.String("string value goes here"), 1116 Stable: aws.Bool(true), 1117 StartTime: aws.Float64(123.45), 1118 Type: aws.String("string value goes here"), 1119 VocabularyFilterMatch: aws.Bool(true), 1120 }, 1121 { 1122 Confidence: aws.Float64(123.45), 1123 Content: aws.String("string value goes here"), 1124 EndTime: aws.Float64(123.45), 1125 Speaker: aws.String("string value goes here"), 1126 Stable: aws.Bool(true), 1127 StartTime: aws.Float64(123.45), 1128 Type: aws.String("string value goes here"), 1129 VocabularyFilterMatch: aws.Bool(true), 1130 }, 1131 }, 1132 Transcript: aws.String("string value goes here"), 1133 }, 1134 }, 1135 ChannelId: aws.String("string value goes here"), 1136 EndTime: aws.Float64(123.45), 1137 IsPartial: aws.Bool(true), 1138 ResultId: aws.String("string value goes here"), 1139 StartTime: aws.Float64(123.45), 1140 }, 1141 { 1142 Alternatives: []*Alternative{ 1143 { 1144 Items: []*Item{ 1145 { 1146 Confidence: aws.Float64(123.45), 1147 Content: aws.String("string value goes here"), 1148 EndTime: aws.Float64(123.45), 1149 Speaker: aws.String("string value goes here"), 1150 Stable: aws.Bool(true), 1151 StartTime: aws.Float64(123.45), 1152 Type: aws.String("string value goes here"), 1153 VocabularyFilterMatch: aws.Bool(true), 1154 }, 1155 { 1156 Confidence: aws.Float64(123.45), 1157 Content: aws.String("string value goes here"), 1158 EndTime: aws.Float64(123.45), 1159 Speaker: aws.String("string value goes here"), 1160 Stable: aws.Bool(true), 1161 StartTime: aws.Float64(123.45), 1162 Type: aws.String("string value goes here"), 1163 VocabularyFilterMatch: aws.Bool(true), 1164 }, 1165 { 1166 Confidence: aws.Float64(123.45), 1167 Content: aws.String("string value goes here"), 1168 EndTime: aws.Float64(123.45), 1169 Speaker: aws.String("string value goes here"), 1170 Stable: aws.Bool(true), 1171 StartTime: aws.Float64(123.45), 1172 Type: aws.String("string value goes here"), 1173 VocabularyFilterMatch: aws.Bool(true), 1174 }, 1175 }, 1176 Transcript: aws.String("string value goes here"), 1177 }, 1178 { 1179 Items: []*Item{ 1180 { 1181 Confidence: aws.Float64(123.45), 1182 Content: aws.String("string value goes here"), 1183 EndTime: aws.Float64(123.45), 1184 Speaker: aws.String("string value goes here"), 1185 Stable: aws.Bool(true), 1186 StartTime: aws.Float64(123.45), 1187 Type: aws.String("string value goes here"), 1188 VocabularyFilterMatch: aws.Bool(true), 1189 }, 1190 { 1191 Confidence: aws.Float64(123.45), 1192 Content: aws.String("string value goes here"), 1193 EndTime: aws.Float64(123.45), 1194 Speaker: aws.String("string value goes here"), 1195 Stable: aws.Bool(true), 1196 StartTime: aws.Float64(123.45), 1197 Type: aws.String("string value goes here"), 1198 VocabularyFilterMatch: aws.Bool(true), 1199 }, 1200 { 1201 Confidence: aws.Float64(123.45), 1202 Content: aws.String("string value goes here"), 1203 EndTime: aws.Float64(123.45), 1204 Speaker: aws.String("string value goes here"), 1205 Stable: aws.Bool(true), 1206 StartTime: aws.Float64(123.45), 1207 Type: aws.String("string value goes here"), 1208 VocabularyFilterMatch: aws.Bool(true), 1209 }, 1210 }, 1211 Transcript: aws.String("string value goes here"), 1212 }, 1213 { 1214 Items: []*Item{ 1215 { 1216 Confidence: aws.Float64(123.45), 1217 Content: aws.String("string value goes here"), 1218 EndTime: aws.Float64(123.45), 1219 Speaker: aws.String("string value goes here"), 1220 Stable: aws.Bool(true), 1221 StartTime: aws.Float64(123.45), 1222 Type: aws.String("string value goes here"), 1223 VocabularyFilterMatch: aws.Bool(true), 1224 }, 1225 { 1226 Confidence: aws.Float64(123.45), 1227 Content: aws.String("string value goes here"), 1228 EndTime: aws.Float64(123.45), 1229 Speaker: aws.String("string value goes here"), 1230 Stable: aws.Bool(true), 1231 StartTime: aws.Float64(123.45), 1232 Type: aws.String("string value goes here"), 1233 VocabularyFilterMatch: aws.Bool(true), 1234 }, 1235 { 1236 Confidence: aws.Float64(123.45), 1237 Content: aws.String("string value goes here"), 1238 EndTime: aws.Float64(123.45), 1239 Speaker: aws.String("string value goes here"), 1240 Stable: aws.Bool(true), 1241 StartTime: aws.Float64(123.45), 1242 Type: aws.String("string value goes here"), 1243 VocabularyFilterMatch: aws.Bool(true), 1244 }, 1245 }, 1246 Transcript: aws.String("string value goes here"), 1247 }, 1248 }, 1249 ChannelId: aws.String("string value goes here"), 1250 EndTime: aws.Float64(123.45), 1251 IsPartial: aws.Bool(true), 1252 ResultId: aws.String("string value goes here"), 1253 StartTime: aws.Float64(123.45), 1254 }, 1255 { 1256 Alternatives: []*Alternative{ 1257 { 1258 Items: []*Item{ 1259 { 1260 Confidence: aws.Float64(123.45), 1261 Content: aws.String("string value goes here"), 1262 EndTime: aws.Float64(123.45), 1263 Speaker: aws.String("string value goes here"), 1264 Stable: aws.Bool(true), 1265 StartTime: aws.Float64(123.45), 1266 Type: aws.String("string value goes here"), 1267 VocabularyFilterMatch: aws.Bool(true), 1268 }, 1269 { 1270 Confidence: aws.Float64(123.45), 1271 Content: aws.String("string value goes here"), 1272 EndTime: aws.Float64(123.45), 1273 Speaker: aws.String("string value goes here"), 1274 Stable: aws.Bool(true), 1275 StartTime: aws.Float64(123.45), 1276 Type: aws.String("string value goes here"), 1277 VocabularyFilterMatch: aws.Bool(true), 1278 }, 1279 { 1280 Confidence: aws.Float64(123.45), 1281 Content: aws.String("string value goes here"), 1282 EndTime: aws.Float64(123.45), 1283 Speaker: aws.String("string value goes here"), 1284 Stable: aws.Bool(true), 1285 StartTime: aws.Float64(123.45), 1286 Type: aws.String("string value goes here"), 1287 VocabularyFilterMatch: aws.Bool(true), 1288 }, 1289 }, 1290 Transcript: aws.String("string value goes here"), 1291 }, 1292 { 1293 Items: []*Item{ 1294 { 1295 Confidence: aws.Float64(123.45), 1296 Content: aws.String("string value goes here"), 1297 EndTime: aws.Float64(123.45), 1298 Speaker: aws.String("string value goes here"), 1299 Stable: aws.Bool(true), 1300 StartTime: aws.Float64(123.45), 1301 Type: aws.String("string value goes here"), 1302 VocabularyFilterMatch: aws.Bool(true), 1303 }, 1304 { 1305 Confidence: aws.Float64(123.45), 1306 Content: aws.String("string value goes here"), 1307 EndTime: aws.Float64(123.45), 1308 Speaker: aws.String("string value goes here"), 1309 Stable: aws.Bool(true), 1310 StartTime: aws.Float64(123.45), 1311 Type: aws.String("string value goes here"), 1312 VocabularyFilterMatch: aws.Bool(true), 1313 }, 1314 { 1315 Confidence: aws.Float64(123.45), 1316 Content: aws.String("string value goes here"), 1317 EndTime: aws.Float64(123.45), 1318 Speaker: aws.String("string value goes here"), 1319 Stable: aws.Bool(true), 1320 StartTime: aws.Float64(123.45), 1321 Type: aws.String("string value goes here"), 1322 VocabularyFilterMatch: aws.Bool(true), 1323 }, 1324 }, 1325 Transcript: aws.String("string value goes here"), 1326 }, 1327 { 1328 Items: []*Item{ 1329 { 1330 Confidence: aws.Float64(123.45), 1331 Content: aws.String("string value goes here"), 1332 EndTime: aws.Float64(123.45), 1333 Speaker: aws.String("string value goes here"), 1334 Stable: aws.Bool(true), 1335 StartTime: aws.Float64(123.45), 1336 Type: aws.String("string value goes here"), 1337 VocabularyFilterMatch: aws.Bool(true), 1338 }, 1339 { 1340 Confidence: aws.Float64(123.45), 1341 Content: aws.String("string value goes here"), 1342 EndTime: aws.Float64(123.45), 1343 Speaker: aws.String("string value goes here"), 1344 Stable: aws.Bool(true), 1345 StartTime: aws.Float64(123.45), 1346 Type: aws.String("string value goes here"), 1347 VocabularyFilterMatch: aws.Bool(true), 1348 }, 1349 { 1350 Confidence: aws.Float64(123.45), 1351 Content: aws.String("string value goes here"), 1352 EndTime: aws.Float64(123.45), 1353 Speaker: aws.String("string value goes here"), 1354 Stable: aws.Bool(true), 1355 StartTime: aws.Float64(123.45), 1356 Type: aws.String("string value goes here"), 1357 VocabularyFilterMatch: aws.Bool(true), 1358 }, 1359 }, 1360 Transcript: aws.String("string value goes here"), 1361 }, 1362 }, 1363 ChannelId: aws.String("string value goes here"), 1364 EndTime: aws.Float64(123.45), 1365 IsPartial: aws.Bool(true), 1366 ResultId: aws.String("string value goes here"), 1367 StartTime: aws.Float64(123.45), 1368 }, 1369 }, 1370 }, 1371 }, 1372 } 1373 1374 var marshalers request.HandlerList 1375 marshalers.PushBackNamed(restjson.BuildHandler) 1376 payloadMarshaler := protocol.HandlerPayloadMarshal{ 1377 Marshalers: marshalers, 1378 } 1379 _ = payloadMarshaler 1380 1381 eventMsgs := []eventstream.Message{ 1382 { 1383 Headers: eventstream.Headers{ 1384 eventstreamtest.EventMessageTypeHeader, 1385 { 1386 Name: eventstreamapi.EventTypeHeader, 1387 Value: eventstream.StringValue("TranscriptEvent"), 1388 }, 1389 }, 1390 Payload: eventstreamtest.MarshalEventPayload(payloadMarshaler, expectEvents[0]), 1391 }, 1392 } 1393 1394 return expectEvents, eventMsgs 1395} 1396func TestStartStreamTranscription_ReadException(t *testing.T) { 1397 expectEvents := []TranscriptResultStreamEvent{ 1398 &BadRequestException{ 1399 RespMetadata: protocol.ResponseMetadata{ 1400 StatusCode: 200, 1401 }, 1402 Message_: aws.String("string value goes here"), 1403 }, 1404 } 1405 1406 var marshalers request.HandlerList 1407 marshalers.PushBackNamed(restjson.BuildHandler) 1408 payloadMarshaler := protocol.HandlerPayloadMarshal{ 1409 Marshalers: marshalers, 1410 } 1411 1412 eventMsgs := []eventstream.Message{ 1413 { 1414 Headers: eventstream.Headers{ 1415 eventstreamtest.EventExceptionTypeHeader, 1416 { 1417 Name: eventstreamapi.ExceptionTypeHeader, 1418 Value: eventstream.StringValue("BadRequestException"), 1419 }, 1420 }, 1421 Payload: eventstreamtest.MarshalEventPayload(payloadMarshaler, expectEvents[0]), 1422 }, 1423 } 1424 1425 sess, cleanupFn, err := eventstreamtest.SetupEventStreamSession(t, 1426 eventstreamtest.ServeEventStream{ 1427 T: t, 1428 Events: eventMsgs, 1429 }, 1430 true, 1431 ) 1432 if err != nil { 1433 t.Fatalf("expect no error, %v", err) 1434 } 1435 defer cleanupFn() 1436 1437 svc := New(sess) 1438 resp, err := svc.StartStreamTranscription(nil) 1439 if err != nil { 1440 t.Fatalf("expect no error got, %v", err) 1441 } 1442 1443 defer resp.GetStream().Close() 1444 1445 <-resp.GetStream().Events() 1446 1447 err = resp.GetStream().Err() 1448 if err == nil { 1449 t.Fatalf("expect err, got none") 1450 } 1451 1452 expectErr := &BadRequestException{ 1453 RespMetadata: protocol.ResponseMetadata{ 1454 StatusCode: 200, 1455 }, 1456 Message_: aws.String("string value goes here"), 1457 } 1458 aerr, ok := err.(awserr.Error) 1459 if !ok { 1460 t.Errorf("expect exception, got %T, %#v", err, err) 1461 } 1462 if e, a := expectErr.Code(), aerr.Code(); e != a { 1463 t.Errorf("expect %v, got %v", e, a) 1464 } 1465 if e, a := expectErr.Message(), aerr.Message(); e != a { 1466 t.Errorf("expect %v, got %v", e, a) 1467 } 1468 1469 if e, a := expectErr, aerr; !reflect.DeepEqual(e, a) { 1470 t.Errorf("expect error %+#v, got %+#v", e, a) 1471 } 1472} 1473 1474var _ awserr.Error = (*BadRequestException)(nil) 1475var _ awserr.Error = (*ConflictException)(nil) 1476var _ awserr.Error = (*InternalFailureException)(nil) 1477var _ awserr.Error = (*LimitExceededException)(nil) 1478var _ awserr.Error = (*ServiceUnavailableException)(nil) 1479 1480type loopReader struct { 1481 source *bytes.Reader 1482} 1483 1484func (c *loopReader) Read(p []byte) (int, error) { 1485 if c.source.Len() == 0 { 1486 c.source.Seek(0, 0) 1487 } 1488 1489 return c.source.Read(p) 1490} 1491 1492func TestStartMedicalStreamTranscription_Write(t *testing.T) { 1493 clientEvents, expectedClientEvents := mockStartMedicalStreamTranscriptionWriteEvents() 1494 1495 sess, cleanupFn, err := eventstreamtest.SetupEventStreamSession(t, 1496 &eventstreamtest.ServeEventStream{ 1497 T: t, 1498 ClientEvents: expectedClientEvents, 1499 BiDirectional: true, 1500 }, 1501 true) 1502 defer cleanupFn() 1503 1504 svc := New(sess) 1505 resp, err := svc.StartMedicalStreamTranscription(nil) 1506 if err != nil { 1507 t.Fatalf("expect no error, got %v", err) 1508 } 1509 1510 stream := resp.GetStream() 1511 1512 for _, event := range clientEvents { 1513 err = stream.Send(context.Background(), event) 1514 if err != nil { 1515 t.Fatalf("expect no error, got %v", err) 1516 } 1517 } 1518 1519 if err := stream.Close(); err != nil { 1520 t.Errorf("expect no error, got %v", err) 1521 } 1522} 1523 1524func TestStartMedicalStreamTranscription_WriteClose(t *testing.T) { 1525 sess, cleanupFn, err := eventstreamtest.SetupEventStreamSession(t, 1526 eventstreamtest.ServeEventStream{T: t, BiDirectional: true}, 1527 true, 1528 ) 1529 if err != nil { 1530 t.Fatalf("expect no error, %v", err) 1531 } 1532 defer cleanupFn() 1533 1534 svc := New(sess) 1535 resp, err := svc.StartMedicalStreamTranscription(nil) 1536 if err != nil { 1537 t.Fatalf("expect no error got, %v", err) 1538 } 1539 1540 // Assert calling Err before close does not close the stream. 1541 resp.GetStream().Err() 1542 1543 err = resp.GetStream().Send(context.Background(), &AudioEvent{}) 1544 if err != nil { 1545 t.Fatalf("expect no error, got %v", err) 1546 } 1547 1548 resp.GetStream().Close() 1549 1550 if err := resp.GetStream().Err(); err != nil { 1551 t.Errorf("expect no error, %v", err) 1552 } 1553} 1554 1555func TestStartMedicalStreamTranscription_WriteError(t *testing.T) { 1556 sess, cleanupFn, err := eventstreamtest.SetupEventStreamSession(t, 1557 eventstreamtest.ServeEventStream{ 1558 T: t, 1559 BiDirectional: true, 1560 ForceCloseAfter: time.Millisecond * 500, 1561 }, 1562 true, 1563 ) 1564 if err != nil { 1565 t.Fatalf("expect no error, %v", err) 1566 } 1567 defer cleanupFn() 1568 1569 svc := New(sess) 1570 resp, err := svc.StartMedicalStreamTranscription(nil) 1571 if err != nil { 1572 t.Fatalf("expect no error got, %v", err) 1573 } 1574 1575 defer resp.GetStream().Close() 1576 1577 for { 1578 err = resp.GetStream().Send(context.Background(), &AudioEvent{}) 1579 if err != nil { 1580 if strings.Contains("unable to send event", err.Error()) { 1581 t.Errorf("expected stream closed error, got %v", err) 1582 } 1583 break 1584 } 1585 } 1586} 1587 1588func TestStartMedicalStreamTranscription_ReadWrite(t *testing.T) { 1589 expectedServiceEvents, serviceEvents := mockStartMedicalStreamTranscriptionReadEvents() 1590 clientEvents, expectedClientEvents := mockStartMedicalStreamTranscriptionWriteEvents() 1591 1592 sess, cleanupFn, err := eventstreamtest.SetupEventStreamSession(t, 1593 &eventstreamtest.ServeEventStream{ 1594 T: t, 1595 ClientEvents: expectedClientEvents, 1596 Events: serviceEvents, 1597 BiDirectional: true, 1598 }, 1599 true) 1600 defer cleanupFn() 1601 1602 svc := New(sess) 1603 resp, err := svc.StartMedicalStreamTranscription(nil) 1604 if err != nil { 1605 t.Fatalf("expect no error, got %v", err) 1606 } 1607 1608 stream := resp.GetStream() 1609 defer stream.Close() 1610 1611 var wg sync.WaitGroup 1612 1613 wg.Add(1) 1614 go func() { 1615 defer wg.Done() 1616 var i int 1617 for event := range resp.GetStream().Events() { 1618 if event == nil { 1619 t.Errorf("%d, expect event, got nil", i) 1620 } 1621 if e, a := expectedServiceEvents[i], event; !reflect.DeepEqual(e, a) { 1622 t.Errorf("%d, expect %T %v, got %T %v", i, e, e, a, a) 1623 } 1624 i++ 1625 } 1626 }() 1627 1628 for _, event := range clientEvents { 1629 err = stream.Send(context.Background(), event) 1630 if err != nil { 1631 t.Errorf("expect no error, got %v", err) 1632 } 1633 } 1634 1635 resp.GetStream().Close() 1636 1637 wg.Wait() 1638 1639 if err := resp.GetStream().Err(); err != nil { 1640 t.Errorf("expect no error, %v", err) 1641 } 1642} 1643 1644func mockStartMedicalStreamTranscriptionWriteEvents() ( 1645 []AudioStreamEvent, 1646 []eventstream.Message, 1647) { 1648 inputEvents := []AudioStreamEvent{ 1649 &AudioEvent{ 1650 AudioChunk: []byte("blob value goes here"), 1651 }, 1652 } 1653 1654 var marshalers request.HandlerList 1655 marshalers.PushBackNamed(restjson.BuildHandler) 1656 payloadMarshaler := protocol.HandlerPayloadMarshal{ 1657 Marshalers: marshalers, 1658 } 1659 _ = payloadMarshaler 1660 1661 eventMsgs := []eventstream.Message{ 1662 { 1663 Headers: eventstream.Headers{ 1664 eventstreamtest.EventMessageTypeHeader, 1665 { 1666 Name: ":content-type", 1667 Value: eventstream.StringValue("application/octet-stream"), 1668 }, 1669 { 1670 Name: eventstreamapi.EventTypeHeader, 1671 Value: eventstream.StringValue("AudioEvent"), 1672 }, 1673 }, 1674 Payload: inputEvents[0].(*AudioEvent).AudioChunk, 1675 }, 1676 } 1677 1678 return inputEvents, eventMsgs 1679} 1680 1681func TestStartStreamTranscription_Write(t *testing.T) { 1682 clientEvents, expectedClientEvents := mockStartStreamTranscriptionWriteEvents() 1683 1684 sess, cleanupFn, err := eventstreamtest.SetupEventStreamSession(t, 1685 &eventstreamtest.ServeEventStream{ 1686 T: t, 1687 ClientEvents: expectedClientEvents, 1688 BiDirectional: true, 1689 }, 1690 true) 1691 defer cleanupFn() 1692 1693 svc := New(sess) 1694 resp, err := svc.StartStreamTranscription(nil) 1695 if err != nil { 1696 t.Fatalf("expect no error, got %v", err) 1697 } 1698 1699 stream := resp.GetStream() 1700 1701 for _, event := range clientEvents { 1702 err = stream.Send(context.Background(), event) 1703 if err != nil { 1704 t.Fatalf("expect no error, got %v", err) 1705 } 1706 } 1707 1708 if err := stream.Close(); err != nil { 1709 t.Errorf("expect no error, got %v", err) 1710 } 1711} 1712 1713func TestStartStreamTranscription_WriteClose(t *testing.T) { 1714 sess, cleanupFn, err := eventstreamtest.SetupEventStreamSession(t, 1715 eventstreamtest.ServeEventStream{T: t, BiDirectional: true}, 1716 true, 1717 ) 1718 if err != nil { 1719 t.Fatalf("expect no error, %v", err) 1720 } 1721 defer cleanupFn() 1722 1723 svc := New(sess) 1724 resp, err := svc.StartStreamTranscription(nil) 1725 if err != nil { 1726 t.Fatalf("expect no error got, %v", err) 1727 } 1728 1729 // Assert calling Err before close does not close the stream. 1730 resp.GetStream().Err() 1731 1732 err = resp.GetStream().Send(context.Background(), &AudioEvent{}) 1733 if err != nil { 1734 t.Fatalf("expect no error, got %v", err) 1735 } 1736 1737 resp.GetStream().Close() 1738 1739 if err := resp.GetStream().Err(); err != nil { 1740 t.Errorf("expect no error, %v", err) 1741 } 1742} 1743 1744func TestStartStreamTranscription_WriteError(t *testing.T) { 1745 sess, cleanupFn, err := eventstreamtest.SetupEventStreamSession(t, 1746 eventstreamtest.ServeEventStream{ 1747 T: t, 1748 BiDirectional: true, 1749 ForceCloseAfter: time.Millisecond * 500, 1750 }, 1751 true, 1752 ) 1753 if err != nil { 1754 t.Fatalf("expect no error, %v", err) 1755 } 1756 defer cleanupFn() 1757 1758 svc := New(sess) 1759 resp, err := svc.StartStreamTranscription(nil) 1760 if err != nil { 1761 t.Fatalf("expect no error got, %v", err) 1762 } 1763 1764 defer resp.GetStream().Close() 1765 1766 for { 1767 err = resp.GetStream().Send(context.Background(), &AudioEvent{}) 1768 if err != nil { 1769 if strings.Contains("unable to send event", err.Error()) { 1770 t.Errorf("expected stream closed error, got %v", err) 1771 } 1772 break 1773 } 1774 } 1775} 1776 1777func TestStartStreamTranscription_ReadWrite(t *testing.T) { 1778 expectedServiceEvents, serviceEvents := mockStartStreamTranscriptionReadEvents() 1779 clientEvents, expectedClientEvents := mockStartStreamTranscriptionWriteEvents() 1780 1781 sess, cleanupFn, err := eventstreamtest.SetupEventStreamSession(t, 1782 &eventstreamtest.ServeEventStream{ 1783 T: t, 1784 ClientEvents: expectedClientEvents, 1785 Events: serviceEvents, 1786 BiDirectional: true, 1787 }, 1788 true) 1789 defer cleanupFn() 1790 1791 svc := New(sess) 1792 resp, err := svc.StartStreamTranscription(nil) 1793 if err != nil { 1794 t.Fatalf("expect no error, got %v", err) 1795 } 1796 1797 stream := resp.GetStream() 1798 defer stream.Close() 1799 1800 var wg sync.WaitGroup 1801 1802 wg.Add(1) 1803 go func() { 1804 defer wg.Done() 1805 var i int 1806 for event := range resp.GetStream().Events() { 1807 if event == nil { 1808 t.Errorf("%d, expect event, got nil", i) 1809 } 1810 if e, a := expectedServiceEvents[i], event; !reflect.DeepEqual(e, a) { 1811 t.Errorf("%d, expect %T %v, got %T %v", i, e, e, a, a) 1812 } 1813 i++ 1814 } 1815 }() 1816 1817 for _, event := range clientEvents { 1818 err = stream.Send(context.Background(), event) 1819 if err != nil { 1820 t.Errorf("expect no error, got %v", err) 1821 } 1822 } 1823 1824 resp.GetStream().Close() 1825 1826 wg.Wait() 1827 1828 if err := resp.GetStream().Err(); err != nil { 1829 t.Errorf("expect no error, %v", err) 1830 } 1831} 1832 1833func mockStartStreamTranscriptionWriteEvents() ( 1834 []AudioStreamEvent, 1835 []eventstream.Message, 1836) { 1837 inputEvents := []AudioStreamEvent{ 1838 &AudioEvent{ 1839 AudioChunk: []byte("blob value goes here"), 1840 }, 1841 } 1842 1843 var marshalers request.HandlerList 1844 marshalers.PushBackNamed(restjson.BuildHandler) 1845 payloadMarshaler := protocol.HandlerPayloadMarshal{ 1846 Marshalers: marshalers, 1847 } 1848 _ = payloadMarshaler 1849 1850 eventMsgs := []eventstream.Message{ 1851 { 1852 Headers: eventstream.Headers{ 1853 eventstreamtest.EventMessageTypeHeader, 1854 { 1855 Name: ":content-type", 1856 Value: eventstream.StringValue("application/octet-stream"), 1857 }, 1858 { 1859 Name: eventstreamapi.EventTypeHeader, 1860 Value: eventstream.StringValue("AudioEvent"), 1861 }, 1862 }, 1863 Payload: inputEvents[0].(*AudioEvent).AudioChunk, 1864 }, 1865 } 1866 1867 return inputEvents, eventMsgs 1868} 1869