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 * @summary Unit test for java.net.CookieManager 27 * @bug 6244040 7150552 7051862 28 * @run main/othervm -ea CookieManagerTest 29 * @author Edward Wang 30 */ 31 32 import com.sun.net.httpserver.*; 33 import java.io.IOException; 34 import java.net.*; 35 36 public class CookieManagerTest { 37 38 static CookieTransactionHandler httpTrans; 39 static HttpServer server; 40 41 public static void main(String[] args) throws Exception { 42 startHttpServer(); 43 makeHttpCall(); 44 45 if (httpTrans.badRequest) { 46 throw new RuntimeException("Test failed : bad cookie header"); 47 } 48 checkCookiePolicy(); 49 } 50 51 public static void startHttpServer() throws IOException { 52 httpTrans = new CookieTransactionHandler(); 53 server = HttpServer.create(new InetSocketAddress(0), 0); 54 server.createContext("/", httpTrans); 55 server.start(); 56 } 57 58 /* 59 * Checks if CookiePolicy.ACCEPT_ORIGINAL_SERVER#shouldAccept() 60 * returns false for null arguments 61 */ 62 private static void checkCookiePolicy() throws Exception { 63 CookiePolicy cp = CookiePolicy.ACCEPT_ORIGINAL_SERVER; 64 boolean retVal; 65 retVal = cp.shouldAccept(null, null); 66 checkValue(retVal); 67 retVal = cp.shouldAccept(null, new HttpCookie("CookieName", "CookieVal")); 68 checkValue(retVal); 69 retVal = cp.shouldAccept((new URL("http", "localhost", 2345, "/")).toURI(), 70 null); 71 checkValue(retVal); 72 } 73 74 private static void checkValue(boolean val) { 75 if (val) 76 throw new RuntimeException("Return value is not false!"); 77 } 78 79 public static void makeHttpCall() throws IOException { 80 try { 81 System.out.println("http server listenining on: " 82 + server.getAddress().getPort()); 83 84 // install CookieManager to use 85 CookieHandler.setDefault(new CookieManager()); 86 87 for (int i = 0; i < CookieTransactionHandler.testCount; i++) { 88 System.out.println("====== CookieManager test " + (i+1) 89 + " ======"); 90 ((CookieManager)CookieHandler.getDefault()) 91 .setCookiePolicy(CookieTransactionHandler.testPolicies[i]); 92 ((CookieManager)CookieHandler.getDefault()) 93 .getCookieStore().removeAll(); 94 URL url = new URL("http" , 95 InetAddress.getLocalHost().getHostAddress(), 96 server.getAddress().getPort(), 97 CookieTransactionHandler.testCases[i][0] 98 .serverPath); 99 HttpURLConnection uc = (HttpURLConnection)url.openConnection(); 100 uc.getResponseCode(); 101 uc.disconnect(); 102 } 103 } finally { 104 server.stop(0); 105 } 106 } 107 } 108 109 class CookieTransactionHandler implements HttpHandler { 110 111 private int testcaseDone = 0; 112 private int testDone = 0; 113 114 public static boolean badRequest = false; 115 // the main test control logic will also loop exactly this number 116 // to send http request 117 public static final int testCount = 6; 118 119 private String localHostAddr = "127.0.0.1"; 120 121 @Override 122 public void handle(HttpExchange exchange) throws IOException { 123 if (testDone < testCases[testcaseDone].length) { 124 // still have other tests to run, 125 // check the Cookie header and then redirect it 126 if (testDone > 0) checkRequest(exchange.getRequestHeaders()); 127 exchange.getResponseHeaders().add("Location", 128 testCases[testcaseDone][testDone].serverPath); 129 exchange.getResponseHeaders() 130 .add(testCases[testcaseDone][testDone].headerToken, 131 testCases[testcaseDone][testDone].cookieToSend); 132 exchange.sendResponseHeaders(302, -1); 133 testDone++; 134 } else { 135 // the last test of this test case 136 if (testDone > 0) checkRequest(exchange.getRequestHeaders()); 137 testcaseDone++; 138 testDone = 0; 139 exchange.sendResponseHeaders(200, -1); 140 } 171 cookieToSend = cts; 172 cookieToRecv = ctr; 173 serverPath = sp; 174 } 175 }; 176 177 /* 178 * these two must match each other, 179 * i.e. testCases.length == testPolicies.length 180 */ 181 182 // the test cases to run; each test case may contain multiple roundtrips 183 public static CookieTestCase[][] testCases = null; 184 // indicates what CookiePolicy to use with each test cases 185 public static CookiePolicy[] testPolicies = null; 186 187 CookieTransactionHandler() { 188 testCases = new CookieTestCase[testCount][]; 189 testPolicies = new CookiePolicy[testCount]; 190 191 try { 192 localHostAddr = InetAddress.getLocalHost().getHostAddress(); 193 } catch (Exception ignored) { 194 }; 195 int count = 0; 196 197 // an http session with Netscape cookies exchanged 198 testPolicies[count] = CookiePolicy.ACCEPT_ORIGINAL_SERVER; 199 testCases[count++] = new CookieTestCase[]{ 200 new CookieTestCase("Set-Cookie", 201 "CUSTOMER=WILE:BOB; " + 202 "path=/; expires=Sat, 09-Nov-2030 23:12:40 GMT;" + "domain=." + 203 localHostAddr, 204 "CUSTOMER=WILE:BOB", 205 "/" 206 ), 207 new CookieTestCase("Set-Cookie", 208 "PART_NUMBER=ROCKET_LAUNCHER_0001; path=/;" + "domain=." + localHostAddr, 209 "CUSTOMER=WILE:BOB; PART_NUMBER=ROCKET_LAUNCHER_0001", 210 "/" 211 ), 212 new CookieTestCase("Set-Cookie", 213 "SHIPPING=FEDEX; path=/foo;" + "domain=." + localHostAddr, 214 "CUSTOMER=WILE:BOB; PART_NUMBER=ROCKET_LAUNCHER_0001", | 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 * @summary Unit test for java.net.CookieManager 27 * @bug 6244040 7150552 7051862 28 * @modules jdk.httpserver 29 * @run main/othervm -ea CookieManagerTest 30 * @author Edward Wang 31 */ 32 33 import com.sun.net.httpserver.*; 34 import java.io.IOException; 35 import java.net.*; 36 import static java.net.Proxy.NO_PROXY; 37 38 public class CookieManagerTest { 39 40 static CookieTransactionHandler httpTrans; 41 static HttpServer server; 42 43 static final String hostAddress = getAddr(); 44 45 /** Returns an IP literal suitable for use by the test. */ 46 static String getAddr() { 47 try { 48 InetAddress lh = InetAddress.getLocalHost(); 49 System.out.println("Trying: " + lh); 50 if (lh.isReachable(5_000)) { 51 System.out.println("Using: " + lh); 52 return lh.getHostAddress(); 53 } 54 } catch (IOException x) { 55 System.out.println("Debug: caught:" + x); 56 } 57 System.out.println("Using: \"127.0.0.1\""); 58 return "127.0.0.1"; 59 } 60 61 public static void main(String[] args) throws Exception { 62 startHttpServer(); 63 makeHttpCall(); 64 65 if (httpTrans.badRequest) { 66 throw new RuntimeException("Test failed : bad cookie header"); 67 } 68 checkCookiePolicy(); 69 } 70 71 public static void startHttpServer() throws IOException { 72 httpTrans = new CookieTransactionHandler(); 73 server = HttpServer.create(new InetSocketAddress(0), 0); 74 server.createContext("/", httpTrans); 75 server.start(); 76 } 77 78 /* 79 * Checks if CookiePolicy.ACCEPT_ORIGINAL_SERVER#shouldAccept() 80 * returns false for null arguments 81 */ 82 private static void checkCookiePolicy() throws Exception { 83 CookiePolicy cp = CookiePolicy.ACCEPT_ORIGINAL_SERVER; 84 boolean retVal; 85 retVal = cp.shouldAccept(null, null); 86 checkValue(retVal); 87 retVal = cp.shouldAccept(null, new HttpCookie("CookieName", "CookieVal")); 88 checkValue(retVal); 89 retVal = cp.shouldAccept((new URL("http", "localhost", 2345, "/")).toURI(), 90 null); 91 checkValue(retVal); 92 } 93 94 private static void checkValue(boolean val) { 95 if (val) 96 throw new RuntimeException("Return value is not false!"); 97 } 98 99 public static void makeHttpCall() throws IOException { 100 try { 101 int port = server.getAddress().getPort(); 102 System.out.println("http server listenining on: " + port); 103 104 // install CookieManager to use 105 CookieHandler.setDefault(new CookieManager()); 106 107 for (int i = 0; i < CookieTransactionHandler.testCount; i++) { 108 System.out.println("====== CookieManager test " + (i+1) 109 + " ======"); 110 ((CookieManager)CookieHandler.getDefault()) 111 .setCookiePolicy(CookieTransactionHandler.testPolicies[i]); 112 ((CookieManager)CookieHandler.getDefault()) 113 .getCookieStore().removeAll(); 114 URL url = new URL("http" , 115 hostAddress, 116 server.getAddress().getPort(), 117 CookieTransactionHandler.testCases[i][0] 118 .serverPath); 119 System.out.println("Requesting " + url); 120 HttpURLConnection uc = (HttpURLConnection)url.openConnection(NO_PROXY); 121 uc.getResponseCode(); 122 uc.disconnect(); 123 } 124 } finally { 125 server.stop(0); 126 } 127 } 128 } 129 130 class CookieTransactionHandler implements HttpHandler { 131 132 private int testcaseDone = 0; 133 private int testDone = 0; 134 135 public static boolean badRequest = false; 136 // the main test control logic will also loop exactly this number 137 // to send http request 138 public static final int testCount = 6; 139 140 @Override 141 public void handle(HttpExchange exchange) throws IOException { 142 if (testDone < testCases[testcaseDone].length) { 143 // still have other tests to run, 144 // check the Cookie header and then redirect it 145 if (testDone > 0) checkRequest(exchange.getRequestHeaders()); 146 exchange.getResponseHeaders().add("Location", 147 testCases[testcaseDone][testDone].serverPath); 148 exchange.getResponseHeaders() 149 .add(testCases[testcaseDone][testDone].headerToken, 150 testCases[testcaseDone][testDone].cookieToSend); 151 exchange.sendResponseHeaders(302, -1); 152 testDone++; 153 } else { 154 // the last test of this test case 155 if (testDone > 0) checkRequest(exchange.getRequestHeaders()); 156 testcaseDone++; 157 testDone = 0; 158 exchange.sendResponseHeaders(200, -1); 159 } 190 cookieToSend = cts; 191 cookieToRecv = ctr; 192 serverPath = sp; 193 } 194 }; 195 196 /* 197 * these two must match each other, 198 * i.e. testCases.length == testPolicies.length 199 */ 200 201 // the test cases to run; each test case may contain multiple roundtrips 202 public static CookieTestCase[][] testCases = null; 203 // indicates what CookiePolicy to use with each test cases 204 public static CookiePolicy[] testPolicies = null; 205 206 CookieTransactionHandler() { 207 testCases = new CookieTestCase[testCount][]; 208 testPolicies = new CookiePolicy[testCount]; 209 210 String localHostAddr = CookieManagerTest.hostAddress; 211 212 int count = 0; 213 214 // an http session with Netscape cookies exchanged 215 testPolicies[count] = CookiePolicy.ACCEPT_ORIGINAL_SERVER; 216 testCases[count++] = new CookieTestCase[]{ 217 new CookieTestCase("Set-Cookie", 218 "CUSTOMER=WILE:BOB; " + 219 "path=/; expires=Sat, 09-Nov-2030 23:12:40 GMT;" + "domain=." + 220 localHostAddr, 221 "CUSTOMER=WILE:BOB", 222 "/" 223 ), 224 new CookieTestCase("Set-Cookie", 225 "PART_NUMBER=ROCKET_LAUNCHER_0001; path=/;" + "domain=." + localHostAddr, 226 "CUSTOMER=WILE:BOB; PART_NUMBER=ROCKET_LAUNCHER_0001", 227 "/" 228 ), 229 new CookieTestCase("Set-Cookie", 230 "SHIPPING=FEDEX; path=/foo;" + "domain=." + localHostAddr, 231 "CUSTOMER=WILE:BOB; PART_NUMBER=ROCKET_LAUNCHER_0001", |