diff --git a/channels/adminListener.go b/channels/adminListener.go index 421b4ac9f70f91f9c3294a2838e684fb01527b65..d9e203f1c0c4bab8be5fa14220130c773fd74ee5 100644 --- a/channels/adminListener.go +++ b/channels/adminListener.go @@ -40,7 +40,7 @@ func (al *adminListener) Listen(payload []byte, } //check if we sent the message, ignore triggering if we sent - if al.checkSent(msgID) { + if al.checkSent(msgID, round) { return } diff --git a/channels/adminListener_test.go b/channels/adminListener_test.go index 1b6f06e8a0bf6e9d70d39ee8129185a8e75c89a2..cb571d5724dcd7318d7ab4dec78bd2c0fe14866c 100644 --- a/channels/adminListener_test.go +++ b/channels/adminListener_test.go @@ -77,7 +77,7 @@ func TestAdminListener_Listen(t *testing.T) { al := adminListener{ chID: chID, trigger: dummy.triggerAdminEvent, - checkSent: func(messageID cryptoChannel.MessageID) bool { return false }, + checkSent: func(messageID cryptoChannel.MessageID, r rounds.Round) bool { return false }, } // Call the listener @@ -138,7 +138,7 @@ func TestAdminListener_Listen_BadRound(t *testing.T) { al := adminListener{ chID: chID, trigger: dummy.triggerAdminEvent, - checkSent: func(messageID cryptoChannel.MessageID) bool { return false }, + checkSent: func(messageID cryptoChannel.MessageID, r rounds.Round) bool { return false }, } // Call the listener @@ -170,7 +170,7 @@ func TestAdminListener_Listen_BadChannelMessage(t *testing.T) { al := adminListener{ chID: chID, trigger: dummy.triggerAdminEvent, - checkSent: func(messageID cryptoChannel.MessageID) bool { return false }, + checkSent: func(messageID cryptoChannel.MessageID, r rounds.Round) bool { return false }, } // Call the listener @@ -217,7 +217,7 @@ func TestAdminListener_Listen_BadSizedBroadcast(t *testing.T) { al := adminListener{ chID: chID, trigger: dummy.triggerAdminEvent, - checkSent: func(messageID cryptoChannel.MessageID) bool { return false }, + checkSent: func(messageID cryptoChannel.MessageID, r rounds.Round) bool { return false }, } // Call the listener diff --git a/channels/joinedChannel_test.go b/channels/joinedChannel_test.go index a8a21f666ebd959ebb2d0d082edb414680221450..e3bee24de606711cc0a0cffcd24e6a6c9b42001d 100644 --- a/channels/joinedChannel_test.go +++ b/channels/joinedChannel_test.go @@ -490,7 +490,7 @@ func Test_loadJoinedChannel(t *testing.T) { } loadedJc, err := loadJoinedChannel(ch.ReceptionID, m.kv, m.net, m.rng, - m.events, m.broadcastMaker, func(messageID cryptoChannel.MessageID) bool { + m.events, m.broadcastMaker, func(messageID cryptoChannel.MessageID, r rounds.Round) bool { return false }) if err != nil { diff --git a/channels/sendTracker.go b/channels/sendTracker.go index ec366b1e66450aa75557170ca79117d20a655e91..0678993a754739b49ac3d7e0b56c6d2eff8d622b 100644 --- a/channels/sendTracker.go +++ b/channels/sendTracker.go @@ -70,7 +70,7 @@ type sendTracker struct { // messageReceiveFunc is a function type for sendTracker.MessageReceive so it // can be mocked for testing where used -type messageReceiveFunc func(messageID cryptoChannel.MessageID) bool +type messageReceiveFunc func(messageID cryptoChannel.MessageID, r rounds.Round) bool // loadSendTracker loads a sent tracker, restoring from disk. It will register a // function with the cmix client, delayed on when the network goes healthy, @@ -342,7 +342,7 @@ func (st *sendTracker) handleSend(uuid uint64, // was sent by this user. If it was, the correct signal is sent to the event // model and the function returns true, notifying the caller to not process // the message -func (st *sendTracker) MessageReceive(messageID cryptoChannel.MessageID) bool { +func (st *sendTracker) MessageReceive(messageID cryptoChannel.MessageID, round rounds.Round) bool { st.mux.RLock() //skip if already added @@ -374,6 +374,10 @@ func (st *sendTracker) MessageReceive(messageID cryptoChannel.MessageID) bool { st.byRound[msgData.RoundID] = newRoundList } + ts := mutateTimestamp(round.Timestamps[states.QUEUED], messageID) + go st.updateStatus(msgData.UUID, messageID, ts, + round, Delivered) + if err := st.storeSent(); err != nil { jww.FATAL.Panicf("failed to store the updated sent list: %+v", err) } diff --git a/channels/sendTracker_test.go b/channels/sendTracker_test.go index 305e9084f2637ce54d5345bda861a3213c52f735..a90926f33ea427a4f26d5b132c90cf6df7e0bc7e 100644 --- a/channels/sendTracker_test.go +++ b/channels/sendTracker_test.go @@ -8,6 +8,7 @@ import ( "gitlab.com/elixxir/client/storage/versioned" cryptoChannel "gitlab.com/elixxir/crypto/channel" "gitlab.com/elixxir/ekv" + "gitlab.com/elixxir/primitives/states" "gitlab.com/xx_network/primitives/id" "gitlab.com/xx_network/primitives/id/ephemeral" "gitlab.com/xx_network/primitives/netTime" @@ -45,6 +46,13 @@ func (mc *mockClient) RemoveHealthCallback(uint64) {} func TestSendTracker_MessageReceive(t *testing.T) { kv := versioned.NewKV(ekv.MakeMemstore()) uuidNum := uint64(0) + rid := id.Round(2) + + r := rounds.Round{ + ID: rid, + Timestamps: make(map[states.Round]time.Time), + } + r.Timestamps[states.QUEUED] = time.Now() trigger := func(chID *id.ID, umi *userMessageInternal, ts time.Time, receptionID receptionID.EphemeralIdentity, round rounds.Round, status SentStatus) (uint64, error) { @@ -62,12 +70,11 @@ func TestSendTracker_MessageReceive(t *testing.T) { st := loadSendTracker(&mockClient{}, kv, trigger, nil, updateStatus) mid := cryptoChannel.MakeMessageID([]byte("hello"), cid) - process := st.MessageReceive(mid) + process := st.MessageReceive(mid, r) if process { t.Fatalf("Did not receive expected result from MessageReceive") } - rid := id.Round(2) uuid, err := st.denotePendingSend(cid, &userMessageInternal{ userMessage: &UserMessage{}, channelMessage: &ChannelMessage{ @@ -87,7 +94,7 @@ func TestSendTracker_MessageReceive(t *testing.T) { if err != nil { t.Fatalf(err.Error()) } - process = st.MessageReceive(mid) + process = st.MessageReceive(mid, r) if !process { t.Fatalf("Did not receive expected result from MessageReceive") } @@ -109,7 +116,7 @@ func TestSendTracker_MessageReceive(t *testing.T) { ID: rid, State: 1, }) - process = st.MessageReceive(mid) + process = st.MessageReceive(mid, r) if !process { t.Fatalf("Did not receive expected result from MessageReceive") } diff --git a/channels/userListener.go b/channels/userListener.go index 98bcffd47fb736e3b3059f28b9bdc0c1e6552049..dad5075fd08daf0a46f2a221108df2b90dc45a91 100644 --- a/channels/userListener.go +++ b/channels/userListener.go @@ -42,7 +42,7 @@ func (ul *userListener) Listen(payload []byte, msgID := umi.GetMessageID() //check if we sent the message, ignore triggering if we sent - if ul.checkSent(msgID) { + if ul.checkSent(msgID, round) { return } diff --git a/channels/userListener_test.go b/channels/userListener_test.go index fa0c5369207e145490446c58248178c781112f99..23d8ae8c1188ef7c717680f4b6a980dace81e0cc 100644 --- a/channels/userListener_test.go +++ b/channels/userListener_test.go @@ -99,7 +99,7 @@ func TestUserListener_Listen(t *testing.T) { chID: chID, name: ns, trigger: dummy.triggerEvent, - checkSent: func(messageID cryptoChannel.MessageID) bool { return false }, + checkSent: func(messageID cryptoChannel.MessageID, r rounds.Round) bool { return false }, } //call the listener @@ -184,7 +184,7 @@ func TestUserListener_Listen_BadUserSig(t *testing.T) { chID: chID, name: ns, trigger: dummy.triggerEvent, - checkSent: func(messageID cryptoChannel.MessageID) bool { return false }, + checkSent: func(messageID cryptoChannel.MessageID, r rounds.Round) bool { return false }, } //call the listener @@ -247,7 +247,7 @@ func TestUserListener_Listen_BadRound(t *testing.T) { chID: chID, name: ns, trigger: dummy.triggerEvent, - checkSent: func(messageID cryptoChannel.MessageID) bool { return false }, + checkSent: func(messageID cryptoChannel.MessageID, r rounds.Round) bool { return false }, } //call the listener @@ -280,7 +280,7 @@ func TestUserListener_Listen_BadMessage(t *testing.T) { chID: chID, name: ns, trigger: dummy.triggerEvent, - checkSent: func(messageID cryptoChannel.MessageID) bool { return false }, + checkSent: func(messageID cryptoChannel.MessageID, r rounds.Round) bool { return false }, } //call the listener @@ -345,7 +345,7 @@ func TestUserListener_Listen_BadSizedBroadcast(t *testing.T) { chID: chID, name: ns, trigger: dummy.triggerEvent, - checkSent: func(messageID cryptoChannel.MessageID) bool { return false }, + checkSent: func(messageID cryptoChannel.MessageID, r rounds.Round) bool { return false }, } //call the listener