From 674be27070f77e1d6e55b6bd67f0f456f994bb35 Mon Sep 17 00:00:00 2001 From: Paul Marks Date: Thu, 16 Nov 2023 16:06:16 -0500 Subject: [PATCH] Bug 1803465 - Reorganize unit tests --- .../support/utils/URLStringUtilsTest.kt | 46 +++++---- .../support/utils/WebURLFinderTest.kt | 93 +++++++++++++++++++ 2 files changed, 123 insertions(+), 16 deletions(-) diff --git a/android-components/components/support/utils/src/test/java/mozilla/components/support/utils/URLStringUtilsTest.kt b/android-components/components/support/utils/src/test/java/mozilla/components/support/utils/URLStringUtilsTest.kt index 069f21b5b4fe..d406e9f15254 100644 --- a/android-components/components/support/utils/src/test/java/mozilla/components/support/utils/URLStringUtilsTest.kt +++ b/android-components/components/support/utils/src/test/java/mozilla/components/support/utils/URLStringUtilsTest.kt @@ -88,21 +88,28 @@ class URLStringUtilsTest { assertFalse(isURLLike("www.c-c- ")) assertFalse(isURLLike("3-3 ")) - // IPv6 literals - assertTrue(isURLLike("[::]")) - assertTrue(isURLLike("[::1]")) - assertTrue(isURLLike("[1::]")) - assertTrue(isURLLike("[::]/")) - assertTrue(isURLLike("[1:2:3:4:5:6:7:8]")) - assertTrue(isURLLike("https:[::]")) - assertTrue(isURLLike("https://[::]")) - assertTrue(isURLLike("https://[::1]")) - assertTrue(isURLLike("https://[1::]")) - assertTrue(isURLLike("https://[2001:db8::1.2.3.4]/")) - assertTrue(isURLLike("https://[1:2:3:4:5:6:7:8]/")) - assertTrue(isURLLike("[2001:db8::1.2.3.4]/")) - - // Invalid IPv6 literals, just to illustrate the limits of the regex. + // Valid IPv6 literals correctly recognized as valid. + val validIPv6Literals = listOf( + "[::]", + "[::1]", + "[1::]", + "[1:2:3:4:5:6:7:8]", + "[2001:db8::1.2.3.4]", + "[::1]:8080", + ) + + validIPv6Literals.forEach { url -> + assertTrue(isURLLike(url)) + assertTrue(isURLLike("$url/")) + assertTrue(isURLLike("https://$url")) + assertTrue(isURLLike("https://$url/")) + assertTrue(isURLLike("https:$url")) + assertTrue(isURLLike("http://$url")) + assertTrue(isURLLike("http://$url/")) + assertTrue(isURLLike("http:$url")) + } + + // Invalid IPv6 literals correctly recognized as invalid. assertFalse(isURLLike("::1")) assertFalse(isURLLike(":::")) assertFalse(isURLLike("[[http://]]")) @@ -110,9 +117,14 @@ class URLStringUtilsTest { assertFalse(isURLLike("[[[:")) assertFalse(isURLLike("[[[:/")) assertFalse(isURLLike("http://]]]")) - assertTrue(isURLLike("[:::")) + + // Invalid IPv6 literals correctly recognized as something else. assertTrue(isURLLike("fe80::")) assertTrue(isURLLike("x:[")) + + // Invalid IPv6 literals incorrectly recognized as valid. + // We allow these for now, until bug 1685152 is fixed. + assertTrue(isURLLike("[:::")) assertTrue(isURLLike("http://[::")) assertTrue(isURLLike("http://[::/path")) assertTrue(isURLLike("http://[::?query")) @@ -121,6 +133,8 @@ class URLStringUtilsTest { assertTrue(isURLLike("[[[::")) assertTrue(isURLLike("[[[::/")) assertTrue(isURLLike("http://[1.2.3]")) + assertTrue(isURLLike("https://[1:2:3:4:5:6:7]/")) + assertTrue(isURLLike("https://[1:2:3:4:5:6:7:8:9]/")) // Examples from issues assertTrue(isURLLike("https://abc--cba.com/")) // #7096 diff --git a/android-components/components/support/utils/src/test/java/mozilla/components/support/utils/WebURLFinderTest.kt b/android-components/components/support/utils/src/test/java/mozilla/components/support/utils/WebURLFinderTest.kt index d523e711d5fa..256e7b7f181d 100644 --- a/android-components/components/support/utils/src/test/java/mozilla/components/support/utils/WebURLFinderTest.kt +++ b/android-components/components/support/utils/src/test/java/mozilla/components/support/utils/WebURLFinderTest.kt @@ -116,4 +116,97 @@ class WebURLFinderTest { assertFalse(isWebURL("javascript:alert('Hi')")) assertFalse(isWebURL("JAVascript:alert('Hi')")) } + + @Test + fun isUrlLikeEmulated() { + // autolinkWebUrlPattern uses a copy of the regex from URLStringUtils, + // so here we emulate isURLLike() and copy its tests. + val isURLLike: (String) -> Boolean = { find(it) == it.trim() } + + // All cases that behave differently are annotated with INVERT(). + val INVERT: (Boolean) -> Boolean = { !it } + + assertFalse(isURLLike("inurl:mozilla.org advanced search")) + assertFalse(isURLLike("sf: help")) + assertFalse(isURLLike("mozilla./~")) + assertFalse(isURLLike("cnn.com politics")) + + assertTrue(isURLLike("about:config")) + assertTrue(isURLLike("about:config:8000")) + assertTrue(INVERT(isURLLike("file:///home/user/myfile.html"))) + assertTrue(INVERT(isURLLike("file://////////////home//user/myfile.html"))) + assertTrue(INVERT(isURLLike("file://C:\\Users\\user\\myfile.html"))) + assertTrue(isURLLike("http://192.168.255.255")) + assertTrue(isURLLike("link.unknown")) + assertTrue(isURLLike("3.14.2019")) + assertTrue(isURLLike("3-four.14.2019")) + assertTrue(isURLLike(" cnn.com ")) + assertTrue(isURLLike(" cnn.com")) + assertTrue(isURLLike("cnn.com ")) + assertTrue(isURLLike("mozilla.com/~userdir")) + assertTrue(isURLLike("my-domain.com")) + assertTrue(isURLLike("http://faß.de//")) + assertTrue(isURLLike("cnn.cơḿ")) + assertTrue(isURLLike("cnn.çơḿ")) + + assertTrue(isURLLike("c-c.com")) + assertTrue(isURLLike("c-c-c-c.c-c-c")) + assertTrue(isURLLike("c-http://c.com")) + assertTrue(isURLLike("about-mozilla:mozilla")) + assertTrue(isURLLike("c-http.d-x")) + assertTrue(isURLLike("www.c.-")) + assertTrue(isURLLike("3-3.3")) + assertTrue(isURLLike("www.c-c.-")) + + assertFalse(isURLLike(" -://x.com ")) + assertFalse(isURLLike(" -x.com")) + assertFalse(isURLLike("http://www-.com")) + assertFalse(isURLLike("www.c-c- ")) + assertFalse(isURLLike("3-3 ")) + + val validIPv6Literals = listOf( + "[::]", + "[::1]", + "[1::]", + "[1:2:3:4:5:6:7:8]", + "[2001:db8::1.2.3.4]", + "[::1]:8080", + ) + + validIPv6Literals.forEach { url -> + assertTrue(INVERT(isURLLike(url))) + assertTrue(INVERT(isURLLike("$url/"))) + assertTrue(isURLLike("https://$url")) + assertTrue(isURLLike("https://$url/")) + assertTrue(isURLLike("https:$url")) + assertTrue(isURLLike("http://$url")) + assertTrue(isURLLike("http://$url/")) + assertTrue(isURLLike("http:$url")) + } + + assertFalse(isURLLike("::1")) + assertFalse(isURLLike(":::")) + assertFalse(isURLLike("[[http://]]")) + assertFalse(isURLLike("[[[")) + assertFalse(isURLLike("[[[:")) + assertFalse(isURLLike("[[[:/")) + assertFalse(isURLLike("http://]]]")) + + assertTrue(isURLLike("fe80::")) + assertTrue(isURLLike("x:[")) + + assertTrue(INVERT(isURLLike("[:::"))) + assertTrue(INVERT(isURLLike("http://[::"))) + assertTrue(INVERT(isURLLike("http://[::/path"))) + assertTrue(INVERT(isURLLike("http://[::?query"))) + assertTrue(INVERT(isURLLike("[[http://banana]]"))) + assertTrue(INVERT(isURLLike("http://[[["))) + assertTrue(INVERT(isURLLike("[[[::"))) + assertTrue(INVERT(isURLLike("[[[::/"))) + assertTrue(INVERT(isURLLike("http://[1.2.3]"))) + assertTrue(INVERT(isURLLike("https://[1:2:3:4:5:6:7]/"))) + assertTrue(INVERT(isURLLike("https://[1:2:3:4:5:6:7:8:9]/"))) + + assertTrue(isURLLike("https://abc--cba.com/")) + } }