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 }