1 /*
   2  * Copyright (c) 2003, 2007, Oracle and/or its affiliates. All rights reserved.
   3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   4  *
   5  * This code is free software; you can redistribute it and/or modify it
   6  * under the terms of the GNU General Public License version 2 only, as
   7  * published by the Free Software Foundation.
   8  *
   9  * This code is distributed in the hope that it will be useful, but WITHOUT
  10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  12  * version 2 for more details (a copy is included in the LICENSE file that
  13  * accompanied this code).
  14  *
  15  * You should have received a copy of the GNU General Public License version
  16  * 2 along with this work; if not, write to the Free Software Foundation,
  17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  18  *
  19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  20  * or visit www.oracle.com if you need additional information or have any
  21  * questions.
  22  */
  23 
  24 /*
  25  * @test
  26  * @bug 4932837 6582235
  27  * @summary Test SslRMI[Client|Server]SocketFactory equals() and hashCode().
  28  * @author Daniel Fuchs
  29  *
  30  * @run main SocketFactoryTest
  31  */
  32 
  33 import java.io.PrintWriter;
  34 import java.io.IOException;
  35 import java.io.Serializable;
  36 import java.io.ObjectInputStream;
  37 import java.io.ObjectOutputStream;
  38 import java.io.ByteArrayInputStream;
  39 import java.io.ByteArrayOutputStream;
  40 import java.util.Map;
  41 import java.util.HashMap;
  42 import javax.net.ssl.SSLContext;
  43 import javax.rmi.ssl.SslRMIClientSocketFactory;
  44 import javax.rmi.ssl.SslRMIServerSocketFactory;
  45 
  46 public class SocketFactoryTest {
  47 
  48     public static final String[] ciphersuite =
  49         new String[] { "SSL_RSA_WITH_NULL_MD5" };
  50 
  51     public static final String[] protocol =
  52         new String[] { "TLSv1" };
  53 
  54     public static class MySslRMIClientSocketFactory
  55         extends SslRMIClientSocketFactory {
  56     }
  57 
  58     public static class MySslRMIServerSocketFactory
  59         extends SslRMIServerSocketFactory {
  60         public MySslRMIServerSocketFactory() {
  61             super();
  62         }
  63         public MySslRMIServerSocketFactory(String[] ciphers,
  64                                            String[] protocols,
  65                                            boolean need) {
  66             super(ciphers, protocols, need);
  67         }
  68         public MySslRMIServerSocketFactory(SSLContext context,
  69                                            String[] ciphers,
  70                                            String[] protocols,
  71                                            boolean need) {
  72             super(context, ciphers, protocols, need);
  73         }
  74     }
  75 
  76     public static Object serializeAndClone(Object o) throws Exception {
  77         System.out.println("Serializing object: " + o);
  78         final ByteArrayOutputStream obytes =
  79             new ByteArrayOutputStream();
  80         final ObjectOutputStream ostr =
  81             new ObjectOutputStream(obytes);
  82         ostr.writeObject(o);
  83         ostr.flush();
  84 
  85         System.out.println("Deserializing object");
  86         final ByteArrayInputStream ibytes =
  87             new ByteArrayInputStream(obytes.toByteArray());
  88         final ObjectInputStream istr =
  89             new ObjectInputStream(ibytes);
  90         return istr.readObject();
  91     }
  92 
  93     public static void testEquals(Object a, Object b, boolean expected) {
  94         final boolean found = a.equals(b);
  95         if (found != expected)
  96             throw new RuntimeException("testEquals failed: objects are " +
  97                                        ((found)?"equals":"not equals"));
  98         if (found && a.hashCode()!=b.hashCode())
  99             throw new RuntimeException("testEquals failed: objects are " +
 100                                        "equals but their hashcode differ");
 101     }
 102 
 103     public static void main(String[] args) {
 104         try {
 105             System.out.println("SocketFactoryTest START.");
 106 
 107             final SSLContext context = SSLContext.getInstance("SSL");
 108             context.init(null, null, null);
 109 
 110             final SslRMIClientSocketFactory client1 =
 111                 new SslRMIClientSocketFactory();
 112             final SslRMIClientSocketFactory client2 =
 113                 new SslRMIClientSocketFactory();
 114             final SslRMIClientSocketFactory client11 =
 115                 (SslRMIClientSocketFactory) serializeAndClone(client1);
 116             final SslRMIClientSocketFactory client21 =
 117                 (SslRMIClientSocketFactory) serializeAndClone(client2);
 118             final SslRMIServerSocketFactory server1 =
 119                 new SslRMIServerSocketFactory();
 120             final SslRMIServerSocketFactory server2 =
 121                 new SslRMIServerSocketFactory(null,
 122                                               null,
 123                                               false);
 124             final SslRMIServerSocketFactory server3 =
 125                 new SslRMIServerSocketFactory(ciphersuite,
 126                                               null,
 127                                               false);
 128             final SslRMIServerSocketFactory server4 =
 129                 new SslRMIServerSocketFactory(null,
 130                                               protocol,
 131                                               false);
 132             final SslRMIServerSocketFactory server5 =
 133                 new SslRMIServerSocketFactory(null,
 134                                               null,
 135                                               true);
 136             final SslRMIServerSocketFactory server6 =
 137                 new SslRMIServerSocketFactory(null,
 138                                               null,
 139                                               null,
 140                                               false);
 141             final SslRMIServerSocketFactory server7 =
 142                 new SslRMIServerSocketFactory(SSLContext.getDefault(),
 143                                               null,
 144                                               null,
 145                                               false);
 146             final SslRMIServerSocketFactory server8 =
 147                 new SslRMIServerSocketFactory(null,
 148                                               null,
 149                                               null,
 150                                               true);
 151             final SslRMIServerSocketFactory server9 =
 152                 new SslRMIServerSocketFactory(SSLContext.getDefault(),
 153                                               null,
 154                                               null,
 155                                               true);
 156             final SslRMIServerSocketFactory server10 =
 157                 new SslRMIServerSocketFactory(context,
 158                                               null,
 159                                               null,
 160                                               true);
 161             final MySslRMIClientSocketFactory subclient1 =
 162                 new MySslRMIClientSocketFactory();
 163             final MySslRMIClientSocketFactory subclient2 =
 164                 new MySslRMIClientSocketFactory();
 165             final MySslRMIServerSocketFactory subserver1 =
 166                 new MySslRMIServerSocketFactory();
 167             final MySslRMIServerSocketFactory subserver2 =
 168                 new MySslRMIServerSocketFactory(null,
 169                                                 null,
 170                                                 false);
 171             final MySslRMIServerSocketFactory subserver3 =
 172                 new MySslRMIServerSocketFactory(ciphersuite,
 173                                                 null,
 174                                                 false);
 175             final MySslRMIServerSocketFactory subserver4 =
 176                 new MySslRMIServerSocketFactory(null,
 177                                                 protocol,
 178                                                 false);
 179             final MySslRMIServerSocketFactory subserver5 =
 180                 new MySslRMIServerSocketFactory(null,
 181                                                 null,
 182                                                 true);
 183             final MySslRMIServerSocketFactory subserver6 =
 184                 new MySslRMIServerSocketFactory(null,
 185                                                 ciphersuite,
 186                                                 null,
 187                                                 false);
 188             final MySslRMIServerSocketFactory subserver7 =
 189                 new MySslRMIServerSocketFactory(SSLContext.getDefault(),
 190                                                 ciphersuite,
 191                                                 null,
 192                                                 false);
 193             final MySslRMIServerSocketFactory subserver8 =
 194                 new MySslRMIServerSocketFactory(context,
 195                                                 null,
 196                                                 null,
 197                                                 true);
 198 
 199             // clients
 200             System.out.println("testEquals(client1,client1,true)");
 201             testEquals(client1,client1,true);
 202             System.out.println("testEquals(client1,client2,true)");
 203             testEquals(client1,client2,true);
 204             System.out.println("testEquals(client1,client11,true)");
 205             testEquals(client1,client11,true);
 206             System.out.println("testEquals(client1,client21,true)");
 207             testEquals(client1,client21,true);
 208             System.out.println("testEquals(client11,client21,true)");
 209             testEquals(client11,client21,true);
 210             System.out.println("testEquals(client1,null,false)");
 211             testEquals(client1,null,false);
 212             System.out.println("testEquals(client1,server1,false)");
 213             testEquals(client1,server1,false);
 214             System.out.println("testEquals(client21,server2,false)");
 215             testEquals(client21,server2,false);
 216             System.out.println("testEquals(client1,new Object(),false)");
 217             testEquals(client1,new Object(),false);
 218 
 219             // servers
 220             System.out.println("testEquals(server1,server1,true)");
 221             testEquals(server1,server1,true);
 222             System.out.println("testEquals(server2,server2,true)");
 223             testEquals(server2,server2,true);
 224             System.out.println("testEquals(server3,server3,true)");
 225             testEquals(server3,server3,true);
 226             System.out.println("testEquals(server4,server4,true)");
 227             testEquals(server4,server4,true);
 228             System.out.println("testEquals(server5,server5,true)");
 229             testEquals(server5,server5,true);
 230             System.out.println("testEquals(server1,server2,true)");
 231             testEquals(server1,server2,true);
 232             System.out.println("testEquals(server1,server3,false)");
 233             testEquals(server1,server3,false);
 234             System.out.println("testEquals(server2,server3,false)");
 235             testEquals(server2,server3,false);
 236             System.out.println("testEquals(server3,server4,false)");
 237             testEquals(server3,server4,false);
 238             System.out.println("testEquals(server4,server5,false)");
 239             testEquals(server4,server5,false);
 240             System.out.println("testEquals(server6,server7,false)");
 241             testEquals(server6,server7,false);
 242             System.out.println("testEquals(server8,server9,false)");
 243             testEquals(server8,server9,false);
 244             System.out.println("testEquals(server9,server10,false)");
 245             testEquals(server9,server10,false);
 246             System.out.println("testEquals(server2,server6,true)");
 247             testEquals(server2,server6,true);
 248             System.out.println("testEquals(server2,server7,false)");
 249             testEquals(server2,server7,false);
 250             System.out.println("testEquals(server5,server8,true)");
 251             testEquals(server5,server8,true);
 252             System.out.println("testEquals(server5,server9,false)");
 253             testEquals(server5,server9,false);
 254             System.out.println("testEquals(server1,null,false)");
 255             testEquals(server1,null,false);
 256             System.out.println("testEquals(server2,null,false)");
 257             testEquals(server2,null,false);
 258             System.out.println("testEquals(server3,null,false)");
 259             testEquals(server3,null,false);
 260             System.out.println("testEquals(server1,client2,false)");
 261             testEquals(server1,client2,false);
 262             System.out.println("testEquals(server2,client11,false)");
 263             testEquals(server2,client11,false);
 264             System.out.println("testEquals(server1,new Object(),false)");
 265             testEquals(server1,new Object(),false);
 266 
 267             // client subclass
 268             System.out.println("testEquals(subclient1,subclient1,true)");
 269             testEquals(subclient1,subclient1,true);
 270             System.out.println("testEquals(subclient1,subclient2,true)");
 271             testEquals(subclient1,subclient2,true);
 272             System.out.println("testEquals(subclient1,client1,false)");
 273             testEquals(subclient1,client1,false);
 274             System.out.println("testEquals(client1,subclient1,false)");
 275             testEquals(client1,subclient1,false);
 276             System.out.println("testEquals(subclient1,null,false)");
 277             testEquals(subclient1,null,false);
 278             System.out.println("testEquals(subclient1,server1,false)");
 279             testEquals(subclient1,server1,false);
 280             System.out.println("testEquals(server1,subclient1,false)");
 281             testEquals(server1,subclient1,false);
 282             System.out.println("testEquals(subclient2,subserver2,false)");
 283             testEquals(subclient1,subserver2,false);
 284             System.out.println("testEquals(subclient1,new Object(),false)");
 285             testEquals(subclient1,new Object(),false);
 286 
 287             // server subclass
 288             System.out.println("testEquals(subserver1,subserver1,true)");
 289             testEquals(subserver1,subserver1,true);
 290             System.out.println("testEquals(subserver2,subserver2,true)");
 291             testEquals(subserver2,subserver2,true);
 292             System.out.println("testEquals(subserver3,subserver3,true)");
 293             testEquals(subserver3,subserver3,true);
 294             System.out.println("testEquals(subserver4,subserver4,true)");
 295             testEquals(subserver4,subserver4,true);
 296             System.out.println("testEquals(subserver5,subserver5,true)");
 297             testEquals(subserver5,subserver5,true);
 298             System.out.println("testEquals(subserver1,subserver2,true)");
 299             testEquals(subserver1,subserver2,true);
 300             System.out.println("testEquals(subserver1,subserver3,false)");
 301             testEquals(subserver1,subserver3,false);
 302             System.out.println("testEquals(subserver2,subserver3,false)");
 303             testEquals(subserver2,subserver3,false);
 304             System.out.println("testEquals(subserver3,subserver4,false)");
 305             testEquals(subserver3,subserver4,false);
 306             System.out.println("testEquals(subserver4,subserver5,false)");
 307             testEquals(subserver4,subserver5,false);
 308             System.out.println("testEquals(subserver3,subserver6,true)");
 309             testEquals(subserver3,subserver6,true);
 310             System.out.println("testEquals(subserver3,subserver7,false)");
 311             testEquals(subserver3,subserver7,false);
 312             System.out.println("testEquals(subserver1,server1,false)");
 313             testEquals(subserver1,server1,false);
 314             System.out.println("testEquals(server1,subserver1,false)");
 315             testEquals(server1,subserver1,false);
 316             System.out.println("testEquals(subserver2,server2,false)");
 317             testEquals(subserver2,server2,false);
 318             System.out.println("testEquals(server2,subserver2,false)");
 319             testEquals(server2,subserver2,false);
 320             System.out.println("testEquals(subserver3,server3,false)");
 321             testEquals(subserver3,server3,false);
 322             System.out.println("testEquals(server3,subserver3,false)");
 323             testEquals(server3,subserver3,false);
 324             System.out.println("testEquals(subserver4,server4,false)");
 325             testEquals(subserver4,server4,false);
 326             System.out.println("testEquals(server4,subserver4,false)");
 327             testEquals(server4,subserver4,false);
 328             System.out.println("testEquals(subserver5,server5,false)");
 329             testEquals(subserver5,server5,false);
 330             System.out.println("testEquals(server5,subserver5,false)");
 331             testEquals(server5,subserver5,false);
 332             System.out.println("testEquals(server10,subserver8,false)");
 333             testEquals(server10,subserver8,false);
 334             System.out.println("testEquals(subserver8,server10,false)");
 335             testEquals(subserver8,server10,false);
 336             System.out.println("testEquals(subserver1,null,false)");
 337             testEquals(subserver1,null,false);
 338             System.out.println("testEquals(subserver1,client2,false)");
 339             testEquals(subserver1,client2,false);
 340             System.out.println("testEquals(subserver1,subclient2,false)");
 341             testEquals(subserver1,subclient2,false);
 342             System.out.println("testEquals(client1,subserver2,false)");
 343             testEquals(client1,subserver2,false);
 344             System.out.println("testEquals(subserver1,new Object(),false)");
 345             testEquals(subserver1,new Object(),false);
 346 
 347             System.out.println("SocketFactoryTest PASSED.");
 348         } catch (Exception x) {
 349             System.out.println("SocketFactoryTest FAILED: " + x);
 350             x.printStackTrace();
 351             System.exit(1);
 352         }
 353     }
 354 }