package org.stagemonitor.tracing.freemarker; import com.uber.jaeger.context.TracingUtils; import freemarker.template.Configuration; import freemarker.template.Template; import freemarker.template.TemplateException; import org.junit.After; import org.junit.Before; import org.junit.Test; import org.stagemonitor.tracing.profiler.CallStackElement; import org.stagemonitor.tracing.profiler.Profiler; import java.io.IOException; import java.io.StringWriter; import java.util.Collections; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.CoreMatchers.nullValue; import static org.junit.Assert.assertThat; import static org.junit.Assert.assertTrue; public class FreemarkerProfilingTransformerTest { @Before public void setUp() throws Exception { assertTrue(TracingUtils.getTraceContext().isEmpty()); } @After public void tearDown() throws Exception { assertTrue(TracingUtils.getTraceContext().isEmpty()); } @Test public void testFreemarkerProfiling() throws Exception { final CallStackElement callTree = Profiler.activateProfiling("testFreemarkerProfiling"); final String renderedTemplate = processTemplate("test.ftl", "${templateModel.foo}", new TemplateModel()); Profiler.stop(); Profiler.deactivateProfiling(); assertThat(renderedTemplate, is("foo")); System.out.println(callTree); assertThat(callTree.getChildren().size(), is(1)); final CallStackElement freemarkerNode = callTree.getChildren().get(0); assertThat(freemarkerNode.getSignature(), is("test.ftl:1#templateModel.foo")); assertThat(freemarkerNode.getChildren().size(), is(1)); final CallStackElement templateModelNode = freemarkerNode.getChildren().get(0); assertThat(templateModelNode.getSignature(), is("String org.stagemonitor.tracing.freemarker.FreemarkerProfilingTransformerTest$TemplateModel.getFoo()")); } @Test public void testFreemarkerProfilingMethodCall() throws Exception { final CallStackElement callTree = Profiler.activateProfiling("testFreemarkerProfilingMethodCall"); final String renderedTemplate = processTemplate("test.ftl", "${templateModel.getFoo()}", new TemplateModel()); Profiler.stop(); Profiler.deactivateProfiling(); assertThat(renderedTemplate, is("foo")); System.out.println(callTree); assertThat(callTree.getChildren().size(), is(1)); final CallStackElement freemarkerNode = callTree.getChildren().get(0); assertThat(freemarkerNode.getSignature(), is("test.ftl:1#templateModel.getFoo()")); assertThat(freemarkerNode.getChildren().size(), is(1)); final CallStackElement templateModelNode = freemarkerNode.getChildren().get(0); assertThat(templateModelNode.getSignature(), is("String org.stagemonitor.tracing.freemarker.FreemarkerProfilingTransformerTest$TemplateModel.getFoo()")); } @Test public void testFreemarkerWorksIfNotProfiling() throws Exception { final String renderedTemplate = processTemplate("test.ftl", "${templateModel.getFoo()}", new TemplateModel()); assertThat(renderedTemplate, is("foo")); } @Test public void testShortSignature() { final String signature = "foobar.ftl:123#foo.getBar('123').baz"; // don't try to shorten ftl signatures assertThat(CallStackElement.createRoot(signature).getShortSignature(), nullValue()); } public static class TemplateModel { public String getFoo() { Profiler.start("String org.stagemonitor.tracing.freemarker.FreemarkerProfilingTransformerTest$TemplateModel.getFoo()"); try { return "foo"; } finally { Profiler.stop(); } } } private String processTemplate(String templateName, String templateString, TemplateModel templateModel) throws IOException, TemplateException { Template template = new Template(templateName, templateString, new Configuration(Configuration.VERSION_2_3_22)); StringWriter out = new StringWriter(templateString.length()); template.process(Collections.singletonMap("templateModel", templateModel), out); return out.toString(); } }