Skip to content

Commit f472aeb

Browse files
committed
CCPackageDownloadManager tests added.
CCPackageDownloadManager header documentation improved for setDownloadPath. Bugfix for setting a new download path. Added allDownloads properties. Mainly for testing purposes, it shouldn't hurt. NSAssert added in CCPackageDownloadManager to assert installData is attached to CCPackageDownload. CCPackageDownloadManager no longer sets failed download status of a package: CCPackageDownload is doing this now.
1 parent 9164f13 commit f472aeb

File tree

4 files changed

+164
-15
lines changed

4 files changed

+164
-15
lines changed

UnitTests/CCPackageDownloadManagerTests.m

Lines changed: 144 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,59 @@
77
//
88

99
#import <XCTest/XCTest.h>
10+
#import "CCPackageDownloadManager.h"
11+
#import "CCPackageDownloadManagerDelegate.h"
12+
#import "CCPackage.h"
13+
#import "CCDirector.h"
14+
#import "AppDelegate.h"
15+
#import "CCUnitTestAssertions.h"
16+
#import "CCPackageInstallData.h"
17+
#import "CCPackage+InstallData.h"
1018

11-
@interface CCPackageDownloadManagerTests : XCTestCase
19+
@interface CCPackageDownloadManagerTestURLProtocol : NSURLProtocol @end
20+
21+
@implementation CCPackageDownloadManagerTestURLProtocol
22+
23+
+ (BOOL)canInitWithRequest:(NSURLRequest*)theRequest
24+
{
25+
return [theRequest.URL.scheme caseInsensitiveCompare:@"http"] == NSOrderedSame;
26+
}
27+
28+
+ (NSURLRequest *)canonicalRequestForRequest:(NSURLRequest *)theRequest
29+
{
30+
return theRequest;
31+
}
32+
33+
- (void)startLoading
34+
{
35+
// just send back what was received in URL as last path component
36+
NSString *payload = [self.request.URL lastPathComponent];
37+
NSData *data = [payload dataUsingEncoding:NSUTF8StringEncoding];
38+
39+
NSHTTPURLResponse *response;
40+
response = [[NSHTTPURLResponse alloc] initWithURL:self.request.URL
41+
statusCode:200
42+
HTTPVersion:@"HTTP/1.1"
43+
headerFields:nil];
44+
45+
id<NSURLProtocolClient> client = [self client];
46+
[client URLProtocol:self didReceiveResponse:response cacheStoragePolicy:NSURLCacheStorageNotAllowed];
47+
[client URLProtocol:self didLoadData:data];
48+
[client URLProtocolDidFinishLoading:self];
49+
}
50+
51+
- (void)stopLoading
52+
{
53+
// Nothing to do
54+
}
55+
56+
@end
57+
58+
@interface CCPackageDownloadManagerTests : XCTestCase <CCPackageDownloadManagerDelegate>
59+
60+
@property (nonatomic, strong) CCPackageDownloadManager *downloadManager;
61+
@property (nonatomic) BOOL allDownloadsReturned;
62+
@property (nonatomic, copy) NSString *downloadPath;
1263

1364
@end
1465

@@ -17,18 +68,106 @@ @implementation CCPackageDownloadManagerTests
1768
- (void)setUp
1869
{
1970
[super setUp];
20-
// Put setup code here. This method is called before the invocation of each test method in the class.
71+
72+
[(AppController *)[UIApplication sharedApplication].delegate configureCocos2d];
73+
[[CCDirector sharedDirector] stopAnimation];
74+
// Spin the runloop a bit otherwise nondeterministic exceptions are thrown in the CCScheduler.
75+
[[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate dateWithTimeInterval:0.2 sinceDate:[NSDate date]]];
76+
77+
[NSURLProtocol registerClass:[CCPackageDownloadManagerTestURLProtocol class]];
78+
79+
self.downloadManager = [[CCPackageDownloadManager alloc] init];
80+
self.allDownloadsReturned = NO;
81+
82+
self.downloadPath = [NSTemporaryDirectory() stringByAppendingPathComponent:@"Downloads"];
83+
84+
[self deleteOldDownloads];
85+
86+
_downloadManager.downloadPath = _downloadPath;
87+
_downloadManager.delegate = self;
2188
}
2289

2390
- (void)tearDown
2491
{
25-
// Put teardown code here. This method is called after the invocation of each test method in the class.
92+
[NSURLProtocol unregisterClass:[CCPackageDownloadManagerTestURLProtocol class]];
2693
[super tearDown];
2794
}
2895

29-
- (void)testExample
96+
- (void)deleteOldDownloads
97+
{
98+
NSFileManager *fileManager = [NSFileManager defaultManager];
99+
[fileManager removeItemAtPath:_downloadPath error:nil];
100+
}
101+
102+
- (void)testSetDownloadPath
103+
{
104+
NSString *newPath = [NSTemporaryDirectory() stringByAppendingPathComponent:@"NewDownloads"];
105+
_downloadManager.downloadPath = newPath;
106+
107+
NSFileManager *fileManager = [NSFileManager defaultManager];
108+
BOOL isDir;
109+
110+
XCTAssert([fileManager fileExistsAtPath:newPath isDirectory:&isDir]);
111+
XCTAssertTrue(isDir);
112+
CCAssertEqualStrings(newPath, _downloadManager.downloadPath);
113+
}
114+
115+
- (void)testTwoDownloads
116+
{
117+
CCPackage *package1 = [[CCPackage alloc] initWithName:@"package1" resolution:@"phonehd" os:@"iOS" remoteURL:[NSURL URLWithString:@"http://package.fake/package1"]];
118+
CCPackageInstallData *installData1 = [[CCPackageInstallData alloc] init];
119+
[package1 setInstallData:installData1];
120+
121+
CCPackage *package2 = [[CCPackage alloc] initWithName:@"package2" resolution:@"phonehd" os:@"iOS" remoteURL:[NSURL URLWithString:@"http://package.fake/package2"]];
122+
CCPackageInstallData *installData2 = [[CCPackageInstallData alloc] init];
123+
[package2 setInstallData:installData2];
124+
125+
[_downloadManager enqueuePackageForDownload:package1];
126+
[_downloadManager enqueuePackageForDownload:package2];
127+
128+
while (!_allDownloadsReturned)
129+
{
130+
[[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]];
131+
}
132+
133+
NSFileManager *fileManager = [NSFileManager defaultManager];
134+
XCTAssertTrue([fileManager fileExistsAtPath:[package1 installData].localDownloadURL.path]);
135+
XCTAssertTrue([fileManager fileExistsAtPath:[package2 installData].localDownloadURL.path]);
136+
137+
CCAssertEqualStrings(@"package1", [NSString stringWithContentsOfFile:[package1 installData].localDownloadURL.path encoding:NSUTF8StringEncoding error:nil]);
138+
CCAssertEqualStrings(@"package2", [NSString stringWithContentsOfFile:[package2 installData].localDownloadURL.path encoding:NSUTF8StringEncoding error:nil]);
139+
}
140+
141+
- (void)testCancelDownload
142+
{
143+
CCPackage *package1 = [[CCPackage alloc] initWithName:@"package1" resolution:@"phonehd" os:@"iOS" remoteURL:[NSURL URLWithString:@"http://package.fake/package1"]];
144+
CCPackageInstallData *installData1 = [[CCPackageInstallData alloc] init];
145+
[package1 setInstallData:installData1];
146+
147+
[_downloadManager enqueuePackageForDownload:package1];
148+
[_downloadManager cancelDownloadOfPackage:package1];
149+
150+
// Can't wait for delegate since cancelling won't trigger them
151+
// Just wait a short amount of time and see if nothing has been written to disk
152+
[[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate dateWithTimeInterval:0.5 sinceDate:[NSDate date]]];
153+
154+
NSFileManager *fileManager = [NSFileManager defaultManager];
155+
XCTAssertFalse([fileManager fileExistsAtPath:[package1 installData].localDownloadURL.path]);
156+
}
157+
158+
159+
#pragma mark -
160+
161+
- (void)downloadFinishedOfPackage:(CCPackage *)package
162+
{
163+
NSLog(@"%@ finished", package);
164+
self.allDownloadsReturned = _downloadManager.allDownloads.count == 0;
165+
}
166+
167+
- (void)downloadFailedOfPackage:(CCPackage *)package error:(NSError *)error
30168
{
31-
XCTFail(@"No implementation for \"%s\"", __PRETTY_FUNCTION__);
169+
NSLog(@"%@ failed", package);
170+
self.allDownloadsReturned = _downloadManager.allDownloads.count == 0;
32171
}
33172

34173
@end

UnitTests/CCPackageUnzipperTests.m

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77
//
88

99
#import <XCTest/XCTest.h>
10-
#import <MacTypes.h>
1110
#import "CCPackageUnzipper.h"
1211
#import "CCPackage.h"
1312
#import "CCPackageInstallData.h"

cocos2d/CCPackageDownloadManager.h

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,14 @@
88
@interface CCPackageDownloadManager : NSObject <CCPackageDownloadDelegate>
99

1010
/**
11-
* The download folder path for all downloads
11+
* All active downloads
12+
*/
13+
@property (nonatomic, strong, readonly) NSArray *allDownloads;
14+
15+
/**
16+
* The download folder path for all downloads.
17+
* If the path does not exist it will be created.
18+
* In case the creation of that new download path failed the value will remain unchanged.
1219
*/
1320
@property (nonatomic, copy) NSString *downloadPath;
1421

cocos2d/CCPackageDownloadManager.m

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -32,32 +32,37 @@ - (id)init
3232
return self;
3333
}
3434

35-
- (void)setDownloadPath:(NSString *)downloadPath
35+
- (void)setDownloadPath:(NSString *)newDownloadPath
3636
{
37-
if ([_downloadPath isEqualToString:downloadPath])
37+
if ([_downloadPath isEqualToString:newDownloadPath])
3838
{
3939
return;
4040
}
4141

4242
NSFileManager *fileManager = [NSFileManager defaultManager];
43-
if (![fileManager fileExistsAtPath:_downloadPath])
43+
if (![fileManager fileExistsAtPath:newDownloadPath])
4444
{
4545
NSError *error;
46-
if (![fileManager createDirectoryAtPath:downloadPath
46+
if (![fileManager createDirectoryAtPath:newDownloadPath
4747
withIntermediateDirectories:YES
4848
attributes:nil
4949
error:&error])
5050
{
51-
CCLOG(@"[PACKAGE/DOWNLOAD][ERROR] Setting installation path to %@ - %@", downloadPath, error);
51+
CCLOG(@"[PACKAGE/DOWNLOAD][ERROR] Setting installation path to %@ - %@", newDownloadPath, error);
5252
return;
5353
}
5454
}
5555

5656
[self willChangeValueForKey:@"downloadPath"];
57-
_downloadPath = downloadPath;
57+
_downloadPath = [newDownloadPath copy];
5858
[self didChangeValueForKey:@"downloadPath"];
5959
}
6060

61+
- (NSArray *)allDownloads
62+
{
63+
return _downloads;
64+
}
65+
6166
- (void)enqueuePackageForDownload:(CCPackage *)package
6267
{
6368
if (package.status == CCPackageStatusDownloadPaused)
@@ -83,6 +88,7 @@ - (void)enqueuePackageForDownload:(CCPackage *)package
8388
localURL:[NSURL fileURLWithPath:[_downloadPath stringByAppendingPathComponent:fileName]]];
8489

8590
CCPackageInstallData *installData = [package installData];
91+
NSAssert(installData != nil, @"installData must not be nil");
8692
installData.localDownloadURL = [NSURL fileURLWithPath:[_downloadPath stringByAppendingPathComponent:fileName]];
8793

8894
packageDownload.delegate = self;
@@ -161,8 +167,6 @@ - (void)downloadFailed:(CCPackageDownload *)download error:(NSError *)error
161167
{
162168
[_downloads removeObject:download];
163169

164-
[download.package setValue:@(CCPackageStatusDownloadFailed) forKey:@"status"];
165-
166170
[_delegate downloadFailedOfPackage:download.package error:error];
167171
}
168172

0 commit comments

Comments
 (0)