Skip to content
Snippets Groups Projects
Commit 74dba3c6 authored by Benjamin Wenger's avatar Benjamin Wenger
Browse files

Merge branch 'groupMessageID' into 'release'

added tags to the cmd layer

See merge request !133
parents e6328d57 d95249ef
No related branches found
No related tags found
2 merge requests!170Release,!133added tags to the cmd layer
...@@ -124,8 +124,8 @@ func (g *GroupChat) Send(groupIdBytes, message []byte) (*GroupSendReport, error) ...@@ -124,8 +124,8 @@ func (g *GroupChat) Send(groupIdBytes, message []byte) (*GroupSendReport, error)
return nil, errors.Errorf("Failed to unmarshal group ID: %+v", err) return nil, errors.Errorf("Failed to unmarshal group ID: %+v", err)
} }
round, timestamp, err := g.m.Send(groupID, message) round, timestamp, msgID, err := g.m.Send(groupID, message)
return &GroupSendReport{round, timestamp}, err return &GroupSendReport{round, timestamp, msgID}, err
} }
// GetGroups returns an IdList containing a list of group IDs that the user is a // GetGroups returns an IdList containing a list of group IDs that the user is a
...@@ -239,6 +239,7 @@ func (ngr *NewGroupReport) Unmarshal(b []byte) error { ...@@ -239,6 +239,7 @@ func (ngr *NewGroupReport) Unmarshal(b []byte) error {
type GroupSendReport struct { type GroupSendReport struct {
roundID id.Round roundID id.Round
timestamp time.Time timestamp time.Time
messageID group.MessageID
} }
// GetRoundID returns the ID of the round that the send occurred on. // GetRoundID returns the ID of the round that the send occurred on.
...@@ -257,6 +258,11 @@ func (gsr *GroupSendReport) GetTimestampMS() int64 { ...@@ -257,6 +258,11 @@ func (gsr *GroupSendReport) GetTimestampMS() int64 {
return int64(ts) return int64(ts)
} }
// GetMessageID returns the ID of the round that the send occurred on.
func (gsr *GroupSendReport) GetMessageID() []byte {
return gsr.messageID[:]
}
//// ////
// Group Structure // Group Structure
//// ////
......
...@@ -218,7 +218,7 @@ func sendGroup(groupIdString string, msg []byte, gm *groupChat.Manager) { ...@@ -218,7 +218,7 @@ func sendGroup(groupIdString string, msg []byte, gm *groupChat.Manager) {
jww.INFO.Printf("Sending to group %s message %q", groupID, msg) jww.INFO.Printf("Sending to group %s message %q", groupID, msg)
rid, timestamp, err := gm.Send(groupID, msg) rid, timestamp, _, err := gm.Send(groupID, msg)
if err != nil { if err != nil {
jww.FATAL.Panicf("Sending message to group %s: %+v", groupID, err) jww.FATAL.Panicf("Sending message to group %s: %+v", groupID, err)
} }
......
...@@ -37,15 +37,15 @@ const ( ...@@ -37,15 +37,15 @@ const (
// Send sends a message to all group members using Client.SendManyCMIX. The // Send sends a message to all group members using Client.SendManyCMIX. The
// send fails if the message is too long. // send fails if the message is too long.
func (m *Manager) Send(groupID *id.ID, message []byte) (id.Round, time.Time, func (m *Manager) Send(groupID *id.ID, message []byte) (id.Round, time.Time, group.MessageID,
error) { error) {
// Get the current time stripped of the monotonic clock // Get the current time stripped of the monotonic clock
timeNow := netTime.Now().Round(0) timeNow := netTime.Now().Round(0)
// Create a cMix message for each group member // Create a cMix message for each group member
messages, err := m.createMessages(groupID, message, timeNow) messages, msgID, err := m.createMessages(groupID, message, timeNow)
if err != nil { if err != nil {
return 0, time.Time{}, errors.Errorf(newCmixMsgErr, err) return 0, time.Time{}, group.MessageID{}, errors.Errorf(newCmixMsgErr, err)
} }
param := params.GetDefaultCMIX() param := params.GetDefaultCMIX()
...@@ -54,28 +54,38 @@ func (m *Manager) Send(groupID *id.ID, message []byte) (id.Round, time.Time, ...@@ -54,28 +54,38 @@ func (m *Manager) Send(groupID *id.ID, message []byte) (id.Round, time.Time,
rid, _, err := m.net.SendManyCMIX(messages, param) rid, _, err := m.net.SendManyCMIX(messages, param)
if err != nil { if err != nil {
return 0, time.Time{}, return 0, time.Time{}, group.MessageID{},
errors.Errorf(sendManyCmixErr, m.gs.GetUser().ID, groupID, err) errors.Errorf(sendManyCmixErr, m.gs.GetUser().ID, groupID, err)
} }
jww.DEBUG.Printf("Sent message to %d members in group %s at %s.", jww.DEBUG.Printf("Sent message to %d members in group %s at %s.",
len(messages), groupID, timeNow) len(messages), groupID, timeNow)
return rid, timeNow, nil return rid, timeNow, msgID, nil
} }
// createMessages generates a list of cMix messages and a list of corresponding // createMessages generates a list of cMix messages and a list of corresponding
// recipient IDs. // recipient IDs.
func (m *Manager) createMessages(groupID *id.ID, msg []byte, timestamp time.Time) ( func (m *Manager) createMessages(groupID *id.ID, msg []byte, timestamp time.Time) (
[]message.TargetedCmixMessage, error) { []message.TargetedCmixMessage, group.MessageID, error) {
//make the message ID
cmixMsg := format.NewMessage(m.store.Cmix().GetGroup().GetP().ByteLen())
_, intlMsg, err := newMessageParts(cmixMsg.ContentsSize())
if err != nil {
return nil, group.MessageID{},errors.WithMessage(err,"Failed to make message parts for message ID")
}
messageID := group.NewMessageID(groupID, setInternalPayload(intlMsg, timestamp, m.gs.GetUser().ID, msg))
g, exists := m.gs.Get(groupID) g, exists := m.gs.Get(groupID)
if !exists { if !exists {
return []message.TargetedCmixMessage{}, return []message.TargetedCmixMessage{}, group.MessageID{},
errors.Errorf(newNoGroupErr, groupID) errors.Errorf(newNoGroupErr, groupID)
} }
return m.newMessages(g, msg, timestamp) NewMessages, err := m.newMessages(g, msg, timestamp)
return NewMessages, messageID, err
} }
// newMessages is a private function that allows the passing in of a timestamp // newMessages is a private function that allows the passing in of a timestamp
......
...@@ -30,7 +30,7 @@ func TestManager_Send(t *testing.T) { ...@@ -30,7 +30,7 @@ func TestManager_Send(t *testing.T) {
messageBytes := []byte("Group chat message.") messageBytes := []byte("Group chat message.")
sender := m.gs.GetUser().DeepCopy() sender := m.gs.GetUser().DeepCopy()
_, _, err := m.Send(g.ID, messageBytes) _, _, _, err := m.Send(g.ID, messageBytes)
if err != nil { if err != nil {
t.Errorf("Send() returned an error: %+v", err) t.Errorf("Send() returned an error: %+v", err)
} }
...@@ -110,7 +110,7 @@ func TestManager_Send_CmixMessageError(t *testing.T) { ...@@ -110,7 +110,7 @@ func TestManager_Send_CmixMessageError(t *testing.T) {
expectedErr := strings.SplitN(newCmixMsgErr, "%", 2)[0] expectedErr := strings.SplitN(newCmixMsgErr, "%", 2)[0]
// Send message // Send message
_, _, err := m.Send(g.ID, make([]byte, 400)) _, _, _, err := m.Send(g.ID, make([]byte, 400))
if err == nil || !strings.Contains(err.Error(), expectedErr) { if err == nil || !strings.Contains(err.Error(), expectedErr) {
t.Errorf("Send() failed to return the expected error."+ t.Errorf("Send() failed to return the expected error."+
"\nexpected: %s\nreceived: %+v", expectedErr, err) "\nexpected: %s\nreceived: %+v", expectedErr, err)
...@@ -125,7 +125,7 @@ func TestManager_Send_SendManyCMIXError(t *testing.T) { ...@@ -125,7 +125,7 @@ func TestManager_Send_SendManyCMIXError(t *testing.T) {
expectedErr := strings.SplitN(sendManyCmixErr, "%", 2)[0] expectedErr := strings.SplitN(sendManyCmixErr, "%", 2)[0]
// Send message // Send message
_, _, err := m.Send(g.ID, []byte("message")) _, _, _, err := m.Send(g.ID, []byte("message"))
if err == nil || !strings.Contains(err.Error(), expectedErr) { if err == nil || !strings.Contains(err.Error(), expectedErr) {
t.Errorf("Send() failed to return the expected error."+ t.Errorf("Send() failed to return the expected error."+
"\nexpected: %s\nreceived: %+v", expectedErr, err) "\nexpected: %s\nreceived: %+v", expectedErr, err)
...@@ -145,7 +145,7 @@ func TestManager_createMessages(t *testing.T) { ...@@ -145,7 +145,7 @@ func TestManager_createMessages(t *testing.T) {
testMsg := []byte("Test group message.") testMsg := []byte("Test group message.")
sender := m.gs.GetUser() sender := m.gs.GetUser()
messages, err := m.createMessages(g.ID, testMsg, netTime.Now()) messages, _, err := m.createMessages(g.ID, testMsg, netTime.Now())
if err != nil { if err != nil {
t.Errorf("createMessages() returned an error: %+v", err) t.Errorf("createMessages() returned an error: %+v", err)
} }
...@@ -205,7 +205,7 @@ func TestManager_createMessages_InvalidGroupIdError(t *testing.T) { ...@@ -205,7 +205,7 @@ func TestManager_createMessages_InvalidGroupIdError(t *testing.T) {
m, _ := newTestManagerWithStore(prng, 10, 0, nil, nil, t) m, _ := newTestManagerWithStore(prng, 10, 0, nil, nil, t)
// Read message and make sure the error is expected // Read message and make sure the error is expected
_, err := m.createMessages( _, _, err := m.createMessages(
id.NewIdFromString("invalidID", id.Group, t), nil, time.Time{}) id.NewIdFromString("invalidID", id.Group, t), nil, time.Time{})
if err == nil || !strings.Contains(err.Error(), expectedErr) { if err == nil || !strings.Contains(err.Error(), expectedErr) {
t.Errorf("createMessages() did not return the expected error."+ t.Errorf("createMessages() did not return the expected error."+
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment