From 9df2a8895b7a3e8d04620946f3783c3aa4f41b90 Mon Sep 17 00:00:00 2001 From: Fabian Boemer Date: Tue, 29 Oct 2024 09:32:19 -0700 Subject: [PATCH] More readable logs for PIRProcessDatabase duplicate keywords (#125) --- .../PrivateInformationRetrieval/Error.swift | 4 +-- .../PrivateInformationRetrieval/Util.swift | 25 ++++++++++++++++++ .../UtilTests.swift | 26 +++++++++++++++++++ 3 files changed, 53 insertions(+), 2 deletions(-) create mode 100644 Sources/PrivateInformationRetrieval/Util.swift create mode 100644 Tests/PrivateInformationRetrievalTests/UtilTests.swift diff --git a/Sources/PrivateInformationRetrieval/Error.swift b/Sources/PrivateInformationRetrieval/Error.swift index 1c297b71..abd7647b 100644 --- a/Sources/PrivateInformationRetrieval/Error.swift +++ b/Sources/PrivateInformationRetrieval/Error.swift @@ -75,8 +75,8 @@ extension PirError: LocalizedError { """ case let .invalidDatabaseDuplicateKeyword(keyword, oldValue, newValue): """ - Invalid database: Duplicate values \(oldValue), \(newValue) \ - for keyword \(keyword) + Invalid database: Duplicate values '\(oldValue.utf8OrBase64())', '\(newValue.utf8OrBase64())' \ + for keyword '\(keyword.utf8OrBase64())' """ case let .invalidDatabasePlaintextCount(plaintextCount, expected): "Invalid database: Database has \(plaintextCount) plaintexts, expected \(expected)" diff --git a/Sources/PrivateInformationRetrieval/Util.swift b/Sources/PrivateInformationRetrieval/Util.swift new file mode 100644 index 00000000..d8eb7939 --- /dev/null +++ b/Sources/PrivateInformationRetrieval/Util.swift @@ -0,0 +1,25 @@ +// Copyright 2024 Apple Inc. and the Swift Homomorphic Encryption project authors +// +// 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 + +extension [UInt8] { + func utf8OrBase64() -> String { + if let utf8 = String(validating: self, as: UTF8.self) { + "\(utf8) (utf8)" + } else { + "\(Data(self).base64EncodedString()) (base64)" + } + } +} diff --git a/Tests/PrivateInformationRetrievalTests/UtilTests.swift b/Tests/PrivateInformationRetrievalTests/UtilTests.swift new file mode 100644 index 00000000..889142c1 --- /dev/null +++ b/Tests/PrivateInformationRetrievalTests/UtilTests.swift @@ -0,0 +1,26 @@ +// Copyright 2024 Apple Inc. and the Swift Homomorphic Encryption project authors +// +// 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. + +@testable import PrivateInformationRetrieval +import XCTest + +class UtilTests: XCTestCase { + func testUTF8OrBase64() throws { + let utf8 = Array(Data("abc123".utf8)) + XCTAssertEqual(utf8.utf8OrBase64(), "abc123 (utf8)") + + let nonUtf8: [UInt8] = [128] + XCTAssertEqual(nonUtf8.utf8OrBase64(), Data(nonUtf8).base64EncodedString() + " (base64)") + } +}