1 /*
2  *  Licensed to the Apache Software Foundation (ASF) under one or more
3  *  contributor license agreements.  See the NOTICE file distributed with
4  *  this work for additional information regarding copyright ownership.
5  *  The ASF licenses this file to You under the Apache License, Version 2.0
6  *  (the "License"); you may not use this file except in compliance with
7  *  the License.  You may obtain a copy of the License at
8  *
9  *     http://www.apache.org/licenses/LICENSE-2.0
10  *
11  *  Unless required by applicable law or agreed to in writing, software
12  *  distributed under the License is distributed on an "AS IS" BASIS,
13  *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  *  See the License for the specific language governing permissions and
15  *  limitations under the License.
16  */
17 
18 package libcore.java.net;
19 
20 import libcore.junit.junit3.TestCaseWithRules;
21 import libcore.junit.util.ResourceLeakageDetector;
22 import org.junit.Rule;
23 import org.junit.rules.TestRule;
24 
25 public abstract class OldSocketTestCase extends TestCaseWithRules {
26     @Rule
27     public TestRule guardRule = ResourceLeakageDetector.getRule();
28 
29     public static final int SO_MULTICAST = 0;
30 
31     public static final int SO_MULTICAST_INTERFACE = 1;
32 
33     public static final int SO_LINGER = 2;
34 
35     public static final int SO_RCVBUF = 3;
36 
37     public static final int SO_TIMEOUT = 4;
38 
39     public static final int SO_SNDBUF = 5;
40 
41     public static final int TCP_NODELAY = 6;
42 
43     public static final int SO_KEEPALIVE = 7;
44 
45     public static final int SO_REUSEADDR = 8;
46 
47     public static final int SO_OOBINLINE = 9;
48 
49     public static final int IP_TOS = 10;
50 
51     public static final int SO_BROADCAST = 11;
52 
53     public static final int SO_USELOOPBACK = 12;
54 
55     private static final String osDoesNotSupportOperationString = "The socket does not support the operation";
56 
57     private static final String osDoesNotSupportOptionString = "The socket option is not supported";
58 
59     private static final String osDoesNotSupportOptionArgumentString = "The socket option arguments are invalid";
60 
61     /**
62      * Answer whether the OS supports the given socket option.
63      */
getOptionIsSupported(int option)64     public boolean getOptionIsSupported(int option) {
65         switch (option) {
66         case SO_RCVBUF:
67         case SO_SNDBUF:
68             return true;
69         case SO_MULTICAST:
70         case SO_MULTICAST_INTERFACE:
71         case SO_LINGER:
72             return true;
73         case TCP_NODELAY:
74         case SO_TIMEOUT:
75             return true;
76         case SO_KEEPALIVE:
77         case SO_REUSEADDR:
78             return true;
79         case SO_OOBINLINE:
80             return true;
81         case IP_TOS:
82             return true;
83         case SO_BROADCAST:
84             return true;
85         case SO_USELOOPBACK:
86             return true;
87         }
88         return false;
89     }
90 
91     /**
92      * If the exception is "socket does not support the operation" exception and
93      * it is expected on the current platform, do nothing. Otherwise, fail the
94      * test.
95      */
handleException(Exception e, int option)96     public void handleException(Exception e, int option) {
97         if (!getOptionIsSupported(option)) {
98             String message = e.getMessage();
99             if (message != null
100                     && (message.equals(osDoesNotSupportOperationString)
101                             || message.equals(osDoesNotSupportOptionString) || message
102                             .equals(osDoesNotSupportOptionArgumentString))) {
103                 /*
104                  * This exception is the correct behavior for platforms which do
105                  * not support the option
106                  */
107             } else {
108                 fail("Threw \""
109                         + e
110                         + "\" instead of correct exception for unsupported socket option: "
111                         + getSocketOptionString(option));
112             }
113         } else {
114             fail("Exception during test : " + e.getMessage());
115         }
116     }
117 
118     /**
119      * This method should be called at the end of a socket option test's code
120      * but before the exception catch statements. It throws a failure if the
121      * option given is not supported on the current platform but the VM failed
122      * to throw an exception. So, on platforms which do not support the option,
123      * the execution should never get to this method.
124      */
ensureExceptionThrownIfOptionIsUnsupportedOnOS(int option)125     public void ensureExceptionThrownIfOptionIsUnsupportedOnOS(int option) {
126         if (!getOptionIsSupported(option)) {
127             fail("Failed to throw exception for unsupported socket option: "
128                     + getSocketOptionString(option));
129         }
130     }
131 
132     /**
133      * Answer a string for the socket option given.
134      */
getSocketOptionString(int option)135     private String getSocketOptionString(int option) {
136         switch (option) {
137         case SO_MULTICAST:
138             return "Multicast";
139         case SO_LINGER:
140             return "Linger";
141         case SO_RCVBUF:
142             return "Receive buffer size";
143         case SO_TIMEOUT:
144             return "Socket timeout";
145         case SO_SNDBUF:
146             return "Send buffer size";
147         case TCP_NODELAY:
148             return "TCP no delay";
149         case SO_KEEPALIVE:
150             return "Keepalive";
151         case SO_REUSEADDR:
152             return "Reuse address";
153         case SO_OOBINLINE:
154             return "out of band data inline";
155         case IP_TOS:
156             return "Traffic class";
157         case SO_BROADCAST:
158             return "broadcast";
159         case SO_USELOOPBACK:
160             return "loopback";
161         }
162         return "Unknown socket option";
163     }
164 
165 }
166