| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270 |
- // Copyright 2022 Google LLC
- //
- // 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 Foundation
- import FirebaseCore
- @testable import FirebaseFunctions
- #if COCOAPODS
- import GTMSessionFetcher
- #else
- import GTMSessionFetcherCore
- #endif
- import XCTest
- class SerializerTests: XCTestCase {
- func testEncodeNull() throws {
- let serializer = FUNSerializer()
- let null = NSNull()
- XCTAssertEqual(try serializer.encode(null) as? NSNull, null)
- }
- func testDecodeNull() throws {
- let serializer = FUNSerializer()
- let null = NSNull()
- XCTAssertEqual(try serializer.decode(null) as? NSNull, null)
- }
- func testEncodeInt32() throws {
- let serializer = FUNSerializer()
- let one = NSNumber(value: 1 as Int32)
- XCTAssertEqual(one, try serializer.encode(one) as? NSNumber)
- }
- func testEncodeInt() throws {
- let serializer = FUNSerializer()
- let one = NSNumber(1)
- let dict = try XCTUnwrap(serializer.encode(one) as? NSDictionary)
- XCTAssertEqual("type.googleapis.com/google.protobuf.Int64Value", dict["@type"] as? String)
- XCTAssertEqual("1", dict["value"] as? String)
- }
- func testDecodeInt32() throws {
- let serializer = FUNSerializer()
- let one = NSNumber(value: 1 as Int32)
- XCTAssertEqual(one, try serializer.decode(one) as? NSNumber)
- }
- func testDecodeInt() throws {
- let serializer = FUNSerializer()
- let one = NSNumber(1)
- XCTAssertEqual(one, try serializer.decode(one) as? NSNumber)
- }
- func testDecodeIntFromDictionary() throws {
- let serializer = FUNSerializer()
- let dictOne = ["@type": "type.googleapis.com/google.protobuf.Int64Value",
- "value": "1"]
- XCTAssertEqual(NSNumber(1), try serializer.decode(dictOne) as? NSNumber)
- }
- func testEncodeLong() throws {
- let serializer = FUNSerializer()
- let lowLong = NSNumber(-9_223_372_036_854_775_800)
- let dict = try XCTUnwrap(serializer.encode(lowLong) as? NSDictionary)
- XCTAssertEqual("type.googleapis.com/google.protobuf.Int64Value", dict["@type"] as? String)
- XCTAssertEqual("-9223372036854775800", dict["value"] as? String)
- }
- func testDecodeLong() throws {
- let serializer = FUNSerializer()
- let lowLong = NSNumber(-9_223_372_036_854_775_800)
- XCTAssertEqual(lowLong, try serializer.decode(lowLong) as? NSNumber)
- }
- func testDecodeLongFromDictionary() throws {
- let serializer = FUNSerializer()
- let dictLowLong = ["@type": "type.googleapis.com/google.protobuf.Int64Value",
- "value": "-9223372036854775800"]
- let decoded = try serializer.decode(dictLowLong) as? NSNumber
- XCTAssertEqual(NSNumber(-9_223_372_036_854_775_800), decoded)
- // A naive implementation might convert a number to a double and think that's close enough.
- // We need to make sure it's a long long for accuracy.
- XCTAssertEqual(decoded?.objCType[0], CChar("q".utf8.first!))
- }
- func testDecodeInvalidLong() throws {
- let serializer = FUNSerializer()
- let typeString = "type.googleapis.com/google.protobuf.Int64Value"
- let badVal = "-9223372036854775800 and some other junk"
- let dictLowLong = ["@type": typeString, "value": badVal]
- do {
- _ = try serializer.decode(dictLowLong) as? NSNumber
- } catch let SerializerError.invalidValueForType(value, type) {
- XCTAssertEqual(value, badVal)
- XCTAssertEqual(type, typeString)
- return
- }
- XCTFail()
- }
- func testEncodeUnsignedLong() throws {
- let serializer = FUNSerializer()
- let typeString = "type.googleapis.com/google.protobuf.UInt64Value"
- let highULong = NSNumber(value: 18_446_744_073_709_551_607 as UInt64)
- let expected = ["@type": typeString, "value": "18446744073709551607"]
- let encoded = try serializer.encode(highULong) as? [String: String]
- XCTAssertEqual(encoded, expected)
- }
- func testDecodeUnsignedLong() throws {
- let serializer = FUNSerializer()
- let highULong = NSNumber(value: 18_446_744_073_709_551_607 as UInt64)
- XCTAssertEqual(highULong, try serializer.decode(highULong) as? NSNumber)
- }
- func testDecodeUnsignedLongFromDictionary() throws {
- let serializer = FUNSerializer()
- let typeString = "type.googleapis.com/google.protobuf.UInt64Value"
- let highULong = NSNumber(value: 18_446_744_073_709_551_607 as UInt64)
- let coded = ["@type": typeString, "value": "18446744073709551607"]
- let decoded = try serializer.decode(coded) as? NSNumber
- XCTAssertEqual(highULong, decoded)
- // A naive implementation might convert a number to a double and think that's close enough.
- // We need to make sure it's an unsigned long long for accuracy.
- XCTAssertEqual(decoded?.objCType[0], CChar("Q".utf8.first!))
- }
- func testDecodeUnsignedLongFromDictionaryOverflow() throws {
- let serializer = FUNSerializer()
- let typeString = "type.googleapis.com/google.protobuf.UInt64Value"
- let tooHighVal = "18446744073709551616"
- let coded = ["@type": typeString, "value": tooHighVal]
- do {
- _ = try serializer.decode(coded) as? NSNumber
- } catch let SerializerError.invalidValueForType(value, type) {
- XCTAssertEqual(value, tooHighVal)
- XCTAssertEqual(type, typeString)
- return
- }
- XCTFail()
- }
- func testEncodeDouble() throws {
- let serializer = FUNSerializer()
- let myDouble = NSNumber(value: 1.2 as Double)
- XCTAssertEqual(myDouble, try serializer.encode(myDouble) as? NSNumber)
- }
- func testDecodeDouble() throws {
- let serializer = FUNSerializer()
- let myDouble = NSNumber(value: 1.2 as Double)
- XCTAssertEqual(myDouble, try serializer.decode(myDouble) as? NSNumber)
- }
- func testEncodeBool() throws {
- let serializer = FUNSerializer()
- XCTAssertEqual(true, try serializer.encode(true) as? NSNumber)
- }
- func testDecodeBool() throws {
- let serializer = FUNSerializer()
- XCTAssertEqual(true, try serializer.decode(true) as? NSNumber)
- }
- func testEncodeString() throws {
- let serializer = FUNSerializer()
- XCTAssertEqual("hello", try serializer.encode("hello") as? String)
- }
- func testDecodeString() throws {
- let serializer = FUNSerializer()
- XCTAssertEqual("good-bye", try serializer.decode("good-bye") as? String)
- }
- // TODO: Should we add support for Array as well as NSArray?
- func testEncodeSimpleArray() throws {
- let serializer = FUNSerializer()
- let input = [1 as Int32, 2 as Int32] as NSArray
- XCTAssertEqual(input, try serializer.encode(input) as? NSArray)
- }
- func testEncodeArray() throws {
- let serializer = FUNSerializer()
- let input = [
- 1 as Int32,
- "two",
- [3 as Int32, ["@type": "type.googleapis.com/google.protobuf.Int64Value",
- "value": "9876543210"]] as [Any],
- ] as NSArray
- XCTAssertEqual(input, try serializer.encode(input) as? NSArray)
- }
- func testDecodeArray() throws {
- let serializer = FUNSerializer()
- let input = [
- 1 as Int64,
- "two",
- [3 as Int32, ["@type": "type.googleapis.com/google.protobuf.Int64Value",
- "value": "9876543210"]] as [Any],
- ] as NSArray
- let expected = [1 as Int64, "two", [3 as Int32, 9_876_543_210 as Int64] as [Any]] as NSArray
- XCTAssertEqual(expected, try serializer.decode(input) as? NSArray)
- }
- func testEncodeMap() {
- let input = [
- "foo": 1 as Int32,
- "bar": "hello",
- "baz": [3 as Int32, 9_876_543_210 as Int64] as [Any],
- ] as NSDictionary
- let expected = [
- "foo": 1,
- "bar": "hello",
- "baz": [3, ["@type": "type.googleapis.com/google.protobuf.Int64Value",
- "value": "9876543210"]] as [Any],
- ] as NSDictionary
- let serializer = FUNSerializer()
- XCTAssertEqual(expected, try serializer.encode(input) as? NSDictionary)
- }
- func testDecodeMap() {
- let input = ["foo": 1, "bar": "hello", "baz": [3, 9_876_543_210]] as NSDictionary
- let expected = ["foo": 1, "bar": "hello", "baz": [3, 9_876_543_210]] as NSDictionary
- let serializer = FUNSerializer()
- XCTAssertEqual(expected, try serializer.decode(input) as? NSDictionary)
- }
- func testEncodeUnknownType() {
- let input = ["@type": "unknown", "value": "whatever"] as NSDictionary
- let serializer = FUNSerializer()
- XCTAssertEqual(input, try serializer.encode(input) as? NSDictionary)
- }
- func testDecodeUnknownType() {
- let input = ["@type": "unknown", "value": "whatever"] as NSDictionary
- let serializer = FUNSerializer()
- XCTAssertEqual(input, try serializer.decode(input) as? NSDictionary)
- }
- func testDecodeUnknownTypeWithoutValue() {
- let input = ["@type": "unknown"] as NSDictionary
- let serializer = FUNSerializer()
- XCTAssertEqual(input, try serializer.decode(input) as? NSDictionary)
- }
- // - (void)testDecodeUnknownTypeWithoutValue {
- // NSDictionary *input = @{
- // @"@type" : @"unknown",
- // };
- // FUNSerializer *serializer = [[FUNSerializer alloc] init];
- // NSError *error = nil;
- // XCTAssertEqualObjects(input, [serializer decode:input error:&error]);
- // XCTAssertNil(error);
- // }
- //
- // @end
- }
|