blob: 09e41e721b81922041e487ea96cc70a3bf2b4c65 [file] [log] [blame]
/*
* 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.tomcat.util.buf;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.function.Consumer;
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameter;
import org.junit.runners.Parameterized.Parameters;
/**
* Checks that all MessageBytes getters are consistent with most recently used
* setter.
*/
@RunWith(Parameterized.class)
public class TestMessageBytesConversion {
private static final String PREVIOUS_STRING = "previous-string";
private static final byte[] PREVIOUS_BYTES = "previous-bytes".getBytes(StandardCharsets.ISO_8859_1);
private static final char[] PREVIOUS_CHARS = "previous-chars".toCharArray();
private static final String EXPECTED_STRING = "expected";
private static final byte[] EXPECTED_BYTES = "expected".getBytes(StandardCharsets.ISO_8859_1);
private static final char[] EXPECTED_CHARS = "expected".toCharArray();
@Parameters(name = "{index}: previous({0}, {1}, {2}, {3}), set {4}, check({5}, {6}, {7}")
public static Collection<Object[]> parameters() {
List<MessageBytesType> previousTypes = new ArrayList<>();
previousTypes.add(MessageBytesType.BYTE);
previousTypes.add(MessageBytesType.CHAR);
previousTypes.add(MessageBytesType.STRING);
previousTypes.add(MessageBytesType.NULL);
List<MessageBytesType> setTypes = new ArrayList<>();
setTypes.add(MessageBytesType.BYTE);
setTypes.add(MessageBytesType.CHAR);
setTypes.add(MessageBytesType.STRING);
List<Object[]> parameterSets = new ArrayList<>();
List<List<MessageBytesType>> previousPermutations = permutations(previousTypes);
List<List<MessageBytesType>> checkPermutations = permutations(setTypes);
for (List<MessageBytesType> setPermutation : previousPermutations) {
for (MessageBytesType setType : setTypes) {
for (List<MessageBytesType> checkPermutation : checkPermutations) {
parameterSets.add(new Object[] {
setPermutation.get(0), setPermutation.get(1), setPermutation.get(2), setPermutation.get(3),
setType,
checkPermutation.get(0), checkPermutation.get(1), checkPermutation.get(2)});
}
}
}
return parameterSets;
}
@Parameter(0)
public MessageBytesType setFirst;
@Parameter(1)
public MessageBytesType setSecond;
@Parameter(2)
public MessageBytesType setThird;
@Parameter(3)
public MessageBytesType setFourth;
@Parameter(4)
public MessageBytesType expected;
@Parameter(5)
public MessageBytesType checkFirst;
@Parameter(6)
public MessageBytesType checkSecond;
@Parameter(7)
public MessageBytesType checkThird;
@Test
public void testConversion() {
MessageBytes mb = MessageBytes.newInstance();
setFirst.setPrevious(mb);
setSecond.setPrevious(mb);
setThird.setPrevious(mb);
setFourth.setPrevious(mb);
expected.setExpected(mb);
checkFirst.checkExpected(mb);
checkSecond.checkExpected(mb);
checkThird.checkExpected(mb);
}
@Test
public void testConversionNull() {
MessageBytes mb = MessageBytes.newInstance();
setFirst.setPrevious(mb);
setSecond.setPrevious(mb);
setThird.setPrevious(mb);
setFourth.setPrevious(mb);
mb.setString(null);
checkFirst.checkNull(mb);
checkSecond.checkNull(mb);
checkThird.checkNull(mb);
}
public enum MessageBytesType {
BYTE((x) -> x.setBytes(PREVIOUS_BYTES, 0, PREVIOUS_BYTES.length),
(x) -> x.setBytes(EXPECTED_BYTES, 0, EXPECTED_BYTES.length),
(x) -> {x.toBytes(); Assert.assertTrue(x.getByteChunk().equals(EXPECTED_BYTES, 0, EXPECTED_BYTES.length) );},
(x) -> {x.toBytes(); Assert.assertTrue(x.getByteChunk().isNull());}),
CHAR((x) -> x.setChars(PREVIOUS_CHARS, 0, PREVIOUS_CHARS.length),
(x) -> x.setChars(EXPECTED_CHARS, 0, EXPECTED_CHARS.length),
(x) -> {x.toChars(); Assert.assertArrayEquals(EXPECTED_CHARS, x.getCharChunk().getChars());},
(x) -> {x.toChars(); Assert.assertTrue(x.getCharChunk().isNull());}),
STRING((x) -> x.setString(PREVIOUS_STRING),
(x) -> x.setString(EXPECTED_STRING),
(x) -> Assert.assertEquals(EXPECTED_STRING, x.toString()),
(x) -> Assert.assertNull(x.toString())),
NULL((x) -> x.setString(null),
(x) -> x.setString(null),
(x) -> Assert.assertTrue(x.isNull()),
(x) -> Assert.assertTrue(x.isNull()));
private final Consumer<MessageBytes> setPrevious;
private final Consumer<MessageBytes> setExpected;
private final Consumer<MessageBytes> checkExpected;
private final Consumer<MessageBytes> checkNull;
MessageBytesType(Consumer<MessageBytes> setPrevious, Consumer<MessageBytes> setExpected,
Consumer<MessageBytes> checkExpected, Consumer<MessageBytes> checkNull) {
this.setPrevious = setPrevious;
this.setExpected = setExpected;
this.checkExpected = checkExpected;
this.checkNull = checkNull;
}
public void setPrevious(MessageBytes mb) {
setPrevious.accept(mb);
}
public void setExpected(MessageBytes mb) {
setExpected.accept(mb);
}
public void checkExpected(MessageBytes mb) {
checkExpected.accept(mb);
}
public void checkNull(MessageBytes mb) {
checkNull.accept(mb);
}
}
private static <T> List<List<T>> permutations(List<T> items) {
List<List<T>> results = new ArrayList<>();
if (items.size() == 1) {
results.add(items);
} else {
List<T> others = new ArrayList<>(items);
T first = others.remove(0);
List<List<T>> subPermutations = permutations(others);
for (List<T> subPermutation : subPermutations) {
for (int i = 0; i <= subPermutation.size(); i++) {
List<T> result = new ArrayList<>(subPermutation);
result.add(i, first);
results.add(result);
}
}
}
return results;
}
}