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