github.com/aavshr/aws-sdk-go@v1.41.3/private/protocol/eventstream/eventstreamapi/signer_test.go (about)

     1  //go:build go1.7
     2  // +build go1.7
     3  
     4  package eventstreamapi
     5  
     6  import (
     7  	"bytes"
     8  	"encoding/base64"
     9  	"encoding/hex"
    10  	"fmt"
    11  	"strings"
    12  	"testing"
    13  	"time"
    14  
    15  	"github.com/aavshr/aws-sdk-go/private/protocol/eventstream"
    16  	"github.com/aavshr/aws-sdk-go/private/protocol/eventstream/eventstreamtest"
    17  )
    18  
    19  func TestSignEncoder(t *testing.T) {
    20  	currentTime := time.Date(2019, 1, 27, 22, 37, 54, 0, time.UTC)
    21  
    22  	cases := map[string]struct {
    23  		Signer       StreamSigner
    24  		Input        eventstream.Message
    25  		Expect       eventstream.Message
    26  		NestedExpect *eventstream.Message
    27  		Err          string
    28  	}{
    29  		"sign message": {
    30  			Signer: mockChunkSigner{
    31  				signature: "524f1d03d1d81e94a099042736d40bd9681b867321443ff58a4568e274dbd83bff",
    32  			},
    33  			Input: eventstream.Message{
    34  				Headers: eventstream.Headers{
    35  					{
    36  						Name:  "header_name",
    37  						Value: eventstream.StringValue("header value"),
    38  					},
    39  				},
    40  				Payload: []byte("payload"),
    41  			},
    42  			Expect: eventstream.Message{
    43  				Headers: eventstream.Headers{
    44  					{
    45  						Name:  ":date",
    46  						Value: eventstream.TimestampValue(currentTime),
    47  					},
    48  					{
    49  						Name: ":chunk-signature",
    50  						Value: eventstream.BytesValue(mustDecodeBytes(
    51  							hex.DecodeString("524f1d03d1d81e94a099042736d40bd9681b867321443ff58a4568e274dbd83bff"),
    52  						)),
    53  					},
    54  				},
    55  				Payload: mustDecodeBytes(
    56  					base64.StdEncoding.DecodeString(
    57  						`AAAAMgAAABs0pv1jC2hlYWRlcl9uYW1lBwAMaGVhZGVyIHZhbHVlcGF5bG9hZH4tKFg=`,
    58  					),
    59  				),
    60  			},
    61  			NestedExpect: &eventstream.Message{
    62  				Headers: eventstream.Headers{
    63  					{
    64  						Name:  "header_name",
    65  						Value: eventstream.StringValue("header value"),
    66  					},
    67  				},
    68  				Payload: []byte(`payload`),
    69  			},
    70  		},
    71  		"signing error": {
    72  			Signer: mockChunkSigner{err: fmt.Errorf("signing error")},
    73  			Input: eventstream.Message{
    74  				Headers: []eventstream.Header{
    75  					{
    76  						Name:  "header_name",
    77  						Value: eventstream.StringValue("header value"),
    78  					},
    79  				},
    80  				Payload: []byte("payload"),
    81  			},
    82  			Err: "signing error",
    83  		},
    84  	}
    85  
    86  	origNowFn := timeNow
    87  	timeNow = func() time.Time { return currentTime }
    88  	defer func() { timeNow = origNowFn }()
    89  
    90  	decodeBuf := make([]byte, 1024)
    91  	for name, c := range cases {
    92  		t.Run(name, func(t *testing.T) {
    93  			encoder := &mockEncoder{}
    94  			signer := NewSignEncoder(c.Signer, encoder)
    95  
    96  			err := signer.Encode(c.Input)
    97  			if err == nil && len(c.Err) > 0 {
    98  				t.Fatalf("expected error, but got nil")
    99  			} else if err != nil && len(c.Err) == 0 {
   100  				t.Fatalf("expected no error, but got %v", err)
   101  			} else if err != nil && len(c.Err) > 0 && !strings.Contains(err.Error(), c.Err) {
   102  				t.Fatalf("expected %v, but got %v", c.Err, err)
   103  			} else if len(c.Err) > 0 {
   104  				return
   105  			}
   106  
   107  			eventstreamtest.AssertMessageEqual(t, c.Expect, encoder.msgs[0], "envelope msg")
   108  
   109  			if c.NestedExpect != nil {
   110  				nested := eventstream.NewDecoder(bytes.NewReader(encoder.msgs[0].Payload))
   111  				nestedMsg, err := nested.Decode(decodeBuf)
   112  				if err != nil {
   113  					t.Fatalf("expect no decode error got, %v", err)
   114  				}
   115  
   116  				eventstreamtest.AssertMessageEqual(t, *c.NestedExpect, nestedMsg, "nested msg")
   117  			}
   118  		})
   119  	}
   120  }
   121  
   122  type mockEncoder struct {
   123  	msgs []eventstream.Message
   124  }
   125  
   126  func (m *mockEncoder) Encode(msg eventstream.Message) error {
   127  	m.msgs = append(m.msgs, msg)
   128  	return nil
   129  }