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