public void PublishFrame_Qos_GuaranteedDispatch_SendsReply() { FrameBuilder fb = new FrameBuilder(); fb.WriteByte((byte)QoS.GuaranteedDispatch); fb.WriteArray(BitConverter.GetBytes((UInt32)123456)); fb.WriteString("Test"); fb.WriteMultiByte(3); fb.WriteArray(new byte[] { 0xAA, 0xBB, 0xCC }); var data = fb.GetData(); var frm = new Frame(); frm.payload = data; frm.frameType = FrameType.Publish; A.CallTo(() => subManFake.DispatchMessage(A <string> .Ignored, A <byte[]> .Ignored, A <QoS> .Ignored)).Returns(PostResult.Dispatched); peerMan.FrameReceived(frm, rpFake); A.CallTo(() => rpFake.SendPublishReply(123456, Core.StatusCodes.PublishStatus.Ack)).MustHaveHappened(); }
private void HandlePublish(Frame frame, IPeer source) { // the 5 offset is added because we dont process QoS and Framenumber yet. var qos = (QoS)frame.payload[0]; var msgId = BitConverter.ToUInt32(frame.payload, 1); var len = Util.ExtractMultiByte(frame.payload, 5); var buff = new byte[len.value]; Array.Copy(frame.payload, 5 + (int)len.numBytesUsed, buff, 0, (int)len.value); var channelName = Encoding.UTF8.GetString(buff); var payloadLenOffset = 5 + len.numBytesUsed + len.value; var payloadLen = Util.ExtractMultiByte(frame.payload, (int)payloadLenOffset); var payloadBuff = new byte[payloadLen.value]; Array.Copy(frame.payload, (int)(payloadLenOffset + payloadLen.numBytesUsed), payloadBuff, 0, (int)payloadLen.value); var res = subMan.DispatchMessage(channelName, payloadBuff, qos); switch (qos) { case QoS.BestEffort: // No answer in BestEffort case, we favor throughput here. break; case QoS.GuaranteedDelivery: // If GuaranteedDelivery was requested, we send a failure notice if we did not // get a positive answer source.SendPublishReply(msgId, res == PostResult.Delivered ? Core.StatusCodes.PublishStatus.AckDelivery : Core.StatusCodes.PublishStatus.NakDelivery); break; case QoS.GuaranteedDispatch: source.SendPublishReply(msgId, res >= PostResult.DeliveryError ? Core.StatusCodes.PublishStatus.Ack : Core.StatusCodes.PublishStatus.NakDispatch); break; } }