package org.rhq.enterprise.server.plugins.yum;/* * RHQ Management Platform * Copyright (C) 2013 Red Hat, Inc. * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation version 2 of the License. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ import static org.testng.Assert.assertEquals; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStreamReader; import java.io.Reader; import java.net.InetAddress; import java.net.URI; import java.net.URISyntaxException; import java.net.URL; import java.util.HashMap; import java.util.Map; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.testng.Assert; import org.testng.annotations.AfterClass; import org.testng.annotations.BeforeClass; import org.testng.annotations.Test; import org.rhq.core.util.stream.StreamUtil; import org.rhq.test.PortScout; import Acme.Serve.Serve; import Acme.Serve.UrlReaderTestServer; /** * @author Lukas Krejci * @since 4.9 */ @Test public class UrlReaderTest { private static final String TEST_USER = "testUser"; private static final String TEST_PASSWORD = "password"; private static class AuthServlet extends HttpServlet { private static final long serialVersionUID = 1L; @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String authType = req.getAuthType(); String remoteUser = req.getRemoteUser(); assertEquals(authType, "BASIC", "Unexpected authentication type"); assertEquals(remoteUser, TEST_USER, "Unexpected authenticated user."); String path = req.getPathTranslated(); if (path != null) { FileInputStream in = new FileInputStream(path); try { StreamUtil.copy(in, resp.getOutputStream(), false); } finally { in.close(); } } } } private UrlReaderTestServer httpServer; private String rootUrl; @BeforeClass public void startWebServer() throws IOException, URISyntaxException { PortScout portScout = new PortScout(); int httpPort = portScout.getNextFreePort(); Map<String, Object> params = new HashMap<String, Object>(); params.put(Serve.ARG_PORT, httpPort); params.put(Serve.ARG_NOHUP, "nohup"); httpServer = new UrlReaderTestServer(params, System.err); Serve.PathTreeDictionary aliases = new Serve.PathTreeDictionary(); File root = getRoot(); aliases.put("/", root); aliases.put("/*", root); httpServer.setMappingTable(aliases); httpServer.addDefaultServlets(null); httpServer.addServlet("/auth", new AuthServlet()); UrlReaderTestServer.AuthRealm authRealm = new UrlReaderTestServer.AuthRealm("auth"); authRealm.put(TEST_USER, TEST_PASSWORD); Serve.PathTreeDictionary realms = new Serve.PathTreeDictionary(); realms.put("/auth", authRealm); httpServer.setRealms(realms); portScout.close(); httpServer.runInBackground(); rootUrl = InetAddress.getLocalHost().getHostAddress() + ":" + httpPort; } @AfterClass(alwaysRun = true) public void stopWebServer() throws IOException { httpServer.stopBackground(); httpServer.destroyAllServlets(); } public void picksCorrectImpl() throws Exception { URI httpUrl = new URI("http://jboss.org/rhq"); URI httpsUrl = new URI("https://jboss.org/rhq"); URI noSchemeUrl = new URI("stairway/to/heaven"); URI fileUrl = new URI("file:/over/the/rainbow"); UrlReader httpRdr = UrlReader.fromUri(httpUrl, null, null); UrlReader httpsRdr = UrlReader.fromUri(httpsUrl, null, null); UrlReader noSchemeRdr = UrlReader.fromUri(noSchemeUrl, null, null); UrlReader fileRdr = UrlReader.fromUri(fileUrl, null, null); assertReader(httpRdr, httpUrl.toURL(), HttpReader.class); assertReader(httpsRdr, httpsUrl.toURL(), HttpReader.class); assertReader(noSchemeRdr, new URL("file:stairway/to/heaven"), DiskReader.class); assertReader(fileRdr, fileUrl.toURL(), DiskReader.class); } public void readsFiles() throws Exception { UrlReader fileReader = UrlReader.fromUri(getRoot().toURI(), null, null); testReaderWithTestFile(fileReader); } public void readsHttp() throws Exception { URI uri = new URI("http://" + rootUrl); UrlReader httpReader = UrlReader.fromUri(uri, null, null); testReaderWithTestFile(httpReader); } public void authenticatesInHttp() throws Exception { URI uri = new URI("http://" + rootUrl + "/auth"); UrlReader httpReader = UrlReader.fromUri(uri, TEST_USER, TEST_PASSWORD); testReaderWithTestFile(httpReader); } private static void assertReader(UrlReader instance, URL expectedUrl, Class<? extends UrlReader> expectedType) { assertEquals(instance.getClass(), expectedType, "Unexpected reader type"); assertEquals(instance.getBaseURL(), expectedUrl, "Unexpected baseUrl"); } private void testReaderWithTestFile(UrlReader reader) throws IOException, URISyntaxException { try { reader.validate(); } catch (IOException e) { Assert.fail("Validation of " + reader.getClass().getSimpleName() + " reader failed", e); } Reader rdr = new InputStreamReader(reader.openStream("test.file")); try { String contents = StreamUtil.slurp(rdr); assertEquals(contents, "kachny\n", "Unexpected contents of the test file"); } finally { rdr.close(); } } private File getRoot() throws URISyntaxException { URI testUri = getClass().getResource("/test.file").toURI(); File testFile = new File(testUri.getSchemeSpecificPart()); return testFile.getParentFile(); } }