| /* | 
 |  * 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; | 
 |         } | 
 |     } | 
 | } |