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  }