package org.webpieces.router.impl.compression;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import org.apache.commons.io.FileUtils;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.webpieces.router.api.ProdRouterModule;
import org.webpieces.router.api.RouterConfig;
import org.webpieces.router.impl.StaticRoute;
import org.webpieces.router.impl.UrlPath;
import org.webpieces.util.logging.Logger;
import org.webpieces.util.logging.LoggerFactory;
import org.webpieces.util.security.SecretKeyInfo;
import com.google.inject.Binder;
import com.google.inject.Guice;
import com.google.inject.Injector;
import com.google.inject.Module;
import com.google.inject.util.Modules;
public class TestCompressionCache {
private static final Logger log = LoggerFactory.getLogger(TestCompressionCache.class);
private CompressionCacheSetup cache;
private TestFileUtilProxy proxy = new TestFileUtilProxy();
private File cacheDir = new File(System.getProperty("java.io.tmpdir")+"/cacheForTesting");
@Before
public void setUp() throws IOException {
FileUtils.deleteDirectory(cacheDir);
log.info("deleting dir="+cacheDir);
File stagingDir = new File("output/staging");
FileUtils.deleteDirectory(stagingDir);
RouterConfig config = new RouterConfig();
config.setSecretKey(SecretKeyInfo.generateForTest());
config.setCachedCompressedDirectory(cacheDir);
Module allMods = Modules.override(new ProdRouterModule(config)).with(new TestModule());
Injector injector = Guice.createInjector(allMods);
cache = injector.getInstance(CompressionCacheSetup.class);
}
@Test
public void testStartServerTwiceNoChanges() throws IOException {
File f = new File("src/test/resources/cacheTest1");
File stagingDir = new File("output/staging");
FileUtils.copyDirectory(f, stagingDir);
List<StaticRoute> routes = runBasicServerOnce(stagingDir);
//if server is just restarted(no file changes), we should skip reading files...
cache.setupCache(routes);
Assert.assertEquals(0, proxy.getReadFiles().size());
Assert.assertEquals(0, proxy.getCompressedFiles().size());
}
private List<StaticRoute> runBasicServerOnce(File stagingDir) {
List<StaticRoute> routes = new ArrayList<>();
routes.add(new StaticRoute(new UrlPath("", "/public/"), stagingDir.getAbsolutePath()+"/", false, cacheDir));
cache.setupCache(routes);
Assert.assertEquals(2, proxy.getReadFiles().size());
Assert.assertEquals(2, proxy.getCompressedFiles().size());
proxy.clear();
return routes;
}
@Test
public void testStartServerTwiceButUrlPathChanges() throws IOException {
File f = new File("src/test/resources/cacheTest1");
File stagingDir = new File("output/staging");
FileUtils.copyDirectory(f, stagingDir);
runBasicServerOnce(stagingDir);
List<StaticRoute> routes2 = new ArrayList<>();
routes2.add(new StaticRoute(new UrlPath("", "/public1.4/"), stagingDir.getAbsolutePath()+"/", false, cacheDir));
//if server is just restarted(no file changes), we should skip reading files...
cache.setupCache(routes2);
Assert.assertEquals(2, proxy.getReadFiles().size());
Assert.assertEquals(2, proxy.getCompressedFiles().size());
}
@Test
public void testCreateCacheAndUpdateTimestampButNotChangeFileContents() throws IOException {
File f = new File("src/test/resources/cacheTest1");
File stagingDir = new File("output/staging");
FileUtils.copyDirectory(f, stagingDir);
List<StaticRoute> routes = runBasicServerOnce(stagingDir);
FileUtils.copyDirectory(f, stagingDir, false); //do not preserve dates here...
//if server is just restarted(no file changes), we should skip reading files...
cache.setupCache(routes);
Assert.assertEquals(2, proxy.getReadFiles().size());
Assert.assertEquals(0, proxy.getCompressedFiles().size());
}
@Test
public void testModifyFileContentsButNotUrlPathFailure() throws IOException {
File f = new File("src/test/resources/cacheTest1");
File stagingDir = new File("output/staging");
FileUtils.copyDirectory(f, stagingDir);
List<StaticRoute> routes = runBasicServerOnce(stagingDir);
File f2 = new File("src/test/resources/cacheTest2");
FileUtils.deleteDirectory(stagingDir);
FileUtils.copyDirectory(f2, stagingDir, false); //do not preserve dates here...
try {
cache.setupCache(routes);
Assert.fail("should have failed since file contents changed and url path didn't which would have broken web app customers");
} catch(IllegalStateException e) {
}
}
private class TestModule implements Module {
@Override
public void configure(Binder binder) {
binder.bind(FileUtil.class).toInstance(proxy);
}
}
}