package org.webpieces.webserver.staticpath; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.nio.charset.StandardCharsets; import java.util.Properties; import org.junit.Assert; import org.junit.Before; import org.junit.Test; import org.webpieces.httpcommon.Requests; import org.webpieces.httpcommon.api.RequestId; import org.webpieces.httpcommon.api.RequestListener; import org.webpieces.httpparser.api.dto.HttpRequest; import org.webpieces.httpparser.api.dto.KnownHttpMethod; import org.webpieces.httpparser.api.dto.KnownStatusCode; import org.webpieces.util.file.VirtualFileClasspath; import org.webpieces.util.net.URLEncoder; import org.webpieces.webserver.ResponseExtract; import org.webpieces.webserver.WebserverForTest; import org.webpieces.webserver.test.FullResponse; import org.webpieces.webserver.test.MockResponseSender; import org.webpieces.webserver.test.PlatformOverridesForTest; public class TestStaticPaths { private RequestListener server; private MockResponseSender socket = new MockResponseSender(); private File cacheDir; @Before public void setUp() { VirtualFileClasspath metaFile = new VirtualFileClasspath("staticMeta.txt", WebserverForTest.class.getClassLoader()); WebserverForTest webserver = new WebserverForTest(new PlatformOverridesForTest(), null, false, metaFile); cacheDir = webserver.getCacheDir(); server = webserver.start(); } @Test public void testStaticDir() { HttpRequest req = Requests.createRequest(KnownHttpMethod.GET, "/public/staticMeta.txt"); server.incomingRequest(req, new RequestId(0), true, socket); FullResponse response = ResponseExtract.assertSingleResponse(socket); response.assertStatusCode(KnownStatusCode.HTTP_200_OK); response.assertContains("org.webpieces.webserver.staticpath.app.StaticMeta"); response.assertContentType("text/plain; charset=utf-8"); } @Test public void testStaticDirWithHashGeneration() throws FileNotFoundException, IOException { HttpRequest req = Requests.createRequest(KnownHttpMethod.GET, "/pageparam"); server.incomingRequest(req, new RequestId(0), true, socket); FullResponse response = ResponseExtract.assertSingleResponse(socket); String hash = loadUrlEncodedHash(); response.assertStatusCode(KnownStatusCode.HTTP_200_OK); response.assertContains("/public/fonts.css?hash="+hash); } @Test public void testStaticDirWithHashLoad() throws FileNotFoundException, IOException { String hash = loadUrlEncodedHash(); HttpRequest req = Requests.createRequest(KnownHttpMethod.GET, "/public/fonts.css?hash="+hash); server.incomingRequest(req, new RequestId(0), true, socket); FullResponse response = ResponseExtract.assertSingleResponse(socket); response.assertStatusCode(KnownStatusCode.HTTP_200_OK); response.assertContains("themes.googleusercontent.com"); response.assertContentType("text/css; charset=utf-8"); } private String loadUrlEncodedHash() throws IOException, FileNotFoundException { File meta = new File(cacheDir, "public/webpiecesMeta.properties"); Properties p = new Properties(); p.load(new FileInputStream(meta)); String hash = p.getProperty("/public/fonts.css"); String encodedHash = URLEncoder.encode(hash, StandardCharsets.UTF_8); return encodedHash; } @Test public void testStaticDirWithBadHashDoesNotLoadMismatchFileIntoBrowser() throws FileNotFoundException, IOException { HttpRequest req = Requests.createRequest(KnownHttpMethod.GET, "/public/fonts.css?hash=BADHASH"); server.incomingRequest(req, new RequestId(0), true, socket); FullResponse response = ResponseExtract.assertSingleResponse(socket); response.assertStatusCode(KnownStatusCode.HTTP_404_NOTFOUND); } @Test public void testStaticDirJpg() { HttpRequest req = Requests.createRequest(KnownHttpMethod.GET, "/public/pics.ext/image.jpg"); server.incomingRequest(req, new RequestId(0), true, socket); FullResponse response = ResponseExtract.assertSingleResponse(socket); response.assertStatusCode(KnownStatusCode.HTTP_200_OK); response.assertContentType("image/jpeg"); int size = response.getBody().getReadableSize(); Assert.assertEquals(18066, size); } @Test public void testStaticDirAndNotFound() { HttpRequest req = Requests.createRequest(KnownHttpMethod.GET, "/public/pics.ext/notFound.jpg"); server.incomingRequest(req, new RequestId(0), true, socket); FullResponse response = ResponseExtract.assertSingleResponse(socket); response.assertStatusCode(KnownStatusCode.HTTP_404_NOTFOUND); //render html page when not found... response.assertContentType("text/html; charset=utf-8"); } @Test public void testStaticFile() { HttpRequest req = Requests.createRequest(KnownHttpMethod.GET, "/public/myfile"); server.incomingRequest(req, new RequestId(0), true, socket); FullResponse response = ResponseExtract.assertSingleResponse(socket); response.assertStatusCode(KnownStatusCode.HTTP_200_OK); response.assertContains("app.TagsMeta"); } }