github.com/aavshr/aws-sdk-go@v1.41.3/private/protocol/eventstream/eventstreamapi/reader_test.go (about) 1 package eventstreamapi 2 3 import ( 4 "bytes" 5 "fmt" 6 "io" 7 "testing" 8 9 "github.com/aavshr/aws-sdk-go/aws/request" 10 "github.com/aavshr/aws-sdk-go/private/protocol" 11 "github.com/aavshr/aws-sdk-go/private/protocol/eventstream" 12 "github.com/aavshr/aws-sdk-go/private/protocol/restjson" 13 ) 14 15 var eventMessageTypeHeader = eventstream.Header{ 16 Name: MessageTypeHeader, 17 Value: eventstream.StringValue(EventMessageType), 18 } 19 20 func TestEventReader(t *testing.T) { 21 stream := createStream( 22 eventstream.Message{ 23 Headers: eventstream.Headers{ 24 eventMessageTypeHeader, 25 eventstream.Header{ 26 Name: EventTypeHeader, 27 Value: eventstream.StringValue("eventABC"), 28 }, 29 }, 30 }, 31 eventstream.Message{ 32 Headers: eventstream.Headers{ 33 eventMessageTypeHeader, 34 eventstream.Header{ 35 Name: EventTypeHeader, 36 Value: eventstream.StringValue("eventEFG"), 37 }, 38 }, 39 }, 40 ) 41 42 var unmarshalers request.HandlerList 43 unmarshalers.PushBackNamed(restjson.UnmarshalHandler) 44 45 decoder := eventstream.NewDecoder(stream) 46 eventReader := NewEventReader(decoder, 47 protocol.HandlerPayloadUnmarshal{ 48 Unmarshalers: unmarshalers, 49 }, 50 unmarshalerForEventType, 51 ) 52 53 event, err := eventReader.ReadEvent() 54 if err != nil { 55 t.Fatalf("expect no error, got %v", err) 56 } 57 58 if event == nil { 59 t.Fatalf("expect event got none") 60 } 61 62 event, err = eventReader.ReadEvent() 63 if err == nil { 64 t.Fatalf("expect error for unknown event, got none") 65 } 66 67 if event != nil { 68 t.Fatalf("expect no event, got %T, %v", event, event) 69 } 70 } 71 72 func TestEventReader_Error(t *testing.T) { 73 stream := createStream( 74 eventstream.Message{ 75 Headers: eventstream.Headers{ 76 eventstream.Header{ 77 Name: MessageTypeHeader, 78 Value: eventstream.StringValue(ErrorMessageType), 79 }, 80 eventstream.Header{ 81 Name: ErrorCodeHeader, 82 Value: eventstream.StringValue("errorCode"), 83 }, 84 eventstream.Header{ 85 Name: ErrorMessageHeader, 86 Value: eventstream.StringValue("error message occur"), 87 }, 88 }, 89 }, 90 ) 91 92 var unmarshalers request.HandlerList 93 unmarshalers.PushBackNamed(restjson.UnmarshalHandler) 94 95 decoder := eventstream.NewDecoder(stream) 96 eventReader := NewEventReader(decoder, 97 protocol.HandlerPayloadUnmarshal{ 98 Unmarshalers: unmarshalers, 99 }, 100 unmarshalerForEventType, 101 ) 102 103 event, err := eventReader.ReadEvent() 104 if err == nil { 105 t.Fatalf("expect error got none") 106 } 107 108 if event != nil { 109 t.Fatalf("expect no event, got %v", event) 110 } 111 112 if e, a := "errorCode: error message occur", err.Error(); e != a { 113 t.Errorf("expect %v error, got %v", e, a) 114 } 115 } 116 117 func TestEventReader_Exception(t *testing.T) { 118 eventMsgs := []eventstream.Message{ 119 { 120 Headers: eventstream.Headers{ 121 eventstream.Header{ 122 Name: MessageTypeHeader, 123 Value: eventstream.StringValue(ExceptionMessageType), 124 }, 125 eventstream.Header{ 126 Name: ExceptionTypeHeader, 127 Value: eventstream.StringValue("exception"), 128 }, 129 }, 130 Payload: []byte(`{"message":"exception message"}`), 131 }, 132 } 133 stream := createStream(eventMsgs...) 134 135 var unmarshalers request.HandlerList 136 unmarshalers.PushBackNamed(restjson.UnmarshalHandler) 137 138 decoder := eventstream.NewDecoder(stream) 139 eventReader := NewEventReader(decoder, 140 protocol.HandlerPayloadUnmarshal{ 141 Unmarshalers: unmarshalers, 142 }, 143 unmarshalerForEventType, 144 ) 145 146 event, err := eventReader.ReadEvent() 147 if err == nil { 148 t.Fatalf("expect error got none") 149 } 150 151 if event != nil { 152 t.Fatalf("expect no event, got %v", event) 153 } 154 155 et := err.(*exceptionType) 156 if e, a := string(eventMsgs[0].Payload), string(et.Payload); e != a { 157 t.Errorf("expect %v payload, got %v", e, a) 158 } 159 } 160 161 func BenchmarkEventReader(b *testing.B) { 162 var buf bytes.Buffer 163 encoder := eventstream.NewEncoder(&buf) 164 msg := eventstream.Message{ 165 Headers: eventstream.Headers{ 166 eventMessageTypeHeader, 167 eventstream.Header{ 168 Name: EventTypeHeader, 169 Value: eventstream.StringValue("eventStructured"), 170 }, 171 }, 172 Payload: []byte(`{"String":"stringfield","Number":123,"Nested":{"String":"fieldstring","Number":321}}`), 173 } 174 if err := encoder.Encode(msg); err != nil { 175 b.Fatalf("failed to encode message, %v", err) 176 } 177 stream := bytes.NewReader(buf.Bytes()) 178 179 var unmarshalers request.HandlerList 180 unmarshalers.PushBackNamed(restjson.UnmarshalHandler) 181 182 decoder := eventstream.NewDecoder(stream) 183 eventReader := NewEventReader(decoder, 184 protocol.HandlerPayloadUnmarshal{ 185 Unmarshalers: unmarshalers, 186 }, 187 unmarshalerForEventType, 188 ) 189 190 b.ResetTimer() 191 for i := 0; i < b.N; i++ { 192 stream.Seek(0, 0) 193 194 event, err := eventReader.ReadEvent() 195 if err != nil { 196 b.Fatalf("expect no error, got %v", err) 197 } 198 if event == nil { 199 b.Fatalf("expect event got none") 200 } 201 } 202 } 203 204 func unmarshalerForEventType(eventType string) (Unmarshaler, error) { 205 switch eventType { 206 case "eventABC": 207 return &eventABC{}, nil 208 case "eventStructured": 209 return &eventStructured{}, nil 210 case "exception": 211 return &exceptionType{}, nil 212 default: 213 return nil, fmt.Errorf("unknown event type, %v", eventType) 214 } 215 } 216 217 type eventABC struct { 218 _ struct{} 219 220 HeaderField string 221 Payload []byte 222 } 223 224 func (e *eventABC) UnmarshalEvent( 225 unmarshaler protocol.PayloadUnmarshaler, 226 msg eventstream.Message, 227 ) error { 228 return nil 229 } 230 231 func createStream(msgs ...eventstream.Message) io.Reader { 232 w := bytes.NewBuffer(nil) 233 234 encoder := eventstream.NewEncoder(w) 235 236 for _, msg := range msgs { 237 if err := encoder.Encode(msg); err != nil { 238 panic("createStream failed, " + err.Error()) 239 } 240 } 241 242 return w 243 } 244 245 type exceptionType struct { 246 Payload []byte 247 } 248 249 func (e exceptionType) Error() string { 250 return fmt.Sprintf("exception error message") 251 } 252 253 func (e *exceptionType) UnmarshalEvent( 254 unmarshaler protocol.PayloadUnmarshaler, 255 msg eventstream.Message, 256 ) error { 257 e.Payload = msg.Payload 258 return nil 259 }