package com.github.jknack.handlebars.cache; import static org.easymock.EasyMock.createMock; import static org.easymock.EasyMock.eq; import static org.easymock.EasyMock.expect; import static org.easymock.EasyMock.isA; import static org.easymock.EasyMock.replay; import static org.easymock.EasyMock.verify; import static org.junit.Assert.assertEquals; import java.io.IOException; import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; import org.junit.Test; import com.github.jknack.handlebars.HandlebarsException; import com.github.jknack.handlebars.Parser; import com.github.jknack.handlebars.Template; import com.github.jknack.handlebars.io.ForwardingTemplateSource; import com.github.jknack.handlebars.io.TemplateSource; import com.github.jknack.handlebars.io.URLTemplateSource; import com.google.common.cache.Cache; import com.google.common.cache.CacheBuilder; public class GuavaTemplateCacheTest { @Test public void get() throws IOException { Cache<TemplateSource, Template> cache = CacheBuilder.newBuilder() .build(); TemplateSource source = new URLTemplateSource("/template.hbs", getClass().getResource( "/template.hbs")); Template template = createMock(Template.class); Parser parser = createMock(Parser.class); expect(parser.parse(source)).andReturn(template); replay(parser, template); // 1st call, parse must be call it assertEquals(template, new GuavaTemplateCache(cache).get(source, parser)); // 2nd call, should return from cache assertEquals(template, new GuavaTemplateCache(cache).get(source, parser)); verify(parser, template); } @Test public void getAndReload() throws IOException, InterruptedException { Cache<TemplateSource, Template> cache = CacheBuilder.newBuilder() .build(); TemplateSource source = source("/template.hbs"); Template template = createMock(Template.class); Template reloadTemplate = createMock(Template.class); Parser parser = createMock(Parser.class); expect(parser.parse(source)).andReturn(template); TemplateSource reloadSource = new ForwardingTemplateSource(source) { @Override public long lastModified() { return System.currentTimeMillis() * 7; } }; expect(parser.parse(reloadSource)).andReturn(reloadTemplate); replay(parser, template, reloadTemplate); // 1st call, parse must be call it assertEquals(template, new GuavaTemplateCache(cache).setReload(true).get(source, parser)); // 2nd call, should return from cache assertEquals(template, new GuavaTemplateCache(cache).setReload(true).get(source, parser)); // 3th call, parse must be call it assertEquals(reloadTemplate, new GuavaTemplateCache(cache).setReload(true).get(reloadSource, parser)); verify(parser, template, reloadTemplate); } @Test public void evict() throws IOException { TemplateSource source = createMock(TemplateSource.class); @SuppressWarnings("unchecked") Cache<TemplateSource, Template> cache = createMock(Cache.class); cache.invalidate(source); replay(cache, source); new GuavaTemplateCache(cache).evict(source); verify(cache, source); } @Test public void clear() throws IOException { @SuppressWarnings("unchecked") Cache<TemplateSource, Template> cache = createMock(Cache.class); cache.invalidateAll(); replay(cache); new GuavaTemplateCache(cache).clear(); verify(cache); } @SuppressWarnings("unchecked") @Test(expected = IllegalStateException.class) public void executionExceptionWithRuntimeException() throws IOException, ExecutionException { TemplateSource source = createMock(TemplateSource.class); Parser parser = createMock(Parser.class); Cache<TemplateSource, Template> cache = createMock(Cache.class); expect(cache.get(eq(source), isA(Callable.class))).andThrow( new ExecutionException(new IllegalStateException())); replay(cache, source, parser); new GuavaTemplateCache(cache).get(source, parser); verify(cache, source, parser); } @SuppressWarnings("unchecked") @Test(expected = Error.class) public void executionExceptionWithError() throws IOException, ExecutionException { TemplateSource source = createMock(TemplateSource.class); Parser parser = createMock(Parser.class); Cache<TemplateSource, Template> cache = createMock(Cache.class); expect(cache.get(eq(source), isA(Callable.class))).andThrow( new ExecutionException(new Error())); replay(cache, source, parser); new GuavaTemplateCache(cache).get(source, parser); verify(cache, source, parser); } @SuppressWarnings("unchecked") @Test(expected = HandlebarsException.class) public void executionExceptionWithCheckedException() throws IOException, ExecutionException { TemplateSource source = createMock(TemplateSource.class); Parser parser = createMock(Parser.class); Cache<TemplateSource, Template> cache = createMock(Cache.class); expect(cache.get(eq(source), isA(Callable.class))).andThrow( new ExecutionException(new IOException())); replay(cache, source, parser); new GuavaTemplateCache(cache).get(source, parser); verify(cache, source, parser); } private TemplateSource source(final String filename) throws IOException { TemplateSource source = new URLTemplateSource(filename, getClass().getResource( filename)); return source; } }