|  |  |  | // | 
					
						
							|  |  |  | //  Copyright (c) 2018 Open Whisper Systems. All rights reserved. | 
					
						
							|  |  |  | // | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import XCTest | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class ParamParserTest: SignalBaseTest { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     override func setUp() { | 
					
						
							|  |  |  |         super.setUp() | 
					
						
							|  |  |  |         // Put setup code here. This method is called before the invocation of each test method in the class. | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     override func tearDown() { | 
					
						
							|  |  |  |         // Put teardown code here. This method is called after the invocation of each test method in the class. | 
					
						
							|  |  |  |         super.tearDown() | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     let dict: [String: Any] = ["some_int": 11, "some_string": "asdf", "large_int": Int64.max, "negative_int": -10] | 
					
						
							|  |  |  |     var parser: ParamParser { | 
					
						
							|  |  |  |         return ParamParser(dictionary: dict) | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     func testExample() { | 
					
						
							|  |  |  |         XCTAssertEqual(11, try parser.required(key: "some_int")) | 
					
						
							|  |  |  |         XCTAssertEqual(11, try parser.optional(key: "some_int")) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         let expectedString: String = "asdf" | 
					
						
							|  |  |  |         XCTAssertEqual(expectedString, try parser.required(key: "some_string")) | 
					
						
							|  |  |  |         XCTAssertEqual(expectedString, try parser.optional(key: "some_string")) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         XCTAssertEqual(nil, try parser.optional(key: "does_not_exist") as String?) | 
					
						
							|  |  |  |         XCTAssertThrowsError(try parser.required(key: "does_not_exist") as String) | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     func testNumeric() { | 
					
						
							|  |  |  |         let expectedInt32: Int32 = 11 | 
					
						
							|  |  |  |         XCTAssertEqual(expectedInt32, try parser.required(key: "some_int")) | 
					
						
							|  |  |  |         XCTAssertEqual(expectedInt32, try parser.optional(key: "some_int")) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         let expectedInt64: Int64 = 11 | 
					
						
							|  |  |  |         XCTAssertEqual(expectedInt64, try parser.required(key: "some_int")) | 
					
						
							|  |  |  |         XCTAssertEqual(expectedInt64, try parser.optional(key: "some_int")) | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     func testNumericSizeFailures() { | 
					
						
							|  |  |  |         XCTAssertThrowsError(try { | 
					
						
							|  |  |  |             let _: Int32 = try parser.required(key: "large_int") | 
					
						
							|  |  |  |         }()) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         XCTAssertThrowsError(try { | 
					
						
							|  |  |  |             let _: Int32? = try parser.optional(key: "large_int") | 
					
						
							|  |  |  |         }()) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         XCTAssertNoThrow(try { | 
					
						
							|  |  |  |             let _: Int64 = try parser.required(key: "large_int") | 
					
						
							|  |  |  |         }()) | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     func testNumericSignFailures() { | 
					
						
							|  |  |  |         XCTAssertNoThrow(try { | 
					
						
							|  |  |  |             let _: Int = try parser.required(key: "negative_int") | 
					
						
							|  |  |  |         }()) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         XCTAssertNoThrow(try { | 
					
						
							|  |  |  |             let _: Int64 = try parser.required(key: "negative_int") | 
					
						
							|  |  |  |         }()) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         XCTAssertThrowsError(try { | 
					
						
							|  |  |  |             let _: UInt64 = try parser.required(key: "negative_int") | 
					
						
							|  |  |  |         }()) | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     // MARK: Base64EncodedData | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     func testBase64Data_Valid() { | 
					
						
							|  |  |  |         let originalString = "asdf" | 
					
						
							|  |  |  |         let utf8Data: Data = originalString.data(using: .utf8)! | 
					
						
							|  |  |  |         let base64EncodedString = utf8Data.base64EncodedString() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         let dict: [String: Any] = ["some_data": base64EncodedString] | 
					
						
							|  |  |  |         let parser = ParamParser(dictionary: dict) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         XCTAssertEqual(utf8Data, try parser.requiredBase64EncodedData(key: "some_data")) | 
					
						
							|  |  |  |         XCTAssertEqual(utf8Data, try parser.optionalBase64EncodedData(key: "some_data")) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         let data: Data = try! parser.requiredBase64EncodedData(key: "some_data") | 
					
						
							|  |  |  |         let roundTripString = String(data: data, encoding: .utf8) | 
					
						
							|  |  |  |         XCTAssertEqual(originalString, roundTripString) | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     func testBase64Data_EmptyString() { | 
					
						
							|  |  |  |         let dict: [String: Any] = ["some_data": ""] | 
					
						
							|  |  |  |         let parser = ParamParser(dictionary: dict) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         XCTAssertThrowsError(try parser.requiredBase64EncodedData(key: "some_data")) | 
					
						
							|  |  |  |         XCTAssertEqual(nil, try parser.optionalBase64EncodedData(key: "some_data")) | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     func testBase64Data_NSNull() { | 
					
						
							|  |  |  |         let dict: [String: Any] = ["some_data": NSNull()] | 
					
						
							|  |  |  |         let parser = ParamParser(dictionary: dict) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         XCTAssertThrowsError(try parser.requiredBase64EncodedData(key: "some_data")) | 
					
						
							|  |  |  |         XCTAssertEqual(nil, try parser.optionalBase64EncodedData(key: "some_data")) | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     func testBase64Data_Invalid() { | 
					
						
							|  |  |  |         // invalid base64 data | 
					
						
							|  |  |  |         let base64EncodedString = "YXNkZg" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         let dict: [String: Any] = ["some_data": base64EncodedString] | 
					
						
							|  |  |  |         let parser = ParamParser(dictionary: dict) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         XCTAssertThrowsError(try parser.requiredBase64EncodedData(key: "some_data")) | 
					
						
							|  |  |  |         XCTAssertThrowsError(try parser.optionalBase64EncodedData(key: "some_data")) | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | } |