You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by ma...@apache.org on 2023/01/20 19:04:55 UTC
[tomcat] 06/12: Remove RFC 7450 priorities tests
This is an automated email from the ASF dual-hosted git repository.
markt pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/tomcat.git
commit fb22e14158226b6074c2af636725f38f0b0ae44d
Author: Mark Thomas <ma...@apache.org>
AuthorDate: Tue Dec 6 19:45:04 2022 +0000
Remove RFC 7450 priorities tests
---
.../apache/coyote/http2/TestAbstractStream.java | 407 ---------------------
.../apache/coyote/http2/TestHttp2Section_5_3.java | 258 -------------
2 files changed, 665 deletions(-)
diff --git a/test/org/apache/coyote/http2/TestAbstractStream.java b/test/org/apache/coyote/http2/TestAbstractStream.java
deleted file mode 100644
index 79dca9ab23..0000000000
--- a/test/org/apache/coyote/http2/TestAbstractStream.java
+++ /dev/null
@@ -1,407 +0,0 @@
-/*
- * 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.coyote.http2;
-
-import java.io.IOException;
-import java.nio.ByteBuffer;
-import java.nio.channels.CompletionHandler;
-import java.util.concurrent.Semaphore;
-import java.util.concurrent.TimeUnit;
-
-import org.junit.Assert;
-import org.junit.Test;
-
-import org.apache.tomcat.util.net.ApplicationBufferHandler;
-import org.apache.tomcat.util.net.NioChannel;
-import org.apache.tomcat.util.net.NioEndpoint;
-import org.apache.tomcat.util.net.SSLSupport;
-import org.apache.tomcat.util.net.SendfileDataBase;
-import org.apache.tomcat.util.net.SendfileState;
-import org.apache.tomcat.util.net.SocketWrapperBase;
-
-/*
- * This tests use A=1, B=2, etc to map stream IDs to the names used in the
- * figures.
- */
-public class TestAbstractStream {
-
- @Test
- public void testDependenciesFig3() {
- // Setup
- Http2UpgradeHandler handler =
- new Http2UpgradeHandler(new Http2Protocol(), null, null, new TesterSocketWrapper());
- Stream a = new Stream(Integer.valueOf(1), handler);
- Stream b = new Stream(Integer.valueOf(2), handler);
- Stream c = new Stream(Integer.valueOf(3), handler);
- Stream d = new Stream(Integer.valueOf(4), handler);
- b.rePrioritise(a, false, 16);
- c.rePrioritise(a, false, 16);
-
- // Action
- d.rePrioritise(a, false, 16);
-
- // Check parents
- Assert.assertEquals(handler, a.getParentStream());
- Assert.assertEquals(a, b.getParentStream());
- Assert.assertEquals(a, c.getParentStream());
- Assert.assertEquals(a, d.getParentStream());
-
- // Check children
- Assert.assertEquals(3, a.getChildStreams().size());
- Assert.assertTrue(a.getChildStreams().contains(b));
- Assert.assertTrue(a.getChildStreams().contains(c));
- Assert.assertTrue(a.getChildStreams().contains(d));
- Assert.assertEquals(0, b.getChildStreams().size());
- Assert.assertEquals(0, c.getChildStreams().size());
- Assert.assertEquals(0, d.getChildStreams().size());
- }
-
-
- @Test
- public void testDependenciesFig4() {
- // Setup
- Http2UpgradeHandler handler =
- new Http2UpgradeHandler(new Http2Protocol(), null, null, new TesterSocketWrapper());
- Stream a = new Stream(Integer.valueOf(1), handler);
- Stream b = new Stream(Integer.valueOf(2), handler);
- Stream c = new Stream(Integer.valueOf(3), handler);
- Stream d = new Stream(Integer.valueOf(4), handler);
- b.rePrioritise(a, false, 16);
- c.rePrioritise(a, false, 16);
-
- // Action
- d.rePrioritise(a, true, 16);
-
- // Check parents
- Assert.assertEquals(handler, a.getParentStream());
- Assert.assertEquals(d, b.getParentStream());
- Assert.assertEquals(d, c.getParentStream());
- Assert.assertEquals(a, d.getParentStream());
-
- // Check children
- Assert.assertEquals(1, a.getChildStreams().size());
- Assert.assertTrue(a.getChildStreams().contains(d));
- Assert.assertEquals(2, d.getChildStreams().size());
- Assert.assertTrue(d.getChildStreams().contains(b));
- Assert.assertTrue(d.getChildStreams().contains(c));
- Assert.assertEquals(0, b.getChildStreams().size());
- Assert.assertEquals(0, c.getChildStreams().size());
- }
-
-
- @Test
- public void testDependenciesFig5NonExclusive() {
- // Setup
- Http2UpgradeHandler handler =
- new Http2UpgradeHandler(new Http2Protocol(), null, null, new TesterSocketWrapper());
- Stream a = new Stream(Integer.valueOf(1), handler);
- Stream b = new Stream(Integer.valueOf(2), handler);
- Stream c = new Stream(Integer.valueOf(3), handler);
- Stream d = new Stream(Integer.valueOf(4), handler);
- Stream e = new Stream(Integer.valueOf(5), handler);
- Stream f = new Stream(Integer.valueOf(6), handler);
- b.rePrioritise(a, false, 16);
- c.rePrioritise(a, false, 16);
- d.rePrioritise(c, false, 16);
- e.rePrioritise(c, false, 16);
- f.rePrioritise(d, false, 16);
-
- // Action
- a.rePrioritise(d, false, 16);
-
- // Check parents
- Assert.assertEquals(handler, d.getParentStream());
- Assert.assertEquals(d, f.getParentStream());
- Assert.assertEquals(d, a.getParentStream());
- Assert.assertEquals(a, b.getParentStream());
- Assert.assertEquals(a, c.getParentStream());
- Assert.assertEquals(c, e.getParentStream());
-
- // Check children
- Assert.assertEquals(2, d.getChildStreams().size());
- Assert.assertTrue(d.getChildStreams().contains(a));
- Assert.assertTrue(d.getChildStreams().contains(f));
- Assert.assertEquals(0, f.getChildStreams().size());
- Assert.assertEquals(2, a.getChildStreams().size());
- Assert.assertTrue(a.getChildStreams().contains(b));
- Assert.assertTrue(a.getChildStreams().contains(c));
- Assert.assertEquals(0, b.getChildStreams().size());
- Assert.assertEquals(1, c.getChildStreams().size());
- Assert.assertTrue(c.getChildStreams().contains(e));
- Assert.assertEquals(0, e.getChildStreams().size());
- }
-
-
- @Test
- public void testDependenciesFig5Exclusive() {
- // Setup
- Http2UpgradeHandler handler =
- new Http2UpgradeHandler(new Http2Protocol(), null, null, new TesterSocketWrapper());
- Stream a = new Stream(Integer.valueOf(1), handler);
- Stream b = new Stream(Integer.valueOf(2), handler);
- Stream c = new Stream(Integer.valueOf(3), handler);
- Stream d = new Stream(Integer.valueOf(4), handler);
- Stream e = new Stream(Integer.valueOf(5), handler);
- Stream f = new Stream(Integer.valueOf(6), handler);
- b.rePrioritise(a, false, 16);
- c.rePrioritise(a, false, 16);
- d.rePrioritise(c, false, 16);
- e.rePrioritise(c, false, 16);
- f.rePrioritise(d, false, 16);
-
- // Action
- a.rePrioritise(d, true, 16);
-
- // Check parents
- Assert.assertEquals(handler, d.getParentStream());
- Assert.assertEquals(d, a.getParentStream());
- Assert.assertEquals(a, b.getParentStream());
- Assert.assertEquals(a, c.getParentStream());
- Assert.assertEquals(a, f.getParentStream());
- Assert.assertEquals(c, e.getParentStream());
-
- // Check children
- Assert.assertEquals(1, d.getChildStreams().size());
- Assert.assertTrue(d.getChildStreams().contains(a));
- Assert.assertEquals(3, a.getChildStreams().size());
- Assert.assertTrue(a.getChildStreams().contains(b));
- Assert.assertTrue(a.getChildStreams().contains(c));
- Assert.assertTrue(a.getChildStreams().contains(f));
- Assert.assertEquals(0, b.getChildStreams().size());
- Assert.assertEquals(0, f.getChildStreams().size());
- Assert.assertEquals(1, c.getChildStreams().size());
- Assert.assertTrue(c.getChildStreams().contains(e));
- Assert.assertEquals(0, e.getChildStreams().size());
- }
-
-
- @Test
- public void testCircular01() {
- // Setup
- Http2UpgradeHandler handler =
- new Http2UpgradeHandler(new Http2Protocol(), null, null, new TesterSocketWrapper());
- Stream a = new Stream(Integer.valueOf(1), handler);
- Stream b = new Stream(Integer.valueOf(2), handler);
- Stream c = new Stream(Integer.valueOf(3), handler);
-
- b.rePrioritise(a, false, 16);
- c.rePrioritise(b, false, 16);
-
- // Action
- a.rePrioritise(c, false, 16);
-
- // Check parents
- Assert.assertEquals(c, a.getParentStream());
- Assert.assertEquals(a, b.getParentStream());
- Assert.assertEquals(handler, c.getParentStream());
-
- // Check children
- Assert.assertEquals(1, handler.getChildStreams().size());
- Assert.assertTrue(handler.getChildStreams().contains(c));
- Assert.assertEquals(1, a.getChildStreams().size());
- Assert.assertTrue(a.getChildStreams().contains(b));
- Assert.assertEquals(0, b.getChildStreams().size());
- Assert.assertEquals(1, c.getChildStreams().size());
- Assert.assertTrue(c.getChildStreams().contains(a));
- }
-
-
- @Test
- public void testCircular02() {
- // Setup
- Http2UpgradeHandler handler =
- new Http2UpgradeHandler(new Http2Protocol(), null, null, new TesterSocketWrapper());
- Stream a = new Stream(Integer.valueOf(1), handler);
- Stream b = new Stream(Integer.valueOf(2), handler);
- Stream c = new Stream(Integer.valueOf(3), handler);
- Stream d = new Stream(Integer.valueOf(4), handler);
- Stream e = new Stream(Integer.valueOf(5), handler);
- Stream f = new Stream(Integer.valueOf(6), handler);
-
- b.rePrioritise(a, false, 16);
- c.rePrioritise(b, false, 16);
- e.rePrioritise(d, false, 16);
- f.rePrioritise(e, false, 16);
-
- // Action
- a.rePrioritise(f, false, 16);
- d.rePrioritise(c, false, 16);
-
- // Check parents
- Assert.assertEquals(f, a.getParentStream());
- Assert.assertEquals(a, b.getParentStream());
- Assert.assertEquals(handler, c.getParentStream());
- Assert.assertEquals(c, d.getParentStream());
- Assert.assertEquals(d, e.getParentStream());
- Assert.assertEquals(e, f.getParentStream());
-
- // Check children
- Assert.assertEquals(1, handler.getChildStreams().size());
- Assert.assertTrue(handler.getChildStreams().contains(c));
- Assert.assertEquals(1, a.getChildStreams().size());
- Assert.assertTrue(a.getChildStreams().contains(b));
- Assert.assertEquals(0, b.getChildStreams().size());
- Assert.assertEquals(1, c.getChildStreams().size());
- Assert.assertTrue(c.getChildStreams().contains(d));
- Assert.assertEquals(1, d.getChildStreams().size());
- Assert.assertTrue(d.getChildStreams().contains(e));
- Assert.assertEquals(1, e.getChildStreams().size());
- Assert.assertTrue(e.getChildStreams().contains(f));
- Assert.assertEquals(1, f.getChildStreams().size());
- Assert.assertTrue(f.getChildStreams().contains(a));
- }
-
-
- // https://bz.apache.org/bugzilla/show_bug.cgi?id=61682
- @Test
- public void testCircular03() {
- // Setup
- Http2UpgradeHandler handler =
- new Http2UpgradeHandler(new Http2Protocol(), null, null, new TesterSocketWrapper());
- Stream a = new Stream(Integer.valueOf(1), handler);
- Stream b = new Stream(Integer.valueOf(3), handler);
- Stream c = new Stream(Integer.valueOf(5), handler);
- Stream d = new Stream(Integer.valueOf(7), handler);
-
- // Action
- b.rePrioritise(a, false, 16);
- c.rePrioritise(a, false, 16);
- d.rePrioritise(b, false, 16);
- c.rePrioritise(handler, false, 16);
- a.rePrioritise(c, false, 16);
-
- // Check parents
- Assert.assertEquals(c, a.getParentStream());
- Assert.assertEquals(a, b.getParentStream());
- Assert.assertEquals(handler, c.getParentStream());
- Assert.assertEquals(b, d.getParentStream());
-
- // This triggers the StackOverflowError
- Assert.assertTrue(c.isDescendant(d));
-
- // Check children
- Assert.assertEquals(1, handler.getChildStreams().size());
- Assert.assertTrue(handler.getChildStreams().contains(c));
- Assert.assertEquals(1, c.getChildStreams().size());
- Assert.assertTrue(c.getChildStreams().contains(a));
- Assert.assertEquals(1, a.getChildStreams().size());
- Assert.assertTrue(a.getChildStreams().contains(b));
- Assert.assertEquals(1, b.getChildStreams().size());
- Assert.assertTrue(b.getChildStreams().contains(d));
- Assert.assertEquals(0, d.getChildStreams().size());
- }
-
-
- private static class TesterSocketWrapper extends SocketWrapperBase<NioChannel> {
-
- public TesterSocketWrapper() {
- super(null, new NioEndpoint());
- }
-
- @Override
- protected void populateRemoteHost() {
- }
-
- @Override
- protected void populateRemoteAddr() {
- }
-
- @Override
- protected void populateRemotePort() {
- }
-
- @Override
- protected void populateLocalName() {
- }
-
- @Override
- protected void populateLocalAddr() {
- }
-
- @Override
- protected void populateLocalPort() {
- }
-
- @Override
- public int read(boolean block, byte[] b, int off, int len) throws IOException {
- return 0;
- }
-
- @Override
- public int read(boolean block, ByteBuffer to) throws IOException {
- return 0;
- }
-
- @Override
- public boolean isReadyForRead() throws IOException {
- return false;
- }
-
- @Override
- public void setAppReadBufHandler(ApplicationBufferHandler handler) {
- }
-
- @Override
- protected void doClose() {
- }
-
- @Override
- protected boolean flushNonBlocking() throws IOException {
- return false;
- }
-
- @Override
- protected void doWrite(boolean block, ByteBuffer from) throws IOException {
- }
-
- @Override
- public void registerReadInterest() {
- }
-
- @Override
- public void registerWriteInterest() {
- }
-
- @Override
- public SendfileDataBase createSendfileData(String filename, long pos, long length) {
- return null;
- }
-
- @Override
- public SendfileState processSendfile(SendfileDataBase sendfileData) {
- return null;
- }
-
- @Override
- public void doClientAuth(SSLSupport sslSupport) throws IOException {
- }
-
- @Override
- public SSLSupport getSslSupport() {
- return null;
- }
-
- @Override
- protected <A> SocketWrapperBase<NioChannel>.OperationState<A> newOperationState(
- boolean read, ByteBuffer[] buffers, int offset, int length, BlockingMode block,
- long timeout, TimeUnit unit, A attachment, CompletionCheck check,
- CompletionHandler<Long, ? super A> handler, Semaphore semaphore,
- SocketWrapperBase<NioChannel>.VectoredIOCompletionHandler<A> completion) {
- return null;
- }
- }
-}
diff --git a/test/org/apache/coyote/http2/TestHttp2Section_5_3.java b/test/org/apache/coyote/http2/TestHttp2Section_5_3.java
deleted file mode 100644
index 32fdb9fed6..0000000000
--- a/test/org/apache/coyote/http2/TestHttp2Section_5_3.java
+++ /dev/null
@@ -1,258 +0,0 @@
-/*
- * 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.coyote.http2;
-
-import org.junit.Assert;
-import org.junit.Test;
-
-/**
- * Unit tests for Section 5.3 of
- * <a href="https://tools.ietf.org/html/rfc7540">RFC 7540</a>.
- * <br>
- * The order of tests in this class is aligned with the order of the
- * requirements in the RFC.
- *
- * Note: Unit tests for the examples described by each of the figures may be
- * found in {@link TestAbstractStream}.
- */
-public class TestHttp2Section_5_3 extends Http2TestBase {
-
- // Section 5.3.1
-
- @Test
- public void testStreamDependsOnSelf() throws Exception {
- http2Connect();
-
- sendPriority(3, 3, 15);
-
- parser.readFrame();
-
- Assert.assertEquals("3-RST-[1]\n", output.getTrace());
- }
-
-
- // Section 5.3.2
-
- @Test
- public void testWeighting() throws Exception {
-
- http2Connect();
-
- // This test uses small window updates that will trigger the excessive
- // overhead protection so disable it.
- http2Protocol.setOverheadWindowUpdateThreshold(0);
- // May also see (rarely, depends on timing) sequential 1 byte data
- // frames on the same Stream
- http2Protocol.setOverheadDataThreshold(0);
-
-
- // Default connection window size is 64k - 1. Initial request will have
- // used 8k (56k -1). Increase it to 57k
- sendWindowUpdate(0, 1 + 1024);
-
- // Use up 56k of the connection window
- for (int i = 3; i < 17; i += 2) {
- sendSimpleGetRequest(i);
- readSimpleGetResponse();
- }
-
- // Set the default window size to 1024 bytes
- sendSettings(0, false, new SettingValue(4, 1024));
- // Wait for the ack
- parser.readFrame();
- // Debugging Gump failure
- log.info(output.getTrace());
- output.clearTrace();
-
- // At this point the connection window should be 1k and any new stream
- // should have a window of 1k as well
-
- // Set up streams A=17, B=19, C=21
- sendPriority(17, 0, 15);
- sendPriority(19, 17, 3);
- sendPriority(21, 17, 11);
-
- // First, process a request on stream 17. This should consume both
- // stream 17's window and the connection window.
- sendSimpleGetRequest(17);
- // 17-headers, 17-1k-body
- parser.readFrame();
- // Debugging Gump failure
- log.info(output.getTrace());
- parser.readFrame();
- // Debugging Gump failure
- log.info(output.getTrace());
- output.clearTrace();
-
- // Send additional requests. Connection window is empty so only headers
- // will be returned.
- sendSimpleGetRequest(19);
- sendSimpleGetRequest(21);
-
- // Open up the flow control windows for stream 19 & 21 to more than the
- // size of a simple request (8k)
- sendWindowUpdate(19, 16*1024);
- sendWindowUpdate(21, 16*1024);
-
- // Read some frames
- // 19-headers, 21-headers
- parser.readFrame();
- // Debugging Gump failure
- log.info(output.getTrace());
- parser.readFrame();
- // Debugging Gump failure
- log.info(output.getTrace());
- output.clearTrace();
-
- // At this point 17 is blocked because the stream window is zero and
- // 19 & 21 are blocked because the connection window is zero.
- //
- // To test allocation, the connection window size is increased by 1.
- // This should result in an allocation of 1 byte each to streams 19 and
- // 21 but because each stream is processed in a separate thread it is
- // not guaranteed that both streams will be blocked when the connection
- // window size is increased. The test therefore sends 1 byte window
- // updates until a small body has been seen from each stream. Then the
- // tests sends a larger (1024 byte) window update and checks that it is
- // correctly distributed between the streams.
- //
- // The test includes a margin to allow for the potential differences in
- // response caused by timing differences on the server.
- //
- // The loop below handles 0, 1 or 2 stream being blocked
- // - If 0 streams are blocked the connection window will be set to one
- // and that will be consumed by the first stream to attempt to write.
- // That body frame will be read by the client. The stream will then be
- // blocked and the loop will start again.
- // - If 1 stream is blocked, the connection window will be set to one
- // which will then be consumed by the blocked stream. After writing
- // the single byte the stream will again be blocked and the loop will
- // start again.
- // - If 2 streams are blocked the connection window will be set to one
- // but one byte will be permitted for both streams (due to rounding in
- // the allocation). The window size should be -1 (see below). Two
- // frames (one for each stream will be written) one of which will be
- // consumed by the client. The loop will start again and the Window
- // size incremented to zero. No data will be written by the streams
- // but the second data frame written in the last iteration of the loop
- // will be read. The loop will then exit since frames from both
- // streams will have been observed.
- boolean seen19 = false;
- boolean seen21 = false;
- while (!seen19 || !seen21) {
- sendWindowUpdate(0, 1);
- parser.readFrame();
- // Debugging Gump failure
- log.info(output.getTrace());
- int[] data = parseBodyFrame(output.getTrace());
- if (data[0] == 19) {
- seen19 = true;
- } else if (data[0] == 21) {
- seen21 = true;
- } else {
- // Unexpected stream
- Assert.fail("Unexpected stream: [" + output.getTrace() + "]");
- }
- // A value of more than 1 here is unlikely but possible depending on
- // how threads are scheduled. This has been observed as high as 21
- // on ci.apache.org so allow a margin and use 30.
- if (data[1] > 30) {
- // Larger than expected body size
- Assert.fail("Larger than expected body: [" + output.getTrace() + "] " + data[1]);
- }
- output.clearTrace();
- }
-
- // Need to give both server side threads enough time to request an
- // allocation from the connection flow control window before sending
- // the next window update.
- Thread.sleep(1000);
-
- sendWindowUpdate(0, 1024);
- parser.readFrame();
-
- // Make sure you have read the big comment before the loop above. It is
- // possible that the timing of the server threads is such that there are
- // still small body frames to read.
- int[] data = parseBodyFrame(output.getTrace());
- while (data[1] < 20) {
- // Debugging Gump failure
- log.info(output.getTrace());
- output.clearTrace();
- parser.readFrame();
- data = parseBodyFrame(output.getTrace());
- }
-
- // Should now have two larger body frames. One has already been read.
- seen19 = false;
- seen21 = false;
- while (!seen19 && !seen21) {
- // Debugging Gump failure
- log.info(output.getTrace());
- if (data[0] == 19) {
- seen19 = true;
- // If everything works instantly this should be 256 but allow a
- // fairly large margin for timing differences
- if (data[1] < 216 || data[1] > 296) {
- Assert.fail("Unexpected body size: [" + output.getTrace() + "]");
- }
- } else if (data[0] == 21) {
- seen21 = true;
- // If everything works instantly this should be 768 but allow a
- // fairly large margin for timing differences
- if (data[1] < 728 || data[1] > 808) {
- Assert.fail("Unexpected body size: [" + output.getTrace() + "]");
- }
- } else {
- Assert.fail("Unexpected stream: [" + output.getTrace() + "]");
- }
- output.clearTrace();
- parser.readFrame();
- data = parseBodyFrame(output.getTrace());
- }
- // Debugging Gump failure
- log.info(output.getTrace());
- output.clearTrace();
-
- // Release everything and read all the remaining data
- sendWindowUpdate(0, 1024 * 1024);
- sendWindowUpdate(17, 1024 * 1024);
-
- // Read remaining frames
- // 17-7k-body, 19~8k-body, 21~8k-body
- for (int i = 0; i < 3; i++) {
- parser.readFrame();
- // Debugging Gump failure
- log.info(output.getTrace());
- }
- }
-
-
- private int[] parseBodyFrame(String output) {
- String[] parts = output.trim().split("-");
- if (parts.length != 3 || !"Body".equals(parts[1])) {
- Assert.fail("Unexpected output: [" + output + "]");
- }
-
- int[] result = new int[2];
-
- result[0] = Integer.parseInt(parts[0]);
- result[1] = Integer.parseInt(parts[2]);
-
- return result;
- }
-}
---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@tomcat.apache.org
For additional commands, e-mail: dev-help@tomcat.apache.org