aboutsummaryrefslogtreecommitdiff
path: root/Foundation/GTMNSData+zlibTest.m
diff options
context:
space:
mode:
authorGravatar thomasvl <thomasvl@7dc7ac4e-7543-0410-b95c-c1676fc8e2a3>2008-01-28 20:19:42 +0000
committerGravatar thomasvl <thomasvl@7dc7ac4e-7543-0410-b95c-c1676fc8e2a3>2008-01-28 20:19:42 +0000
commit2a5219567634ab7ab74314ff3615132becadff4a (patch)
tree8e6f447544e5eaf460da741bf57771f929b4a70c /Foundation/GTMNSData+zlibTest.m
initial drop of a few sources to start things out
Diffstat (limited to 'Foundation/GTMNSData+zlibTest.m')
-rw-r--r--Foundation/GTMNSData+zlibTest.m183
1 files changed, 183 insertions, 0 deletions
diff --git a/Foundation/GTMNSData+zlibTest.m b/Foundation/GTMNSData+zlibTest.m
new file mode 100644
index 0000000..f18735d
--- /dev/null
+++ b/Foundation/GTMNSData+zlibTest.m
@@ -0,0 +1,183 @@
+//
+// GTMNSData+zlibTest.m
+//
+// Copyright 2007-2008 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License"); you may not
+// use this file except in compliance with the License. You may obtain a copy
+// of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+// License for the specific language governing permissions and limitations under
+// the License.
+//
+
+#import "GTMNSData+zlib.h"
+#import <stdlib.h> // for randiom/srandomdev
+#import <zlib.h>
+
+#import <SenTestingKit/SenTestingKit.h>
+
+@interface GTMNSData_zlibTest : SenTestCase
+@end
+
+
+static void FillWithRandom(char *data, unsigned long len) {
+ char *max = data + len;
+ for ( ; data < max ; ++data) {
+ *data = random() & 0xFF;
+ }
+}
+
+static BOOL HasGzipHeader(NSData *data) {
+ // very simple check
+ if ([data length] > 2) {
+ const unsigned char *bytes = [data bytes];
+ return (bytes[0] == 0x1f) && (bytes[1] == 0x8b);
+ }
+ return NO;
+}
+
+
+@implementation GTMNSData_zlibTest
+
+- (void)setUp {
+ // seed random from /dev/random
+ srandomdev();
+}
+
+- (void)testInflateDeflate {
+ // generate a range of sizes w/ random content
+ for (int n = 0 ; n < 2 ; ++n) {
+ for (int x = 1 ; x < 128 ; ++x) {
+ NSAutoreleasePool *localPool = [[NSAutoreleasePool alloc] init];
+ STAssertNotNil(localPool, @"failed to alloc local pool");
+
+ NSMutableData *data = [NSMutableData data];
+ STAssertNotNil(data, @"failed to alloc data block");
+
+ // first pass small blocks, second pass, larger ones, but second pass
+ // avoid making them multimples of 128.
+ [data setLength:((n*x*128) + x)];
+ FillWithRandom([data mutableBytes], [data length]);
+
+ // w/ *Bytes apis, default level
+ NSData *deflated = [NSData gtm_dataByDeflatingBytes:[data bytes] length:[data length]];
+ STAssertNotNil(deflated, @"failed to deflate data block");
+ STAssertTrue([deflated length] > 0, @"failed to deflate data block");
+ STAssertFalse(HasGzipHeader(deflated), @"has gzip header on zlib data");
+ NSData *dataPrime = [NSData gtm_dataByInflatingBytes:[deflated bytes] length:[deflated length]];
+ STAssertNotNil(dataPrime, @"failed to inflate data block");
+ STAssertTrue([dataPrime length] > 0, @"failed to inflate data block");
+ STAssertEqualObjects(data, dataPrime, @"failed to round trip via *Bytes apis");
+
+ // w/ *Data apis, default level
+ deflated = [NSData gtm_dataByDeflatingData:data];
+ STAssertNotNil(deflated, @"failed to deflate data block");
+ STAssertTrue([deflated length] > 0, @"failed to deflate data block");
+ STAssertFalse(HasGzipHeader(deflated), @"has gzip header on zlib data");
+ dataPrime = [NSData gtm_dataByInflatingData:deflated];
+ STAssertNotNil(dataPrime, @"failed to inflate data block");
+ STAssertTrue([dataPrime length] > 0, @"failed to inflate data block");
+ STAssertEqualObjects(data, dataPrime, @"failed to round trip via *Data apis");
+
+ // loop over the compression levels
+ for (int level = 1 ; level < 9 ; ++level) {
+ // w/ *Bytes apis, using our level
+ deflated = [NSData gtm_dataByDeflatingBytes:[data bytes]
+ length:[data length]
+ compressionLevel:level];
+ STAssertNotNil(deflated, @"failed to deflate data block");
+ STAssertTrue([deflated length] > 0, @"failed to deflate data block");
+ STAssertFalse(HasGzipHeader(deflated), @"has gzip header on zlib data");
+ dataPrime = [NSData gtm_dataByInflatingBytes:[deflated bytes] length:[deflated length]];
+ STAssertNotNil(dataPrime, @"failed to inflate data block");
+ STAssertTrue([dataPrime length] > 0, @"failed to inflate data block");
+ STAssertEqualObjects(data, dataPrime, @"failed to round trip via *Bytes apis");
+
+ // w/ *Data apis, using our level
+ deflated = [NSData gtm_dataByDeflatingData:data compressionLevel:level];
+ STAssertNotNil(deflated, @"failed to deflate data block");
+ STAssertTrue([deflated length] > 0, @"failed to deflate data block");
+ STAssertFalse(HasGzipHeader(deflated), @"has gzip header on zlib data");
+ dataPrime = [NSData gtm_dataByInflatingData:deflated];
+ STAssertNotNil(dataPrime, @"failed to inflate data block");
+ STAssertTrue([dataPrime length] > 0, @"failed to inflate data block");
+ STAssertEqualObjects(data, dataPrime, @"failed to round trip via *Data apis");
+ }
+
+ [localPool release];
+ }
+ }
+}
+
+- (void)testInflateGzip {
+ // generate a range of sizes w/ random content
+ for (int n = 0 ; n < 2 ; ++n) {
+ for (int x = 1 ; x < 128 ; ++x) {
+ NSAutoreleasePool *localPool = [[NSAutoreleasePool alloc] init];
+ STAssertNotNil(localPool, @"failed to alloc local pool");
+
+ NSMutableData *data = [NSMutableData data];
+ STAssertNotNil(data, @"failed to alloc data block");
+
+ // first pass small blocks, second pass, larger ones, but second pass
+ // avoid making them multimples of 128.
+ [data setLength:((n*x*128) + x)];
+ FillWithRandom([data mutableBytes], [data length]);
+
+ // w/ *Bytes apis, default level
+ NSData *gzipped = [NSData gtm_dataByGzippingBytes:[data bytes] length:[data length]];
+ STAssertNotNil(gzipped, @"failed to gzip data block");
+ STAssertTrue([gzipped length] > 0, @"failed to gzip data block");
+ STAssertTrue(HasGzipHeader(gzipped), @"doesn't have gzip header on gzipped data");
+ NSData *dataPrime = [NSData gtm_dataByInflatingBytes:[gzipped bytes] length:[gzipped length]];
+ STAssertNotNil(dataPrime, @"failed to inflate data block");
+ STAssertTrue([dataPrime length] > 0, @"failed to inflate data block");
+ STAssertEqualObjects(data, dataPrime, @"failed to round trip via *Bytes apis");
+
+ // w/ *Data apis, default level
+ gzipped = [NSData gtm_dataByGzippingData:data];
+ STAssertNotNil(gzipped, @"failed to gzip data block");
+ STAssertTrue([gzipped length] > 0, @"failed to gzip data block");
+ STAssertTrue(HasGzipHeader(gzipped), @"doesn't have gzip header on gzipped data");
+ dataPrime = [NSData gtm_dataByInflatingData:gzipped];
+ STAssertNotNil(dataPrime, @"failed to inflate data block");
+ STAssertTrue([dataPrime length] > 0, @"failed to inflate data block");
+ STAssertEqualObjects(data, dataPrime, @"failed to round trip via *Data apis");
+
+ // loop over the compression levels
+ for (int level = 1 ; level < 9 ; ++level) {
+ // w/ *Bytes apis, using our level
+ gzipped = [NSData gtm_dataByGzippingBytes:[data bytes]
+ length:[data length]
+ compressionLevel:level];
+ STAssertNotNil(gzipped, @"failed to gzip data block");
+ STAssertTrue([gzipped length] > 0, @"failed to gzip data block");
+ STAssertTrue(HasGzipHeader(gzipped), @"doesn't have gzip header on gzipped data");
+ dataPrime = [NSData gtm_dataByInflatingBytes:[gzipped bytes] length:[gzipped length]];
+ STAssertNotNil(dataPrime, @"failed to inflate data block");
+ STAssertTrue([dataPrime length] > 0, @"failed to inflate data block");
+ STAssertEqualObjects(data, dataPrime, @"failed to round trip via *Bytes apis");
+
+ // w/ *Data apis, using our level
+ gzipped = [NSData gtm_dataByGzippingData:data compressionLevel:level];
+ STAssertNotNil(gzipped, @"failed to gzip data block");
+ STAssertTrue([gzipped length] > 0, @"failed to gzip data block");
+ STAssertTrue(HasGzipHeader(gzipped), @"doesn't have gzip header on gzipped data");
+ dataPrime = [NSData gtm_dataByInflatingData:gzipped];
+ STAssertNotNil(dataPrime, @"failed to inflate data block");
+ STAssertTrue([dataPrime length] > 0, @"failed to inflate data block");
+ STAssertEqualObjects(data, dataPrime, @"failed to round trip via *Data apis");
+ }
+
+ [localPool release];
+ }
+ }
+}
+
+@end