github.com/aavshr/aws-sdk-go@v1.41.3/service/s3/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 s3
     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/restxml"
    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 TestSelectObjectContent_Read(t *testing.T) {
    38  	expectEvents, eventMsgs := mockSelectObjectContentReadEvents()
    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.SelectObjectContent(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 TestSelectObjectContent_ReadClose(t *testing.T) {
    75  	_, eventMsgs := mockSelectObjectContentReadEvents()
    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.SelectObjectContent(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 TestSelectObjectContent_ReadUnknownEvent(t *testing.T) {
   113  	expectEvents, eventMsgs := mockSelectObjectContentReadEvents()
   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([]SelectObjectContentEventStreamEvent{
   132  			&SelectObjectContentEventStreamUnknownEvent{
   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.SelectObjectContent(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 BenchmarkSelectObjectContent_Read(b *testing.B) {
   175  	_, eventMsgs := mockSelectObjectContentReadEvents()
   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.SelectObjectContent(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 mockSelectObjectContentReadEvents() (
   222  	[]SelectObjectContentEventStreamEvent,
   223  	[]eventstream.Message,
   224  ) {
   225  	expectEvents := []SelectObjectContentEventStreamEvent{
   226  		&ContinuationEvent{},
   227  		&EndEvent{},
   228  		&ProgressEvent{
   229  			Details: &Progress{
   230  				BytesProcessed: aws.Int64(1234),
   231  				BytesReturned:  aws.Int64(1234),
   232  				BytesScanned:   aws.Int64(1234),
   233  			},
   234  		},
   235  		&RecordsEvent{
   236  			Payload: []byte("blob value goes here"),
   237  		},
   238  		&StatsEvent{
   239  			Details: &Stats{
   240  				BytesProcessed: aws.Int64(1234),
   241  				BytesReturned:  aws.Int64(1234),
   242  				BytesScanned:   aws.Int64(1234),
   243  			},
   244  		},
   245  	}
   246  
   247  	var marshalers request.HandlerList
   248  	marshalers.PushBackNamed(restxml.BuildHandler)
   249  	payloadMarshaler := protocol.HandlerPayloadMarshal{
   250  		Marshalers: marshalers,
   251  	}
   252  	_ = payloadMarshaler
   253  
   254  	eventMsgs := []eventstream.Message{
   255  		{
   256  			Headers: eventstream.Headers{
   257  				eventstreamtest.EventMessageTypeHeader,
   258  				{
   259  					Name:  eventstreamapi.EventTypeHeader,
   260  					Value: eventstream.StringValue("Cont"),
   261  				},
   262  			},
   263  		},
   264  		{
   265  			Headers: eventstream.Headers{
   266  				eventstreamtest.EventMessageTypeHeader,
   267  				{
   268  					Name:  eventstreamapi.EventTypeHeader,
   269  					Value: eventstream.StringValue("End"),
   270  				},
   271  			},
   272  		},
   273  		{
   274  			Headers: eventstream.Headers{
   275  				eventstreamtest.EventMessageTypeHeader,
   276  				{
   277  					Name:  eventstreamapi.EventTypeHeader,
   278  					Value: eventstream.StringValue("Progress"),
   279  				},
   280  			},
   281  			Payload: eventstreamtest.MarshalEventPayload(payloadMarshaler, expectEvents[2]),
   282  		},
   283  		{
   284  			Headers: eventstream.Headers{
   285  				eventstreamtest.EventMessageTypeHeader,
   286  				{
   287  					Name:  eventstreamapi.EventTypeHeader,
   288  					Value: eventstream.StringValue("Records"),
   289  				},
   290  			},
   291  			Payload: expectEvents[3].(*RecordsEvent).Payload,
   292  		},
   293  		{
   294  			Headers: eventstream.Headers{
   295  				eventstreamtest.EventMessageTypeHeader,
   296  				{
   297  					Name:  eventstreamapi.EventTypeHeader,
   298  					Value: eventstream.StringValue("Stats"),
   299  				},
   300  			},
   301  			Payload: eventstreamtest.MarshalEventPayload(payloadMarshaler, expectEvents[4]),
   302  		},
   303  	}
   304  
   305  	return expectEvents, eventMsgs
   306  }
   307  
   308  type loopReader struct {
   309  	source *bytes.Reader
   310  }
   311  
   312  func (c *loopReader) Read(p []byte) (int, error) {
   313  	if c.source.Len() == 0 {
   314  		c.source.Seek(0, 0)
   315  	}
   316  
   317  	return c.source.Read(p)
   318  }