| /* | |
| * Copyright (c) 1997, 2018 Oracle and/or its affiliates. All rights reserved. | |
| * | |
| * This program and the accompanying materials are made available under the | |
| * terms of the Eclipse Public License v. 2.0, which is available at | |
| * http://www.eclipse.org/legal/epl-2.0. | |
| * | |
| * This Source Code may also be made available under the following Secondary | |
| * Licenses when the conditions for such availability set forth in the | |
| * Eclipse Public License v. 2.0 are satisfied: GNU General Public License, | |
| * version 2 with the GNU Classpath Exception, which is available at | |
| * https://www.gnu.org/software/classpath/license.html. | |
| * | |
| * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0 | |
| */ | |
| import java.io.BufferedReader; | |
| import java.io.BufferedWriter; | |
| import java.io.IOException; | |
| import java.io.InputStream; | |
| import java.io.InputStreamReader; | |
| import java.io.OutputStream; | |
| import java.io.OutputStreamWriter; | |
| import java.net.HttpURLConnection; | |
| import java.net.URL; | |
| import java.net.URLEncoder; | |
| import java.util.ArrayList; | |
| import java.util.List; | |
| import java.util.concurrent.Callable; | |
| import java.util.concurrent.CountDownLatch; | |
| import java.util.concurrent.ExecutorService; | |
| import java.util.concurrent.Executors; | |
| import java.util.concurrent.Future; | |
| import java.util.concurrent.TimeUnit; | |
| import com.sun.appserv.test.util.results.SimpleReporterAdapter; | |
| /* | |
| * Unit test for comet: echo. | |
| */ | |
| public class WebTest { | |
| private static final String TEST_NAME = "comet-echo"; | |
| private static final SimpleReporterAdapter stat = new SimpleReporterAdapter("appserv-tests", TEST_NAME); | |
| private String host; | |
| private String port; | |
| private String contextRoot; | |
| public WebTest(String[] args) { | |
| host = args[0]; | |
| port = args[1]; | |
| contextRoot = args[2]; | |
| } | |
| public static void main(String[] args) { | |
| stat.addDescription("Unit test for comet: echo"); | |
| WebTest webTest = new WebTest(args); | |
| webTest.run(); | |
| } | |
| public void run() { | |
| try { | |
| String urlStr = "http://" + host + ":" + port + contextRoot + "/echo"; | |
| int numOfClients = 10; | |
| CountDownLatch startSignal = new CountDownLatch(numOfClients); | |
| CountDownLatch endSignal = new CountDownLatch(numOfClients); | |
| ExecutorService executorService = Executors.newFixedThreadPool(numOfClients); | |
| List<Future<String>> futures = new ArrayList<Future<String>>(); | |
| for (int i = 0; i < numOfClients; i++) { | |
| futures.add(executorService.submit( | |
| new Worker(urlStr, startSignal, endSignal))); | |
| } | |
| System.out.println("Wait to start ..."); | |
| boolean ss = startSignal.await(numOfClients * 2000, TimeUnit.MILLISECONDS); | |
| System.out.println(ss); | |
| String message = "abc"; | |
| System.out.println("Sending message: " + message); | |
| writeMessage(urlStr, message); | |
| System.out.println("Wait to end ..."); | |
| boolean es = endSignal.await(numOfClients * 1000, TimeUnit.MILLISECONDS); | |
| System.out.println(es); | |
| boolean valid = true; | |
| for (Future<String> future : futures) { | |
| String returnedMessage = future.get(1000, TimeUnit.MILLISECONDS); | |
| System.out.println("Got message : " + returnedMessage); | |
| valid = valid && (message.equals(returnedMessage)); | |
| } | |
| executorService.shutdown(); | |
| stat.addStatus(TEST_NAME, ((valid)? stat.PASS : stat.FAIL)); | |
| } catch (Exception ex) { | |
| ex.printStackTrace(); | |
| stat.addStatus(TEST_NAME, stat.FAIL); | |
| } | |
| stat.printSummary(); | |
| } | |
| private void writeMessage(String urlStr, String message) throws Exception { | |
| OutputStream os = null; | |
| BufferedWriter bw = null; | |
| String line = null; | |
| try{ | |
| URL url = new URL(urlStr); | |
| String data = "msg=" + URLEncoder.encode(message); | |
| HttpURLConnection urlConnection = (HttpURLConnection)url.openConnection(); | |
| urlConnection.setRequestMethod("POST"); | |
| urlConnection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); | |
| urlConnection.setDoOutput(true); | |
| urlConnection.connect(); | |
| os = urlConnection.getOutputStream(); | |
| bw = new BufferedWriter(new OutputStreamWriter(os)); | |
| bw.write(data); | |
| bw.flush(); | |
| int statusCode = urlConnection.getResponseCode(); | |
| if (HttpURLConnection.HTTP_OK != statusCode) { | |
| throw new IllegalStateException("Incorrect return code: " + statusCode); | |
| } | |
| } finally { | |
| try { | |
| if (os != null) { | |
| os.close(); | |
| } | |
| } catch(IOException ioe) { | |
| // ignore | |
| } | |
| try { | |
| if (bw != null) { | |
| bw.close(); | |
| } | |
| } catch(IOException ioe) { | |
| // ignore | |
| } | |
| } | |
| } | |
| private static class Worker implements Callable<String> { | |
| private String urlStr; | |
| private CountDownLatch startSignal; | |
| private CountDownLatch endSignal; | |
| public Worker(String urlStr, CountDownLatch startSignal, | |
| CountDownLatch endSignal) throws Exception { | |
| this.urlStr = urlStr; | |
| this.startSignal = startSignal; | |
| this.endSignal = endSignal; | |
| } | |
| public String call() { | |
| String listenMessage; | |
| InputStream is = null; | |
| BufferedReader br = null; | |
| try { | |
| URL url = new URL(urlStr); | |
| HttpURLConnection urlConnection = (HttpURLConnection)url.openConnection(); | |
| urlConnection.setRequestMethod("GET"); | |
| urlConnection.connect(); | |
| is = urlConnection.getInputStream(); | |
| br = new BufferedReader(new InputStreamReader(is)); | |
| // OK message | |
| System.out.println(br.readLine()); | |
| startSignal.countDown(); | |
| listenMessage = br.readLine(); | |
| endSignal.countDown(); | |
| } catch( Exception ex){ | |
| ex.printStackTrace(); | |
| throw new IllegalStateException("Test UNPREDICTED-FAILURE"); | |
| } finally { | |
| try { | |
| if (is != null) { | |
| is.close(); | |
| } | |
| } catch(IOException ioe) { | |
| // ignore | |
| } | |
| try { | |
| if (br != null) { | |
| br.close(); | |
| } | |
| } catch(IOException ioe) { | |
| // ignore | |
| } | |
| } | |
| return listenMessage; | |
| } | |
| } | |
| } |