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 StartTime: aws.Float64(123.45), 1036 Type: aws.String("string value goes here"), 1037 VocabularyFilterMatch: aws.Bool(true), 1038 }, 1039 { 1040 Confidence: aws.Float64(123.45), 1041 Content: aws.String("string value goes here"), 1042 EndTime: aws.Float64(123.45), 1043 Speaker: aws.String("string value goes here"), 1044 StartTime: aws.Float64(123.45), 1045 Type: aws.String("string value goes here"), 1046 VocabularyFilterMatch: aws.Bool(true), 1047 }, 1048 { 1049 Confidence: aws.Float64(123.45), 1050 Content: aws.String("string value goes here"), 1051 EndTime: aws.Float64(123.45), 1052 Speaker: aws.String("string value goes here"), 1053 StartTime: aws.Float64(123.45), 1054 Type: aws.String("string value goes here"), 1055 VocabularyFilterMatch: aws.Bool(true), 1056 }, 1057 }, 1058 Transcript: aws.String("string value goes here"), 1059 }, 1060 { 1061 Items: []*Item{ 1062 { 1063 Confidence: aws.Float64(123.45), 1064 Content: aws.String("string value goes here"), 1065 EndTime: aws.Float64(123.45), 1066 Speaker: aws.String("string value goes here"), 1067 StartTime: aws.Float64(123.45), 1068 Type: aws.String("string value goes here"), 1069 VocabularyFilterMatch: aws.Bool(true), 1070 }, 1071 { 1072 Confidence: aws.Float64(123.45), 1073 Content: aws.String("string value goes here"), 1074 EndTime: aws.Float64(123.45), 1075 Speaker: aws.String("string value goes here"), 1076 StartTime: aws.Float64(123.45), 1077 Type: aws.String("string value goes here"), 1078 VocabularyFilterMatch: aws.Bool(true), 1079 }, 1080 { 1081 Confidence: aws.Float64(123.45), 1082 Content: aws.String("string value goes here"), 1083 EndTime: aws.Float64(123.45), 1084 Speaker: aws.String("string value goes here"), 1085 StartTime: aws.Float64(123.45), 1086 Type: aws.String("string value goes here"), 1087 VocabularyFilterMatch: aws.Bool(true), 1088 }, 1089 }, 1090 Transcript: aws.String("string value goes here"), 1091 }, 1092 { 1093 Items: []*Item{ 1094 { 1095 Confidence: aws.Float64(123.45), 1096 Content: aws.String("string value goes here"), 1097 EndTime: aws.Float64(123.45), 1098 Speaker: aws.String("string value goes here"), 1099 StartTime: aws.Float64(123.45), 1100 Type: aws.String("string value goes here"), 1101 VocabularyFilterMatch: aws.Bool(true), 1102 }, 1103 { 1104 Confidence: aws.Float64(123.45), 1105 Content: aws.String("string value goes here"), 1106 EndTime: aws.Float64(123.45), 1107 Speaker: aws.String("string value goes here"), 1108 StartTime: aws.Float64(123.45), 1109 Type: aws.String("string value goes here"), 1110 VocabularyFilterMatch: aws.Bool(true), 1111 }, 1112 { 1113 Confidence: aws.Float64(123.45), 1114 Content: aws.String("string value goes here"), 1115 EndTime: aws.Float64(123.45), 1116 Speaker: aws.String("string value goes here"), 1117 StartTime: aws.Float64(123.45), 1118 Type: aws.String("string value goes here"), 1119 VocabularyFilterMatch: aws.Bool(true), 1120 }, 1121 }, 1122 Transcript: aws.String("string value goes here"), 1123 }, 1124 }, 1125 ChannelId: aws.String("string value goes here"), 1126 EndTime: aws.Float64(123.45), 1127 IsPartial: aws.Bool(true), 1128 ResultId: aws.String("string value goes here"), 1129 StartTime: aws.Float64(123.45), 1130 }, 1131 { 1132 Alternatives: []*Alternative{ 1133 { 1134 Items: []*Item{ 1135 { 1136 Confidence: aws.Float64(123.45), 1137 Content: aws.String("string value goes here"), 1138 EndTime: aws.Float64(123.45), 1139 Speaker: aws.String("string value goes here"), 1140 StartTime: aws.Float64(123.45), 1141 Type: aws.String("string value goes here"), 1142 VocabularyFilterMatch: aws.Bool(true), 1143 }, 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 StartTime: aws.Float64(123.45), 1150 Type: aws.String("string value goes here"), 1151 VocabularyFilterMatch: aws.Bool(true), 1152 }, 1153 { 1154 Confidence: aws.Float64(123.45), 1155 Content: aws.String("string value goes here"), 1156 EndTime: aws.Float64(123.45), 1157 Speaker: aws.String("string value goes here"), 1158 StartTime: aws.Float64(123.45), 1159 Type: aws.String("string value goes here"), 1160 VocabularyFilterMatch: aws.Bool(true), 1161 }, 1162 }, 1163 Transcript: aws.String("string value goes here"), 1164 }, 1165 { 1166 Items: []*Item{ 1167 { 1168 Confidence: aws.Float64(123.45), 1169 Content: aws.String("string value goes here"), 1170 EndTime: aws.Float64(123.45), 1171 Speaker: aws.String("string value goes here"), 1172 StartTime: aws.Float64(123.45), 1173 Type: aws.String("string value goes here"), 1174 VocabularyFilterMatch: aws.Bool(true), 1175 }, 1176 { 1177 Confidence: aws.Float64(123.45), 1178 Content: aws.String("string value goes here"), 1179 EndTime: aws.Float64(123.45), 1180 Speaker: aws.String("string value goes here"), 1181 StartTime: aws.Float64(123.45), 1182 Type: aws.String("string value goes here"), 1183 VocabularyFilterMatch: aws.Bool(true), 1184 }, 1185 { 1186 Confidence: aws.Float64(123.45), 1187 Content: aws.String("string value goes here"), 1188 EndTime: aws.Float64(123.45), 1189 Speaker: aws.String("string value goes here"), 1190 StartTime: aws.Float64(123.45), 1191 Type: aws.String("string value goes here"), 1192 VocabularyFilterMatch: aws.Bool(true), 1193 }, 1194 }, 1195 Transcript: aws.String("string value goes here"), 1196 }, 1197 { 1198 Items: []*Item{ 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 StartTime: aws.Float64(123.45), 1205 Type: aws.String("string value goes here"), 1206 VocabularyFilterMatch: aws.Bool(true), 1207 }, 1208 { 1209 Confidence: aws.Float64(123.45), 1210 Content: aws.String("string value goes here"), 1211 EndTime: aws.Float64(123.45), 1212 Speaker: aws.String("string value goes here"), 1213 StartTime: aws.Float64(123.45), 1214 Type: aws.String("string value goes here"), 1215 VocabularyFilterMatch: aws.Bool(true), 1216 }, 1217 { 1218 Confidence: aws.Float64(123.45), 1219 Content: aws.String("string value goes here"), 1220 EndTime: aws.Float64(123.45), 1221 Speaker: aws.String("string value goes here"), 1222 StartTime: aws.Float64(123.45), 1223 Type: aws.String("string value goes here"), 1224 VocabularyFilterMatch: aws.Bool(true), 1225 }, 1226 }, 1227 Transcript: aws.String("string value goes here"), 1228 }, 1229 }, 1230 ChannelId: aws.String("string value goes here"), 1231 EndTime: aws.Float64(123.45), 1232 IsPartial: aws.Bool(true), 1233 ResultId: aws.String("string value goes here"), 1234 StartTime: aws.Float64(123.45), 1235 }, 1236 { 1237 Alternatives: []*Alternative{ 1238 { 1239 Items: []*Item{ 1240 { 1241 Confidence: aws.Float64(123.45), 1242 Content: aws.String("string value goes here"), 1243 EndTime: aws.Float64(123.45), 1244 Speaker: aws.String("string value goes here"), 1245 StartTime: aws.Float64(123.45), 1246 Type: aws.String("string value goes here"), 1247 VocabularyFilterMatch: aws.Bool(true), 1248 }, 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 StartTime: aws.Float64(123.45), 1255 Type: aws.String("string value goes here"), 1256 VocabularyFilterMatch: aws.Bool(true), 1257 }, 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 StartTime: aws.Float64(123.45), 1264 Type: aws.String("string value goes here"), 1265 VocabularyFilterMatch: aws.Bool(true), 1266 }, 1267 }, 1268 Transcript: aws.String("string value goes here"), 1269 }, 1270 { 1271 Items: []*Item{ 1272 { 1273 Confidence: aws.Float64(123.45), 1274 Content: aws.String("string value goes here"), 1275 EndTime: aws.Float64(123.45), 1276 Speaker: aws.String("string value goes here"), 1277 StartTime: aws.Float64(123.45), 1278 Type: aws.String("string value goes here"), 1279 VocabularyFilterMatch: aws.Bool(true), 1280 }, 1281 { 1282 Confidence: aws.Float64(123.45), 1283 Content: aws.String("string value goes here"), 1284 EndTime: aws.Float64(123.45), 1285 Speaker: aws.String("string value goes here"), 1286 StartTime: aws.Float64(123.45), 1287 Type: aws.String("string value goes here"), 1288 VocabularyFilterMatch: aws.Bool(true), 1289 }, 1290 { 1291 Confidence: aws.Float64(123.45), 1292 Content: aws.String("string value goes here"), 1293 EndTime: aws.Float64(123.45), 1294 Speaker: aws.String("string value goes here"), 1295 StartTime: aws.Float64(123.45), 1296 Type: aws.String("string value goes here"), 1297 VocabularyFilterMatch: aws.Bool(true), 1298 }, 1299 }, 1300 Transcript: aws.String("string value goes here"), 1301 }, 1302 { 1303 Items: []*Item{ 1304 { 1305 Confidence: aws.Float64(123.45), 1306 Content: aws.String("string value goes here"), 1307 EndTime: aws.Float64(123.45), 1308 Speaker: aws.String("string value goes here"), 1309 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 StartTime: aws.Float64(123.45), 1319 Type: aws.String("string value goes here"), 1320 VocabularyFilterMatch: aws.Bool(true), 1321 }, 1322 { 1323 Confidence: aws.Float64(123.45), 1324 Content: aws.String("string value goes here"), 1325 EndTime: aws.Float64(123.45), 1326 Speaker: aws.String("string value goes here"), 1327 StartTime: aws.Float64(123.45), 1328 Type: aws.String("string value goes here"), 1329 VocabularyFilterMatch: aws.Bool(true), 1330 }, 1331 }, 1332 Transcript: aws.String("string value goes here"), 1333 }, 1334 }, 1335 ChannelId: aws.String("string value goes here"), 1336 EndTime: aws.Float64(123.45), 1337 IsPartial: aws.Bool(true), 1338 ResultId: aws.String("string value goes here"), 1339 StartTime: aws.Float64(123.45), 1340 }, 1341 }, 1342 }, 1343 }, 1344 } 1345 1346 var marshalers request.HandlerList 1347 marshalers.PushBackNamed(restjson.BuildHandler) 1348 payloadMarshaler := protocol.HandlerPayloadMarshal{ 1349 Marshalers: marshalers, 1350 } 1351 _ = payloadMarshaler 1352 1353 eventMsgs := []eventstream.Message{ 1354 { 1355 Headers: eventstream.Headers{ 1356 eventstreamtest.EventMessageTypeHeader, 1357 { 1358 Name: eventstreamapi.EventTypeHeader, 1359 Value: eventstream.StringValue("TranscriptEvent"), 1360 }, 1361 }, 1362 Payload: eventstreamtest.MarshalEventPayload(payloadMarshaler, expectEvents[0]), 1363 }, 1364 } 1365 1366 return expectEvents, eventMsgs 1367} 1368func TestStartStreamTranscription_ReadException(t *testing.T) { 1369 expectEvents := []TranscriptResultStreamEvent{ 1370 &BadRequestException{ 1371 RespMetadata: protocol.ResponseMetadata{ 1372 StatusCode: 200, 1373 }, 1374 Message_: aws.String("string value goes here"), 1375 }, 1376 } 1377 1378 var marshalers request.HandlerList 1379 marshalers.PushBackNamed(restjson.BuildHandler) 1380 payloadMarshaler := protocol.HandlerPayloadMarshal{ 1381 Marshalers: marshalers, 1382 } 1383 1384 eventMsgs := []eventstream.Message{ 1385 { 1386 Headers: eventstream.Headers{ 1387 eventstreamtest.EventExceptionTypeHeader, 1388 { 1389 Name: eventstreamapi.ExceptionTypeHeader, 1390 Value: eventstream.StringValue("BadRequestException"), 1391 }, 1392 }, 1393 Payload: eventstreamtest.MarshalEventPayload(payloadMarshaler, expectEvents[0]), 1394 }, 1395 } 1396 1397 sess, cleanupFn, err := eventstreamtest.SetupEventStreamSession(t, 1398 eventstreamtest.ServeEventStream{ 1399 T: t, 1400 Events: eventMsgs, 1401 }, 1402 true, 1403 ) 1404 if err != nil { 1405 t.Fatalf("expect no error, %v", err) 1406 } 1407 defer cleanupFn() 1408 1409 svc := New(sess) 1410 resp, err := svc.StartStreamTranscription(nil) 1411 if err != nil { 1412 t.Fatalf("expect no error got, %v", err) 1413 } 1414 1415 defer resp.GetStream().Close() 1416 1417 <-resp.GetStream().Events() 1418 1419 err = resp.GetStream().Err() 1420 if err == nil { 1421 t.Fatalf("expect err, got none") 1422 } 1423 1424 expectErr := &BadRequestException{ 1425 RespMetadata: protocol.ResponseMetadata{ 1426 StatusCode: 200, 1427 }, 1428 Message_: aws.String("string value goes here"), 1429 } 1430 aerr, ok := err.(awserr.Error) 1431 if !ok { 1432 t.Errorf("expect exception, got %T, %#v", err, err) 1433 } 1434 if e, a := expectErr.Code(), aerr.Code(); e != a { 1435 t.Errorf("expect %v, got %v", e, a) 1436 } 1437 if e, a := expectErr.Message(), aerr.Message(); e != a { 1438 t.Errorf("expect %v, got %v", e, a) 1439 } 1440 1441 if e, a := expectErr, aerr; !reflect.DeepEqual(e, a) { 1442 t.Errorf("expect error %+#v, got %+#v", e, a) 1443 } 1444} 1445 1446var _ awserr.Error = (*BadRequestException)(nil) 1447var _ awserr.Error = (*ConflictException)(nil) 1448var _ awserr.Error = (*InternalFailureException)(nil) 1449var _ awserr.Error = (*LimitExceededException)(nil) 1450var _ awserr.Error = (*ServiceUnavailableException)(nil) 1451 1452type loopReader struct { 1453 source *bytes.Reader 1454} 1455 1456func (c *loopReader) Read(p []byte) (int, error) { 1457 if c.source.Len() == 0 { 1458 c.source.Seek(0, 0) 1459 } 1460 1461 return c.source.Read(p) 1462} 1463 1464func TestStartMedicalStreamTranscription_Write(t *testing.T) { 1465 clientEvents, expectedClientEvents := mockStartMedicalStreamTranscriptionWriteEvents() 1466 1467 sess, cleanupFn, err := eventstreamtest.SetupEventStreamSession(t, 1468 &eventstreamtest.ServeEventStream{ 1469 T: t, 1470 ClientEvents: expectedClientEvents, 1471 BiDirectional: true, 1472 }, 1473 true) 1474 defer cleanupFn() 1475 1476 svc := New(sess) 1477 resp, err := svc.StartMedicalStreamTranscription(nil) 1478 if err != nil { 1479 t.Fatalf("expect no error, got %v", err) 1480 } 1481 1482 stream := resp.GetStream() 1483 1484 for _, event := range clientEvents { 1485 err = stream.Send(context.Background(), event) 1486 if err != nil { 1487 t.Fatalf("expect no error, got %v", err) 1488 } 1489 } 1490 1491 if err := stream.Close(); err != nil { 1492 t.Errorf("expect no error, got %v", err) 1493 } 1494} 1495 1496func TestStartMedicalStreamTranscription_WriteClose(t *testing.T) { 1497 sess, cleanupFn, err := eventstreamtest.SetupEventStreamSession(t, 1498 eventstreamtest.ServeEventStream{T: t, BiDirectional: true}, 1499 true, 1500 ) 1501 if err != nil { 1502 t.Fatalf("expect no error, %v", err) 1503 } 1504 defer cleanupFn() 1505 1506 svc := New(sess) 1507 resp, err := svc.StartMedicalStreamTranscription(nil) 1508 if err != nil { 1509 t.Fatalf("expect no error got, %v", err) 1510 } 1511 1512 // Assert calling Err before close does not close the stream. 1513 resp.GetStream().Err() 1514 1515 err = resp.GetStream().Send(context.Background(), &AudioEvent{}) 1516 if err != nil { 1517 t.Fatalf("expect no error, got %v", err) 1518 } 1519 1520 resp.GetStream().Close() 1521 1522 if err := resp.GetStream().Err(); err != nil { 1523 t.Errorf("expect no error, %v", err) 1524 } 1525} 1526 1527func TestStartMedicalStreamTranscription_WriteError(t *testing.T) { 1528 sess, cleanupFn, err := eventstreamtest.SetupEventStreamSession(t, 1529 eventstreamtest.ServeEventStream{ 1530 T: t, 1531 BiDirectional: true, 1532 ForceCloseAfter: time.Millisecond * 500, 1533 }, 1534 true, 1535 ) 1536 if err != nil { 1537 t.Fatalf("expect no error, %v", err) 1538 } 1539 defer cleanupFn() 1540 1541 svc := New(sess) 1542 resp, err := svc.StartMedicalStreamTranscription(nil) 1543 if err != nil { 1544 t.Fatalf("expect no error got, %v", err) 1545 } 1546 1547 defer resp.GetStream().Close() 1548 1549 for { 1550 err = resp.GetStream().Send(context.Background(), &AudioEvent{}) 1551 if err != nil { 1552 if strings.Contains("unable to send event", err.Error()) { 1553 t.Errorf("expected stream closed error, got %v", err) 1554 } 1555 break 1556 } 1557 } 1558} 1559 1560func TestStartMedicalStreamTranscription_ReadWrite(t *testing.T) { 1561 expectedServiceEvents, serviceEvents := mockStartMedicalStreamTranscriptionReadEvents() 1562 clientEvents, expectedClientEvents := mockStartMedicalStreamTranscriptionWriteEvents() 1563 1564 sess, cleanupFn, err := eventstreamtest.SetupEventStreamSession(t, 1565 &eventstreamtest.ServeEventStream{ 1566 T: t, 1567 ClientEvents: expectedClientEvents, 1568 Events: serviceEvents, 1569 BiDirectional: true, 1570 }, 1571 true) 1572 defer cleanupFn() 1573 1574 svc := New(sess) 1575 resp, err := svc.StartMedicalStreamTranscription(nil) 1576 if err != nil { 1577 t.Fatalf("expect no error, got %v", err) 1578 } 1579 1580 stream := resp.GetStream() 1581 defer stream.Close() 1582 1583 var wg sync.WaitGroup 1584 1585 wg.Add(1) 1586 go func() { 1587 defer wg.Done() 1588 var i int 1589 for event := range resp.GetStream().Events() { 1590 if event == nil { 1591 t.Errorf("%d, expect event, got nil", i) 1592 } 1593 if e, a := expectedServiceEvents[i], event; !reflect.DeepEqual(e, a) { 1594 t.Errorf("%d, expect %T %v, got %T %v", i, e, e, a, a) 1595 } 1596 i++ 1597 } 1598 }() 1599 1600 for _, event := range clientEvents { 1601 err = stream.Send(context.Background(), event) 1602 if err != nil { 1603 t.Errorf("expect no error, got %v", err) 1604 } 1605 } 1606 1607 resp.GetStream().Close() 1608 1609 wg.Wait() 1610 1611 if err := resp.GetStream().Err(); err != nil { 1612 t.Errorf("expect no error, %v", err) 1613 } 1614} 1615 1616func mockStartMedicalStreamTranscriptionWriteEvents() ( 1617 []AudioStreamEvent, 1618 []eventstream.Message, 1619) { 1620 inputEvents := []AudioStreamEvent{ 1621 &AudioEvent{ 1622 AudioChunk: []byte("blob value goes here"), 1623 }, 1624 } 1625 1626 var marshalers request.HandlerList 1627 marshalers.PushBackNamed(restjson.BuildHandler) 1628 payloadMarshaler := protocol.HandlerPayloadMarshal{ 1629 Marshalers: marshalers, 1630 } 1631 _ = payloadMarshaler 1632 1633 eventMsgs := []eventstream.Message{ 1634 { 1635 Headers: eventstream.Headers{ 1636 eventstreamtest.EventMessageTypeHeader, 1637 { 1638 Name: ":content-type", 1639 Value: eventstream.StringValue("application/octet-stream"), 1640 }, 1641 { 1642 Name: eventstreamapi.EventTypeHeader, 1643 Value: eventstream.StringValue("AudioEvent"), 1644 }, 1645 }, 1646 Payload: inputEvents[0].(*AudioEvent).AudioChunk, 1647 }, 1648 } 1649 1650 return inputEvents, eventMsgs 1651} 1652 1653func TestStartStreamTranscription_Write(t *testing.T) { 1654 clientEvents, expectedClientEvents := mockStartStreamTranscriptionWriteEvents() 1655 1656 sess, cleanupFn, err := eventstreamtest.SetupEventStreamSession(t, 1657 &eventstreamtest.ServeEventStream{ 1658 T: t, 1659 ClientEvents: expectedClientEvents, 1660 BiDirectional: true, 1661 }, 1662 true) 1663 defer cleanupFn() 1664 1665 svc := New(sess) 1666 resp, err := svc.StartStreamTranscription(nil) 1667 if err != nil { 1668 t.Fatalf("expect no error, got %v", err) 1669 } 1670 1671 stream := resp.GetStream() 1672 1673 for _, event := range clientEvents { 1674 err = stream.Send(context.Background(), event) 1675 if err != nil { 1676 t.Fatalf("expect no error, got %v", err) 1677 } 1678 } 1679 1680 if err := stream.Close(); err != nil { 1681 t.Errorf("expect no error, got %v", err) 1682 } 1683} 1684 1685func TestStartStreamTranscription_WriteClose(t *testing.T) { 1686 sess, cleanupFn, err := eventstreamtest.SetupEventStreamSession(t, 1687 eventstreamtest.ServeEventStream{T: t, BiDirectional: true}, 1688 true, 1689 ) 1690 if err != nil { 1691 t.Fatalf("expect no error, %v", err) 1692 } 1693 defer cleanupFn() 1694 1695 svc := New(sess) 1696 resp, err := svc.StartStreamTranscription(nil) 1697 if err != nil { 1698 t.Fatalf("expect no error got, %v", err) 1699 } 1700 1701 // Assert calling Err before close does not close the stream. 1702 resp.GetStream().Err() 1703 1704 err = resp.GetStream().Send(context.Background(), &AudioEvent{}) 1705 if err != nil { 1706 t.Fatalf("expect no error, got %v", err) 1707 } 1708 1709 resp.GetStream().Close() 1710 1711 if err := resp.GetStream().Err(); err != nil { 1712 t.Errorf("expect no error, %v", err) 1713 } 1714} 1715 1716func TestStartStreamTranscription_WriteError(t *testing.T) { 1717 sess, cleanupFn, err := eventstreamtest.SetupEventStreamSession(t, 1718 eventstreamtest.ServeEventStream{ 1719 T: t, 1720 BiDirectional: true, 1721 ForceCloseAfter: time.Millisecond * 500, 1722 }, 1723 true, 1724 ) 1725 if err != nil { 1726 t.Fatalf("expect no error, %v", err) 1727 } 1728 defer cleanupFn() 1729 1730 svc := New(sess) 1731 resp, err := svc.StartStreamTranscription(nil) 1732 if err != nil { 1733 t.Fatalf("expect no error got, %v", err) 1734 } 1735 1736 defer resp.GetStream().Close() 1737 1738 for { 1739 err = resp.GetStream().Send(context.Background(), &AudioEvent{}) 1740 if err != nil { 1741 if strings.Contains("unable to send event", err.Error()) { 1742 t.Errorf("expected stream closed error, got %v", err) 1743 } 1744 break 1745 } 1746 } 1747} 1748 1749func TestStartStreamTranscription_ReadWrite(t *testing.T) { 1750 expectedServiceEvents, serviceEvents := mockStartStreamTranscriptionReadEvents() 1751 clientEvents, expectedClientEvents := mockStartStreamTranscriptionWriteEvents() 1752 1753 sess, cleanupFn, err := eventstreamtest.SetupEventStreamSession(t, 1754 &eventstreamtest.ServeEventStream{ 1755 T: t, 1756 ClientEvents: expectedClientEvents, 1757 Events: serviceEvents, 1758 BiDirectional: true, 1759 }, 1760 true) 1761 defer cleanupFn() 1762 1763 svc := New(sess) 1764 resp, err := svc.StartStreamTranscription(nil) 1765 if err != nil { 1766 t.Fatalf("expect no error, got %v", err) 1767 } 1768 1769 stream := resp.GetStream() 1770 defer stream.Close() 1771 1772 var wg sync.WaitGroup 1773 1774 wg.Add(1) 1775 go func() { 1776 defer wg.Done() 1777 var i int 1778 for event := range resp.GetStream().Events() { 1779 if event == nil { 1780 t.Errorf("%d, expect event, got nil", i) 1781 } 1782 if e, a := expectedServiceEvents[i], event; !reflect.DeepEqual(e, a) { 1783 t.Errorf("%d, expect %T %v, got %T %v", i, e, e, a, a) 1784 } 1785 i++ 1786 } 1787 }() 1788 1789 for _, event := range clientEvents { 1790 err = stream.Send(context.Background(), event) 1791 if err != nil { 1792 t.Errorf("expect no error, got %v", err) 1793 } 1794 } 1795 1796 resp.GetStream().Close() 1797 1798 wg.Wait() 1799 1800 if err := resp.GetStream().Err(); err != nil { 1801 t.Errorf("expect no error, %v", err) 1802 } 1803} 1804 1805func mockStartStreamTranscriptionWriteEvents() ( 1806 []AudioStreamEvent, 1807 []eventstream.Message, 1808) { 1809 inputEvents := []AudioStreamEvent{ 1810 &AudioEvent{ 1811 AudioChunk: []byte("blob value goes here"), 1812 }, 1813 } 1814 1815 var marshalers request.HandlerList 1816 marshalers.PushBackNamed(restjson.BuildHandler) 1817 payloadMarshaler := protocol.HandlerPayloadMarshal{ 1818 Marshalers: marshalers, 1819 } 1820 _ = payloadMarshaler 1821 1822 eventMsgs := []eventstream.Message{ 1823 { 1824 Headers: eventstream.Headers{ 1825 eventstreamtest.EventMessageTypeHeader, 1826 { 1827 Name: ":content-type", 1828 Value: eventstream.StringValue("application/octet-stream"), 1829 }, 1830 { 1831 Name: eventstreamapi.EventTypeHeader, 1832 Value: eventstream.StringValue("AudioEvent"), 1833 }, 1834 }, 1835 Payload: inputEvents[0].(*AudioEvent).AudioChunk, 1836 }, 1837 } 1838 1839 return inputEvents, eventMsgs 1840} 1841