1 /*
2  * Copyright (c) 2003, 2012, 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 {
MySslRMIServerSocketFactory()60         public MySslRMIServerSocketFactory() {
61             super();
62         }
MySslRMIServerSocketFactory(String[] ciphers, String[] protocols, boolean need)63         public MySslRMIServerSocketFactory(String[] ciphers,
64                                            String[] protocols,
65                                            boolean need) {
66             super(ciphers, protocols, need);
67         }
MySslRMIServerSocketFactory(SSLContext context, String[] ciphers, String[] protocols, boolean need)68         public MySslRMIServerSocketFactory(SSLContext context,
69                                            String[] ciphers,
70                                            String[] protocols,
71                                            boolean need) {
72             super(context, ciphers, protocols, need);
73         }
74     }
75 
serializeAndClone(Object o)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 
testEquals(Object a, Object b, boolean expected)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 
main(String[] args)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 }
355