1 // Copyright (C) 2006, 2007 Red Hat, Inc. |
|
2 // Written by Gary Benson <gbenson@redhat.com> |
|
3 |
|
4 // This file is part of Mauve. |
|
5 |
|
6 // Mauve is free software; you can redistribute it and/or modify |
|
7 // it under the terms of the GNU General Public License as published by |
|
8 // the Free Software Foundation; either version 2, or (at your option) |
|
9 // any later version. |
|
10 |
|
11 // Mauve is distributed in the hope that it will be useful, |
|
12 // but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|
14 // GNU General Public License for more details. |
|
15 |
|
16 // You should have received a copy of the GNU General Public License |
|
17 // along with Mauve; see the file COPYING. If not, write to |
|
18 // the Free Software Foundation, 59 Temple Place - Suite 330, |
|
19 // Boston, MA 02111-1307, USA. |
|
20 |
|
21 // Tags: JDK1.2 |
|
22 |
|
23 package gnu.testlet.java.net.SocketPermission; |
|
24 |
|
25 import java.net.InetAddress; |
|
26 import java.net.SocketPermission; |
|
27 import java.net.UnknownHostException; |
|
28 |
|
29 import gnu.testlet.Testlet; |
|
30 import gnu.testlet.TestHarness; |
|
31 |
|
32 public class implies implements Testlet |
|
33 { |
|
34 static String redhat_com_addr = null; |
|
35 static { |
|
36 try { |
|
37 redhat_com_addr = |
|
38 InetAddress.getByName("www.redhat.com").getHostAddress(); |
|
39 } |
|
40 catch (UnknownHostException e) { |
|
41 } |
|
42 } |
|
43 |
|
44 private Test[] hosts = new Test[] { |
|
45 new Test("", "", false), |
|
46 new Test("localhost", "localhost", true), |
|
47 new Test("127.0.0.1", "localhost", true), |
|
48 new Test("localhost", "127.0.0.1", true), |
|
49 new Test("www.redhat.com", "www.redhat.com", true), |
|
50 new Test("*.redhat.com", "www.redhat.com", true), |
|
51 new Test("www.redhat.com", "*.redhat.com", false), |
|
52 new Test(redhat_com_addr, redhat_com_addr, true), |
|
53 new Test("www.redhat.com", redhat_com_addr, true), |
|
54 new Test(redhat_com_addr, "www.redhat.com", true), |
|
55 new Test("*.redhat.com", redhat_com_addr, true), |
|
56 new Test(redhat_com_addr, "*.redhat.com", false), |
|
57 new Test("209.132.177.50", "209.132.177.51", false), |
|
58 new Test("209.132.177.50", "209.132.178.50", false), |
|
59 new Test("209.132.177.50", "209.130.177.50", false), |
|
60 new Test("209.132.177.50", "208.132.177.50", false), |
|
61 // full uncompressed IPv6 addresses |
|
62 new Test("[FEDC:BA98:7654:3210:FEDC:BA98:7654:3210]", |
|
63 "[FEDC:BA98:7654:3210:FEDC:BA98:7654:3210]", true), |
|
64 new Test("[FEDC:BA98:7654:3210:FEDC:BA98:7654:3210]", |
|
65 "FEDC:BA98:7654:3210:FEDC:BA98:7654:3210", true), |
|
66 new Test("FEDC:BA98:7654:3210:FEDC:BA98:7654:3210", |
|
67 "[FEDC:BA98:7654:3210:FEDC:BA98:7654:3210]", true), |
|
68 new Test("FEDC:BA98:7654:3210:FEDC:BA98:7654:3210", |
|
69 "FEDC:BA98:7654:3210:FEDC:BA98:7654:3210", true), |
|
70 new Test("[FEDC:BA98:7654:3210:FEDC:BA98:7654:3210]", |
|
71 "[fedc:ba98:7654:3210:fedc:ba98:7654:3210]", true), |
|
72 new Test("[FEDC:Bb98:7654:3210:FEDC:BA98:7654:3210]", |
|
73 "[FEDC:BA98:7654:3210:FEDC:BA98:7654:3210]", false), |
|
74 // compressed IPv6 addresses |
|
75 new Test("[1080:0:0:0:8:800:200C:417A]", |
|
76 "[1080:0000:0:0:8:800:200C:417A]", true), |
|
77 new Test("[1080::8:800:200C:417A]", "[1080::8:800:200C:417A]", true), |
|
78 new Test("[1080::8:800:200C:417A]", "[1080::8:800:200C:417a]", true), |
|
79 new Test("[1080::8:800:200C:417A]", "[1080:0:0:0:8:800:200C:417A]", true), |
|
80 new Test("[1080:0:0:0:8:800:200C:417A]", "[1080::8:800:200C:417A]", true), |
|
81 new Test("[1080::8:800:200C:417B]", "[1080:0:0:0:8:800:200C:417A]", false), |
|
82 new Test("[1080:0:0:0:8:800:200C:417A]", "[1080::8:800:200C:417B]", false), |
|
83 new Test("[FF01::101]", "[FF01:0:0:0:0:0:0:101]", true), |
|
84 new Test("[FF01:0:0:0:0:0:0:101]", "[FF01::101]", true), |
|
85 new Test("[::1]", "[0:0:0:0:0:0:0:1]", true), |
|
86 new Test("[0:0:0:0:0:0:0:1]", "[::1]", true), |
|
87 new Test("[::]", "[0:0:0:0:0:0:0:0]", true), |
|
88 new Test("[0:0:0:0:0:0:0:0]", "[::]", true), |
|
89 // alternative IPv6 addresses |
|
90 new Test("[0:0:0:0:0:0:13.1.68.3]", "[0:0:0:0:0:0:13.1.68.3]", true), |
|
91 new Test("[::13.1.68.3]", "[0:0:0:0:0:0:13.1.68.3]", true), |
|
92 new Test("[0:0:0:0:0:0:13.1.68.3]", "[::13.1.68.3]", true), |
|
93 new Test("[::13.1.68.3]", "[::13.1.68.3]", true), |
|
94 new Test("[::13.1.68.3]", "[::D01:4403]", true), |
|
95 new Test("[::D01:4403]", "[::13.1.68.3]", true), |
|
96 new Test("[::D01:4403]", "[::D01:4403]", true), |
|
97 new Test("[::D01:4403]", "[0:0:0:0:0:0:13.1.68.3]", true), |
|
98 new Test("[0:0:0:0:0:0:13.1.68.3]", "[::D01:4403]", true), |
|
99 new Test("[0:0:0:0:0:FFFF:129.144.52.38]", |
|
100 "[0:0:0:0:0:FFFF:129.144.52.38]", true), |
|
101 new Test("[::FFFF:129.144.52.38]", "[0:0:0:0:0:FFFF:129.144.52.38]", true), |
|
102 new Test("[0:0:0:0:0:FFFF:129.144.52.38]", "[::FFFF:129.144.52.38]", true), |
|
103 new Test("[::FFFF:129.144.52.38]", "[::FFFF:129.144.52.38]", true), |
|
104 new Test("[::13.1.68.3]", "[::FFFF:13.1.68.3]", false), |
|
105 new Test("[::FFFF:13.1.68.3]", "[::13.1.68.3]", false), |
|
106 // IPv4-mapped IPv6 addresses |
|
107 new Test("[::FFFF:13.1.68.3]", "13.1.68.3", true), |
|
108 new Test("13.1.68.3", "[::FFFF:13.1.68.3]", true), |
|
109 new Test("[::FFFF:D01:4403]", "13.1.68.3", true), |
|
110 new Test("13.1.68.3", "[::FFFF:D01:4403]", true), |
|
111 new Test("[::13.1.68.3]", "13.1.68.3", false), |
|
112 new Test("13.1.68.3", "[::13.1.68.3]", false), |
|
113 new Test("[::D01:4403]", "13.1.68.3", false), |
|
114 new Test("13.1.68.3", "[::D01:4403]", false), |
|
115 // Unconventional IPv4 addresses |
|
116 new Test("13.1.68.3", "13.1.17411", true), |
|
117 new Test("13.1.17411", "13.1.68.3", true), |
|
118 new Test("13.1.68.3", "13.82947", true), |
|
119 new Test("13.82947", "13.1.68.3", true), |
|
120 new Test("13.1.68.3", "13.82947", true), |
|
121 new Test("13.1.68.3", |
|
122 String.valueOf((13 << 24) + (1 << 16) + (68 << 8) + 3), true), |
|
123 new Test(String.valueOf((13 << 24) + (1 << 16) + (68 << 8) + 3), |
|
124 "13.1.68.3", true), |
|
125 }; |
|
126 |
|
127 private Test[] ports = new Test[] { |
|
128 // no restriction |
|
129 new Test("", "", true), |
|
130 new Test("", ":80", true), |
|
131 new Test("", ":-80", true), |
|
132 new Test("", ":80-", true), |
|
133 new Test("", ":70-90", true), |
|
134 // one port |
|
135 new Test(":80", "", false), |
|
136 new Test(":80", ":70", false), |
|
137 new Test(":80", ":80", true), |
|
138 new Test(":80", ":-80", false), |
|
139 new Test(":80", ":80-", false), |
|
140 new Test(":80", ":70-90", false), |
|
141 new Test(":80", ":80-80", true), |
|
142 new Test(":80", ":90-90", false), |
|
143 // up to and including x |
|
144 new Test(":-80", "", false), |
|
145 new Test(":-80", ":70", true), |
|
146 new Test(":-80", ":80", true), |
|
147 new Test(":-80", ":90", false), |
|
148 new Test(":-80", ":-70", true), |
|
149 new Test(":-80", ":-80", true), |
|
150 new Test(":-80", ":-90", false), |
|
151 new Test(":-80", ":70-", false), |
|
152 new Test(":-80", ":80-", false), |
|
153 new Test(":-80", ":90-", false), |
|
154 new Test(":-80", ":60-70", true), |
|
155 new Test(":-80", ":70-90", false), |
|
156 new Test(":-80", ":90-100", false), |
|
157 new Test(":-80", ":70-70", true), |
|
158 new Test(":-80", ":80-80", true), |
|
159 new Test(":-80", ":90-90", false), |
|
160 // x and above |
|
161 new Test(":80-", "", false), |
|
162 new Test(":80-", ":70", false), |
|
163 new Test(":80-", ":80", true), |
|
164 new Test(":80-", ":90", true), |
|
165 new Test(":80-", ":-70", false), |
|
166 new Test(":80-", ":-80", false), |
|
167 new Test(":80-", ":-90", false), |
|
168 new Test(":80-", ":70-", false), |
|
169 new Test(":80-", ":80-", true), |
|
170 new Test(":80-", ":90-", true), |
|
171 new Test(":80-", ":60-70", false), |
|
172 new Test(":80-", ":70-90", false), |
|
173 new Test(":80-", ":90-100", true), |
|
174 new Test(":80-", ":70-70", false), |
|
175 new Test(":80-", ":80-80", true), |
|
176 new Test(":80-", ":90-90", true), |
|
177 // double-ended range |
|
178 new Test(":75-85", "", false), |
|
179 new Test(":75-85", ":70", false), |
|
180 new Test(":75-85", ":80", true), |
|
181 new Test(":75-85", ":90", false), |
|
182 new Test(":75-85", ":-70", false), |
|
183 new Test(":75-85", ":-80", false), |
|
184 new Test(":75-85", ":-90", false), |
|
185 new Test(":75-85", ":70-", false), |
|
186 new Test(":75-85", ":80-", false), |
|
187 new Test(":75-85", ":90-", false), |
|
188 new Test(":75-85", ":70-80", false), |
|
189 new Test(":75-85", ":75-85", true), |
|
190 new Test(":75-85", ":80-90", false), |
|
191 new Test(":75-85", ":70-90", false), |
|
192 new Test(":75-85", ":70-70", false), |
|
193 new Test(":75-85", ":80-80", true), |
|
194 new Test(":75-85", ":90-90", false), |
|
195 // bit loss |
|
196 new Test(":80", ":65616", false), // 65616 & 0xFFFF = 80 |
|
197 new Test(":80", ":-65456", false), // -65456 & 0xFFFF = 80 |
|
198 // also 4294967376? |
|
199 }; |
|
200 |
|
201 public void test(TestHarness harness) |
|
202 { |
|
203 harness.checkPoint("hostport checking"); |
|
204 harness.check(redhat_com_addr != null); |
|
205 |
|
206 for (int i = 0; i < hosts.length; i++) { |
|
207 for (int j = 0; j < ports.length; j++) { |
|
208 Test test = new Test(hosts[i], ports[j]); |
|
209 |
|
210 SocketPermission px = new SocketPermission(test.x, "connect"); |
|
211 SocketPermission py = new SocketPermission(test.y, "connect"); |
|
212 |
|
213 try { |
|
214 harness.check(px.implies(py) == test.expect, test.x + " should" |
|
215 + (test.expect ? "" : " not") + " imply " + test.y); |
|
216 } |
|
217 catch (Exception e) { |
|
218 harness.check(false, test.x + " implies " + test.y + " failed"); |
|
219 harness.debug(e); |
|
220 } |
|
221 } |
|
222 } |
|
223 |
|
224 harness.checkPoint("actions checking"); |
|
225 for (int i = 1; i < 1 << actions.length; i++) { |
|
226 for (int j = 1; j < 1 << actions.length; j++) { |
|
227 SocketPermission pi = new SocketPermission("localhost", makeAction(i)); |
|
228 SocketPermission pj = new SocketPermission("localhost", makeAction(j)); |
|
229 |
|
230 harness.check(pi.implies(pj) == ((maybeAddResolve(i) & j) == j)); |
|
231 } |
|
232 } |
|
233 } |
|
234 |
|
235 // stuff for hosts checking |
|
236 private static class Test |
|
237 { |
|
238 String x, y; |
|
239 boolean expect; |
|
240 |
|
241 Test(String x, String y, boolean expect) |
|
242 { |
|
243 this.x = x; |
|
244 this.y = y; |
|
245 this.expect = expect; |
|
246 } |
|
247 |
|
248 Test(Test host, Test port) |
|
249 { |
|
250 x = host.x + port.x; |
|
251 y = host.y + port.y; |
|
252 if (x.length() == 0 && y.length() == 0) |
|
253 expect = true; |
|
254 else |
|
255 expect = host.expect && port.expect; |
|
256 } |
|
257 } |
|
258 |
|
259 // stuff for actions checking |
|
260 private static String[] actions = {"accept", "connect", "listen", "resolve"}; |
|
261 private static String makeAction(int mask) |
|
262 { |
|
263 String result = ""; |
|
264 for (int i = 0; i < actions.length; i++) { |
|
265 if ((mask & (1 << i)) != 0) { |
|
266 if (result.length() > 0) |
|
267 result += ","; |
|
268 result += actions[i]; |
|
269 } |
|
270 } |
|
271 return result; |
|
272 } |
|
273 |
|
274 // All other actions imply resolve |
|
275 private static int maybeAddResolve(int mask) |
|
276 { |
|
277 boolean addit = false; |
|
278 int addwhat = 0; |
|
279 |
|
280 for (int i = 0; i < actions.length; i++) { |
|
281 if (actions[i].equals("resolve")) |
|
282 addwhat = 1 << i; |
|
283 else if ((mask & (1 << i)) != 0) |
|
284 addit = true; |
|
285 } |
|
286 if (addit) |
|
287 mask |= addwhat; |
|
288 return mask; |
|
289 } |
|
290 } |
|