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