[Import Maps] Add tests for non-ASCII characters

As the non-bare keys and resolution results of
specifier maps are normalized (i.e. serialized URLs),
raw and percent-encoded non-ASCII strings are
considered equal (as both of them are
percent-encoded after serialization).

This CL tests that raw and percent-encoded versions of
non-ASCII characters are:

- Considered equal in non-bare specifier keys,
- Considered equal in checking backtracking, and
- Not considered equal in bare specifier keys.

For consistency, this CL also adds some backtracking tests
that don't involve non-ASCII characters but use
the same patterns of added non-ASCII tests.

Bug: 848607, https://github.com/WICG/import-maps/issues/207
Change-Id: I6c8ae478da2fcbe0f6df03a608dabdad60644ea1
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2573422
Commit-Queue: Hiroshige Hayashizaki <hiroshige@chromium.org>
Reviewed-by: Kouhei Ueno <kouhei@chromium.org>
Reviewed-by: Domenic Denicola <domenic@chromium.org>
Cr-Commit-Position: refs/heads/master@{#835824}
diff --git a/import-maps/data-driven/resources/packages-via-trailing-slashes.json b/import-maps/data-driven/resources/packages-via-trailing-slashes.json
index 6ff330c..9f2ac99 100644
--- a/import-maps/data-driven/resources/packages-via-trailing-slashes.json
+++ b/import-maps/data-driven/resources/packages-via-trailing-slashes.json
@@ -8,7 +8,9 @@
       "lodash-dotdot": "../node_modules/lodash-es/lodash.js",
       "lodash-dotdot/": "../node_modules/lodash-es/",
       "mapped/": "https://example.com/",
-      "mapped/path/": "https://github.com/WICG/import-maps/issues/207/"
+      "mapped/path/": "https://github.com/WICG/import-maps/issues/207/",
+      "mapped/non-ascii-1/": "https://example.com/%E3%81%8D%E3%81%A4%E3%81%AD/",
+      "mapped/non-ascii-2/": "https://example.com/きつね/"
     }
   },
   "importMapBaseURL": "https://example.com/app/index.html",
@@ -46,11 +48,23 @@
         "mapped/path": "https://example.com/path",
         "mapped/path/": "https://github.com/WICG/import-maps/issues/207/",
         "mapped/path/..": null,
+        "mapped/path/../path/": null,
+        "mapped/path/../207": null,
+        "mapped/path/../207/": "https://github.com/WICG/import-maps/issues/207/",
+        "mapped/path//": null,
+        "mapped/path/WICG/import-maps/issues/207/": "https://github.com/WICG/import-maps/issues/207/WICG/import-maps/issues/207/",
+        "mapped/path//WICG/import-maps/issues/207/": "https://github.com/WICG/import-maps/issues/207/",
         "mapped/path/../backtrack": null,
         "mapped/path/../../backtrack": null,
         "mapped/path/../../../backtrack": null,
         "moment/../backtrack": null,
-        "moment/..": null
+        "moment/..": null,
+        "mapped/non-ascii-1/": "https://example.com/%E3%81%8D%E3%81%A4%E3%81%AD/",
+        "mapped/non-ascii-1/../%E3%81%8D%E3%81%A4%E3%81%AD/": "https://example.com/%E3%81%8D%E3%81%A4%E3%81%AD/",
+        "mapped/non-ascii-1/../きつね/": "https://example.com/%E3%81%8D%E3%81%A4%E3%81%AD/",
+        "mapped/non-ascii-2/": "https://example.com/%E3%81%8D%E3%81%A4%E3%81%AD/",
+        "mapped/non-ascii-2/../%E3%81%8D%E3%81%A4%E3%81%AD/": "https://example.com/%E3%81%8D%E3%81%A4%E3%81%AD/",
+        "mapped/non-ascii-2/../きつね/": "https://example.com/%E3%81%8D%E3%81%A4%E3%81%AD/"
       }
     }
   }
diff --git a/import-maps/data-driven/resources/tricky-specifiers.json b/import-maps/data-driven/resources/tricky-specifiers.json
index d9c80c9..998fe7f 100644
--- a/import-maps/data-driven/resources/tricky-specifiers.json
+++ b/import-maps/data-driven/resources/tricky-specifiers.json
@@ -8,7 +8,11 @@
       "..": "/lib/dotdot.mjs",
       "..\\": "/lib/dotdotbackslash.mjs",
       "%2E": "/lib/percent2e.mjs",
-      "%2F": "/lib/percent2f.mjs"
+      "%2F": "/lib/percent2f.mjs",
+      "https://map.example/%E3%81%8D%E3%81%A4%E3%81%AD/": "/a/",
+      "https://map.example/きつね/fox/": "/b/",
+      "%E3%81%8D%E3%81%A4%E3%81%AD/": "/c/",
+      "きつね/fox/": "/d/"
     }
   },
   "importMapBaseURL": "https://example.com/app/index.html",
@@ -38,6 +42,30 @@
       "expectedResults": {
         "only-slash": null
       }
+    },
+    "URL-like specifiers are normalized": {
+      "expectedResults": {
+        "https://map.example/%E3%81%8D%E3%81%A4%E3%81%AD/": "https://example.com/a/",
+        "https://map.example/%E3%81%8D%E3%81%A4%E3%81%AD/bar": "https://example.com/a/bar",
+        "https://map.example/%E3%81%8D%E3%81%A4%E3%81%AD/fox/": "https://example.com/b/",
+        "https://map.example/%E3%81%8D%E3%81%A4%E3%81%AD/fox/bar": "https://example.com/b/bar",
+        "https://map.example/きつね/": "https://example.com/a/",
+        "https://map.example/きつね/bar": "https://example.com/a/bar",
+        "https://map.example/きつね/fox/": "https://example.com/b/",
+        "https://map.example/きつね/fox/bar": "https://example.com/b/bar"
+      }
+    },
+    "Bare specifiers are not normalized": {
+      "expectedResults": {
+        "%E3%81%8D%E3%81%A4%E3%81%AD/": "https://example.com/c/",
+        "%E3%81%8D%E3%81%A4%E3%81%AD/bar": "https://example.com/c/bar",
+        "%E3%81%8D%E3%81%A4%E3%81%AD/fox/": "https://example.com/c/fox/",
+        "%E3%81%8D%E3%81%A4%E3%81%AD/fox/bar": "https://example.com/c/fox/bar",
+        "きつね/": null,
+        "きつね/bar": null,
+        "きつね/fox/": "https://example.com/d/",
+        "きつね/fox/bar": "https://example.com/d/bar"
+      }
     }
   }
 }