github.com/aavshr/aws-sdk-go@v1.41.3/service/transcribestreamingservice/eventstream_test.go (about)

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