001: /*
002: * Licensed to the Apache Software Foundation (ASF) under one or more
003: * contributor license agreements. See the NOTICE file distributed with
004: * this work for additional information regarding copyright ownership.
005: * The ASF licenses this file to You under the Apache License, Version 2.0
006: * (the "License"); you may not use this file except in compliance with
007: * the License. You may obtain a copy of the License at
008: *
009: * http://www.apache.org/licenses/LICENSE-2.0
010: *
011: * Unless required by applicable law or agreed to in writing, software
012: * distributed under the License is distributed on an "AS IS" BASIS,
013: * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014: * See the License for the specific language governing permissions and
015: * limitations under the License.
016: */
017:
018: package org.apache.harmony.luni.tests.java.net;
019:
020: public abstract class SocketTestCase extends junit.framework.TestCase {
021:
022: public static final int SO_MULTICAST = 0;
023:
024: public static final int SO_MULTICAST_INTERFACE = 1;
025:
026: public static final int SO_LINGER = 2;
027:
028: public static final int SO_RCVBUF = 3;
029:
030: public static final int SO_TIMEOUT = 4;
031:
032: public static final int SO_SNDBUF = 5;
033:
034: public static final int TCP_NODELAY = 6;
035:
036: public static final int SO_KEEPALIVE = 7;
037:
038: public static final int SO_REUSEADDR = 8;
039:
040: public static final int SO_OOBINLINE = 9;
041:
042: public static final int IP_TOS = 10;
043:
044: public static final int SO_BROADCAST = 11;
045:
046: public static final int SO_USELOOPBACK = 12;
047:
048: public static final String LINUX = "Linux";
049:
050: private static final String osDoesNotSupportOperationString = "The socket does not support the operation";
051:
052: private static final String osDoesNotSupportOptionString = "The socket option is not supported";
053:
054: private static final String osDoesNotSupportOptionArgumentString = "The socket option arguments are invalid";
055:
056: public SocketTestCase() {
057: }
058:
059: public SocketTestCase(String name) {
060: super (name);
061: }
062:
063: /**
064: * Answer whether the OS supports the given socket option.
065: */
066: public boolean getOptionIsSupported(int option) {
067: switch (option) {
068: case SO_RCVBUF:
069: case SO_SNDBUF:
070: return true;
071: case SO_MULTICAST:
072: case SO_MULTICAST_INTERFACE:
073: case SO_LINGER:
074: return true;
075: case TCP_NODELAY:
076: case SO_TIMEOUT:
077: return true;
078: case SO_KEEPALIVE:
079: case SO_REUSEADDR:
080: return true;
081: case SO_OOBINLINE:
082: return true;
083: case IP_TOS:
084: return true;
085: case SO_BROADCAST:
086: return true;
087: case SO_USELOOPBACK:
088: return true;
089: }
090: return false;
091: }
092:
093: /**
094: * If the exception is "socket does not support the operation" exception and
095: * it is expected on the current platform, do nothing. Otherwise, fail the
096: * test.
097: */
098: public void handleException(Exception e, int option) {
099: if (!getOptionIsSupported(option)) {
100: String message = e.getMessage();
101: if (message != null
102: && (message.equals(osDoesNotSupportOperationString)
103: || message
104: .equals(osDoesNotSupportOptionString) || message
105: .equals(osDoesNotSupportOptionArgumentString))) {
106: /*
107: * This exception is the correct behavior for platforms which do
108: * not support the option
109: */
110: } else {
111: fail("Threw \""
112: + e
113: + "\" instead of correct exception for unsupported socket option: "
114: + getSocketOptionString(option));
115: }
116: } else {
117: fail("Exception during test : " + e.getMessage());
118: }
119: }
120:
121: /**
122: * This method should be called at the end of a socket option test's code
123: * but before the exception catch statements. It throws a failure if the
124: * option given is not supported on the current platform but the VM failed
125: * to throw an exception. So, on platforms which do not support the option,
126: * the execution should never get to this method.
127: */
128: public void ensureExceptionThrownIfOptionIsUnsupportedOnOS(
129: int option) {
130: if (!getOptionIsSupported(option)) {
131: String platform = System.getProperty("os.name");
132: String version = System.getProperty("os.version");
133: fail("Failed to throw exception for unsupported socket option: "
134: + getSocketOptionString(option));
135: }
136: }
137:
138: /**
139: * Answer a string for the socket option given.
140: */
141: private String getSocketOptionString(int option) {
142: switch (option) {
143: case SO_MULTICAST:
144: return "Multicast";
145: case SO_LINGER:
146: return "Linger";
147: case SO_RCVBUF:
148: return "Receive buffer size";
149: case SO_TIMEOUT:
150: return "Socket timeout";
151: case SO_SNDBUF:
152: return "Send buffer size";
153: case TCP_NODELAY:
154: return "TCP no delay";
155: case SO_KEEPALIVE:
156: return "Keepalive";
157: case SO_REUSEADDR:
158: return "Reuse address";
159: case SO_OOBINLINE:
160: return "out of band data inline";
161: case IP_TOS:
162: return "Traffic class";
163: case SO_BROADCAST:
164: return "broadcast";
165: case SO_USELOOPBACK:
166: return "loopback";
167: }
168: return "Unknown socket option";
169: }
170:
171: }
|