github.com/choria-io/go-choria@v0.28.1-0.20240416190746-b3bf9c7d5a45/protocol/v2/transport_test.go (about)

     1  // Copyright (c) 2022, R.I. Pienaar and the Choria Project contributors
     2  //
     3  // SPDX-License-Identifier: Apache-2.0
     4  
     5  package v2
     6  
     7  import (
     8  	"github.com/choria-io/go-choria/inter"
     9  	imock "github.com/choria-io/go-choria/inter/imocks"
    10  	"github.com/choria-io/go-choria/protocol"
    11  	"github.com/golang/mock/gomock"
    12  	. "github.com/onsi/ginkgo/v2"
    13  	. "github.com/onsi/gomega"
    14  	"github.com/tidwall/gjson"
    15  )
    16  
    17  var _ = Describe("TransportMessage", func() {
    18  	var mockctl *gomock.Controller
    19  	var security *imock.MockSecurityProvider
    20  
    21  	BeforeEach(func() {
    22  		mockctl = gomock.NewController(GinkgoT())
    23  		security = imock.NewMockSecurityProvider(mockctl)
    24  		security.EXPECT().BackingTechnology().Return(inter.SecurityTechnologyED25519JWT)
    25  		security.EXPECT().ShouldSignReplies().Return(true).AnyTimes()
    26  		security.EXPECT().ChecksumBytes(gomock.Any()).Return([]byte("stub checksum")).AnyTimes()
    27  		security.EXPECT().TokenBytes().Return([]byte("stub token bytes"), nil).AnyTimes()
    28  		security.EXPECT().SignBytes(gomock.Any()).Return([]byte("stub signature"), nil).AnyTimes()
    29  	})
    30  
    31  	AfterEach(func() {
    32  		mockctl.Finish()
    33  	})
    34  
    35  	It("Should support reply data", func() {
    36  		request, _ := NewRequest("test", "go.tests", "rip.mcollective", 120, "a2f0ca717c694f2086cfa81b6c494648", "mcollective")
    37  		request.SetMessage([]byte(`{"message":1}`))
    38  		reply, err := NewReply(request, "testing")
    39  		Expect(err).ToNot(HaveOccurred())
    40  		sreply, err := NewSecureReply(reply, security)
    41  		Expect(err).ToNot(HaveOccurred())
    42  		treply, err := NewTransportMessage("rip.mcollective")
    43  		Expect(err).ToNot(HaveOccurred())
    44  		err = treply.SetReplyData(sreply)
    45  		Expect(err).ToNot(HaveOccurred())
    46  
    47  		sj, err := sreply.JSON()
    48  		Expect(err).ToNot(HaveOccurred())
    49  
    50  		j, err := treply.JSON()
    51  		Expect(err).ToNot(HaveOccurred())
    52  
    53  		Expect(protocol.VersionFromJSON(j)).To(Equal(protocol.TransportV2))
    54  		Expect(gjson.GetBytes(j, "headers.sender").String()).To(Equal("rip.mcollective"))
    55  
    56  		d, err := treply.Message()
    57  		Expect(err).ToNot(HaveOccurred())
    58  
    59  		Expect(d).To(Equal(sj))
    60  	})
    61  
    62  	It("Should support request data", func() {
    63  		request, err := NewRequest("test", "go.tests", "rip.mcollective", 120, "a2f0ca717c694f2086cfa81b6c494648", "mcollective")
    64  		Expect(err).ToNot(HaveOccurred())
    65  		request.SetMessage([]byte(`{"message":1}`))
    66  		srequest, err := NewSecureRequest(request, security)
    67  		Expect(err).ToNot(HaveOccurred())
    68  		trequest, err := NewTransportMessage("rip.mcollective")
    69  		Expect(err).ToNot(HaveOccurred())
    70  		trequest.SetRequestData(srequest)
    71  
    72  		sj, err := srequest.JSON()
    73  		Expect(err).ToNot(HaveOccurred())
    74  		j, err := trequest.JSON()
    75  		Expect(err).ToNot(HaveOccurred())
    76  
    77  		Expect(protocol.VersionFromJSON(j)).To(Equal(protocol.TransportV2))
    78  		Expect(gjson.GetBytes(j, "headers.sender").String()).To(Equal("rip.mcollective"))
    79  
    80  		d, err := trequest.Message()
    81  		Expect(err).ToNot(HaveOccurred())
    82  
    83  		Expect(d).To(Equal(sj))
    84  	})
    85  
    86  	It("Should support creation from JSON data", func() {
    87  		protocol.ClientStrictValidation = true
    88  		defer func() { protocol.ClientStrictValidation = false }()
    89  
    90  		request, err := NewRequest("test", "go.tests", "rip.mcollective", 120, "a2f0ca717c694f2086cfa81b6c494648", "mcollective")
    91  		Expect(err).ToNot(HaveOccurred())
    92  		request.SetMessage([]byte("hello world"))
    93  		srequest, err := NewSecureRequest(request, security)
    94  		Expect(err).ToNot(HaveOccurred())
    95  		trequest, err := NewTransportMessage("rip.mcollective")
    96  		Expect(err).ToNot(HaveOccurred())
    97  
    98  		Expect(trequest.SetRequestData(srequest)).To(Succeed())
    99  
   100  		j, err := trequest.JSON()
   101  		Expect(err).ToNot(HaveOccurred())
   102  
   103  		_, err = NewTransportFromJSON(j)
   104  		Expect(err).ToNot(HaveOccurred())
   105  
   106  		_, err = NewTransportFromJSON([]byte(`{"protocol": 1}`))
   107  		Expect(err).To(MatchError("supplied JSON document does not pass schema validation: missing properties: 'data', 'headers', /protocol: expected string, but got number"))
   108  	})
   109  })