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 Entities: []*Entity{ 1031 { 1032 Category: aws.String("string value goes here"), 1033 Confidence: aws.Float64(123.45), 1034 Content: aws.String("string value goes here"), 1035 EndTime: aws.Float64(123.45), 1036 StartTime: aws.Float64(123.45), 1037 Type: aws.String("string value goes here"), 1038 }, 1039 { 1040 Category: aws.String("string value goes here"), 1041 Confidence: aws.Float64(123.45), 1042 Content: aws.String("string value goes here"), 1043 EndTime: aws.Float64(123.45), 1044 StartTime: aws.Float64(123.45), 1045 Type: aws.String("string value goes here"), 1046 }, 1047 { 1048 Category: aws.String("string value goes here"), 1049 Confidence: aws.Float64(123.45), 1050 Content: aws.String("string value goes here"), 1051 EndTime: aws.Float64(123.45), 1052 StartTime: aws.Float64(123.45), 1053 Type: aws.String("string value goes here"), 1054 }, 1055 }, 1056 Items: []*Item{ 1057 { 1058 Confidence: aws.Float64(123.45), 1059 Content: aws.String("string value goes here"), 1060 EndTime: aws.Float64(123.45), 1061 Speaker: aws.String("string value goes here"), 1062 Stable: aws.Bool(true), 1063 StartTime: aws.Float64(123.45), 1064 Type: aws.String("string value goes here"), 1065 VocabularyFilterMatch: aws.Bool(true), 1066 }, 1067 { 1068 Confidence: aws.Float64(123.45), 1069 Content: aws.String("string value goes here"), 1070 EndTime: aws.Float64(123.45), 1071 Speaker: aws.String("string value goes here"), 1072 Stable: aws.Bool(true), 1073 StartTime: aws.Float64(123.45), 1074 Type: aws.String("string value goes here"), 1075 VocabularyFilterMatch: aws.Bool(true), 1076 }, 1077 { 1078 Confidence: aws.Float64(123.45), 1079 Content: aws.String("string value goes here"), 1080 EndTime: aws.Float64(123.45), 1081 Speaker: aws.String("string value goes here"), 1082 Stable: aws.Bool(true), 1083 StartTime: aws.Float64(123.45), 1084 Type: aws.String("string value goes here"), 1085 VocabularyFilterMatch: aws.Bool(true), 1086 }, 1087 }, 1088 Transcript: aws.String("string value goes here"), 1089 }, 1090 { 1091 Entities: []*Entity{ 1092 { 1093 Category: aws.String("string value goes here"), 1094 Confidence: aws.Float64(123.45), 1095 Content: aws.String("string value goes here"), 1096 EndTime: aws.Float64(123.45), 1097 StartTime: aws.Float64(123.45), 1098 Type: aws.String("string value goes here"), 1099 }, 1100 { 1101 Category: aws.String("string value goes here"), 1102 Confidence: aws.Float64(123.45), 1103 Content: aws.String("string value goes here"), 1104 EndTime: aws.Float64(123.45), 1105 StartTime: aws.Float64(123.45), 1106 Type: aws.String("string value goes here"), 1107 }, 1108 { 1109 Category: aws.String("string value goes here"), 1110 Confidence: aws.Float64(123.45), 1111 Content: aws.String("string value goes here"), 1112 EndTime: aws.Float64(123.45), 1113 StartTime: aws.Float64(123.45), 1114 Type: aws.String("string value goes here"), 1115 }, 1116 }, 1117 Items: []*Item{ 1118 { 1119 Confidence: aws.Float64(123.45), 1120 Content: aws.String("string value goes here"), 1121 EndTime: aws.Float64(123.45), 1122 Speaker: aws.String("string value goes here"), 1123 Stable: aws.Bool(true), 1124 StartTime: aws.Float64(123.45), 1125 Type: aws.String("string value goes here"), 1126 VocabularyFilterMatch: aws.Bool(true), 1127 }, 1128 { 1129 Confidence: aws.Float64(123.45), 1130 Content: aws.String("string value goes here"), 1131 EndTime: aws.Float64(123.45), 1132 Speaker: aws.String("string value goes here"), 1133 Stable: aws.Bool(true), 1134 StartTime: aws.Float64(123.45), 1135 Type: aws.String("string value goes here"), 1136 VocabularyFilterMatch: aws.Bool(true), 1137 }, 1138 { 1139 Confidence: aws.Float64(123.45), 1140 Content: aws.String("string value goes here"), 1141 EndTime: aws.Float64(123.45), 1142 Speaker: aws.String("string value goes here"), 1143 Stable: aws.Bool(true), 1144 StartTime: aws.Float64(123.45), 1145 Type: aws.String("string value goes here"), 1146 VocabularyFilterMatch: aws.Bool(true), 1147 }, 1148 }, 1149 Transcript: aws.String("string value goes here"), 1150 }, 1151 { 1152 Entities: []*Entity{ 1153 { 1154 Category: aws.String("string value goes here"), 1155 Confidence: aws.Float64(123.45), 1156 Content: aws.String("string value goes here"), 1157 EndTime: aws.Float64(123.45), 1158 StartTime: aws.Float64(123.45), 1159 Type: aws.String("string value goes here"), 1160 }, 1161 { 1162 Category: aws.String("string value goes here"), 1163 Confidence: aws.Float64(123.45), 1164 Content: aws.String("string value goes here"), 1165 EndTime: aws.Float64(123.45), 1166 StartTime: aws.Float64(123.45), 1167 Type: aws.String("string value goes here"), 1168 }, 1169 { 1170 Category: aws.String("string value goes here"), 1171 Confidence: aws.Float64(123.45), 1172 Content: aws.String("string value goes here"), 1173 EndTime: aws.Float64(123.45), 1174 StartTime: aws.Float64(123.45), 1175 Type: 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 ChannelId: aws.String("string value goes here"), 1214 EndTime: aws.Float64(123.45), 1215 IsPartial: aws.Bool(true), 1216 ResultId: aws.String("string value goes here"), 1217 StartTime: aws.Float64(123.45), 1218 }, 1219 { 1220 Alternatives: []*Alternative{ 1221 { 1222 Entities: []*Entity{ 1223 { 1224 Category: aws.String("string value goes here"), 1225 Confidence: aws.Float64(123.45), 1226 Content: aws.String("string value goes here"), 1227 EndTime: aws.Float64(123.45), 1228 StartTime: aws.Float64(123.45), 1229 Type: aws.String("string value goes here"), 1230 }, 1231 { 1232 Category: aws.String("string value goes here"), 1233 Confidence: aws.Float64(123.45), 1234 Content: aws.String("string value goes here"), 1235 EndTime: aws.Float64(123.45), 1236 StartTime: aws.Float64(123.45), 1237 Type: aws.String("string value goes here"), 1238 }, 1239 { 1240 Category: aws.String("string value goes here"), 1241 Confidence: aws.Float64(123.45), 1242 Content: aws.String("string value goes here"), 1243 EndTime: aws.Float64(123.45), 1244 StartTime: aws.Float64(123.45), 1245 Type: aws.String("string value goes here"), 1246 }, 1247 }, 1248 Items: []*Item{ 1249 { 1250 Confidence: aws.Float64(123.45), 1251 Content: aws.String("string value goes here"), 1252 EndTime: aws.Float64(123.45), 1253 Speaker: aws.String("string value goes here"), 1254 Stable: aws.Bool(true), 1255 StartTime: aws.Float64(123.45), 1256 Type: aws.String("string value goes here"), 1257 VocabularyFilterMatch: aws.Bool(true), 1258 }, 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 Transcript: aws.String("string value goes here"), 1281 }, 1282 { 1283 Entities: []*Entity{ 1284 { 1285 Category: aws.String("string value goes here"), 1286 Confidence: aws.Float64(123.45), 1287 Content: aws.String("string value goes here"), 1288 EndTime: aws.Float64(123.45), 1289 StartTime: aws.Float64(123.45), 1290 Type: aws.String("string value goes here"), 1291 }, 1292 { 1293 Category: aws.String("string value goes here"), 1294 Confidence: aws.Float64(123.45), 1295 Content: aws.String("string value goes here"), 1296 EndTime: aws.Float64(123.45), 1297 StartTime: aws.Float64(123.45), 1298 Type: aws.String("string value goes here"), 1299 }, 1300 { 1301 Category: aws.String("string value goes here"), 1302 Confidence: aws.Float64(123.45), 1303 Content: aws.String("string value goes here"), 1304 EndTime: aws.Float64(123.45), 1305 StartTime: aws.Float64(123.45), 1306 Type: aws.String("string value goes here"), 1307 }, 1308 }, 1309 Items: []*Item{ 1310 { 1311 Confidence: aws.Float64(123.45), 1312 Content: aws.String("string value goes here"), 1313 EndTime: aws.Float64(123.45), 1314 Speaker: aws.String("string value goes here"), 1315 Stable: aws.Bool(true), 1316 StartTime: aws.Float64(123.45), 1317 Type: aws.String("string value goes here"), 1318 VocabularyFilterMatch: aws.Bool(true), 1319 }, 1320 { 1321 Confidence: aws.Float64(123.45), 1322 Content: aws.String("string value goes here"), 1323 EndTime: aws.Float64(123.45), 1324 Speaker: aws.String("string value goes here"), 1325 Stable: aws.Bool(true), 1326 StartTime: aws.Float64(123.45), 1327 Type: aws.String("string value goes here"), 1328 VocabularyFilterMatch: aws.Bool(true), 1329 }, 1330 { 1331 Confidence: aws.Float64(123.45), 1332 Content: aws.String("string value goes here"), 1333 EndTime: aws.Float64(123.45), 1334 Speaker: aws.String("string value goes here"), 1335 Stable: aws.Bool(true), 1336 StartTime: aws.Float64(123.45), 1337 Type: aws.String("string value goes here"), 1338 VocabularyFilterMatch: aws.Bool(true), 1339 }, 1340 }, 1341 Transcript: aws.String("string value goes here"), 1342 }, 1343 { 1344 Entities: []*Entity{ 1345 { 1346 Category: aws.String("string value goes here"), 1347 Confidence: aws.Float64(123.45), 1348 Content: aws.String("string value goes here"), 1349 EndTime: aws.Float64(123.45), 1350 StartTime: aws.Float64(123.45), 1351 Type: aws.String("string value goes here"), 1352 }, 1353 { 1354 Category: aws.String("string value goes here"), 1355 Confidence: aws.Float64(123.45), 1356 Content: aws.String("string value goes here"), 1357 EndTime: aws.Float64(123.45), 1358 StartTime: aws.Float64(123.45), 1359 Type: aws.String("string value goes here"), 1360 }, 1361 { 1362 Category: aws.String("string value goes here"), 1363 Confidence: aws.Float64(123.45), 1364 Content: aws.String("string value goes here"), 1365 EndTime: aws.Float64(123.45), 1366 StartTime: aws.Float64(123.45), 1367 Type: aws.String("string value goes here"), 1368 }, 1369 }, 1370 Items: []*Item{ 1371 { 1372 Confidence: aws.Float64(123.45), 1373 Content: aws.String("string value goes here"), 1374 EndTime: aws.Float64(123.45), 1375 Speaker: aws.String("string value goes here"), 1376 Stable: aws.Bool(true), 1377 StartTime: aws.Float64(123.45), 1378 Type: aws.String("string value goes here"), 1379 VocabularyFilterMatch: aws.Bool(true), 1380 }, 1381 { 1382 Confidence: aws.Float64(123.45), 1383 Content: aws.String("string value goes here"), 1384 EndTime: aws.Float64(123.45), 1385 Speaker: aws.String("string value goes here"), 1386 Stable: aws.Bool(true), 1387 StartTime: aws.Float64(123.45), 1388 Type: aws.String("string value goes here"), 1389 VocabularyFilterMatch: aws.Bool(true), 1390 }, 1391 { 1392 Confidence: aws.Float64(123.45), 1393 Content: aws.String("string value goes here"), 1394 EndTime: aws.Float64(123.45), 1395 Speaker: aws.String("string value goes here"), 1396 Stable: aws.Bool(true), 1397 StartTime: aws.Float64(123.45), 1398 Type: aws.String("string value goes here"), 1399 VocabularyFilterMatch: aws.Bool(true), 1400 }, 1401 }, 1402 Transcript: aws.String("string value goes here"), 1403 }, 1404 }, 1405 ChannelId: aws.String("string value goes here"), 1406 EndTime: aws.Float64(123.45), 1407 IsPartial: aws.Bool(true), 1408 ResultId: aws.String("string value goes here"), 1409 StartTime: aws.Float64(123.45), 1410 }, 1411 { 1412 Alternatives: []*Alternative{ 1413 { 1414 Entities: []*Entity{ 1415 { 1416 Category: aws.String("string value goes here"), 1417 Confidence: aws.Float64(123.45), 1418 Content: aws.String("string value goes here"), 1419 EndTime: aws.Float64(123.45), 1420 StartTime: aws.Float64(123.45), 1421 Type: aws.String("string value goes here"), 1422 }, 1423 { 1424 Category: aws.String("string value goes here"), 1425 Confidence: aws.Float64(123.45), 1426 Content: aws.String("string value goes here"), 1427 EndTime: aws.Float64(123.45), 1428 StartTime: aws.Float64(123.45), 1429 Type: aws.String("string value goes here"), 1430 }, 1431 { 1432 Category: aws.String("string value goes here"), 1433 Confidence: aws.Float64(123.45), 1434 Content: aws.String("string value goes here"), 1435 EndTime: aws.Float64(123.45), 1436 StartTime: aws.Float64(123.45), 1437 Type: aws.String("string value goes here"), 1438 }, 1439 }, 1440 Items: []*Item{ 1441 { 1442 Confidence: aws.Float64(123.45), 1443 Content: aws.String("string value goes here"), 1444 EndTime: aws.Float64(123.45), 1445 Speaker: aws.String("string value goes here"), 1446 Stable: aws.Bool(true), 1447 StartTime: aws.Float64(123.45), 1448 Type: aws.String("string value goes here"), 1449 VocabularyFilterMatch: aws.Bool(true), 1450 }, 1451 { 1452 Confidence: aws.Float64(123.45), 1453 Content: aws.String("string value goes here"), 1454 EndTime: aws.Float64(123.45), 1455 Speaker: aws.String("string value goes here"), 1456 Stable: aws.Bool(true), 1457 StartTime: aws.Float64(123.45), 1458 Type: aws.String("string value goes here"), 1459 VocabularyFilterMatch: aws.Bool(true), 1460 }, 1461 { 1462 Confidence: aws.Float64(123.45), 1463 Content: aws.String("string value goes here"), 1464 EndTime: aws.Float64(123.45), 1465 Speaker: aws.String("string value goes here"), 1466 Stable: aws.Bool(true), 1467 StartTime: aws.Float64(123.45), 1468 Type: aws.String("string value goes here"), 1469 VocabularyFilterMatch: aws.Bool(true), 1470 }, 1471 }, 1472 Transcript: aws.String("string value goes here"), 1473 }, 1474 { 1475 Entities: []*Entity{ 1476 { 1477 Category: aws.String("string value goes here"), 1478 Confidence: aws.Float64(123.45), 1479 Content: aws.String("string value goes here"), 1480 EndTime: aws.Float64(123.45), 1481 StartTime: aws.Float64(123.45), 1482 Type: aws.String("string value goes here"), 1483 }, 1484 { 1485 Category: aws.String("string value goes here"), 1486 Confidence: aws.Float64(123.45), 1487 Content: aws.String("string value goes here"), 1488 EndTime: aws.Float64(123.45), 1489 StartTime: aws.Float64(123.45), 1490 Type: aws.String("string value goes here"), 1491 }, 1492 { 1493 Category: aws.String("string value goes here"), 1494 Confidence: aws.Float64(123.45), 1495 Content: aws.String("string value goes here"), 1496 EndTime: aws.Float64(123.45), 1497 StartTime: aws.Float64(123.45), 1498 Type: aws.String("string value goes here"), 1499 }, 1500 }, 1501 Items: []*Item{ 1502 { 1503 Confidence: aws.Float64(123.45), 1504 Content: aws.String("string value goes here"), 1505 EndTime: aws.Float64(123.45), 1506 Speaker: aws.String("string value goes here"), 1507 Stable: aws.Bool(true), 1508 StartTime: aws.Float64(123.45), 1509 Type: aws.String("string value goes here"), 1510 VocabularyFilterMatch: aws.Bool(true), 1511 }, 1512 { 1513 Confidence: aws.Float64(123.45), 1514 Content: aws.String("string value goes here"), 1515 EndTime: aws.Float64(123.45), 1516 Speaker: aws.String("string value goes here"), 1517 Stable: aws.Bool(true), 1518 StartTime: aws.Float64(123.45), 1519 Type: aws.String("string value goes here"), 1520 VocabularyFilterMatch: aws.Bool(true), 1521 }, 1522 { 1523 Confidence: aws.Float64(123.45), 1524 Content: aws.String("string value goes here"), 1525 EndTime: aws.Float64(123.45), 1526 Speaker: aws.String("string value goes here"), 1527 Stable: aws.Bool(true), 1528 StartTime: aws.Float64(123.45), 1529 Type: aws.String("string value goes here"), 1530 VocabularyFilterMatch: aws.Bool(true), 1531 }, 1532 }, 1533 Transcript: aws.String("string value goes here"), 1534 }, 1535 { 1536 Entities: []*Entity{ 1537 { 1538 Category: aws.String("string value goes here"), 1539 Confidence: aws.Float64(123.45), 1540 Content: aws.String("string value goes here"), 1541 EndTime: aws.Float64(123.45), 1542 StartTime: aws.Float64(123.45), 1543 Type: aws.String("string value goes here"), 1544 }, 1545 { 1546 Category: aws.String("string value goes here"), 1547 Confidence: aws.Float64(123.45), 1548 Content: aws.String("string value goes here"), 1549 EndTime: aws.Float64(123.45), 1550 StartTime: aws.Float64(123.45), 1551 Type: aws.String("string value goes here"), 1552 }, 1553 { 1554 Category: aws.String("string value goes here"), 1555 Confidence: aws.Float64(123.45), 1556 Content: aws.String("string value goes here"), 1557 EndTime: aws.Float64(123.45), 1558 StartTime: aws.Float64(123.45), 1559 Type: aws.String("string value goes here"), 1560 }, 1561 }, 1562 Items: []*Item{ 1563 { 1564 Confidence: aws.Float64(123.45), 1565 Content: aws.String("string value goes here"), 1566 EndTime: aws.Float64(123.45), 1567 Speaker: aws.String("string value goes here"), 1568 Stable: aws.Bool(true), 1569 StartTime: aws.Float64(123.45), 1570 Type: aws.String("string value goes here"), 1571 VocabularyFilterMatch: aws.Bool(true), 1572 }, 1573 { 1574 Confidence: aws.Float64(123.45), 1575 Content: aws.String("string value goes here"), 1576 EndTime: aws.Float64(123.45), 1577 Speaker: aws.String("string value goes here"), 1578 Stable: aws.Bool(true), 1579 StartTime: aws.Float64(123.45), 1580 Type: aws.String("string value goes here"), 1581 VocabularyFilterMatch: aws.Bool(true), 1582 }, 1583 { 1584 Confidence: aws.Float64(123.45), 1585 Content: aws.String("string value goes here"), 1586 EndTime: aws.Float64(123.45), 1587 Speaker: aws.String("string value goes here"), 1588 Stable: aws.Bool(true), 1589 StartTime: aws.Float64(123.45), 1590 Type: aws.String("string value goes here"), 1591 VocabularyFilterMatch: aws.Bool(true), 1592 }, 1593 }, 1594 Transcript: aws.String("string value goes here"), 1595 }, 1596 }, 1597 ChannelId: aws.String("string value goes here"), 1598 EndTime: aws.Float64(123.45), 1599 IsPartial: aws.Bool(true), 1600 ResultId: aws.String("string value goes here"), 1601 StartTime: aws.Float64(123.45), 1602 }, 1603 }, 1604 }, 1605 }, 1606 } 1607 1608 var marshalers request.HandlerList 1609 marshalers.PushBackNamed(restjson.BuildHandler) 1610 payloadMarshaler := protocol.HandlerPayloadMarshal{ 1611 Marshalers: marshalers, 1612 } 1613 _ = payloadMarshaler 1614 1615 eventMsgs := []eventstream.Message{ 1616 { 1617 Headers: eventstream.Headers{ 1618 eventstreamtest.EventMessageTypeHeader, 1619 { 1620 Name: eventstreamapi.EventTypeHeader, 1621 Value: eventstream.StringValue("TranscriptEvent"), 1622 }, 1623 }, 1624 Payload: eventstreamtest.MarshalEventPayload(payloadMarshaler, expectEvents[0]), 1625 }, 1626 } 1627 1628 return expectEvents, eventMsgs 1629} 1630func TestStartStreamTranscription_ReadException(t *testing.T) { 1631 expectEvents := []TranscriptResultStreamEvent{ 1632 &BadRequestException{ 1633 RespMetadata: protocol.ResponseMetadata{ 1634 StatusCode: 200, 1635 }, 1636 Message_: aws.String("string value goes here"), 1637 }, 1638 } 1639 1640 var marshalers request.HandlerList 1641 marshalers.PushBackNamed(restjson.BuildHandler) 1642 payloadMarshaler := protocol.HandlerPayloadMarshal{ 1643 Marshalers: marshalers, 1644 } 1645 1646 eventMsgs := []eventstream.Message{ 1647 { 1648 Headers: eventstream.Headers{ 1649 eventstreamtest.EventExceptionTypeHeader, 1650 { 1651 Name: eventstreamapi.ExceptionTypeHeader, 1652 Value: eventstream.StringValue("BadRequestException"), 1653 }, 1654 }, 1655 Payload: eventstreamtest.MarshalEventPayload(payloadMarshaler, expectEvents[0]), 1656 }, 1657 } 1658 1659 sess, cleanupFn, err := eventstreamtest.SetupEventStreamSession(t, 1660 eventstreamtest.ServeEventStream{ 1661 T: t, 1662 Events: eventMsgs, 1663 }, 1664 true, 1665 ) 1666 if err != nil { 1667 t.Fatalf("expect no error, %v", err) 1668 } 1669 defer cleanupFn() 1670 1671 svc := New(sess) 1672 resp, err := svc.StartStreamTranscription(nil) 1673 if err != nil { 1674 t.Fatalf("expect no error got, %v", err) 1675 } 1676 1677 defer resp.GetStream().Close() 1678 1679 <-resp.GetStream().Events() 1680 1681 err = resp.GetStream().Err() 1682 if err == nil { 1683 t.Fatalf("expect err, got none") 1684 } 1685 1686 expectErr := &BadRequestException{ 1687 RespMetadata: protocol.ResponseMetadata{ 1688 StatusCode: 200, 1689 }, 1690 Message_: aws.String("string value goes here"), 1691 } 1692 aerr, ok := err.(awserr.Error) 1693 if !ok { 1694 t.Errorf("expect exception, got %T, %#v", err, err) 1695 } 1696 if e, a := expectErr.Code(), aerr.Code(); e != a { 1697 t.Errorf("expect %v, got %v", e, a) 1698 } 1699 if e, a := expectErr.Message(), aerr.Message(); e != a { 1700 t.Errorf("expect %v, got %v", e, a) 1701 } 1702 1703 if e, a := expectErr, aerr; !reflect.DeepEqual(e, a) { 1704 t.Errorf("expect error %+#v, got %+#v", e, a) 1705 } 1706} 1707 1708var _ awserr.Error = (*BadRequestException)(nil) 1709var _ awserr.Error = (*ConflictException)(nil) 1710var _ awserr.Error = (*InternalFailureException)(nil) 1711var _ awserr.Error = (*LimitExceededException)(nil) 1712var _ awserr.Error = (*ServiceUnavailableException)(nil) 1713 1714type loopReader struct { 1715 source *bytes.Reader 1716} 1717 1718func (c *loopReader) Read(p []byte) (int, error) { 1719 if c.source.Len() == 0 { 1720 c.source.Seek(0, 0) 1721 } 1722 1723 return c.source.Read(p) 1724} 1725 1726func TestStartMedicalStreamTranscription_Write(t *testing.T) { 1727 clientEvents, expectedClientEvents := mockStartMedicalStreamTranscriptionWriteEvents() 1728 1729 sess, cleanupFn, err := eventstreamtest.SetupEventStreamSession(t, 1730 &eventstreamtest.ServeEventStream{ 1731 T: t, 1732 ClientEvents: expectedClientEvents, 1733 BiDirectional: true, 1734 }, 1735 true) 1736 defer cleanupFn() 1737 1738 svc := New(sess) 1739 resp, err := svc.StartMedicalStreamTranscription(nil) 1740 if err != nil { 1741 t.Fatalf("expect no error, got %v", err) 1742 } 1743 1744 stream := resp.GetStream() 1745 1746 for _, event := range clientEvents { 1747 err = stream.Send(context.Background(), event) 1748 if err != nil { 1749 t.Fatalf("expect no error, got %v", err) 1750 } 1751 } 1752 1753 if err := stream.Close(); err != nil { 1754 t.Errorf("expect no error, got %v", err) 1755 } 1756} 1757 1758func TestStartMedicalStreamTranscription_WriteClose(t *testing.T) { 1759 sess, cleanupFn, err := eventstreamtest.SetupEventStreamSession(t, 1760 eventstreamtest.ServeEventStream{T: t, BiDirectional: true}, 1761 true, 1762 ) 1763 if err != nil { 1764 t.Fatalf("expect no error, %v", err) 1765 } 1766 defer cleanupFn() 1767 1768 svc := New(sess) 1769 resp, err := svc.StartMedicalStreamTranscription(nil) 1770 if err != nil { 1771 t.Fatalf("expect no error got, %v", err) 1772 } 1773 1774 // Assert calling Err before close does not close the stream. 1775 resp.GetStream().Err() 1776 1777 err = resp.GetStream().Send(context.Background(), &AudioEvent{}) 1778 if err != nil { 1779 t.Fatalf("expect no error, got %v", err) 1780 } 1781 1782 resp.GetStream().Close() 1783 1784 if err := resp.GetStream().Err(); err != nil { 1785 t.Errorf("expect no error, %v", err) 1786 } 1787} 1788 1789func TestStartMedicalStreamTranscription_WriteError(t *testing.T) { 1790 sess, cleanupFn, err := eventstreamtest.SetupEventStreamSession(t, 1791 eventstreamtest.ServeEventStream{ 1792 T: t, 1793 BiDirectional: true, 1794 ForceCloseAfter: time.Millisecond * 500, 1795 }, 1796 true, 1797 ) 1798 if err != nil { 1799 t.Fatalf("expect no error, %v", err) 1800 } 1801 defer cleanupFn() 1802 1803 svc := New(sess) 1804 resp, err := svc.StartMedicalStreamTranscription(nil) 1805 if err != nil { 1806 t.Fatalf("expect no error got, %v", err) 1807 } 1808 1809 defer resp.GetStream().Close() 1810 1811 for { 1812 err = resp.GetStream().Send(context.Background(), &AudioEvent{}) 1813 if err != nil { 1814 if strings.Contains("unable to send event", err.Error()) { 1815 t.Errorf("expected stream closed error, got %v", err) 1816 } 1817 break 1818 } 1819 } 1820} 1821 1822func TestStartMedicalStreamTranscription_ReadWrite(t *testing.T) { 1823 expectedServiceEvents, serviceEvents := mockStartMedicalStreamTranscriptionReadEvents() 1824 clientEvents, expectedClientEvents := mockStartMedicalStreamTranscriptionWriteEvents() 1825 1826 sess, cleanupFn, err := eventstreamtest.SetupEventStreamSession(t, 1827 &eventstreamtest.ServeEventStream{ 1828 T: t, 1829 ClientEvents: expectedClientEvents, 1830 Events: serviceEvents, 1831 BiDirectional: true, 1832 }, 1833 true) 1834 defer cleanupFn() 1835 1836 svc := New(sess) 1837 resp, err := svc.StartMedicalStreamTranscription(nil) 1838 if err != nil { 1839 t.Fatalf("expect no error, got %v", err) 1840 } 1841 1842 stream := resp.GetStream() 1843 defer stream.Close() 1844 1845 var wg sync.WaitGroup 1846 1847 wg.Add(1) 1848 go func() { 1849 defer wg.Done() 1850 var i int 1851 for event := range resp.GetStream().Events() { 1852 if event == nil { 1853 t.Errorf("%d, expect event, got nil", i) 1854 } 1855 if e, a := expectedServiceEvents[i], event; !reflect.DeepEqual(e, a) { 1856 t.Errorf("%d, expect %T %v, got %T %v", i, e, e, a, a) 1857 } 1858 i++ 1859 } 1860 }() 1861 1862 for _, event := range clientEvents { 1863 err = stream.Send(context.Background(), event) 1864 if err != nil { 1865 t.Errorf("expect no error, got %v", err) 1866 } 1867 } 1868 1869 resp.GetStream().Close() 1870 1871 wg.Wait() 1872 1873 if err := resp.GetStream().Err(); err != nil { 1874 t.Errorf("expect no error, %v", err) 1875 } 1876} 1877 1878func mockStartMedicalStreamTranscriptionWriteEvents() ( 1879 []AudioStreamEvent, 1880 []eventstream.Message, 1881) { 1882 inputEvents := []AudioStreamEvent{ 1883 &AudioEvent{ 1884 AudioChunk: []byte("blob value goes here"), 1885 }, 1886 } 1887 1888 var marshalers request.HandlerList 1889 marshalers.PushBackNamed(restjson.BuildHandler) 1890 payloadMarshaler := protocol.HandlerPayloadMarshal{ 1891 Marshalers: marshalers, 1892 } 1893 _ = payloadMarshaler 1894 1895 eventMsgs := []eventstream.Message{ 1896 { 1897 Headers: eventstream.Headers{ 1898 eventstreamtest.EventMessageTypeHeader, 1899 { 1900 Name: ":content-type", 1901 Value: eventstream.StringValue("application/octet-stream"), 1902 }, 1903 { 1904 Name: eventstreamapi.EventTypeHeader, 1905 Value: eventstream.StringValue("AudioEvent"), 1906 }, 1907 }, 1908 Payload: inputEvents[0].(*AudioEvent).AudioChunk, 1909 }, 1910 } 1911 1912 return inputEvents, eventMsgs 1913} 1914 1915func TestStartStreamTranscription_Write(t *testing.T) { 1916 clientEvents, expectedClientEvents := mockStartStreamTranscriptionWriteEvents() 1917 1918 sess, cleanupFn, err := eventstreamtest.SetupEventStreamSession(t, 1919 &eventstreamtest.ServeEventStream{ 1920 T: t, 1921 ClientEvents: expectedClientEvents, 1922 BiDirectional: true, 1923 }, 1924 true) 1925 defer cleanupFn() 1926 1927 svc := New(sess) 1928 resp, err := svc.StartStreamTranscription(nil) 1929 if err != nil { 1930 t.Fatalf("expect no error, got %v", err) 1931 } 1932 1933 stream := resp.GetStream() 1934 1935 for _, event := range clientEvents { 1936 err = stream.Send(context.Background(), event) 1937 if err != nil { 1938 t.Fatalf("expect no error, got %v", err) 1939 } 1940 } 1941 1942 if err := stream.Close(); err != nil { 1943 t.Errorf("expect no error, got %v", err) 1944 } 1945} 1946 1947func TestStartStreamTranscription_WriteClose(t *testing.T) { 1948 sess, cleanupFn, err := eventstreamtest.SetupEventStreamSession(t, 1949 eventstreamtest.ServeEventStream{T: t, BiDirectional: true}, 1950 true, 1951 ) 1952 if err != nil { 1953 t.Fatalf("expect no error, %v", err) 1954 } 1955 defer cleanupFn() 1956 1957 svc := New(sess) 1958 resp, err := svc.StartStreamTranscription(nil) 1959 if err != nil { 1960 t.Fatalf("expect no error got, %v", err) 1961 } 1962 1963 // Assert calling Err before close does not close the stream. 1964 resp.GetStream().Err() 1965 1966 err = resp.GetStream().Send(context.Background(), &AudioEvent{}) 1967 if err != nil { 1968 t.Fatalf("expect no error, got %v", err) 1969 } 1970 1971 resp.GetStream().Close() 1972 1973 if err := resp.GetStream().Err(); err != nil { 1974 t.Errorf("expect no error, %v", err) 1975 } 1976} 1977 1978func TestStartStreamTranscription_WriteError(t *testing.T) { 1979 sess, cleanupFn, err := eventstreamtest.SetupEventStreamSession(t, 1980 eventstreamtest.ServeEventStream{ 1981 T: t, 1982 BiDirectional: true, 1983 ForceCloseAfter: time.Millisecond * 500, 1984 }, 1985 true, 1986 ) 1987 if err != nil { 1988 t.Fatalf("expect no error, %v", err) 1989 } 1990 defer cleanupFn() 1991 1992 svc := New(sess) 1993 resp, err := svc.StartStreamTranscription(nil) 1994 if err != nil { 1995 t.Fatalf("expect no error got, %v", err) 1996 } 1997 1998 defer resp.GetStream().Close() 1999 2000 for { 2001 err = resp.GetStream().Send(context.Background(), &AudioEvent{}) 2002 if err != nil { 2003 if strings.Contains("unable to send event", err.Error()) { 2004 t.Errorf("expected stream closed error, got %v", err) 2005 } 2006 break 2007 } 2008 } 2009} 2010 2011func TestStartStreamTranscription_ReadWrite(t *testing.T) { 2012 expectedServiceEvents, serviceEvents := mockStartStreamTranscriptionReadEvents() 2013 clientEvents, expectedClientEvents := mockStartStreamTranscriptionWriteEvents() 2014 2015 sess, cleanupFn, err := eventstreamtest.SetupEventStreamSession(t, 2016 &eventstreamtest.ServeEventStream{ 2017 T: t, 2018 ClientEvents: expectedClientEvents, 2019 Events: serviceEvents, 2020 BiDirectional: true, 2021 }, 2022 true) 2023 defer cleanupFn() 2024 2025 svc := New(sess) 2026 resp, err := svc.StartStreamTranscription(nil) 2027 if err != nil { 2028 t.Fatalf("expect no error, got %v", err) 2029 } 2030 2031 stream := resp.GetStream() 2032 defer stream.Close() 2033 2034 var wg sync.WaitGroup 2035 2036 wg.Add(1) 2037 go func() { 2038 defer wg.Done() 2039 var i int 2040 for event := range resp.GetStream().Events() { 2041 if event == nil { 2042 t.Errorf("%d, expect event, got nil", i) 2043 } 2044 if e, a := expectedServiceEvents[i], event; !reflect.DeepEqual(e, a) { 2045 t.Errorf("%d, expect %T %v, got %T %v", i, e, e, a, a) 2046 } 2047 i++ 2048 } 2049 }() 2050 2051 for _, event := range clientEvents { 2052 err = stream.Send(context.Background(), event) 2053 if err != nil { 2054 t.Errorf("expect no error, got %v", err) 2055 } 2056 } 2057 2058 resp.GetStream().Close() 2059 2060 wg.Wait() 2061 2062 if err := resp.GetStream().Err(); err != nil { 2063 t.Errorf("expect no error, %v", err) 2064 } 2065} 2066 2067func mockStartStreamTranscriptionWriteEvents() ( 2068 []AudioStreamEvent, 2069 []eventstream.Message, 2070) { 2071 inputEvents := []AudioStreamEvent{ 2072 &AudioEvent{ 2073 AudioChunk: []byte("blob value goes here"), 2074 }, 2075 } 2076 2077 var marshalers request.HandlerList 2078 marshalers.PushBackNamed(restjson.BuildHandler) 2079 payloadMarshaler := protocol.HandlerPayloadMarshal{ 2080 Marshalers: marshalers, 2081 } 2082 _ = payloadMarshaler 2083 2084 eventMsgs := []eventstream.Message{ 2085 { 2086 Headers: eventstream.Headers{ 2087 eventstreamtest.EventMessageTypeHeader, 2088 { 2089 Name: ":content-type", 2090 Value: eventstream.StringValue("application/octet-stream"), 2091 }, 2092 { 2093 Name: eventstreamapi.EventTypeHeader, 2094 Value: eventstream.StringValue("AudioEvent"), 2095 }, 2096 }, 2097 Payload: inputEvents[0].(*AudioEvent).AudioChunk, 2098 }, 2099 } 2100 2101 return inputEvents, eventMsgs 2102} 2103