1// Copyright (c) 2020 650 Industries, Inc. All rights reserved. 2 3#import <XCTest/XCTest.h> 4 5#import <EXUpdates/EXUpdatesMultipartStreamReader.h> 6 7/** 8 * Fork of {@link EXUpdatesMultipartStreamReaderTests}. 9 */ 10@interface EXUpdatesMultipartStreamReaderTests : XCTestCase 11 12@end 13 14@implementation EXUpdatesMultipartStreamReaderTests 15 16- (void)testSimpleCase 17{ 18 NSString *response = 19 @"preamble, should be ignored\r\n" 20 @"--sample_boundary\r\n" 21 @"Content-Type: application/json; charset=utf-8\r\n" 22 @"Content-Length: 2\r\n\r\n" 23 @"{}\r\n" 24 @"--sample_boundary--\r\n" 25 @"epilogue, should be ignored"; 26 27 NSInputStream *inputStream = [NSInputStream inputStreamWithData:[response dataUsingEncoding:NSUTF8StringEncoding]]; 28 EXUpdatesMultipartStreamReader *reader = [[EXUpdatesMultipartStreamReader alloc] initWithInputStream:inputStream 29 boundary:@"sample_boundary"]; 30 __block NSInteger count = 0; 31 BOOL success = [reader readAllPartsWithCompletionCallback:^(NSDictionary *headers, NSData *content, BOOL done) { 32 XCTAssertTrue(done); 33 XCTAssertEqualObjects(headers[@"Content-Type"], @"application/json; charset=utf-8"); 34 XCTAssertEqualObjects([[NSString alloc] initWithData:content encoding:NSUTF8StringEncoding], @"{}"); 35 count++; 36 }]; 37 XCTAssertTrue(success); 38 XCTAssertEqual(count, 1); 39} 40 41- (void)testMultipleParts 42{ 43 NSString *response = 44 @"preamble, should be ignored\r\n" 45 @"--sample_boundary\r\n" 46 @"1\r\n" 47 @"--sample_boundary\r\n" 48 @"2\r\n" 49 @"--sample_boundary\r\n" 50 @"3\r\n" 51 @"--sample_boundary--\r\n" 52 @"epilogue, should be ignored"; 53 54 NSInputStream *inputStream = [NSInputStream inputStreamWithData:[response dataUsingEncoding:NSUTF8StringEncoding]]; 55 EXUpdatesMultipartStreamReader *reader = [[EXUpdatesMultipartStreamReader alloc] initWithInputStream:inputStream 56 boundary:@"sample_boundary"]; 57 __block NSInteger count = 0; 58 BOOL success = [reader readAllPartsWithCompletionCallback:^(__unused NSDictionary *headers, NSData *content, BOOL done) { 59 count++; 60 XCTAssertEqual(done, count == 3); 61 NSString *expectedBody = [NSString stringWithFormat:@"%ld", (long)count]; 62 NSString *actualBody = [[NSString alloc] initWithData:content encoding:NSUTF8StringEncoding]; 63 XCTAssertEqualObjects(actualBody, expectedBody); 64 }]; 65 XCTAssertTrue(success); 66 XCTAssertEqual(count, 3); 67} 68 69- (void)testMultiplePartsNoPreamble 70{ 71 NSString *response = 72 @"--sample_boundary\r\n" 73 @"1\r\n" 74 @"--sample_boundary\r\n" 75 @"2\r\n" 76 @"--sample_boundary\r\n" 77 @"3\r\n" 78 @"--sample_boundary--\r\n" 79 @"epilogue, should be ignored"; 80 81 NSInputStream *inputStream = [NSInputStream inputStreamWithData:[response dataUsingEncoding:NSUTF8StringEncoding]]; 82 EXUpdatesMultipartStreamReader *reader = [[EXUpdatesMultipartStreamReader alloc] initWithInputStream:inputStream 83 boundary:@"sample_boundary"]; 84 __block NSInteger count = 0; 85 BOOL success = [reader readAllPartsWithCompletionCallback:^(__unused NSDictionary *headers, NSData *content, BOOL done) { 86 count++; 87 XCTAssertEqual(done, count == 3); 88 NSString *expectedBody = [NSString stringWithFormat:@"%ld", (long)count]; 89 NSString *actualBody = [[NSString alloc] initWithData:content encoding:NSUTF8StringEncoding]; 90 XCTAssertEqualObjects(actualBody, expectedBody); 91 }]; 92 XCTAssertTrue(success); 93 XCTAssertEqual(count, 3); 94} 95 96- (void)testNoDelimiter 97{ 98 NSString *response = @"Yolo"; 99 100 NSInputStream *inputStream = [NSInputStream inputStreamWithData:[response dataUsingEncoding:NSUTF8StringEncoding]]; 101 EXUpdatesMultipartStreamReader *reader = [[EXUpdatesMultipartStreamReader alloc] initWithInputStream:inputStream 102 boundary:@"sample_boundary"]; 103 __block NSInteger count = 0; 104 BOOL success = [reader readAllPartsWithCompletionCallback:^( 105 __unused NSDictionary *headers, __unused NSData *content, __unused BOOL done) { 106 count++; 107 }]; 108 XCTAssertFalse(success); 109 XCTAssertEqual(count, 0); 110} 111 112- (void)testNoCloseDelimiter 113{ 114 NSString *response = 115 @"preamble, should be ignored\r\n" 116 @"--sample_boundary\r\n" 117 @"Content-Type: application/json; charset=utf-8\r\n" 118 @"Content-Length: 2\r\n\r\n" 119 @"{}\r\n" 120 @"--sample_boundary\r\n" 121 @"incomplete message..."; 122 123 NSInputStream *inputStream = [NSInputStream inputStreamWithData:[response dataUsingEncoding:NSUTF8StringEncoding]]; 124 EXUpdatesMultipartStreamReader *reader = [[EXUpdatesMultipartStreamReader alloc] initWithInputStream:inputStream 125 boundary:@"sample_boundary"]; 126 __block NSInteger count = 0; 127 BOOL success = [reader readAllPartsWithCompletionCallback:^( 128 __unused NSDictionary *headers, __unused NSData *content, __unused BOOL done) { 129 count++; 130 }]; 131 XCTAssertFalse(success); 132 XCTAssertEqual(count, 1); 133} 134 135@end 136