From c32a9efbca8a257ee69ee11e2c7c0cfedf4aec9f Mon Sep 17 00:00:00 2001 From: Fabian Fett Date: Wed, 5 Feb 2025 14:17:20 +0100 Subject: [PATCH 1/3] Add more base64 decoding test --- .../FoundationEssentialsTests/DataTests.swift | 58 +++++++++++++++++++ 1 file changed, 58 insertions(+) diff --git a/Tests/FoundationEssentialsTests/DataTests.swift b/Tests/FoundationEssentialsTests/DataTests.swift index ad5750a06..2557fc788 100644 --- a/Tests/FoundationEssentialsTests/DataTests.swift +++ b/Tests/FoundationEssentialsTests/DataTests.swift @@ -1902,6 +1902,64 @@ extension DataTests { ) } + func test_base64Decode_emptyString() { + XCTAssertEqual(Data(), Data(base64Encoded: "")) + } + + func test_base64Decode_emptyData() { + XCTAssertEqual(Data(), Data(base64Encoded: Data())) + } + + func test_base64Decode_arrayOfNulls() { + XCTAssertEqual(Data(repeating: 0, count: 10), Data(base64Encoded: "AAAAAAAAAAAAAA==")) + } + + func test_base64Decode_AllTheBytesSequentially() { + let base64 = "AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltcXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fn+AgYKDhIWGh4iJiouMjY6PkJGSk5SVlpeYmZqbnJ2en6ChoqOkpaanqKmqq6ytrq+wsbKztLW2t7i5uru8vb6/wMHCw8TFxsfIycrLzM3Oz9DR0tPU1dbX2Nna29zd3t/g4eLj5OXm5+jp6uvs7e7v8PHy8/T19vf4+fr7/P3+/w==" + + XCTAssertEqual(Data(UInt8(0) ... UInt8(255)), Data(base64Encoded: base64)) + } + + func test_base64Decode_ignoringLineBreaks() { + let base64 = """ + TG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQsIGNvbnNlY3RldHVyIGFkaXBpc2Np\r\n\ + bmcgZWxpdC4gVXQgYXQgdGluY2lkdW50IGFyY3UuIFN1c3BlbmRpc3NlIG5lYyBz\r\n\ + b2RhbGVzIGVyYXQsIHNpdCBhbWV0IGltcGVyZGlldCBpcHN1bS4gRXRpYW0gc2Vk\r\n\ + IG9ybmFyZSBmZWxpcy4= + """ + let expected = """ + Lorem ipsum dolor sit amet, consectetur adipiscing elit. Ut at tincidunt arcu. Suspendisse nec sodales erat, sit amet imperdiet ipsum. Etiam sed ornare felis. + """ + + XCTAssertEqual(Data(expected.utf8), Data(base64Encoded: base64, options: .ignoreUnknownCharacters)) + } + + func test_base64Decode_invalidLength() { + XCTAssertThrowsError(_ = try Base64.decode(bytes: "AAAAA".utf8)) { error in + XCTAssertEqual(error as? Base64.DecodingError, .invalidLength) + } + } + + func test_base64Decode_variousPaddingNeeds() { + XCTAssertEqual(Data([1, 2, 3, 4]), Data(base64Encoded: "AQIDBA==")) + XCTAssertEqual(Data([1, 2, 3, 4, 5]), Data(base64Encoded: "AQIDBAU=")) + XCTAssertEqual(Data([1, 2, 3, 4, 5, 6]), Data(base64Encoded: "AQIDBAUG")) + } + + func test_base64Decode_test1MBDataGoing0to255OverAndOver() { + let oneMBTestData = createTestData(count: 1000 * 1024) + func createTestData(count: Int) -> Data { + var data = Data(count: count) + for index in data.indices { + data[index] = UInt8(index % Int(UInt8.max)) + } + return data + } + + let base64DataString = oneMBTestData.base64EncodedString(options: .lineLength64Characters) + XCTAssertEqual(oneMBTestData, Data(base64Encoded: base64DataString, options: .ignoreUnknownCharacters)) + } + func test_base64Data_small() { let data = Data("Hello World".utf8) let base64 = data.base64EncodedString() From 6b8ed2168817f482fb3d665bd1a959246760ff9e Mon Sep 17 00:00:00 2001 From: Fabian Fett Date: Wed, 5 Feb 2025 20:56:08 +0100 Subject: [PATCH 2/3] Fix test --- Tests/FoundationEssentialsTests/DataTests.swift | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/Tests/FoundationEssentialsTests/DataTests.swift b/Tests/FoundationEssentialsTests/DataTests.swift index 2557fc788..3f44dcf81 100644 --- a/Tests/FoundationEssentialsTests/DataTests.swift +++ b/Tests/FoundationEssentialsTests/DataTests.swift @@ -1935,9 +1935,8 @@ extension DataTests { } func test_base64Decode_invalidLength() { - XCTAssertThrowsError(_ = try Base64.decode(bytes: "AAAAA".utf8)) { error in - XCTAssertEqual(error as? Base64.DecodingError, .invalidLength) - } + XCTAssertNil(Data(base64Encoded: "AAAAA")) + XCTAssertNil(Data(base64Encoded: "AAAAA", options: .ignoreUnknownCharacters)) } func test_base64Decode_variousPaddingNeeds() { From 2f229270fa9faacf6ec408d1e31cf7edf4c6e15e Mon Sep 17 00:00:00 2001 From: Fabian Fett Date: Thu, 6 Feb 2025 10:41:51 +0100 Subject: [PATCH 3/3] Test ignore whitespace in different positions --- .../FoundationEssentialsTests/DataTests.swift | 32 +++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/Tests/FoundationEssentialsTests/DataTests.swift b/Tests/FoundationEssentialsTests/DataTests.swift index 3f44dcf81..3a1296cd5 100644 --- a/Tests/FoundationEssentialsTests/DataTests.swift +++ b/Tests/FoundationEssentialsTests/DataTests.swift @@ -1945,6 +1945,38 @@ extension DataTests { XCTAssertEqual(Data([1, 2, 3, 4, 5, 6]), Data(base64Encoded: "AQIDBAUG")) } + func test_base64Decode_ignoreWhitespaceAtVariousPlaces() { + XCTAssertEqual(Data([1, 2, 3, 4]), Data(base64Encoded: " AQIDBA==", options: .ignoreUnknownCharacters)) + XCTAssertEqual(Data([1, 2, 3, 4]), Data(base64Encoded: "A QIDBA==", options: .ignoreUnknownCharacters)) + XCTAssertEqual(Data([1, 2, 3, 4]), Data(base64Encoded: "AQ IDBA==", options: .ignoreUnknownCharacters)) + XCTAssertEqual(Data([1, 2, 3, 4]), Data(base64Encoded: "AQI DBA==", options: .ignoreUnknownCharacters)) + XCTAssertEqual(Data([1, 2, 3, 4]), Data(base64Encoded: "AQID BA==", options: .ignoreUnknownCharacters)) + XCTAssertEqual(Data([1, 2, 3, 4]), Data(base64Encoded: "AQIDB A==", options: .ignoreUnknownCharacters)) + XCTAssertEqual(Data([1, 2, 3, 4]), Data(base64Encoded: "AQIDBA ==", options: .ignoreUnknownCharacters)) + XCTAssertEqual(Data([1, 2, 3, 4]), Data(base64Encoded: "AQIDBA= =", options: .ignoreUnknownCharacters)) + XCTAssertEqual(Data([1, 2, 3, 4]), Data(base64Encoded: "AQIDBA== ", options: .ignoreUnknownCharacters)) + + XCTAssertEqual(Data([1, 2, 3, 4, 5]), Data(base64Encoded: " AQIDBAU=", options: .ignoreUnknownCharacters)) + XCTAssertEqual(Data([1, 2, 3, 4, 5]), Data(base64Encoded: "A QIDBAU=", options: .ignoreUnknownCharacters)) + XCTAssertEqual(Data([1, 2, 3, 4, 5]), Data(base64Encoded: "AQ IDBAU=", options: .ignoreUnknownCharacters)) + XCTAssertEqual(Data([1, 2, 3, 4, 5]), Data(base64Encoded: "AQI DBAU=", options: .ignoreUnknownCharacters)) + XCTAssertEqual(Data([1, 2, 3, 4, 5]), Data(base64Encoded: "AQID BAU=", options: .ignoreUnknownCharacters)) + XCTAssertEqual(Data([1, 2, 3, 4, 5]), Data(base64Encoded: "AQIDB AU=", options: .ignoreUnknownCharacters)) + XCTAssertEqual(Data([1, 2, 3, 4, 5]), Data(base64Encoded: "AQIDBA U=", options: .ignoreUnknownCharacters)) + XCTAssertEqual(Data([1, 2, 3, 4, 5]), Data(base64Encoded: "AQIDBAU =", options: .ignoreUnknownCharacters)) + XCTAssertEqual(Data([1, 2, 3, 4, 5]), Data(base64Encoded: "AQIDBAU= ", options: .ignoreUnknownCharacters)) + + XCTAssertEqual(Data([1, 2, 3, 4, 5, 6]), Data(base64Encoded: " AQIDBAUG", options: .ignoreUnknownCharacters)) + XCTAssertEqual(Data([1, 2, 3, 4, 5, 6]), Data(base64Encoded: "A QIDBAUG", options: .ignoreUnknownCharacters)) + XCTAssertEqual(Data([1, 2, 3, 4, 5, 6]), Data(base64Encoded: "AQ IDBAUG", options: .ignoreUnknownCharacters)) + XCTAssertEqual(Data([1, 2, 3, 4, 5, 6]), Data(base64Encoded: "AQI DBAUG", options: .ignoreUnknownCharacters)) + XCTAssertEqual(Data([1, 2, 3, 4, 5, 6]), Data(base64Encoded: "AQID BAUG", options: .ignoreUnknownCharacters)) + XCTAssertEqual(Data([1, 2, 3, 4, 5, 6]), Data(base64Encoded: "AQIDB AUG", options: .ignoreUnknownCharacters)) + XCTAssertEqual(Data([1, 2, 3, 4, 5, 6]), Data(base64Encoded: "AQIDBA UG", options: .ignoreUnknownCharacters)) + XCTAssertEqual(Data([1, 2, 3, 4, 5, 6]), Data(base64Encoded: "AQIDBAU G", options: .ignoreUnknownCharacters)) + XCTAssertEqual(Data([1, 2, 3, 4, 5, 6]), Data(base64Encoded: "AQIDBAUG ", options: .ignoreUnknownCharacters)) + } + func test_base64Decode_test1MBDataGoing0to255OverAndOver() { let oneMBTestData = createTestData(count: 1000 * 1024) func createTestData(count: Int) -> Data {