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 }