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