From a254819cc7d3a88bf115c55635e2b4335136d0ff Mon Sep 17 00:00:00 2001 From: Max Radermacher Date: Thu, 23 Mar 2023 16:49:14 -0700 Subject: [PATCH] Improve performance of link fetcher unit tests --- SignalServiceKit/src/Util/LinkValidator.swift | 9 +++++++-- SignalServiceKit/tests/Util/LinkValidatorTest.swift | 12 +++++++----- SignalUI/Utils/LinkPreviewFetcher.swift | 5 ----- 3 files changed, 14 insertions(+), 12 deletions(-) diff --git a/SignalServiceKit/src/Util/LinkValidator.swift b/SignalServiceKit/src/Util/LinkValidator.swift index 6ac3f0afcc..1859c97ec7 100644 --- a/SignalServiceKit/src/Util/LinkValidator.swift +++ b/SignalServiceKit/src/Util/LinkValidator.swift @@ -27,8 +27,8 @@ public enum LinkValidator { } public static func firstLinkPreviewURL(in entireMessage: String) -> URL? { - guard let detector = try? NSDataDetector(types: NSTextCheckingResult.CheckingType.link.rawValue) else { - owsFailDebug("Could not create NSDataDetector") + // Don't include link previews for oversize text messages. + guard entireMessage.utf8.dropFirst(Int(kOversizeTextMessageSizeThreshold) - 1).isEmpty else { return nil } @@ -36,6 +36,11 @@ public enum LinkValidator { return nil } + guard let detector = try? NSDataDetector(types: NSTextCheckingResult.CheckingType.link.rawValue) else { + owsFailDebug("Could not create NSDataDetector") + return nil + } + var result: URL? detector.enumerateMatches(in: entireMessage, range: entireMessage.entireRange) { match, _, stop in guard let match = match else { return } diff --git a/SignalServiceKit/tests/Util/LinkValidatorTest.swift b/SignalServiceKit/tests/Util/LinkValidatorTest.swift index 86df60f556..df1603c3b6 100644 --- a/SignalServiceKit/tests/Util/LinkValidatorTest.swift +++ b/SignalServiceKit/tests/Util/LinkValidatorTest.swift @@ -77,8 +77,11 @@ class LinkValidatorTest: XCTestCase { ("alice bob https://www.youtube.com/watch?v=tP-Ipsat90c jim", "https://www.youtube.com/watch?v=tP-Ipsat90c"), - // If there are more than one, take the first. - ("alice bob https://signal.org/url_1 jim https://signal.org/url_2 carol", "https://signal.org/url_1") + // If there is more than one, take the first. + ("alice bob https://signal.org/url_1 jim https://signal.org/url_2 carol", "https://signal.org/url_1"), + + // If there's too much text, we can't parse any URLs. + ("https://signal.org " + String(repeating: "A", count: 4096), nil) ] for (entireMessage, expectedValue) in testCases { let actualValue = LinkValidator.firstLinkPreviewURL(in: entireMessage) @@ -86,12 +89,11 @@ class LinkValidatorTest: XCTestCase { } } - func testFindFirstValidUrlPerformance() throws { + func testFirstLinkPreviewURLPerformance() throws { let entireMessage = String(repeating: "https://example.com ", count: 1_000_000) - let expectedValue = try XCTUnwrap(URL(string: "https://example.com")) measure { let actualValue = LinkValidator.firstLinkPreviewURL(in: entireMessage) - XCTAssertEqual(actualValue, expectedValue) + XCTAssertNil(actualValue) } } } diff --git a/SignalUI/Utils/LinkPreviewFetcher.swift b/SignalUI/Utils/LinkPreviewFetcher.swift index 3074f583ca..33cbf0918f 100644 --- a/SignalUI/Utils/LinkPreviewFetcher.swift +++ b/SignalUI/Utils/LinkPreviewFetcher.swift @@ -149,11 +149,6 @@ public class LinkPreviewFetcher { self.prependSchemeIfNeeded(to: &filteredText) } - // Don't include link previews for oversize text messages. - guard filteredText.lengthOfBytes(using: .utf8) < kOversizeTextMessageSizeThreshold else { - return nil - } - return LinkValidator.firstLinkPreviewURL(in: filteredText) }