From cc4813b07e6a574b3a0f997f17819eac0c80e2ef Mon Sep 17 00:00:00 2001 From: Jake Taylor <jake@elixxir.io> Date: Mon, 16 May 2022 12:36:02 -0500 Subject: [PATCH] fix tests --- restlike/connect/receiver.go | 18 ++++---- restlike/connect/receiver_test.go | 59 ++++++++++++++++++++++++ restlike/connect/response_test.go | 76 +++++++++++++++++++++++++++++++ restlike/connect/server.go | 2 +- restlike/single/receiver.go | 6 +-- restlike/single/receiver_test.go | 6 +-- restlike/single/response_test.go | 12 ++--- restlike/single/server.go | 2 +- 8 files changed, 158 insertions(+), 23 deletions(-) create mode 100644 restlike/connect/receiver_test.go create mode 100644 restlike/connect/response_test.go diff --git a/restlike/connect/receiver.go b/restlike/connect/receiver.go index bfe1b55de..d6e87c574 100644 --- a/restlike/connect/receiver.go +++ b/restlike/connect/receiver.go @@ -17,15 +17,15 @@ import ( "google.golang.org/protobuf/proto" ) -// processor is the reception handler for a RestServer -type connectReceiver struct { +// receiver is the reception handler for a RestServer +type receiver struct { conn connect.Connection endpoints *restlike.Endpoints } // Hear handles connect.Connection message reception for a RestServer // Automatically responds to invalid endpoint requests -func (c connectReceiver) Hear(item receive.Message) { +func (c receiver) Hear(item receive.Message) { // Unmarshal the request payload newMessage := &restlike.Message{} err := proto.Unmarshal(item.Payload, newMessage) @@ -37,24 +37,24 @@ func (c connectReceiver) Hear(item receive.Message) { var respondErr error if cb, err := c.endpoints.Get(restlike.URI(newMessage.GetUri()), restlike.Method(newMessage.GetMethod())); err == nil { // Send the payload to the proper Callback if it exists and singleRespond with the result - respondErr = connRespond(cb(newMessage), c.conn) + respondErr = respond(cb(newMessage), c.conn) } else { // If no callback, automatically send an error response - respondErr = connRespond(&restlike.Message{Error: err.Error()}, c.conn) + respondErr = respond(&restlike.Message{Error: err.Error()}, c.conn) } if respondErr != nil { jww.ERROR.Printf("Unable to singleRespond to request: %+v", err) } } -// connRespond to connect.Connection with the given Message -func connRespond(response *restlike.Message, conn connect.Connection) error { +// respond to connect.Connection with the given Message +func respond(response *restlike.Message, conn connect.Connection) error { payload, err := proto.Marshal(response) if err != nil { return errors.Errorf("unable to marshal restlike response message: %+v", err) } - // TODO: Parameterize params and timeout + // TODO: Parameterize params _, _, _, err = conn.SendE2E(catalog.XxMessage, payload, e2e.GetDefaultParams()) if err != nil { return errors.Errorf("unable to send restlike response message: %+v", err) @@ -63,6 +63,6 @@ func connRespond(response *restlike.Message, conn connect.Connection) error { } // Name is used for debugging -func (c connectReceiver) Name() string { +func (c receiver) Name() string { return "Restlike" } diff --git a/restlike/connect/receiver_test.go b/restlike/connect/receiver_test.go new file mode 100644 index 000000000..d64f0cadc --- /dev/null +++ b/restlike/connect/receiver_test.go @@ -0,0 +1,59 @@ +//////////////////////////////////////////////////////////////////////////////// +// Copyright © 2022 Privategrity Corporation / +// / +// All rights reserved. / +//////////////////////////////////////////////////////////////////////////////// + +package connect + +import ( + "gitlab.com/elixxir/client/e2e/receive" + "gitlab.com/elixxir/client/restlike" + "testing" +) + +// Test failure of proto unmarshal +func TestSingleReceiver_Callback_FailUnmarshal(t *testing.T) { + ep := restlike.NewEndpoints() + r := receiver{endpoints: ep} + + r.Hear(receive.Message{Payload: []byte("test")}) +} + +// Test happy path +//func TestSingleReceiver_Callback(t *testing.T) { +// ep := &Endpoints{endpoints: make(map[URI]map[Method]Callback)} +// resultChan := make(chan interface{}, 1) +// cb := func(*Message) *Message { +// resultChan <- "" +// return nil +// } +// testPath := URI("test/path") +// testMethod := Get +// testMessage := &Message{ +// Content: []byte("test"), +// Headers: nil, +// Method: uint32(testMethod), +// Uri: string(testPath), +// Error: "", +// } +// +// err := ep.Add(testPath, testMethod, cb) +// if err != nil { +// t.Errorf(err.Error()) +// } +// receiver := singleReceiver{endpoints: ep} +// +// testPayload, err := proto.Marshal(testMessage) +// if err != nil { +// t.Errorf(err.Error()) +// } +// testReq := single.BuildTestRequest(testPayload, t) +// receiver.Callback(testReq, receptionID.EphemeralIdentity{}, nil) +// +// select { +// case _ = <-resultChan: +// case <-time.After(3 * time.Second): +// t.Errorf("Test SingleReceiver timed out!") +// } +//} diff --git a/restlike/connect/response_test.go b/restlike/connect/response_test.go new file mode 100644 index 000000000..f10ea9d82 --- /dev/null +++ b/restlike/connect/response_test.go @@ -0,0 +1,76 @@ +//////////////////////////////////////////////////////////////////////////////// +// Copyright © 2022 Privategrity Corporation / +// / +// All rights reserved. / +//////////////////////////////////////////////////////////////////////////////// + +package connect + +import ( + "bytes" + "gitlab.com/elixxir/client/e2e/receive" + "gitlab.com/elixxir/client/restlike" + "google.golang.org/protobuf/proto" + "testing" + "time" +) + +// Test happy path +func TestSingleResponse_Callback(t *testing.T) { + resultChan := make(chan *restlike.Message, 1) + cb := func(input *restlike.Message) { + resultChan <- input + } + testPath := "test/path" + testMethod := restlike.Get + testMessage := &restlike.Message{ + Content: []byte("test"), + Headers: nil, + Method: uint32(testMethod), + Uri: testPath, + Error: "", + } + + r := response{cb} + + testPayload, err := proto.Marshal(testMessage) + if err != nil { + t.Errorf(err.Error()) + } + r.Hear(receive.Message{Payload: testPayload}) + + select { + case result := <-resultChan: + if result.Uri != testPath { + t.Errorf("Mismatched uri") + } + if result.Method != uint32(testMethod) { + t.Errorf("Mismatched method") + } + if !bytes.Equal(testMessage.Content, result.Content) { + t.Errorf("Mismatched content") + } + case <-time.After(3 * time.Second): + t.Errorf("Test SingleResponse timed out!") + } +} + +// Test proto error path +func TestSingleResponse_Callback_ProtoErr(t *testing.T) { + resultChan := make(chan *restlike.Message, 1) + cb := func(input *restlike.Message) { + resultChan <- input + } + r := response{cb} + + r.Hear(receive.Message{Payload: []byte("test")}) + + select { + case result := <-resultChan: + if len(result.Error) == 0 { + t.Errorf("Expected cb proto error!") + } + case <-time.After(3 * time.Second): + t.Errorf("Test SingleResponse proto error timed out!") + } +} diff --git a/restlike/connect/server.go b/restlike/connect/server.go index 1f09c30b3..977edb7f2 100644 --- a/restlike/connect/server.go +++ b/restlike/connect/server.go @@ -33,7 +33,7 @@ func NewServer(receptionId *id.ID, privKey *cyclic.Int, // Callback for connection requests cb := func(conn connect.Connection) { - handler := connectReceiver{endpoints: newServer.endpoints, conn: conn} + handler := receiver{endpoints: newServer.endpoints, conn: conn} conn.RegisterListener(catalog.XxMessage, handler) } diff --git a/restlike/single/receiver.go b/restlike/single/receiver.go index 5fe1691dc..f82a1f327 100644 --- a/restlike/single/receiver.go +++ b/restlike/single/receiver.go @@ -18,14 +18,14 @@ import ( "time" ) -// processor is the reception handler for a RestServer -type singleReceiver struct { +// receiver is the reception handler for a RestServer +type receiver struct { endpoints *restlike.Endpoints } // Callback is the handler for single-use message reception for a RestServer // Automatically responds to invalid endpoint requests -func (s *singleReceiver) Callback(req *single.Request, receptionId receptionID.EphemeralIdentity, rounds []rounds.Round) { +func (s *receiver) Callback(req *single.Request, receptionId receptionID.EphemeralIdentity, rounds []rounds.Round) { // Unmarshal the request payload newMessage := &restlike.Message{} err := proto.Unmarshal(req.GetPayload(), newMessage) diff --git a/restlike/single/receiver_test.go b/restlike/single/receiver_test.go index 53ed5db54..6922991fd 100644 --- a/restlike/single/receiver_test.go +++ b/restlike/single/receiver_test.go @@ -16,10 +16,10 @@ import ( // Test failure of proto unmarshal func TestSingleReceiver_Callback_FailUnmarshal(t *testing.T) { ep := restlike.NewEndpoints() - receiver := singleReceiver{endpoints: ep} + r := receiver{endpoints: ep} testReq := single.BuildTestRequest(make([]byte, 0), t) - receiver.Callback(testReq, receptionID.EphemeralIdentity{}, nil) + r.Callback(testReq, receptionID.EphemeralIdentity{}, nil) } // Test happy path @@ -44,7 +44,7 @@ func TestSingleReceiver_Callback_FailUnmarshal(t *testing.T) { // if err != nil { // t.Errorf(err.Error()) // } -// receiver := singleReceiver{endpoints: ep} +// receiver := receiver{endpoints: ep} // // testPayload, err := proto.Marshal(testMessage) // if err != nil { diff --git a/restlike/single/response_test.go b/restlike/single/response_test.go index 5d500cd99..b5e11bf81 100644 --- a/restlike/single/response_test.go +++ b/restlike/single/response_test.go @@ -32,13 +32,13 @@ func TestSingleResponse_Callback(t *testing.T) { Error: "", } - response := response{cb} + r := response{cb} testPayload, err := proto.Marshal(testMessage) if err != nil { t.Errorf(err.Error()) } - response.Callback(testPayload, receptionID.EphemeralIdentity{}, nil, nil) + r.Callback(testPayload, receptionID.EphemeralIdentity{}, nil, nil) select { case result := <-resultChan: @@ -62,9 +62,9 @@ func TestSingleResponse_Callback_Err(t *testing.T) { cb := func(input *restlike.Message) { resultChan <- input } - response := response{cb} + r := response{cb} - response.Callback(nil, receptionID.EphemeralIdentity{}, nil, errors.New("test")) + r.Callback(nil, receptionID.EphemeralIdentity{}, nil, errors.New("test")) select { case result := <-resultChan: @@ -82,9 +82,9 @@ func TestSingleResponse_Callback_ProtoErr(t *testing.T) { cb := func(input *restlike.Message) { resultChan <- input } - response := response{cb} + r := response{cb} - response.Callback([]byte("test"), receptionID.EphemeralIdentity{}, nil, nil) + r.Callback([]byte("test"), receptionID.EphemeralIdentity{}, nil, nil) select { case result := <-resultChan: diff --git a/restlike/single/server.go b/restlike/single/server.go index 584acdddb..b5bbbd4ee 100644 --- a/restlike/single/server.go +++ b/restlike/single/server.go @@ -29,7 +29,7 @@ func NewServer(receptionId *id.ID, privKey *cyclic.Int, net single.ListenCmix, e endpoints: restlike.NewEndpoints(), } newServer.listener = single.Listen(catalog.RestLike, receptionId, privKey, - net, e2eGrp, &singleReceiver{newServer.endpoints}) + net, e2eGrp, &receiver{newServer.endpoints}) return newServer } -- GitLab