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