tests/libjava-mauve/src/gnu/testlet/java/net/SocketPermission/implies.java
branchjk_new_structure
changeset 1541 75c2e24dea9a
parent 1540 92ac284961c1
child 1542 be11db817bcf
equal deleted inserted replaced
1540:92ac284961c1 1541:75c2e24dea9a
     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 }