go.uber.org/yarpc@v1.72.1/api/encoding/call_test.go (about)

     1  // Copyright (c) 2022 Uber Technologies, Inc.
     2  //
     3  // Permission is hereby granted, free of charge, to any person obtaining a copy
     4  // of this software and associated documentation files (the "Software"), to deal
     5  // in the Software without restriction, including without limitation the rights
     6  // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
     7  // copies of the Software, and to permit persons to whom the Software is
     8  // furnished to do so, subject to the following conditions:
     9  //
    10  // The above copyright notice and this permission notice shall be included in
    11  // all copies or substantial portions of the Software.
    12  //
    13  // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
    14  // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
    15  // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
    16  // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
    17  // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
    18  // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
    19  // THE SOFTWARE.
    20  
    21  package encoding
    22  
    23  import (
    24  	"context"
    25  	"testing"
    26  
    27  	"github.com/stretchr/testify/assert"
    28  	"github.com/stretchr/testify/require"
    29  	"go.uber.org/yarpc/api/transport"
    30  )
    31  
    32  func TestNilCall(t *testing.T) {
    33  	call := CallFromContext(context.Background())
    34  	require.Nil(t, call)
    35  
    36  	assert.Equal(t, "", call.Caller())
    37  	assert.Equal(t, "", call.Service())
    38  	assert.Equal(t, "", call.Transport())
    39  	assert.Equal(t, "", string(call.Encoding()))
    40  	assert.Equal(t, "", call.Procedure())
    41  	assert.Equal(t, "", call.ShardKey())
    42  	assert.Equal(t, "", call.RoutingKey())
    43  	assert.Equal(t, "", call.RoutingDelegate())
    44  	assert.Equal(t, "", call.CallerProcedure())
    45  	assert.Equal(t, "", call.Header("foo"))
    46  	assert.Empty(t, call.HeaderNames())
    47  	assert.Nil(t, call.OriginalHeaders())
    48  
    49  	assert.Error(t, call.WriteResponseHeader("foo", "bar"))
    50  }
    51  
    52  func TestReadFromRequest(t *testing.T) {
    53  	ctx, icall := NewInboundCall(context.Background())
    54  	icall.ReadFromRequest(&transport.Request{
    55  		Service:         "service",
    56  		Transport:       "transport",
    57  		Caller:          "caller",
    58  		Encoding:        transport.Encoding("raw"),
    59  		Procedure:       "proc",
    60  		ShardKey:        "sk",
    61  		RoutingKey:      "rk",
    62  		RoutingDelegate: "rd",
    63  		CallerProcedure: "cp",
    64  		// later header's key/value takes precedence
    65  		Headers: transport.NewHeaders().With("Foo", "Bar").With("foo", "bar"),
    66  	})
    67  	call := CallFromContext(ctx)
    68  	require.NotNil(t, call)
    69  
    70  	assert.Equal(t, "caller", call.Caller())
    71  	assert.Equal(t, "service", call.Service())
    72  	assert.Equal(t, "transport", call.Transport())
    73  	assert.Equal(t, "raw", string(call.Encoding()))
    74  	assert.Equal(t, "proc", call.Procedure())
    75  	assert.Equal(t, "sk", call.ShardKey())
    76  	assert.Equal(t, "rk", call.RoutingKey())
    77  	assert.Equal(t, "rd", call.RoutingDelegate())
    78  	assert.Equal(t, "bar", call.Header("foo"))
    79  	assert.Equal(t, map[string]string{"Foo": "Bar", "foo": "bar"}, call.OriginalHeaders())
    80  	assert.Equal(t, "cp", call.CallerProcedure())
    81  	assert.Len(t, call.HeaderNames(), 1)
    82  
    83  	assert.NoError(t, call.WriteResponseHeader("foo2", "bar2"))
    84  	assert.Equal(t, icall.resHeaders[0].k, "foo2")
    85  	assert.Equal(t, icall.resHeaders[0].v, "bar2")
    86  }
    87  
    88  func TestReadFromRequestMeta(t *testing.T) {
    89  	ctx, icall := NewInboundCall(context.Background())
    90  	icall.ReadFromRequestMeta(&transport.RequestMeta{
    91  		Service:         "service",
    92  		Caller:          "caller",
    93  		Transport:       "transport",
    94  		Encoding:        transport.Encoding("raw"),
    95  		Procedure:       "proc",
    96  		ShardKey:        "sk",
    97  		RoutingKey:      "rk",
    98  		RoutingDelegate: "rd",
    99  		CallerProcedure: "cp",
   100  		// later header's key/value takes precedence
   101  		Headers: transport.NewHeaders().With("Foo", "Bar").With("foo", "bar"),
   102  	})
   103  	call := CallFromContext(ctx)
   104  	require.NotNil(t, call)
   105  
   106  	assert.Equal(t, "caller", call.Caller())
   107  	assert.Equal(t, "service", call.Service())
   108  	assert.Equal(t, "transport", call.Transport())
   109  	assert.Equal(t, "raw", string(call.Encoding()))
   110  	assert.Equal(t, "proc", call.Procedure())
   111  	assert.Equal(t, "sk", call.ShardKey())
   112  	assert.Equal(t, "rk", call.RoutingKey())
   113  	assert.Equal(t, "rd", call.RoutingDelegate())
   114  	assert.Equal(t, "cp", call.CallerProcedure())
   115  	assert.Equal(t, "bar", call.Header("foo"))
   116  	assert.Equal(t, map[string]string{"Foo": "Bar", "foo": "bar"}, call.OriginalHeaders())
   117  	assert.Len(t, call.HeaderNames(), 1)
   118  
   119  	assert.NoError(t, call.WriteResponseHeader("foo2", "bar2"))
   120  	assert.Equal(t, icall.resHeaders[0].k, "foo2")
   121  	assert.Equal(t, icall.resHeaders[0].v, "bar2")
   122  }
   123  
   124  func TestDisabledResponseHeaders(t *testing.T) {
   125  	ctx, icall := NewInboundCallWithOptions(context.Background(), DisableResponseHeaders())
   126  	icall.ReadFromRequest(&transport.Request{
   127  		Service:         "service",
   128  		Transport:       "transport",
   129  		Caller:          "caller",
   130  		Encoding:        transport.Encoding("raw"),
   131  		Procedure:       "proc",
   132  		ShardKey:        "sk",
   133  		RoutingKey:      "rk",
   134  		RoutingDelegate: "rd",
   135  		CallerProcedure: "cp",
   136  		Headers:         transport.NewHeaders().With("foo", "bar"),
   137  	})
   138  	call := CallFromContext(ctx)
   139  	require.NotNil(t, call)
   140  
   141  	assert.Equal(t, "caller", call.Caller())
   142  	assert.Equal(t, "service", call.Service())
   143  	assert.Equal(t, "transport", call.Transport())
   144  	assert.Equal(t, "raw", string(call.Encoding()))
   145  	assert.Equal(t, "proc", call.Procedure())
   146  	assert.Equal(t, "sk", call.ShardKey())
   147  	assert.Equal(t, "rk", call.RoutingKey())
   148  	assert.Equal(t, "rd", call.RoutingDelegate())
   149  	assert.Equal(t, "cp", call.CallerProcedure())
   150  	assert.Equal(t, "bar", call.Header("foo"))
   151  	assert.Len(t, call.HeaderNames(), 1)
   152  
   153  	assert.Error(t, call.WriteResponseHeader("foo", "bar"))
   154  }