public void HandshakeSupportsTest() { ExtendedHandshakeMessage m = new ExtendedHandshakeMessage(); byte[] encoded = m.Encode(); Assert.AreEqual(m.ByteLength, encoded.Length, "#1"); Assert.IsTrue(m.Supports.Exists(delegate(ExtensionSupport s) { return s.Name.Equals(PeerExchangeMessage.Support.Name); }), "#2"); Assert.IsTrue(m.Supports.Exists(delegate(ExtensionSupport s) { return s.Name.Equals(LTChat.Support.Name); }), "#3"); Assert.IsTrue(m.Supports.Exists(delegate(ExtensionSupport s) { return s.Name.Equals(LTMetadata.Support.Name); }), "#4"); }
public void HandshakeSupportsTest() { var message = new ExtendedHandshakeMessage(); var encoded = message.Encode(); Assert.AreEqual(message.ByteLength, encoded.Length, "#1"); Assert.IsTrue(message.Supports.Exists(s => s.Name.Equals(PeerExchangeMessage.Support.Name)), "#2"); Assert.IsTrue(message.Supports.Exists(s => s.Name.Equals(LTChat.Support.Name)), "#3"); Assert.IsTrue(message.Supports.Exists(s => s.Name.Equals(LTMetadata.Support.Name)), "#4"); }
public void HandshakeDecodeTest() { ExtendedHandshakeMessage m = new ExtendedHandshakeMessage(); byte[] data = m.Encode(); ExtendedHandshakeMessage decoded = (ExtendedHandshakeMessage)PeerMessage.DecodeMessage(data, 0, data.Length, rig.Manager); Assert.AreEqual(m.ByteLength, data.Length); Assert.AreEqual(m.ByteLength, decoded.ByteLength, "#1"); Assert.AreEqual(m.LocalPort, decoded.LocalPort, "#2"); Assert.AreEqual(m.MaxRequests, decoded.MaxRequests, "#3"); Assert.AreEqual(m.Version, decoded.Version, "#4"); Assert.AreEqual(m.Supports.Count, decoded.Supports.Count, "#5"); m.Supports.ForEach(delegate(ExtensionSupport s) { Assert.IsTrue(decoded.Supports.Contains(s), "#6:" + s.ToString()); }); }
public void HandshakeDecodeTest() { var message = new ExtendedHandshakeMessage(); byte[] data = message.Encode(); var decoded = (ExtendedHandshakeMessage)PeerMessage.DecodeMessage(data, 0, data.Length, _rig.Manager); Assert.AreEqual(message.ByteLength, data.Length); Assert.AreEqual(message.ByteLength, decoded.ByteLength, "#1"); Assert.AreEqual(message.LocalPort, decoded.LocalPort, "#2"); Assert.AreEqual(message.MaxRequests, decoded.MaxRequests, "#3"); Assert.AreEqual(message.Version, decoded.Version, "#4"); Assert.AreEqual(message.Supports.Count, decoded.Supports.Count, "#5"); message.Supports.ForEach(support => Assert.IsTrue(decoded.Supports.Contains(support), string.Format("#6:{0}", support.ToString()))); }
public void SendMetadataCore(string expectedPath) { CustomConnection connection = pair.Incoming; // 1) Send local handshake. We've already received the remote handshake as part // of the Connect method. SendMessage(new HandshakeMessage(rig.Manager.InfoHash, new string('g', 20), VersionInfo.ProtocolStringV100, true, true), connection); ExtendedHandshakeMessage exHand = new ExtendedHandshakeMessage(rig.Torrent.Metadata.Length); exHand.Supports.Add(LTMetadata.Support); SendMessage(exHand, connection); // 2) Receive the metadata requests from the other peer and fulfill them byte[] buffer = rig.Torrent.Metadata; int length = (buffer.Length + 16383) / 16384; PeerMessage m; while (length > 0 && (m = ReceiveMessage(connection)) != null) { LTMetadata metadata = m as LTMetadata; if (metadata != null) { if (metadata.MetadataMessageType == LTMetadata.eMessageType.Request) { metadata = new LTMetadata (LTMetadata.Support.MessageId, LTMetadata.eMessageType.Data, metadata.Piece, buffer); SendMessage(metadata, connection); length--; } } } // We've sent all the pieces. Now we just wait for the torrentmanager to process them all. while (rig.Manager.Mode is MetadataMode) System.Threading.Thread.Sleep(10); Assert.IsTrue(File.Exists(expectedPath), "#1"); Torrent torrent = Torrent.Load(expectedPath); Assert.AreEqual(rig.Manager.InfoHash, torrent.InfoHash, "#2"); }
public void RequestMetadata() { Setup(false, "path.torrent"); CustomConnection connection = pair.Incoming; // 1) Send local handshake. We've already received the remote handshake as part // of the Connect method. SendMessage(new HandshakeMessage(rig.Manager.Torrent.infoHash, new string('g', 20), VersionInfo.ProtocolStringV100, true, true), connection); ExtendedHandshakeMessage exHand = new ExtendedHandshakeMessage(rig.TorrentDict.LengthInBytes()); exHand.Supports.Add(LTMetadata.Support); SendMessage(exHand, connection); // 2) Send all our metadata requests int length = (rig.TorrentDict.LengthInBytes() + 16383) / 16384; for (int i = 0; i < length; i++) SendMessage(new LTMetadata(LTMetadata.Support.MessageId, LTMetadata.eMessageType.Request, i, null), connection); // 3) Receive all the metadata chunks PeerMessage m; var stream = new MemoryStream(); while (length > 0 && (m = ReceiveMessage(connection)) != null) { LTMetadata metadata = m as LTMetadata; if (metadata != null) { if (metadata.MetadataMessageType == LTMetadata.eMessageType.Data) { stream.Write(metadata.MetadataPiece, 0, metadata.MetadataPiece.Length); length--; } } } // 4) Verify the hash is the same. stream.Position = 0; Assert.AreEqual(rig.Torrent.InfoHash, new InfoHash(new SHA1Managed().ComputeHash(stream)), "#1"); }