From: Jeff Halter Date: Tue, 7 Jun 2022 23:03:25 +0000 (-0700) Subject: Backfill tests and clean up X-Git-Url: https://git.r.bdr.sh/rbdr/mobius/commitdiff_plain/aeec10158441af3cef925ca55e531a4d5517d5ec Backfill tests and clean up --- diff --git a/hotline/files.go b/hotline/files.go index d07f445..4f55eba 100644 --- a/hotline/files.go +++ b/hotline/files.go @@ -10,6 +10,8 @@ import ( "strings" ) +const incompleteFileSuffix = ".incomplete" + func downcaseFileExtension(filename string) string { splitStr := strings.Split(filename, ".") ext := strings.ToLower( @@ -177,8 +179,6 @@ func EncodeFilePath(filePath string) []byte { return bytes } -const incompleteFileSuffix = ".incomplete" - // effectiveFile wraps os.Open to check for the presence of a partial file transfer as a fallback func effectiveFile(filePath string) (*os.File, error) { file, err := os.Open(filePath) diff --git a/hotline/server.go b/hotline/server.go index d5da458..768433b 100644 --- a/hotline/server.go +++ b/hotline/server.go @@ -65,7 +65,12 @@ type PrivateChat struct { } func (s *Server) ListenAndServe(ctx context.Context, cancelRoot context.CancelFunc) error { - s.Logger.Infow("Hotline server started", "version", VERSION) + s.Logger.Infow("Hotline server started", + "version", VERSION, + "API port", fmt.Sprintf(":%v", s.Port), + "Transfer port", fmt.Sprintf(":%v", s.Port+1), + ) + var wg sync.WaitGroup wg.Add(1) @@ -79,13 +84,7 @@ func (s *Server) ListenAndServe(ctx context.Context, cancelRoot context.CancelFu return nil } -func (s *Server) APIPort() int { - return s.APIListener.Addr().(*net.TCPAddr).Port -} - func (s *Server) ServeFileTransfers(ln net.Listener) error { - s.Logger.Infow("Hotline file transfer server started", "Addr", fmt.Sprintf(":%v", s.Port+1)) - for { conn, err := ln.Accept() if err != nil { @@ -138,7 +137,6 @@ func (s *Server) sendTransaction(t Transaction) error { } func (s *Server) Serve(ctx context.Context, cancelRoot context.CancelFunc, ln net.Listener) error { - s.Logger.Infow("Hotline server started", "Addr", fmt.Sprintf(":%v", s.Port)) for { conn, err := ln.Accept() @@ -195,11 +193,7 @@ func NewServer(configDir, netInterface string, netPort int, logger *zap.SugaredL } server.APIListener = ln - if netPort != 0 { - netPort += 1 - } - - ln2, err := net.Listen("tcp", fmt.Sprintf("%s:%v", netInterface, netPort)) + ln2, err := net.Listen("tcp", fmt.Sprintf("%s:%v", netInterface, netPort+1)) server.FileListener = ln2 if err != nil { return nil, err @@ -210,7 +204,6 @@ func NewServer(configDir, netInterface string, netPort int, logger *zap.SugaredL return nil, err } - server.Logger.Debugw("Loading Agreement", "path", configDir+agreementFile) if server.Agreement, err = os.ReadFile(configDir + agreementFile); err != nil { return nil, err } diff --git a/hotline/transaction_handlers.go b/hotline/transaction_handlers.go index 20e7651..f4c5a2f 100644 --- a/hotline/transaction_handlers.go +++ b/hotline/transaction_handlers.go @@ -301,7 +301,7 @@ func HandleSendInstantMsg(cc *ClientConn, t *Transaction) (res []Transaction, er msg := t.GetField(fieldData) ID := t.GetField(fieldUserID) - reply := *NewTransaction( + reply := NewTransaction( tranServerMsg, &ID.Data, NewField(fieldData, msg.Data), @@ -316,12 +316,12 @@ func HandleSendInstantMsg(cc *ClientConn, t *Transaction) (res []Transaction, er reply.Fields = append(reply.Fields, NewField(fieldQuotingMsg, t.GetField(fieldQuotingMsg).Data)) } - res = append(res, reply) + res = append(res, *reply) id, _ := byteToInt(ID.Data) - otherClient := cc.Server.Clients[uint16(id)] - if otherClient == nil { - return res, errors.New("ohno") + otherClient, ok := cc.Server.Clients[uint16(id)] + if !ok { + return res, errors.New("invalid client ID") } // Respond with auto reply if other client has it enabled diff --git a/hotline/transaction_handlers_test.go b/hotline/transaction_handlers_test.go index d7ec098..c174822 100644 --- a/hotline/transaction_handlers_test.go +++ b/hotline/transaction_handlers_test.go @@ -2136,3 +2136,121 @@ func TestHandleDisconnectUser(t *testing.T) { }) } } + +func TestHandleSendInstantMsg(t *testing.T) { + type args struct { + cc *ClientConn + t *Transaction + } + tests := []struct { + name string + args args + wantRes []Transaction + wantErr assert.ErrorAssertionFunc + }{ + { + name: "when client 1 sends a message to client 2", + args: args{ + cc: &ClientConn{ + ID: &[]byte{0, 1}, + UserName: []byte("User1"), + Server: &Server{ + Clients: map[uint16]*ClientConn{ + uint16(2): { + AutoReply: []byte(nil), + }, + }, + }, + }, + t: NewTransaction( + tranSendInstantMsg, + &[]byte{0, 1}, + NewField(fieldData, []byte("hai")), + NewField(fieldUserID, []byte{0, 2}), + ), + }, + wantRes: []Transaction{ + *NewTransaction( + tranServerMsg, + &[]byte{0, 2}, + NewField(fieldData, []byte("hai")), + NewField(fieldUserName, []byte("User1")), + NewField(fieldUserID, []byte{0, 1}), + NewField(fieldOptions, []byte{0, 1}), + ), + { + clientID: &[]byte{0, 1}, + Flags: 0x00, + IsReply: 0x01, + Type: []byte{0x0, 0x6c}, + ID: []byte{0, 0, 0, 0}, + ErrorCode: []byte{0, 0, 0, 0}, + Fields: []Field(nil), + }, + }, + wantErr: assert.NoError, + }, + { + name: "when client 2 has autoreply enabled", + args: args{ + cc: &ClientConn{ + ID: &[]byte{0, 1}, + UserName: []byte("User1"), + Server: &Server{ + Clients: map[uint16]*ClientConn{ + uint16(2): { + ID: &[]byte{0, 2}, + UserName: []byte("User2"), + AutoReply: []byte("autohai"), + }, + }, + }, + }, + t: NewTransaction( + tranSendInstantMsg, + &[]byte{0, 1}, + NewField(fieldData, []byte("hai")), + NewField(fieldUserID, []byte{0, 2}), + ), + }, + wantRes: []Transaction{ + *NewTransaction( + tranServerMsg, + &[]byte{0, 2}, + NewField(fieldData, []byte("hai")), + NewField(fieldUserName, []byte("User1")), + NewField(fieldUserID, []byte{0, 1}), + NewField(fieldOptions, []byte{0, 1}), + ), + *NewTransaction( + tranServerMsg, + &[]byte{0, 1}, + NewField(fieldData, []byte("autohai")), + NewField(fieldUserName, []byte("User2")), + NewField(fieldUserID, []byte{0, 2}), + NewField(fieldOptions, []byte{0, 1}), + ), + { + clientID: &[]byte{0, 1}, + Flags: 0x00, + IsReply: 0x01, + Type: []byte{0x0, 0x6c}, + ID: []byte{0, 0, 0, 0}, + ErrorCode: []byte{0, 0, 0, 0}, + Fields: []Field(nil), + }, + }, + wantErr: assert.NoError, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + gotRes, err := HandleSendInstantMsg(tt.args.cc, tt.args.t) + if !tt.wantErr(t, err, fmt.Sprintf("HandleSendInstantMsg(%v, %v)", tt.args.cc, tt.args.t)) { + return + } + + tranAssertEqual(t, tt.wantRes, gotRes) + }) + } +}