Exemplo n.º 1
0
        public void InvalidFirstChar_ThrowsInvalidBencodeException(string bencode, IBencodeParser bparser)
        {
            var parser = new BDictionaryParser(bparser);
            Action action = () => parser.ParseString(bencode);

            action.ShouldThrow<InvalidBencodeException<BDictionary>>();
        }
Exemplo n.º 2
0
        public void CanParseEmptyDictionary(string bencode, IBencodeParser bparser)
        {
            var parser = new BDictionaryParser(bparser);
            var bdictionary = parser.ParseString(bencode);

            bdictionary.Count.Should().Be(0);
        }
Exemplo n.º 3
0
        public void InvalidFirstChar_ThrowsInvalidBencodeException(string bencode, IBencodeParser bparser)
        {
            var    parser = new BDictionaryParser(bparser);
            Action action = () => parser.ParseString(bencode);

            action.ShouldThrow <InvalidBencodeException <BDictionary> >();
        }
Exemplo n.º 4
0
        public void CanParseEmptyDictionary(string bencode, IBencodeParser bparser)
        {
            var parser      = new BDictionaryParser(bparser);
            var bdictionary = parser.ParseString(bencode);

            bdictionary.Count.Should().Be(0);
        }
        public void InvalidFirstChar_ThrowsInvalidBencodeExceptionAsync(string bencode, IBencodeParser bparser)
        {
            var         parser = new BDictionaryParser(bparser);
            Func <Task> action = async() => await parser.ParseStringAsync(bencode);

            action.Should().Throw <InvalidBencodeException <BDictionary> >().WithMessage("*Unexpected character*");
        }
        public void BelowMinimumLength2_ThrowsInvalidBencodeExceptionAsync(string bencode, IBencodeParser bparser)
        {
            var         parser = new BDictionaryParser(bparser);
            Func <Task> action = async() => await parser.ParseStringAsync(bencode);

            action.Should().Throw <InvalidBencodeException <BDictionary> >().WithMessage("*reached end of stream*");
        }
        public async Task CanParseEmptyDictionaryAsync(string bencode, IBencodeParser bparser)
        {
            var parser      = new BDictionaryParser(bparser);
            var bdictionary = await parser.ParseStringAsync(bencode);

            bdictionary.Count.Should().Be(0);
        }
Exemplo n.º 8
0
        public void BelowMinimumLength2_ThrowsInvalidBencodeException(string bencode, IBencodeParser bparser)
        {
            var    parser = new BDictionaryParser(bparser);
            Action action = () => parser.ParseString(bencode);

            action.Should().Throw <InvalidBencodeException <BDictionary> >().WithMessage("*Invalid length*");
        }
Exemplo n.º 9
0
        public void InvalidFirstChar_ThrowsInvalidBencodeException(string bencode, IBencodeParser bparser)
        {
            var    parser = new BDictionaryParser(bparser);
            Action action = () => parser.ParseString(bencode);

            action.Should().Throw <InvalidBencodeException <BDictionary> >().WithMessage("*Unexpected character*");
        }
Exemplo n.º 10
0
        public void MissingEndChar_ThrowsInvalidBencodeException(string bencode, IBencodeParser bparser)
        {
            SetupBencodeParser(bparser, bencode, new BString("key"), new BString("value"), hasEndChar: false);

            var    parser = new BDictionaryParser(bparser);
            Action action = () => parser.ParseString(bencode);

            action.ShouldThrow <InvalidBencodeException <BDictionary> >();
        }
Exemplo n.º 11
0
        public void MissingEndChar_ThrowsInvalidBencodeException(string bencode, IBencodeParser bparser)
        {
            SetupBencodeParser(bparser, bencode, new BString("key"), new BString("value"), hasEndChar:false);

            var parser = new BDictionaryParser(bparser);
            Action action = () => parser.ParseString(bencode);

            action.ShouldThrow<InvalidBencodeException<BDictionary>>();
        }
Exemplo n.º 12
0
        public void BelowMinimumLength2_WhenStreamLengthNotSupported_ThrowsInvalidBencodeException(string bencode, IBencodeParser bparser)
        {
            var stream = new LengthNotSupportedStream(bencode);

            var    parser = new BDictionaryParser(bparser);
            Action action = () => parser.Parse(stream);

            action.Should().Throw <InvalidBencodeException <BDictionary> >();
        }
        public void InvalidKey_ThrowsInvalidBencodeExceptionAsync(IBencodeParser bparser)
        {
            bparser.ParseAsync <BString>(Arg.Any <PipeBencodeReader>()).Throws <BencodeException>();

            var parser = new BDictionaryParser(bparser);

            Func <Task> action = async() => await parser.ParseStringAsync("di42ee");

            action.Should().Throw <InvalidBencodeException <BDictionary> >().WithMessage("*Could not parse dictionary key*");
        }
Exemplo n.º 14
0
        public void Deserialize(byte[] data)
        {
            var dictParser = new BDictionaryParser(new BencodeParser());
            var dict       = dictParser.Parse(data);

            if (dict.TryGetValue("added", out IBObject added))
            {
                Added = ParseEndPoints((BString)added).ToList();
            }
        }
Exemplo n.º 15
0
        public void InvalidKey_ThrowsInvalidBencodeException(IBencodeParser bparser)
        {
            bparser.Parse <BString>(Arg.Any <BencodeReader>()).Throws <BencodeException>();

            var parser = new BDictionaryParser(bparser);

            Action action = () => parser.ParseString("di42ee");

            action.Should().Throw <InvalidBencodeException <BDictionary> >().WithMessage("*Could not parse dictionary key*");
        }
Exemplo n.º 16
0
        public void DuplicateKey_ThrowsInvalidBencodeException(IBencodeParser bparser, BString someKey, BString someValue)
        {
            bparser.Parse <BString>(Arg.Any <BencodeReader>()).Returns(someKey, someKey);
            bparser.Parse(Arg.Any <BencodeReader>()).Returns(someValue);

            var parser = new BDictionaryParser(bparser);

            Action action = () => parser.ParseString("di42ee");

            action.Should().Throw <InvalidBencodeException <BDictionary> >().WithMessage("*The dictionary already contains the key*");
        }
        public void DuplicateKey_ThrowsInvalidBencodeExceptionAsync(IBencodeParser bparser, BString someKey, BString someValue)
        {
            bparser.ParseAsync <BString>(Arg.Any <PipeBencodeReader>()).Returns(someKey, someKey);
            bparser.ParseAsync(Arg.Any <PipeBencodeReader>()).Returns(someValue);

            var parser = new BDictionaryParser(bparser);

            Func <Task> action = async() => await parser.ParseStringAsync("di42ee");

            action.Should().Throw <InvalidBencodeException <BDictionary> >().WithMessage("*The dictionary already contains the key*");
        }
Exemplo n.º 18
0
        public void CanParseSimple(string bencode, IBencodeParser bparser)
        {
            var key = new BString("key");
            var value = new BString("value");
            SetupBencodeParser(bparser, bencode, key, value, hasEndChar:true);

            var parser = new BDictionaryParser(bparser);
            var bdictionary = parser.ParseString(bencode);

            bdictionary.Count.Should().Be(1);
            bdictionary.Should().ContainKey(key);
            bdictionary[key].Should().BeSameAs(value);
        }
Exemplo n.º 19
0
        public void CanParseSimple(string bencode, IBencodeParser bparser)
        {
            var key   = new BString("key");
            var value = new BString("value");

            SetupBencodeParser(bparser, bencode, key, value, hasEndChar: true);

            var parser      = new BDictionaryParser(bparser);
            var bdictionary = parser.ParseString(bencode);

            bdictionary.Count.Should().Be(1);
            bdictionary.Should().ContainKey(key);
            bdictionary[key].Should().BeSameAs(value);
        }
Exemplo n.º 20
0
        public void Deserialize(IReadOnlyList <byte> data)
        {
            var dictParser = new BDictionaryParser(new BencodeParser());
            var dict       = dictParser.Parse(data.ToArray());

            if (dict.TryGetValue("m", out IBObject msgTypes))
            {
                MessageIds = ((BDictionary)msgTypes).ToDictionary(x => x.Key.ToString(), x => (byte)((BNumber)x.Value).Value);
            }

            if (dict.TryGetValue("v", out IBObject client))
            {
                Client = ((BString)client).ToString();
            }
        }
Exemplo n.º 21
0
        public void MissingEndChar_ThrowsInvalidBencodeException(string bencode, IBencodeParser bparser, BString someKey, IBObject someValue)
        {
            // Arrange
            bparser.Parse <BString>(Arg.Any <BencodeReader>())
            .Returns(someKey);

            bparser.Parse(Arg.Any <BencodeReader>())
            .Returns(someValue)
            .AndSkipsAhead(bencode.Length - 1);

            // Act
            var    parser = new BDictionaryParser(bparser);
            Action action = () => parser.ParseString(bencode);

            // Assert
            action.Should().Throw <InvalidBencodeException <BDictionary> >().WithMessage("*Missing end character of object*");
        }
Exemplo n.º 22
0
        /// <summary>
        /// Loads the specified Torrent file.
        /// </summary>
        /// <param name="input">Input stream to read.</param>
        /// <returns>Metainfo data.</returns>
        public static Metainfo ReadFromStream(Stream input)
        {
            var dictParser = new BDictionaryParser(new BencodeParser());
            var dict       = dictParser.Parse(input);

            var parser  = new BencodeParser();
            var torrent = parser.Parse <Torrent>(dict.EncodeAsBytes());

            var files = new List <ContainedFile>();

            if (torrent.File != null)
            {
                // Single file
                files.Add(new ContainedFile(torrent.File.FileName, torrent.File.FileSize));
            }
            else
            {
                // Multiple files
                files.AddRange(torrent.Files.Select(x => new ContainedFile(x.FullPath, x.FileSize)));
            }

            // Construct pieces
            var pieces = new List <Piece>();

            byte[] pieceHashes = torrent.Pieces;
            int    pieceIndex  = 0;

            for (long offset = 0; offset + torrent.PieceSize <= torrent.TotalSize; offset += torrent.PieceSize)
            {
                int    length = (int)Math.Min(torrent.PieceSize, torrent.TotalSize - offset);
                byte[] hash   = new byte[Sha1Hash.Length];
                Array.Copy(pieceHashes, pieceIndex * Sha1Hash.Length, hash, 0, Sha1Hash.Length);
                Piece piece = new Piece(pieceIndex, length, new Sha1Hash(hash));
                pieces.Add(piece);
                pieceIndex++;
            }

            return(new Metainfo(torrent.DisplayName,
                                new Sha1Hash(torrent.GetInfoHashBytes()),
                                files,
                                pieces,
                                torrent.Trackers.Select(x => x.Select(y => new Uri(y))),
                                new byte[0]));
        }
Exemplo n.º 23
0
        public void CanParseSimple(string bencode, IBencodeParser bparser)
        {
            // Arange
            var key   = new BString("key");
            var value = new BString("value");

            bparser.Parse <BString>(Arg.Any <BencodeReader>())
            .Returns(key);

            bparser.Parse(Arg.Any <BencodeReader>())
            .Returns(value)
            .AndSkipsAhead(bencode.Length - 2);

            // Act
            var parser      = new BDictionaryParser(bparser);
            var bdictionary = parser.ParseString(bencode);

            // Assert
            bdictionary.Count.Should().Be(1);
            bdictionary.Should().ContainKey(key);
            bdictionary[key].Should().BeSameAs(value);
        }
Exemplo n.º 24
0
        public void Deserialize(byte[] data)
        {
            using (var ms = new MemoryStream(data))
            {
                var dictParser = new BDictionaryParser(new BencodeParser());
                var dict       = dictParser.Parse(ms);

                var requestType = (Type)((BNumber)dict["msg_type"]).Value;
                if (!Enum.IsDefined(typeof(Type), requestType))
                {
                    return; // Unsupported message type
                }
                RequestType = requestType;

                PieceIndex = (int)((BNumber)dict["piece"]).Value;

                if (RequestType == Type.Data)
                {
                    TotalSize = (int)((BNumber)dict["total_size"]).Value;
                    PieceData = new byte[ms.Length - ms.Position];
                    ms.Read(PieceData, 0, (int)(ms.Length - ms.Position));
                }
            }
        }