Torrent upload piece request

This commit is contained in:
Ben Davis
2017-08-29 12:55:37 +01:00
parent 91c8e44d48
commit c58defc9e8
3 changed files with 113 additions and 4 deletions
+20 -4
View File
@@ -11,6 +11,9 @@
34D4082D0E0A2C899857DC89 /* Pods_BitTorrent.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8B47AE52A67ECE61259FCDAD /* Pods_BitTorrent.framework */; };
867491B4C409A91D4D72CCE7 /* Pods_BitTorrent_BitTorrentExample.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D97F9FB9F74204574FF6840B /* Pods_BitTorrent_BitTorrentExample.framework */; };
B501A5581F557E9E00B87911 /* RandomEnumeration.swift in Sources */ = {isa = PBXBuildFile; fileRef = B501A5571F557E9E00B87911 /* RandomEnumeration.swift */; };
B501A55B1F55894500B87911 /* TorrentPeerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = B501A55A1F55894400B87911 /* TorrentPeerTests.swift */; };
B501A55D1F55898500B87911 /* TorrentUploadPieceRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = B501A55C1F55898500B87911 /* TorrentUploadPieceRequest.swift */; };
B501A55F1F558BA800B87911 /* TorrentUploadPieceRequestTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = B501A55E1F558BA800B87911 /* TorrentUploadPieceRequestTests.swift */; };
B50B24F71F0A553F00C23E7C /* UDPConnectionTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = B50B24F61F0A553B00C23E7C /* UDPConnectionTests.swift */; };
B50B24F91F0A554A00C23E7C /* UDPConnection.swift in Sources */ = {isa = PBXBuildFile; fileRef = B50B24F81F0A554A00C23E7C /* UDPConnection.swift */; };
B514DD7B1F40971D00C932F8 /* TorrentViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = B514DD7A1F40971D00C932F8 /* TorrentViewController.swift */; };
@@ -78,7 +81,6 @@
B5BFD9CE1F3FAFA500CE0186 /* TorrentTrackerManagerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = B5BFD9CD1F3FAFA500CE0186 /* TorrentTrackerManagerTests.swift */; };
B5BFD9D01F3FB13E00CE0186 /* TorrentTracker.swift in Sources */ = {isa = PBXBuildFile; fileRef = B5BFD9CF1F3FB13E00CE0186 /* TorrentTracker.swift */; };
B5C06F131F12CDD8005730B3 /* TorrentPeer.swift in Sources */ = {isa = PBXBuildFile; fileRef = B5C06F121F12CDD8005730B3 /* TorrentPeer.swift */; };
B5C06F151F12CDE1005730B3 /* TorrentPeerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = B5C06F141F12CDE1005730B3 /* TorrentPeerTests.swift */; };
B5C5F9621F250061007623B2 /* TorrentProgress.swift in Sources */ = {isa = PBXBuildFile; fileRef = B5C5F9611F250061007623B2 /* TorrentProgress.swift */; };
B5C5F9651F2500D1007623B2 /* TorrentProgressTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = B5C5F9641F2500D1007623B2 /* TorrentProgressTests.swift */; };
B5C5F9671F250CC4007623B2 /* TorrentFileManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = B5C5F9661F250CC4007623B2 /* TorrentFileManager.swift */; };
@@ -170,6 +172,9 @@
99A91AD4708288B297A8B700 /* Pods-BitTorrentTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-BitTorrentTests.debug.xcconfig"; path = "Pods/Target Support Files/Pods-BitTorrentTests/Pods-BitTorrentTests.debug.xcconfig"; sourceTree = "<group>"; };
A8680B0EA21B5A20E03DEE6D /* Pods_BitTorrentTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_BitTorrentTests.framework; sourceTree = BUILT_PRODUCTS_DIR; };
B501A5571F557E9E00B87911 /* RandomEnumeration.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RandomEnumeration.swift; sourceTree = "<group>"; };
B501A55A1F55894400B87911 /* TorrentPeerTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TorrentPeerTests.swift; sourceTree = "<group>"; };
B501A55C1F55898500B87911 /* TorrentUploadPieceRequest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TorrentUploadPieceRequest.swift; sourceTree = "<group>"; };
B501A55E1F558BA800B87911 /* TorrentUploadPieceRequestTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TorrentUploadPieceRequestTests.swift; sourceTree = "<group>"; };
B50B24F61F0A553B00C23E7C /* UDPConnectionTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UDPConnectionTests.swift; sourceTree = "<group>"; };
B50B24F81F0A554A00C23E7C /* UDPConnection.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UDPConnection.swift; sourceTree = "<group>"; };
B514DD7A1F40971D00C932F8 /* TorrentViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TorrentViewController.swift; sourceTree = "<group>"; };
@@ -240,7 +245,6 @@
B5BFD9CD1F3FAFA500CE0186 /* TorrentTrackerManagerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TorrentTrackerManagerTests.swift; sourceTree = "<group>"; };
B5BFD9CF1F3FB13E00CE0186 /* TorrentTracker.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TorrentTracker.swift; sourceTree = "<group>"; };
B5C06F121F12CDD8005730B3 /* TorrentPeer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TorrentPeer.swift; sourceTree = "<group>"; };
B5C06F141F12CDE1005730B3 /* TorrentPeerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TorrentPeerTests.swift; sourceTree = "<group>"; };
B5C5F9611F250061007623B2 /* TorrentProgress.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TorrentProgress.swift; sourceTree = "<group>"; };
B5C5F9641F2500D1007623B2 /* TorrentProgressTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TorrentProgressTests.swift; sourceTree = "<group>"; };
B5C5F9661F250CC4007623B2 /* TorrentFileManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TorrentFileManager.swift; sourceTree = "<group>"; };
@@ -318,6 +322,15 @@
name = Pods;
sourceTree = "<group>";
};
B501A5591F55892300B87911 /* Piece Request info */ = {
isa = PBXGroup;
children = (
B501A55C1F55898500B87911 /* TorrentUploadPieceRequest.swift */,
B501A55E1F558BA800B87911 /* TorrentUploadPieceRequestTests.swift */,
);
path = "Piece Request info";
sourceTree = "<group>";
};
B50B24F01F0A54C100C23E7C /* UDP Networking */ = {
isa = PBXGroup;
children = (
@@ -611,7 +624,8 @@
children = (
B5C06F121F12CDD8005730B3 /* TorrentPeer.swift */,
B527F6281F1BCAD2001F06AF /* TorrentPeerDelegateStub.swift */,
B5C06F141F12CDE1005730B3 /* TorrentPeerTests.swift */,
B501A55A1F55894400B87911 /* TorrentPeerTests.swift */,
B501A5591F55892300B87911 /* Piece Request info */,
B527F62E1F1BDF39001F06AF /* Piece Download Buffer */,
B5C06F101F12C2ED005730B3 /* Communicator */,
);
@@ -979,6 +993,7 @@
B55317DC1F02FC4D00909ADF /* TorrentHTTPTracker.swift in Sources */,
B52EE3401F129CA200AC22D6 /* TorrentPeerHandshakeMessageBuffer.swift in Sources */,
B5F27C621F3F93AC0040589C /* TorrentProgressManager.swift in Sources */,
B501A55D1F55898500B87911 /* TorrentUploadPieceRequest.swift in Sources */,
B514DDA41F40E96100C932F8 /* CombinedNetworkSpeedTracker.swift in Sources */,
B514DD8B1F40C40500C932F8 /* NetworkSpeedTracker.swift in Sources */,
B5E977961CAFB46B0038EBE7 /* String+URLEncode.swift in Sources */,
@@ -1010,11 +1025,11 @@
files = (
B535533A1F0FEB9700A6DCBE /* TorrentPeerCommunicatorTests.swift in Sources */,
B51638971F0EEC2B009E563E /* GCDAsyncSocketStub.swift in Sources */,
B5C06F151F12CDE1005730B3 /* TorrentPeerTests.swift in Sources */,
B51D6C091F0C180600E1E3AB /* TorrentUDPTrackerTests.swift in Sources */,
B537CF061F03148B0084089B /* HTTPConnectionStub.swift in Sources */,
B53553451F1250E300A6DCBE /* TorrentPeerCommunicatorDelegateStub.swift in Sources */,
B5BD7FD61F03032400621BC2 /* TorrentHTTPTrackerTests.swift in Sources */,
B501A55F1F558BA800B87911 /* TorrentUploadPieceRequestTests.swift in Sources */,
B53553431F12435C00A6DCBE /* TorrentPeerCommunicatorReadTests.swift in Sources */,
B556D5AE1F0BA1FD00277B8D /* GCDAsyncUdpSocketStub.swift in Sources */,
B5AF7AAD1F253055003FD66F /* FileHandleFake.swift in Sources */,
@@ -1031,6 +1046,7 @@
B53553401F112BDB00A6DCBE /* BitFieldTests.swift in Sources */,
B514DD881F40B2EC00C932F8 /* TorrentClientManagerStubs.swift in Sources */,
B54D0C271CA56ADB004343BD /* TorrentMetaInfoTests.swift in Sources */,
B501A55B1F55894500B87911 /* TorrentPeerTests.swift in Sources */,
B5F27C641F3F93C20040589C /* TorrentProgressManagerTests.swift in Sources */,
B527F62D1F1BD64D001F06AF /* TorrentPieceDownloadBufferTests.swift in Sources */,
B5F27C5F1F3F7BFD0040589C /* TorrentPeerManagerTests.swift in Sources */,
@@ -0,0 +1,50 @@
//
// TorrentUploadPieceRequest.swift
// BitTorrent
//
// Created by Ben Davis on 29/08/2017.
// Copyright © 2017 Ben Davis. All rights reserved.
//
import Foundation
struct TorrentBlock {
let piece: Int
let begin: Int
let length: Int
let data: Data
}
struct TorrentUploadPieceRequest {
private let data: Data
private let index: Int
private let length: Int
private var blockRequests: [TorrentBlockRequest] = []
var hasBlockRequests: Bool {
return blockRequests.first != nil
}
init(data: Data, index: Int, length: Int) {
self.data = data
self.index = index
self.length = length
}
mutating func addRequest(_ request: TorrentBlockRequest) {
blockRequests.append(request)
}
func nextUploadBlock() -> TorrentBlock? {
guard let request = self.blockRequests.first else { return nil }
let begin = request.begin
let end = begin + request.length
let blockData = data[begin..<end]
return TorrentBlock(piece: request.piece,
begin: request.begin,
length: request.length,
data: blockData)
}
}
@@ -0,0 +1,43 @@
//
// TorrentUploadPieceRequestTests.swift
// BitTorrentTests
//
// Created by Ben Davis on 29/08/2017.
// Copyright © 2017 Ben Davis. All rights reserved.
//
import XCTest
@testable import BitTorrent
class TorrentUploadPieceRequestTests: XCTestCase {
let data = Data(repeating: 1, count: 10) + Data(repeating: 2, count: 10)
let index = 123
let length = 20
func test_hasNoPendingRequestsOnInit() {
let sut = TorrentUploadPieceRequest(data: data, index: index, length: length)
XCTAssertFalse(sut.hasBlockRequests)
XCTAssertNil(sut.nextUploadBlock())
}
func test_nextUploadBlockReturnsCorrectData() {
var sut = TorrentUploadPieceRequest(data: data, index: index, length: length)
let request = TorrentBlockRequest(piece: index, begin: 5, length: 10)
sut.addRequest(request)
let result = sut.nextUploadBlock()
XCTAssertNotNil(result, "Result shouldn't be nil")
if let result = result {
XCTAssertEqual(result.begin, 5)
XCTAssertEqual(result.length, 10)
XCTAssertEqual(result.piece, index)
let expected = Data(bytes: [ 1, 1, 1, 1, 1,
2, 2, 2, 2, 2])
XCTAssertEqualData(result.data, expected)
}
}
}