| /* |
| * Licensed to the Apache Software Foundation (ASF) under one or more |
| * contributor license agreements. See the NOTICE file distributed with |
| * this work for additional information regarding copyright ownership. |
| * The ASF licenses this file to You under the Apache License, Version 2.0 |
| * (the "License"); you may not use this file except in compliance with |
| * the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| package org.apache.catalina.nonblocking; |
| |
| import java.io.InputStream; |
| import java.io.OutputStream; |
| import java.net.Socket; |
| import java.nio.charset.StandardCharsets; |
| import java.util.HashMap; |
| import java.util.List; |
| import java.util.Map; |
| |
| import javax.net.SocketFactory; |
| import javax.servlet.http.HttpServletResponse; |
| |
| import org.junit.Assert; |
| import org.junit.Test; |
| |
| import org.apache.catalina.nonblocking.TestNonBlockingAPI.DataWriter; |
| import org.apache.catalina.startup.TomcatBaseTest; |
| import org.apache.tomcat.util.buf.ByteChunk; |
| |
| /** |
| * This is not a standard set of unit tests. This is a set of test clients for |
| * AJP support of Servlet 3.1 non-blocking IO. It assumes that there is an httpd |
| * instance listening on localhost:80 that is redirecting all traffic to a |
| * default Tomcat instance of version 8 or above that includes the examples |
| * web application. |
| */ |
| public class TesterAjpNonBlockingClient extends TomcatBaseTest { |
| |
| @Test |
| public void doTestAJPNonBlockingRead() throws Exception { |
| |
| Map<String, List<String>> resHeaders = new HashMap<>(); |
| ByteChunk out = new ByteChunk(); |
| int rc = postUrl(true, new DataWriter(2000), "http://localhost" + |
| "/examples/servlets/nonblocking/bytecounter", |
| out, resHeaders, null); |
| |
| System.out.println(out.toString()); |
| |
| Assert.assertEquals(HttpServletResponse.SC_OK, rc); |
| } |
| |
| |
| @Test |
| public void testNonBlockingWrite() throws Exception { |
| |
| SocketFactory factory = SocketFactory.getDefault(); |
| Socket s = factory.createSocket("localhost", 80); |
| |
| ByteChunk result = new ByteChunk(); |
| OutputStream os = s.getOutputStream(); |
| os.write(("GET /examples/servlets/nonblocking/numberwriter HTTP/1.1\r\n" + |
| "Host: localhost\r\n" + |
| "Connection: close\r\n" + |
| "\r\n").getBytes(StandardCharsets.ISO_8859_1)); |
| os.flush(); |
| |
| InputStream is = s.getInputStream(); |
| byte[] buffer = new byte[8192]; |
| |
| int read = 0; |
| int readSinceLastPause = 0; |
| while (read != -1) { |
| read = is.read(buffer); |
| if (read > 0) { |
| result.append(buffer, 0, read); |
| } |
| readSinceLastPause += read; |
| if (readSinceLastPause > 40000) { |
| readSinceLastPause = 0; |
| Thread.sleep(500); |
| } |
| } |
| |
| os.close(); |
| is.close(); |
| s.close(); |
| |
| // Validate the result |
| String resultString = result.toString(); |
| log.info("Client read " + resultString.length() + " bytes"); |
| |
| System.out.println(resultString); |
| |
| Assert.assertTrue(resultString.contains("00000000000000010000")); |
| } |
| } |