Skip to content

Commit

Permalink
Merge pull request #1008 from danhd123/develop
Browse files Browse the repository at this point in the history
Nicky's Pull Request plus android fixes.
  • Loading branch information
vlidholt committed Sep 30, 2014
2 parents eb86136 + ce8cbe2 commit 7908afc
Show file tree
Hide file tree
Showing 59 changed files with 5,041 additions and 20 deletions.
3 changes: 3 additions & 0 deletions .gitmodules
Original file line number Diff line number Diff line change
Expand Up @@ -5,3 +5,6 @@ url=https://github.com/slembcke/Chipmunk2D.git
path = external/ObjectAL
url = https://github.com/spritebuilder/ObjectAL-for-Cocos2D.git
branch = apportable
[submodule "external/SSZipArchive"]
path = external/SSZipArchive
url = https://github.com/spritebuilder/ssziparchive.git
90 changes: 90 additions & 0 deletions UnitTests/CCPackageCocos2dEnablerTests.m
Original file line number Diff line number Diff line change
@@ -0,0 +1,90 @@
//
// CCPackageCocos2dEnablerTests.m
// cocos2d-tests-ios
//
// Created by Nicky Weber on 23.09.14.
// Copyright (c) 2014 Cocos2d. All rights reserved.
//

#import <XCTest/XCTest.h>
#import "CCPackageCocos2dEnabler.h"
#import "CCPackage.h"
#import "CCFileUtils.h"
#import "CCSprite.h"
#import "CCBReader.h"
#import "AppDelegate.h"
#import "CCPackage_private.h"

@interface CCPackageCocos2dEnablerTests : XCTestCase

@property (nonatomic, strong) CCPackage *package;
@property (nonatomic, copy) NSURL *installURL;

@end


@implementation CCPackageCocos2dEnablerTests

- (void)setUp
{
[super setUp];
[(AppController *)[UIApplication sharedApplication].delegate configureCocos2d];

self.package = [[CCPackage alloc] initWithName:@"Foo"
resolution:@"phonehd"
os:@"iOS"
remoteURL:[NSURL URLWithString:@"http://foo.fake/Foo-iOS-phonehd.zip"]];

NSString *pathToPackage = [[[NSBundle mainBundle] bundlePath] stringByAppendingPathComponent:@"Resources-shared/Packages/testpackage-iOS-phonehd_unzipped"];
self.installURL = [[NSURL fileURLWithPath:pathToPackage] URLByAppendingPathComponent:@"testpackage-iOS-phonehd"];
_package.installURL = _installURL;
}


#pragma mark - Tests

- (void)testEnablePackage
{
CCPackageCocos2dEnabler *packageEnabler = [[CCPackageCocos2dEnabler alloc] init];
[packageEnabler enablePackages:@[_package]];

XCTAssertTrue([self isPackageInSearchPath]);
XCTAssertEqual(_package.status, CCPackageStatusInstalledEnabled);

CCSprite *sprite = [CCSprite spriteWithImageNamed:@"boredSmiley.png"];
XCTAssertNotNil(sprite);
}

- (void)testDisablePackage
{
[self testEnablePackage];

CCPackageCocos2dEnabler *packageEnabler = [[CCPackageCocos2dEnabler alloc] init];
[packageEnabler disablePackages:@[_package]];

XCTAssertEqual(_package.status, CCPackageStatusInstalledDisabled);

XCTAssertFalse([self isPackageInSearchPath]);

// Can't use [CCSprite spriteWithImageNamed:@"boredSmiley.png"], assertion exception is screwing up test result
CGFloat *scale;
NSString *path = [[CCFileUtils sharedFileUtils] fullPathForFilename:@"boredSmiley.png" contentScale:&scale];
XCTAssertNil(path);
}


#pragma mark - Helper

- (BOOL)isPackageInSearchPath
{
for (NSString *aSearchPath in [CCFileUtils sharedFileUtils].searchPath)
{
if ([aSearchPath isEqualToString:_package.installURL.path])
{
return YES;
}
}
return NO;
}

@end
223 changes: 223 additions & 0 deletions UnitTests/CCPackageDownloadManagerTests.m
Original file line number Diff line number Diff line change
@@ -0,0 +1,223 @@
//
// CCPackageDownloadManagerTests.m
// cocos2d-tests-ios
//
// Created by Nicky Weber on 23.09.14.
// Copyright (c) 2014 Cocos2d. All rights reserved.
//

#import <XCTest/XCTest.h>
#import "CCPackageDownloadManager.h"
#import "CCPackageDownloadManagerDelegate.h"
#import "CCPackage.h"
#import "CCDirector.h"
#import "AppDelegate.h"
#import "CCUnitTestAssertions.h"

@interface CCPackageDownloadManagerTestURLProtocol : NSURLProtocol @end

@implementation CCPackageDownloadManagerTestURLProtocol

+ (BOOL)canInitWithRequest:(NSURLRequest*)theRequest
{
return [theRequest.URL.scheme caseInsensitiveCompare:@"http"] == NSOrderedSame;
}

+ (NSURLRequest *)canonicalRequestForRequest:(NSURLRequest *)theRequest
{
return theRequest;
}

- (void)startLoading
{
// just send back what was received in URL as last path component
NSString *payload = [self.request.URL lastPathComponent];
NSData *data = [payload dataUsingEncoding:NSUTF8StringEncoding];

NSHTTPURLResponse *response;
response = [[NSHTTPURLResponse alloc] initWithURL:self.request.URL
statusCode:200
HTTPVersion:@"HTTP/1.1"
headerFields:nil];

id<NSURLProtocolClient> client = [self client];
[client URLProtocol:self didReceiveResponse:response cacheStoragePolicy:NSURLCacheStorageNotAllowed];
[client URLProtocol:self didLoadData:data];
[client URLProtocolDidFinishLoading:self];
}

- (void)stopLoading
{
// Nothing to do
}

@end


@interface CCPackageDownloadManagerTests : XCTestCase <CCPackageDownloadManagerDelegate>

@property (nonatomic, strong) CCPackageDownloadManager *downloadManager;
@property (nonatomic) BOOL allDownloadsReturned;
@property (nonatomic, copy) NSString *downloadPath;

@end

@implementation CCPackageDownloadManagerTests

- (void)setUp
{
[super setUp];

[(AppController *)[UIApplication sharedApplication].delegate configureCocos2d];
[[CCDirector sharedDirector] stopAnimation];
// Spin the runloop a bit otherwise nondeterministic exceptions are thrown in the CCScheduler.
[[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate dateWithTimeInterval:0.2 sinceDate:[NSDate date]]];

[NSURLProtocol registerClass:[CCPackageDownloadManagerTestURLProtocol class]];

self.downloadManager = [[CCPackageDownloadManager alloc] init];
self.allDownloadsReturned = NO;

self.downloadPath = [NSTemporaryDirectory() stringByAppendingPathComponent:@"Downloads"];

[self deleteOldDownloads];

_downloadManager.downloadPath = _downloadPath;
_downloadManager.delegate = self;
}

- (void)tearDown
{
[NSURLProtocol unregisterClass:[CCPackageDownloadManagerTestURLProtocol class]];
[super tearDown];
}

- (void)deleteOldDownloads
{
NSFileManager *fileManager = [NSFileManager defaultManager];
[fileManager removeItemAtPath:_downloadPath error:nil];
}


#pragma mark - Tests

- (void)testSetDownloadPath
{
NSString *newPath = [NSTemporaryDirectory() stringByAppendingPathComponent:@"NewDownloads"];
_downloadManager.downloadPath = newPath;

NSFileManager *fileManager = [NSFileManager defaultManager];
BOOL isDir;

XCTAssert([fileManager fileExistsAtPath:newPath isDirectory:&isDir]);
XCTAssertTrue(isDir);
CCAssertEqualStrings(newPath, _downloadManager.downloadPath);
}

- (void)testTwoDownloads
{
NSArray *packages = @[[self completePackageWithName:@"package1"], [self completePackageWithName:@"package2"]];

for (CCPackage *aPackage in packages)
{
[_downloadManager enqueuePackageForDownload:aPackage];
}

[self waitUntilDelegateReturns];

[self assertPackagesDownloadedAndContentsAreAsExpected:packages];
}

- (void)testCancelDownload
{
CCPackage *package1 = [self completePackageWithName:@"package1"];

[_downloadManager enqueuePackageForDownload:package1];
[_downloadManager cancelDownloadOfPackage:package1];

// Can't wait for delegate since cancelling won't trigger them
// Just wait a short amount of time and see if nothing has been written to disk
[[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate dateWithTimeInterval:0.5 sinceDate:[NSDate date]]];

NSFileManager *fileManager = [NSFileManager defaultManager];
XCTAssertFalse([fileManager fileExistsAtPath:package1.localDownloadURL.path]);
}

- (void)testPauseAndResumeAllDownloads
{
NSArray *packages = @[[self completePackageWithName:@"package1"],
[self completePackageWithName:@"package2"],
[self completePackageWithName:@"package3"]];

for (CCPackage *aPackage in packages)
{
[_downloadManager enqueuePackageForDownload:aPackage];
}

[_downloadManager pauseAllDownloads];
[_downloadManager resumeAllDownloads];

[self waitUntilDelegateReturns];

[self assertPackagesDownloadedAndContentsAreAsExpected:packages];
}

- (void)testEnqueuePausedPackage
{
CCPackage *package1 = [self completePackageWithName:@"package1"];

[_downloadManager enqueuePackageForDownload:package1];
[_downloadManager pauseDownloadOfPackage:package1];
[_downloadManager enqueuePackageForDownload:package1];

[self waitUntilDelegateReturns];

[self assertPackagesDownloadedAndContentsAreAsExpected:@[package1]];
}

- (void)waitUntilDelegateReturns
{
while (!_allDownloadsReturned)
{
[[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]];
}
}


#pragma mark - Helpers

- (void)assertPackagesDownloadedAndContentsAreAsExpected:(NSArray *)packages
{
NSFileManager *fileManager = [NSFileManager defaultManager];
for (CCPackage *aPackage in packages)
{
XCTAssertTrue([fileManager fileExistsAtPath:aPackage.localDownloadURL.path]);
CCAssertEqualStrings(aPackage.name, [NSString stringWithContentsOfFile:aPackage.localDownloadURL.path encoding:NSUTF8StringEncoding error:nil]);
}
}


#pragma mark - Fixtures

- (CCPackage *)completePackageWithName:(NSString *)name
{
CCPackage *package = [[CCPackage alloc] initWithName:name resolution:@"phonehd" os:@"iOS" remoteURL:[NSURL URLWithString:[NSString stringWithFormat:@"http://package.fake/%@", name]]];
return package;
}


#pragma mark - CCPackageDownloadManagerDelegate

- (void)downloadFinishedOfPackage:(CCPackage *)package
{
NSLog(@"%@ finished", package);
self.allDownloadsReturned = _downloadManager.allDownloads.count == 0;
}

- (void)downloadFailedOfPackage:(CCPackage *)package error:(NSError *)error
{
NSLog(@"%@ failed", package);
self.allDownloadsReturned = _downloadManager.allDownloads.count == 0;
}

@end
Loading

0 comments on commit 7908afc

Please sign in to comment.