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