jaroslav@425
|
1 |
/**
|
jaroslav@425
|
2 |
* Back 2 Browser Bytecode Translator
|
jaroslav@425
|
3 |
* Copyright (C) 2012 Jaroslav Tulach <jaroslav.tulach@apidesign.org>
|
jaroslav@425
|
4 |
*
|
jaroslav@425
|
5 |
* This program is free software: you can redistribute it and/or modify
|
jaroslav@425
|
6 |
* it under the terms of the GNU General Public License as published by
|
jaroslav@425
|
7 |
* the Free Software Foundation, version 2 of the License.
|
jaroslav@425
|
8 |
*
|
jaroslav@425
|
9 |
* This program is distributed in the hope that it will be useful,
|
jaroslav@425
|
10 |
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
jaroslav@425
|
11 |
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
jaroslav@425
|
12 |
* GNU General Public License for more details.
|
jaroslav@425
|
13 |
*
|
jaroslav@425
|
14 |
* You should have received a copy of the GNU General Public License
|
jaroslav@425
|
15 |
* along with this program. Look for COPYING file in the top folder.
|
jaroslav@425
|
16 |
* If not, see http://opensource.org/licenses/GPL-2.0.
|
jaroslav@424
|
17 |
*/
|
jaroslav@424
|
18 |
package org.apidesign.bck2brwsr.tck;
|
jaroslav@424
|
19 |
|
jaroslav@1717
|
20 |
import java.io.ByteArrayInputStream;
|
jaroslav@1717
|
21 |
import java.io.Closeable;
|
jaroslav@1375
|
22 |
import java.io.IOException;
|
jaroslav@424
|
23 |
import java.io.InputStream;
|
jaroslav@1316
|
24 |
import java.net.URL;
|
jaroslav@1717
|
25 |
import java.net.URLConnection;
|
jaroslav@1375
|
26 |
import java.util.Enumeration;
|
jaroslav@1717
|
27 |
import net.java.html.js.JavaScriptBody;
|
jaroslav@1717
|
28 |
import org.apidesign.bck2brwsr.vmtest.BrwsrTest;
|
jaroslav@424
|
29 |
import org.apidesign.bck2brwsr.vmtest.Compare;
|
jaroslav@424
|
30 |
import org.apidesign.bck2brwsr.vmtest.VMTest;
|
jaroslav@424
|
31 |
import org.testng.annotations.Factory;
|
jaroslav@424
|
32 |
|
jaroslav@424
|
33 |
/**
|
jaroslav@424
|
34 |
*
|
jaroslav@424
|
35 |
* @author Jaroslav Tulach <jtulach@netbeans.org>
|
jaroslav@424
|
36 |
*/
|
jaroslav@424
|
37 |
public class ResourcesTest {
|
jaroslav@1375
|
38 |
@Compare public String allManifests() throws Exception {
|
jaroslav@1375
|
39 |
Enumeration<URL> en = ClassLoader.getSystemResources("META-INF/MANIFEST.MF");
|
jaroslav@1375
|
40 |
assert en.hasMoreElements() : "Should have at least one manifest";
|
jaroslav@1375
|
41 |
String first = readString(en.nextElement().openStream());
|
jaroslav@1375
|
42 |
boolean different = false;
|
jaroslav@1375
|
43 |
int cnt = 1;
|
jaroslav@1375
|
44 |
while (en.hasMoreElements()) {
|
jaroslav@1375
|
45 |
URL url = en.nextElement();
|
jaroslav@1375
|
46 |
String now = readString(url.openStream());
|
jaroslav@1375
|
47 |
if (!first.equals(now)) {
|
jaroslav@1375
|
48 |
different = true;
|
jaroslav@1375
|
49 |
}
|
jaroslav@1375
|
50 |
cnt++;
|
jaroslav@1375
|
51 |
if (cnt > 500) {
|
jaroslav@1375
|
52 |
throw new IllegalStateException(
|
jaroslav@1375
|
53 |
"Giving up. First manifest:\n" + first +
|
jaroslav@1375
|
54 |
"\nLast manifest:\n" + now
|
jaroslav@1375
|
55 |
);
|
jaroslav@1375
|
56 |
}
|
jaroslav@1375
|
57 |
}
|
jaroslav@1375
|
58 |
assert different : "Not all manifests should look like first one:\n" + first;
|
jaroslav@1600
|
59 |
if (cnt > 40 && cnt < 50) {
|
jaroslav@1600
|
60 |
return "OK";
|
jaroslav@1600
|
61 |
} else {
|
jaroslav@1600
|
62 |
return "" + cnt;
|
jaroslav@1600
|
63 |
}
|
jaroslav@1375
|
64 |
}
|
jaroslav@424
|
65 |
|
jaroslav@424
|
66 |
@Compare public String readResourceAsStream() throws Exception {
|
jaroslav@424
|
67 |
InputStream is = getClass().getResourceAsStream("Resources.txt");
|
jaroslav@1375
|
68 |
return readString(is);
|
jaroslav@1375
|
69 |
}
|
jaroslav@1398
|
70 |
|
jaroslav@1717
|
71 |
@Compare public String readResourceViaXMLHttpRequest() throws Exception {
|
jaroslav@1717
|
72 |
return readResourceViaXHR("Resources.txt", null);
|
jaroslav@1717
|
73 |
}
|
jaroslav@1717
|
74 |
|
jaroslav@1717
|
75 |
@BrwsrTest public void xhrTestedInBrowser() throws Exception {
|
jaroslav@1717
|
76 |
boolean[] run = { false };
|
jaroslav@1717
|
77 |
readResourceViaXHR("Resources.txt", run);
|
jaroslav@1717
|
78 |
assert run[0] : "XHR really used in browser";
|
jaroslav@1717
|
79 |
}
|
jaroslav@1717
|
80 |
|
jaroslav@1717
|
81 |
@Compare public String readBinaryResourceViaXMLHttpRequest() throws Exception {
|
jaroslav@1717
|
82 |
return readResourceViaXHR("0xfe", null);
|
jaroslav@1717
|
83 |
}
|
jaroslav@1717
|
84 |
|
jaroslav@1717
|
85 |
private String readResourceViaXHR(final String res, boolean[] exec) throws IOException {
|
jaroslav@1717
|
86 |
URL url = getClass().getResource(res);
|
jaroslav@1717
|
87 |
URLConnection conn = url.openConnection();
|
jaroslav@1717
|
88 |
String java = readBytes(url.openStream());
|
jaroslav@1717
|
89 |
String java2 = readBytes(conn.getInputStream());
|
jaroslav@1717
|
90 |
assert java.equals(java2) : "Java:\n" + java + "\nConn:\n" + java2;
|
jaroslav@1717
|
91 |
|
jaroslav@1717
|
92 |
URL url2 = conn.getURL();
|
jaroslav@1717
|
93 |
String java3 = readBytes(url.openStream());
|
jaroslav@1717
|
94 |
assert java.equals(java3) : "Java:\n" + java + "\nConnURL:\n" + java3;
|
jaroslav@1717
|
95 |
|
jaroslav@1717
|
96 |
|
jaroslav@1717
|
97 |
byte[] xhr = readXHR(url2.toExternalForm());
|
jaroslav@1717
|
98 |
if (xhr != null) {
|
jaroslav@1717
|
99 |
if (exec != null) {
|
jaroslav@1717
|
100 |
exec[0] = true;
|
jaroslav@1717
|
101 |
}
|
jaroslav@1717
|
102 |
String s = readBytes(new ByteArrayInputStream(xhr));
|
jaroslav@1717
|
103 |
assert java.equals(s) : "Java:\n" + java + "\nXHR:\n" + s;
|
jaroslav@1717
|
104 |
|
jaroslav@1717
|
105 |
assert conn instanceof Closeable : "Can be closed";
|
jaroslav@1717
|
106 |
|
jaroslav@1717
|
107 |
Closeable c = (Closeable) conn;
|
jaroslav@1717
|
108 |
c.close();
|
jaroslav@1717
|
109 |
|
jaroslav@1717
|
110 |
byte[] xhr2 = null;
|
jaroslav@1717
|
111 |
try {
|
jaroslav@1717
|
112 |
xhr2 = readXHR(url2.toExternalForm());
|
jaroslav@1717
|
113 |
} catch (Throwable t) {
|
jaroslav@1717
|
114 |
// OK, expecting error
|
jaroslav@1717
|
115 |
}
|
jaroslav@1717
|
116 |
assert xhr2 == null : "Cannot read the URL anymore";
|
jaroslav@1717
|
117 |
}
|
jaroslav@1717
|
118 |
return java;
|
jaroslav@1717
|
119 |
}
|
jaroslav@1717
|
120 |
|
jaroslav@1717
|
121 |
@JavaScriptBody(args = { "url" }, body =
|
jaroslav@1717
|
122 |
"if (typeof XMLHttpRequest === 'undefined') return null;\n" +
|
jaroslav@1717
|
123 |
"var xhr = new XMLHttpRequest();\n" +
|
jaroslav@1717
|
124 |
"xhr.overrideMimeType('text\\/plain; charset=x-user-defined');\n" +
|
jaroslav@1717
|
125 |
"xhr.open('GET', url, false);\n" +
|
jaroslav@1717
|
126 |
"xhr.send();\n" +
|
jaroslav@1717
|
127 |
"var ret = []\n" +
|
jaroslav@1717
|
128 |
"for (var i = 0; i < xhr.responseText.length; i++) {\n" +
|
jaroslav@1717
|
129 |
" ret.push(xhr.responseText.charCodeAt(i) & 0xff);\n" +
|
jaroslav@1717
|
130 |
"}\n" +
|
jaroslav@1717
|
131 |
"return ret;\n"
|
jaroslav@1717
|
132 |
)
|
jaroslav@1717
|
133 |
private static byte[] readXHR(String url) {
|
jaroslav@1717
|
134 |
return null;
|
jaroslav@1717
|
135 |
}
|
jaroslav@1717
|
136 |
|
jaroslav@1398
|
137 |
@Compare public String readResourceViaConnection() throws Exception {
|
jaroslav@1717
|
138 |
final URL url = getClass().getResource("Resources.txt");
|
jaroslav@1717
|
139 |
String str = url.toExternalForm();
|
jaroslav@1717
|
140 |
int idx = str.indexOf("org/apidesign/bck2brwsr/tck");
|
jaroslav@1717
|
141 |
assert idx >= 0 : "Package name found in the URL name: " + str;
|
jaroslav@1717
|
142 |
InputStream is = url.openConnection().getInputStream();
|
jaroslav@1398
|
143 |
return readString(is);
|
jaroslav@1398
|
144 |
}
|
jaroslav@1375
|
145 |
|
jaroslav@1375
|
146 |
private String readString(InputStream is) throws IOException {
|
jaroslav@424
|
147 |
StringBuilder sb = new StringBuilder();
|
jaroslav@1375
|
148 |
byte[] b = new byte[512];
|
jaroslav@1375
|
149 |
for (;;) {
|
jaroslav@1375
|
150 |
int len = is.read(b);
|
jaroslav@1375
|
151 |
if (len == -1) {
|
jaroslav@1375
|
152 |
return sb.toString();
|
jaroslav@1375
|
153 |
}
|
jaroslav@1375
|
154 |
for (int i = 0; i < len; i++) {
|
jaroslav@1375
|
155 |
sb.append((char)b[i]);
|
jaroslav@1375
|
156 |
}
|
jaroslav@424
|
157 |
}
|
jaroslav@424
|
158 |
}
|
jaroslav@1333
|
159 |
|
jaroslav@1717
|
160 |
private String readBytes(InputStream is) throws IOException {
|
jaroslav@1717
|
161 |
StringBuilder sb = new StringBuilder();
|
jaroslav@1717
|
162 |
byte[] b = new byte[512];
|
jaroslav@1717
|
163 |
for (;;) {
|
jaroslav@1717
|
164 |
int len = is.read(b);
|
jaroslav@1717
|
165 |
if (len == -1) {
|
jaroslav@1717
|
166 |
return sb.toString();
|
jaroslav@1717
|
167 |
}
|
jaroslav@1717
|
168 |
for (int i = 0; i < len; i++) {
|
jaroslav@1717
|
169 |
sb.append((int)b[i]).append(" ");
|
jaroslav@1717
|
170 |
}
|
jaroslav@1717
|
171 |
}
|
jaroslav@1717
|
172 |
}
|
jaroslav@1717
|
173 |
|
jaroslav@1333
|
174 |
@Compare public String readResourceAsStreamFromClassLoader() throws Exception {
|
jaroslav@1333
|
175 |
InputStream is = getClass().getClassLoader().getResourceAsStream("org/apidesign/bck2brwsr/tck/Resources.txt");
|
jaroslav@1375
|
176 |
return readString(is);
|
jaroslav@1333
|
177 |
}
|
jaroslav@424
|
178 |
|
jaroslav@1316
|
179 |
@Compare public String toURIFromURL() throws Exception {
|
jaroslav@1316
|
180 |
URL u = new URL("http://apidesign.org");
|
jaroslav@1316
|
181 |
return u.toURI().toString();
|
jaroslav@1316
|
182 |
}
|
jaroslav@1316
|
183 |
|
jaroslav@424
|
184 |
@Factory public static Object[] create() {
|
jaroslav@424
|
185 |
return VMTest.create(ResourcesTest.class);
|
jaroslav@424
|
186 |
}
|
jaroslav@424
|
187 |
}
|