jaroslav@425: /** jaroslav@425: * Back 2 Browser Bytecode Translator jaroslav@425: * Copyright (C) 2012 Jaroslav Tulach jaroslav@425: * jaroslav@425: * This program is free software: you can redistribute it and/or modify jaroslav@425: * it under the terms of the GNU General Public License as published by jaroslav@425: * the Free Software Foundation, version 2 of the License. jaroslav@425: * jaroslav@425: * This program is distributed in the hope that it will be useful, jaroslav@425: * but WITHOUT ANY WARRANTY; without even the implied warranty of jaroslav@425: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the jaroslav@425: * GNU General Public License for more details. jaroslav@425: * jaroslav@425: * You should have received a copy of the GNU General Public License jaroslav@425: * along with this program. Look for COPYING file in the top folder. jaroslav@425: * If not, see http://opensource.org/licenses/GPL-2.0. jaroslav@424: */ jaroslav@424: package org.apidesign.bck2brwsr.tck; jaroslav@424: jaroslav@1717: import java.io.ByteArrayInputStream; jaroslav@1717: import java.io.Closeable; jaroslav@1375: import java.io.IOException; jaroslav@424: import java.io.InputStream; jaroslav@1316: import java.net.URL; jaroslav@1717: import java.net.URLConnection; jaroslav@1375: import java.util.Enumeration; jaroslav@1717: import net.java.html.js.JavaScriptBody; jaroslav@1717: import org.apidesign.bck2brwsr.vmtest.BrwsrTest; jaroslav@424: import org.apidesign.bck2brwsr.vmtest.Compare; jaroslav@424: import org.apidesign.bck2brwsr.vmtest.VMTest; jaroslav@424: import org.testng.annotations.Factory; jaroslav@424: jaroslav@424: /** jaroslav@424: * jaroslav@424: * @author Jaroslav Tulach jaroslav@424: */ jaroslav@424: public class ResourcesTest { jaroslav@1375: @Compare public String allManifests() throws Exception { jaroslav@1375: Enumeration en = ClassLoader.getSystemResources("META-INF/MANIFEST.MF"); jaroslav@1375: assert en.hasMoreElements() : "Should have at least one manifest"; jaroslav@1375: String first = readString(en.nextElement().openStream()); jaroslav@1375: boolean different = false; jaroslav@1375: int cnt = 1; jaroslav@1375: while (en.hasMoreElements()) { jaroslav@1375: URL url = en.nextElement(); jaroslav@1375: String now = readString(url.openStream()); jaroslav@1375: if (!first.equals(now)) { jaroslav@1375: different = true; jaroslav@1375: } jaroslav@1375: cnt++; jaroslav@1375: if (cnt > 500) { jaroslav@1375: throw new IllegalStateException( jaroslav@1375: "Giving up. First manifest:\n" + first + jaroslav@1375: "\nLast manifest:\n" + now jaroslav@1375: ); jaroslav@1375: } jaroslav@1375: } jaroslav@1375: assert different : "Not all manifests should look like first one:\n" + first; jaroslav@1600: if (cnt > 40 && cnt < 50) { jaroslav@1600: return "OK"; jaroslav@1600: } else { jaroslav@1600: return "" + cnt; jaroslav@1600: } jaroslav@1375: } jaroslav@424: jaroslav@424: @Compare public String readResourceAsStream() throws Exception { jaroslav@424: InputStream is = getClass().getResourceAsStream("Resources.txt"); jaroslav@1375: return readString(is); jaroslav@1375: } jaroslav@1398: jaroslav@1717: @Compare public String readResourceViaXMLHttpRequest() throws Exception { jaroslav@1717: return readResourceViaXHR("Resources.txt", null); jaroslav@1717: } jaroslav@1717: jaroslav@1717: @BrwsrTest public void xhrTestedInBrowser() throws Exception { jaroslav@1717: boolean[] run = { false }; jaroslav@1717: readResourceViaXHR("Resources.txt", run); jaroslav@1717: assert run[0] : "XHR really used in browser"; jaroslav@1717: } jaroslav@1717: jaroslav@1717: @Compare public String readBinaryResourceViaXMLHttpRequest() throws Exception { jaroslav@1717: return readResourceViaXHR("0xfe", null); jaroslav@1717: } jaroslav@1717: jaroslav@1717: private String readResourceViaXHR(final String res, boolean[] exec) throws IOException { jaroslav@1717: URL url = getClass().getResource(res); jaroslav@1717: URLConnection conn = url.openConnection(); jaroslav@1717: String java = readBytes(url.openStream()); jaroslav@1717: String java2 = readBytes(conn.getInputStream()); jaroslav@1717: assert java.equals(java2) : "Java:\n" + java + "\nConn:\n" + java2; jaroslav@1717: jaroslav@1717: URL url2 = conn.getURL(); jaroslav@1717: String java3 = readBytes(url.openStream()); jaroslav@1717: assert java.equals(java3) : "Java:\n" + java + "\nConnURL:\n" + java3; jaroslav@1717: jaroslav@1717: jaroslav@1717: byte[] xhr = readXHR(url2.toExternalForm()); jaroslav@1717: if (xhr != null) { jaroslav@1717: if (exec != null) { jaroslav@1717: exec[0] = true; jaroslav@1717: } jaroslav@1717: String s = readBytes(new ByteArrayInputStream(xhr)); jaroslav@1717: assert java.equals(s) : "Java:\n" + java + "\nXHR:\n" + s; jaroslav@1717: jaroslav@1717: assert conn instanceof Closeable : "Can be closed"; jaroslav@1717: jaroslav@1717: Closeable c = (Closeable) conn; jaroslav@1717: c.close(); jaroslav@1717: jaroslav@1717: byte[] xhr2 = null; jaroslav@1717: try { jaroslav@1717: xhr2 = readXHR(url2.toExternalForm()); jaroslav@1717: } catch (Throwable t) { jaroslav@1717: // OK, expecting error jaroslav@1717: } jaroslav@1717: assert xhr2 == null : "Cannot read the URL anymore"; jaroslav@1717: } jaroslav@1717: return java; jaroslav@1717: } jaroslav@1717: jaroslav@1717: @JavaScriptBody(args = { "url" }, body = jaroslav@1717: "if (typeof XMLHttpRequest === 'undefined') return null;\n" + jaroslav@1717: "var xhr = new XMLHttpRequest();\n" + jaroslav@1717: "xhr.overrideMimeType('text\\/plain; charset=x-user-defined');\n" + jaroslav@1717: "xhr.open('GET', url, false);\n" + jaroslav@1717: "xhr.send();\n" + jaroslav@1721: "if (xhr.status >= 300) throw 'Status: ' + xhr.status + ' ' + xhr.statusText;\n" + jaroslav@1717: "var ret = []\n" + jaroslav@1717: "for (var i = 0; i < xhr.responseText.length; i++) {\n" + jaroslav@1718: " var b = xhr.responseText.charCodeAt(i) & 0xff;\n" + jaroslav@1718: " if (b > 127) b -= 256;\n" + jaroslav@1718: " ret.push(b);\n" + jaroslav@1717: "}\n" + jaroslav@1717: "return ret;\n" jaroslav@1717: ) jaroslav@1717: private static byte[] readXHR(String url) { jaroslav@1717: return null; jaroslav@1717: } jaroslav@1717: jaroslav@1398: @Compare public String readResourceViaConnection() throws Exception { jaroslav@1717: final URL url = getClass().getResource("Resources.txt"); jaroslav@1717: String str = url.toExternalForm(); jaroslav@1717: int idx = str.indexOf("org/apidesign/bck2brwsr/tck"); jaroslav@1717: assert idx >= 0 : "Package name found in the URL name: " + str; jaroslav@1717: InputStream is = url.openConnection().getInputStream(); jaroslav@1398: return readString(is); jaroslav@1398: } jaroslav@1375: jaroslav@1375: private String readString(InputStream is) throws IOException { jaroslav@424: StringBuilder sb = new StringBuilder(); jaroslav@1375: byte[] b = new byte[512]; jaroslav@1375: for (;;) { jaroslav@1375: int len = is.read(b); jaroslav@1375: if (len == -1) { jaroslav@1375: return sb.toString(); jaroslav@1375: } jaroslav@1375: for (int i = 0; i < len; i++) { jaroslav@1375: sb.append((char)b[i]); jaroslav@1375: } jaroslav@424: } jaroslav@424: } jaroslav@1333: jaroslav@1717: private String readBytes(InputStream is) throws IOException { jaroslav@1717: StringBuilder sb = new StringBuilder(); jaroslav@1717: byte[] b = new byte[512]; jaroslav@1717: for (;;) { jaroslav@1717: int len = is.read(b); jaroslav@1717: if (len == -1) { jaroslav@1717: return sb.toString(); jaroslav@1717: } jaroslav@1717: for (int i = 0; i < len; i++) { jaroslav@1717: sb.append((int)b[i]).append(" "); jaroslav@1717: } jaroslav@1717: } jaroslav@1717: } jaroslav@1717: jaroslav@1333: @Compare public String readResourceAsStreamFromClassLoader() throws Exception { jaroslav@1333: InputStream is = getClass().getClassLoader().getResourceAsStream("org/apidesign/bck2brwsr/tck/Resources.txt"); jaroslav@1375: return readString(is); jaroslav@1333: } jaroslav@424: jaroslav@1316: @Compare public String toURIFromURL() throws Exception { jaroslav@1316: URL u = new URL("http://apidesign.org"); jaroslav@1316: return u.toURI().toString(); jaroslav@1316: } jaroslav@1316: jaroslav@424: @Factory public static Object[] create() { jaroslav@424: return VMTest.create(ResourcesTest.class); jaroslav@424: } jaroslav@424: }