blob: 0d3f48ec796238b8e0f35575177b8b3db5cd06c9 [file] [log] [blame]
J. Duke319a3b92007-12-01 00:00:00 +00001/*
2 * Copyright 1999 Sun Microsystems, Inc. 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
20 * CA 95054 USA or visit www.sun.com if you need additional information or
21 * have any questions.
22 */
23
24/**
25 * @test
26 * @bug 4251010
27 * @summary equals does not works on stub objects created with
28 * custom socket AndFactory
29 * @library ../../../testlibrary
30 *
31 * @build VerifyRemoteEquals
32 * @run main/othervm/timeout=40 VerifyRemoteEquals
33 * @author Laird Dornin
34 */
35
36import java.io.*;
37import java.net.*;
38import java.rmi.*;
39import java.rmi.server.*;
40
41/**
42 * Test ensures that a stub that has never been serialized and one
43 * that has can be .equals(). Test also ensures that stubs with
44 * custom socket factories can be .equals() with equivalent stubs.
45 */
46public class VerifyRemoteEquals {
47
48 /**
49 * Remote interface.
50 */
51 public interface Test extends Remote {
52 }
53
54 /**
55 * Implementation of Remote interface passing custom socket
56 * factories
57 */
58 public static final class TestImpl
59 extends UnicastRemoteObject implements Test
60 {
61 public TestImpl() throws RemoteException {
62 super();
63 }
64
65 public TestImpl(RMIClientSocketFactory clientFactory,
66 RMIServerSocketFactory serverFactory)
67 throws RemoteException
68 {
69
70 super(0, clientFactory, serverFactory);
71 }
72
73 public TestImpl(RMISocketFactory factory)
74 throws RemoteException
75 {
76 super(0, factory, factory);
77 }
78 }
79
80 /**
81 * Remote interface for retrieving Test object.
82 */
83 public interface TestHome extends Remote {
84 public Test get() throws RemoteException;
85 }
86
87 /**
88 * Implementation of interface TestHome.
89 */
90 public static final class TestHomeImpl
91 extends UnicastRemoteObject implements TestHome
92 {
93 private Test test;
94
95 public TestHomeImpl(Test test)
96 throws RemoteException {
97
98 super();
99
100 this.test = test;
101 }
102
103 public Test get() {
104 return test;
105 }
106 }
107
108 /**
109 * Custom server socket factory.
110 */
111 public static final class ServerSocketAndFactory
112 extends ServerSocket implements RMIServerSocketFactory, Serializable
113 {
114 ServerSocketAndFactory() throws IOException, java.net.UnknownHostException {
115 // I am forced to do something useless with the parent
116 // constructor
117 super(0);
118 }
119 ServerSocketAndFactory(int port) throws IOException,
120 java.net.UnknownHostException
121 {
122 super(port);
123 }
124
125 public ServerSocket createServerSocket(int port)
126 throws IOException
127 {
128
129 return new ServerSocketAndFactory(port);
130 }
131
132 public int hashCode() {
133 return getLocalPort();
134 }
135
136 public boolean equals(Object obj) {
137 if (obj instanceof ServerSocketAndFactory) {
138 ServerSocketAndFactory ssf = (ServerSocketAndFactory) obj;
139 if (getLocalPort() == ssf.getLocalPort()) {
140 return true;
141 }
142 }
143 return false;
144 }
145 }
146
147 /**
148 * Custom socket factory.
149 */
150 public static final class ClientSocketAndFactory
151 extends Socket implements RMIClientSocketFactory, Serializable
152 {
153 ClientSocketAndFactory() {
154 }
155 ClientSocketAndFactory(String host, int port) throws IOException {
156 super(host, port);
157 }
158
159 public Socket createSocket(String host, int port)
160 throws IOException {
161
162 return new ClientSocketAndFactory(host, port);
163 }
164
165 public int hashCode() {
166 return getPort();
167 }
168
169 public boolean equals(Object obj) {
170
171 if (obj instanceof ClientSocketAndFactory) {
172 ClientSocketAndFactory csf = (ClientSocketAndFactory) obj;
173 if (getPort() == csf.getPort()) {
174 return true;
175 }
176 }
177
178 return false;
179 }
180 }
181
182 public static void main(String[] args) {
183
184 try {
185 System.out.println("\n\nRegression test for, 4251010\n\n");
186
187 Test test = new TestImpl(new ClientSocketAndFactory(),
188 new ServerSocketAndFactory());
189 TestHome home = new TestHomeImpl(test);
190
191 Test test0 = ((Test) RemoteObject.toStub(test));
192 Test test1 = ((TestHome) RemoteObject.toStub(home)).get();
193 Test test2 = ((TestHome) RemoteObject.toStub(home)).get();
194 Test test3 = ((Test) (new MarshalledObject(test)).get());
195
196 if (test0.equals(test1)) {
197 System.out.println("test0, test1, stubs equal");
198 } else {
199 TestLibrary.bomb("test0, test1, stubs not equal");
200 }
201
202 if (test1.equals(test2)) {
203 System.out.println("test1, test2, stubs equal");
204 } else {
205 TestLibrary.bomb("test1, test2, stubs not equal");
206 }
207
208 // explicitly compare an unmarshalled object with toStub
209 // return
210 if (test2.equals(test3)) {
211 System.out.println("test2, test3, stubs equal");
212 } else {
213 TestLibrary.bomb("test2, test3, stubs not equal");
214 }
215
216 test0 = null;
217 test1 = null;
218 test2 = null;
219 test3 = null;
220
221 TestLibrary.unexport(test);
222 TestLibrary.unexport(home);
223
224 System.err.println("test passed: stubs were equal");
225
226 } catch (Exception e) {
227 TestLibrary.bomb("test got unexpected exception", e);
228 }
229 }
230}