// Demonstrates java.net.IDN transitional / IDNA2003 behaviour that
// Cronet-Android relies on via url/android/java/src/org/chromium/url/IDNStringUtil.java
// and components/cronet/.../CronetEngineBuilderImpl.java#validateHostNameForPinningAndConvert.
//
// Chrome desktop / WHATWG URL (UTS-46 nontransitional) produces DIFFERENT
// A-labels for these inputs -- see url/url_idna_icu.cc.

import java.net.IDN;

public class IDNDemo {
  static void show(String label, String host) {
    String out;
    try {
      out = IDN.toASCII(host, IDN.USE_STD3_ASCII_RULES);
    } catch (Exception e) {
      out = "<rejected: " + e.getClass().getSimpleName() + ">";
    }
    System.out.printf("  %-28s java.net.IDN -> %s%n", "\"" + label + "\"", out);
  }

  public static void main(String[] args) {
    System.out.println("== java.net.IDN.toASCII (as used by Cronet-Android IDNStringUtil) ==");
    System.out.println();
    System.out.println("Deviation characters (transitional vs nontransitional):");
    // U+00DF LATIN SMALL LETTER SHARP S
    show("stra\\u00DFe.de", "straße.de");
    // U+03C2 GREEK SMALL LETTER FINAL SIGMA
    show("\\u03B2\\u03CC\\u03BB\\u03BF\\u03C2.gr", "βόλος.gr");
    // U+200D ZERO WIDTH JOINER
    show("a\\u200Db.example", "a‍b.example");
    // U+200C ZERO WIDTH NON-JOINER
    show("a\\u200Cb.example", "a‌b.example");
    System.out.println();
    System.out.println("Reference: WHATWG URL / Chrome url_idna_icu.cc (UTS-46 nontransitional + ContextJ):");
    System.out.println("  \"stra\\u00DFe.de\"             -> xn--strae-oqa.de");
    System.out.println("  \"\\u03B2\\u03CC\\u03BB\\u03BF\\u03C2.gr\" -> xn--nxasmm1c.gr");
    System.out.println("  \"a\\u200Db.example\"           -> <rejected> (CONTEXTJ)");
    System.out.println("  \"a\\u200Cb.example\"           -> <rejected> (CONTEXTJ)");
    System.out.println();
    System.out.println("=> For all four deviation characters, Cronet-Android resolves a DIFFERENT");
    System.out.println("   registrable domain than Chrome / WebView / any WHATWG-URL-conforming parser");
    System.out.println("   on the same device, or accepts a host that Chrome rejects outright.");
  }
}
