/*
* Copyright 2013-2016 the original author or authors.
*
* Licensed 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.glowroot.agent.weaving;
import org.junit.Test;
import org.glowroot.agent.plugin.api.Message;
import org.glowroot.agent.plugin.api.internal.ReadableMessage;
import static org.assertj.core.api.Assertions.assertThat;
public class GenericMessageSupplierTest {
@Test
public void shouldRenderConstant() throws Exception {
MessageTemplate template = MessageTemplate.create("abc",
TestReceiver.class.getMethod("execute", HasName.class));
Message message = GenericMessageSupplier
.create(template, new HasName(), "execute", new HasName()).get();
String text = ((ReadableMessage) message).getText();
assertThat(text).isEqualTo("abc");
}
@Test
public void shouldRenderNormal() throws Exception {
MessageTemplate template =
MessageTemplate.create("{{this.class.name}}.{{methodName}}(): {{0.name}} => {{_}}",
TestReceiver.class.getMethod("execute", HasName.class));
Message message = GenericMessageSupplier
.create(template, new TestReceiver(), "execute", new HasName()).get();
String text = ((ReadableMessage) message).getText();
assertThat(text).isEqualTo(TestReceiver.class.getName() + ".execute(): the name => ");
}
@Test
public void shouldRenderNullPart() throws Exception {
MessageTemplate template =
MessageTemplate.create("{{this.class.name}}.{{methodName}}(): {{0.name}} => {{_}}",
TestReceiver.class.getMethod("execute", HasName.class));
Message message =
GenericMessageSupplier.create(template, null, "execute", new HasName()).get();
String text = ((ReadableMessage) message).getText();
assertThat(text).isEqualTo("null.execute(): the name => ");
}
@Test
public void shouldRenderRequestedArgOutOfBounds() throws Exception {
MessageTemplate template = MessageTemplate.create(
"{{this.class.name}}.{{methodName}}(): {{0.name}}, {{1.oops}} => {{_}}",
TestReceiver.class.getMethod("execute", HasName.class));
Message message = GenericMessageSupplier
.create(template, new TestReceiver(), "execute", new HasName()).get();
String text = ((ReadableMessage) message).getText();
assertThat(text).isEqualTo(TestReceiver.class.getName()
+ ".execute(): the name, <requested arg index out of bounds: 1> => ");
}
@Test
public void shouldRenderTrailingText() throws Exception {
MessageTemplate template =
MessageTemplate.create("{{this.class.name}}.{{methodName}}(): {{0.name}} trailing",
TestReceiver.class.getMethod("execute", HasName.class));
Message message = GenericMessageSupplier
.create(template, new TestReceiver(), "execute", new HasName()).get();
String text = ((ReadableMessage) message).getText();
assertThat(text).isEqualTo(TestReceiver.class.getName() + ".execute(): the name trailing");
}
@Test
public void shouldRenderBadTemplate() throws Exception {
MessageTemplate template =
MessageTemplate.create("{{this.class.name}}.{{methodName}}(): {{1.name}} trailing",
TestReceiver.class.getMethod("execute", HasName.class));
Message message = GenericMessageSupplier
.create(template, new TestReceiver(), "execute", new HasName()).get();
String text = ((ReadableMessage) message).getText();
assertThat(text).isEqualTo(TestReceiver.class.getName()
+ ".execute(): <requested arg index out of bounds: 1> trailing");
}
@Test
public void shouldRenderBadTemplate2() throws Exception {
MessageTemplate template =
MessageTemplate.create("{{this.class.name}}.{{methodName}}(): {{x.name}} trailing",
TestReceiver.class.getMethod("execute", HasName.class));
Message message =
GenericMessageSupplier.create(template, new TestReceiver(), "execute").get();
String text = ((ReadableMessage) message).getText();
assertThat(text)
.isEqualTo(TestReceiver.class.getName() + ".execute(): {{x.name}} trailing");
}
@Test
public void shouldRenderBadMessage() throws Exception {
MessageTemplate template =
MessageTemplate.create("{{this.class.name}}.{{methodName}}(): {{0.name}} trailing",
TestReceiver.class.getMethod("execute", HasName.class));
Message message =
GenericMessageSupplier.create(template, new TestReceiver(), "execute").get();
String text = ((ReadableMessage) message).getText();
assertThat(text).isEqualTo(TestReceiver.class.getName()
+ ".execute(): <requested arg index out of bounds: 0> trailing");
}
@Test
public void shouldRenderMessageWithThrowingPart() throws Exception {
MessageTemplate template = MessageTemplate.create(
"{{this.class.name}}.{{methodName}}(): {{0.throwingName}} trailing",
TestReceiver.class.getMethod("execute", HasName.class));
Message message = GenericMessageSupplier
.create(template, new TestReceiver(), "execute", new HasName()).get();
String text = ((ReadableMessage) message).getText();
assertThat(text).isEqualTo(TestReceiver.class.getName()
+ ".execute(): <error evaluating: java.lang.RuntimeException: Abc Xyz> trailing");
}
@Test
public void shouldRenderArray() throws Exception {
MessageTemplate template =
MessageTemplate.create("{{this.class.name}}.{{methodName}}(): {{0.names}}",
TestArrayReceiver.class.getMethod("execute", HasArray.class));
Message message = GenericMessageSupplier
.create(template, new TestReceiver(), "execute", new HasArray()).get();
String text = ((ReadableMessage) message).getText();
assertThat(text).isEqualTo(TestReceiver.class.getName() + ".execute(): [the name, two]");
}
@Test
public void shouldRenderArray1() throws Exception {
MessageTemplate template =
MessageTemplate.create("{{this.class.name}}.{{methodName}}(): {{0.names.name}}",
TestArrayReceiver1.class.getMethod("execute", HasArray1.class));
Message message = GenericMessageSupplier
.create(template, new TestReceiver(), "execute", new HasArray1()).get();
String text = ((ReadableMessage) message).getText();
assertThat(text)
.isEqualTo(TestReceiver.class.getName() + ".execute(): [the name, the name]");
}
@Test
public void shouldRenderArray2() throws Exception {
MessageTemplate template =
MessageTemplate.create("{{this.class.name}}.{{methodName}}(): {{0.names.name}}",
TestArrayReceiver2.class.getMethod("execute", HasArray2.class));
Message message = GenericMessageSupplier
.create(template, new TestReceiver(), "execute", new HasArray2()).get();
String text = ((ReadableMessage) message).getText();
assertThat(text)
.isEqualTo(TestReceiver.class.getName() + ".execute(): [[the name, the name]]");
}
@Test
public void shouldRenderArrayLength() throws Exception {
MessageTemplate template =
MessageTemplate.create("{{this.class.name}}.{{methodName}}(): {{0.names.length}}",
TestArrayReceiver.class.getMethod("execute", HasArray.class));
Message message = GenericMessageSupplier
.create(template, new TestReceiver(), "execute", new HasArray()).get();
String text = ((ReadableMessage) message).getText();
assertThat(text).isEqualTo(TestReceiver.class.getName() + ".execute(): 2");
}
public static class HasName {
public String getName() {
return "the name";
}
public String getThrowingName() {
throw new RuntimeException("Abc Xyz");
}
}
public static class HasArray {
public String[] getNames() {
return new String[] {"the name", "two"};
}
}
public static class HasArray1 {
public HasName[] getNames() {
return new HasName[] {new HasName(), new HasName()};
}
}
public static class HasArray2 {
public HasName[][] getNames() {
return new HasName[][] {new HasName[] {new HasName(), new HasName()}};
}
}
public static class TestReceiver {
public void execute(@SuppressWarnings("unused") HasName arg) {}
}
public static class TestArrayReceiver {
public void execute(@SuppressWarnings("unused") HasArray arg) {}
}
public static class TestArrayReceiver1 {
public void execute(@SuppressWarnings("unused") HasArray1 arg) {}
}
public static class TestArrayReceiver2 {
public void execute(@SuppressWarnings("unused") HasArray2 arg) {}
}
}