blob: 9feba1ac6ad91fdb91b67e4dd09334455209ae8d [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.jmeter.protocol.jms.sampler.render;
import static org.hamcrest.CoreMatchers.allOf;
import static org.hamcrest.CoreMatchers.containsString;
import static org.hamcrest.CoreMatchers.instanceOf;
import static org.junit.jupiter.api.Assertions.assertArrayEquals;
import static org.junit.jupiter.api.Assertions.assertEquals;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.nio.charset.StandardCharsets;
import org.apache.jmeter.threads.JMeterVariables;
import org.hamcrest.Description;
import org.hamcrest.Matcher;
import org.hamcrest.MatcherAssert;
import org.hamcrest.TypeSafeMatcher;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.ValueSource;
public class BinaryMessageRendererTest extends MessageRendererTest<byte[]> {
public static class ThrowableMessageMatcher<T extends Throwable> extends
TypeSafeMatcher<T> {
private final Matcher<String> matcher;
public ThrowableMessageMatcher(Matcher<String> matcher) {
this.matcher = matcher;
}
public void describeTo(Description description) {
description.appendText("exception with message ");
description.appendDescriptionOf(matcher);
}
@Override
protected boolean matchesSafely(T item) {
return matcher.matches(item.getMessage());
}
@Override
protected void describeMismatchSafely(T item, Description description) {
description.appendText("message ");
matcher.describeMismatch(item.getMessage(), description);
}
}
public static class ThrowableCauseMatcher<T extends Throwable> extends
TypeSafeMatcher<T> {
private final Matcher<?> causeMatcher;
public ThrowableCauseMatcher(Matcher<?> causeMatcher) {
this.causeMatcher = causeMatcher;
}
public void describeTo(Description description) {
description.appendText("exception with cause ");
description.appendDescriptionOf(causeMatcher);
}
@Override
protected boolean matchesSafely(T item) {
return causeMatcher.matches(item.getCause());
}
@Override
protected void describeMismatchSafely(T item, Description description) {
description.appendText("cause ");
causeMatcher.describeMismatch(item.getCause(), description);
}
}
public static <T extends Throwable> Matcher<T> hasMessage(final Matcher<String> matcher) {
return new ThrowableMessageMatcher<T>(matcher);
}
public static <T extends Throwable> Matcher<T> hasCause(final Matcher<?> matcher) {
return new ThrowableCauseMatcher<T>(matcher);
}
private BinaryMessageRenderer render = RendererFactory.getInstance().getBinary();
@Override
protected MessageRenderer<byte[]> getRenderer() {
return render;
}
@Test
public void getValueFromText() {
Assertions.assertThrows(UnsupportedOperationException.class, () -> render.getValueFromText(""));
}
@ParameterizedTest
@ValueSource(strings = {"UTF-8", "Cp1252"})
public void testGetContent(String encoding) throws UnsupportedEncodingException, IOException {
String value = "éè€";
byte[] expected = value.getBytes(encoding);
String filename = writeFile(encoding, expected);
// The tested method
byte[] actual = render.getContent(filename);
assertArrayEquals(expected, actual, "value: " + value);
}
@Test
public void readNonExistingContent() {
RuntimeException ex = Assertions.assertThrows(
RuntimeException.class,
() -> render.getContent("__file_that_may_not_exists_else_it_will_fail")
);
MatcherAssert.assertThat(ex, allOf(
hasMessage(containsString("Can't read content of __file_that_may_not_exists_else_it_will_fail")),
hasCause(instanceOf(IOException.class))
));
}
@Test
public void getValueFromFile_withNoVar() throws IOException {
String text = "éè€";
String fileName = writeFile("utf8.txt", text);
assertValueFromFile(text, fileName, true);
assertCacheContentInString(text);
}
@Test
public void getValueFromFile_withOneVar(JMeterVariables vars) throws IOException {
String fileName = writeFile("oneVar.txt", "${oneVar}");
String value = "éè€";
vars.put("oneVar", value);
assertValueFromFile(value, fileName, true);
assertCacheContentInString("${oneVar}");
}
@Test
public void getValueFromFile_withInvalidEncoding() {
RuntimeException ex = Assertions.assertThrows(
RuntimeException.class,
() -> render.getValueFromFile("utf8.txt", "banana", true, cache)
);
MatcherAssert.assertThat(
ex,
allOf(
hasMessage(containsString("utf8.txt")),
hasCause(instanceOf(UnsupportedEncodingException.class))
)
);
}
@Test
public void getValueFromFile_inRawMode() throws IOException {
String text = "${oneVar}";
String fileName = writeFile("oneVar.txt", text);
assertValueFromFile(text, fileName, false);
assertCacheContentInBytes(text);
}
protected void assertValueFromFile(String expected, String fileName, boolean hasVariable) {
assertValueFromFile(actual -> assertBytesEquals(expected, actual), fileName, hasVariable);
}
protected void assertCacheContentInBytes(String expected) {
assertBytesEquals(expected, (byte[]) getFirstCachedValue());
}
protected void assertCacheContentInString(String expected) {
assertEquals(expected, getFirstCachedValue());
}
protected void assertBytesEquals(String expected, byte[] actual) {
assertArrayEquals(expected.getBytes(StandardCharsets.UTF_8), actual);
}
}