/******************************************************************************* * Copyright (c) 2012-2017 Codenvy, S.A. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Codenvy, S.A. - initial API and implementation *******************************************************************************/ package org.eclipse.che.plugin.urlfactory; import org.eclipse.jetty.server.Server; import org.eclipse.jetty.server.ServerConnector; import org.eclipse.jetty.servlet.ServletContextHandler; import org.eclipse.jetty.servlet.ServletHolder; import org.mockito.InjectMocks; import org.mockito.testng.MockitoTestNGListener; import org.testng.Assert; import org.testng.annotations.AfterClass; import org.testng.annotations.BeforeClass; import org.testng.annotations.Listeners; import org.testng.annotations.Test; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.URL; import static org.eclipse.jetty.http.HttpStatus.NOT_FOUND_404; import static org.eclipse.jetty.http.HttpStatus.OK_200; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.reset; import static org.mockito.Mockito.when; import static org.testng.Assert.assertFalse; import static org.testng.Assert.assertTrue; /** * Testing {@link URLChecker} * * @author Florent Benoit */ @Listeners(MockitoTestNGListener.class) public class URLCheckerTest { /** * Instance to test. */ @InjectMocks private URLChecker URLChecker; /** * Http jetty instance used in tests. */ private Server server; /** * Port number used. */ private int port; /** * Check that when url is null, NPE is thrown */ @Test(expectedExceptions = NullPointerException.class) public void checkNullURL() { URLChecker.exists((String)null); } /** * Check that the url exists */ @Test public void checkUrlFileExists() { // test to check if this url exist URL urlJson = URLCheckerTest.class.getResource("/" + URLCheckerTest.class.getName().replace('.', '/') + ".class"); Assert.assertNotNull(urlJson); boolean exists = URLChecker.exists(urlJson); assertTrue(exists); } /** * Check when url doesn't exist */ @Test public void checkUrlFileNotExists() { // test to check if this url exist URL urlJson = URLCheckerTest.class.getResource("/" + URLCheckerTest.class.getPackage().getName().replace('.', '/') + "/.che.json"); Assert.assertNotNull(urlJson); boolean exists = URLChecker.exists(urlJson.toString() + "-notfound"); assertFalse(exists); } /** * Check when url is invalid */ @Test public void checkUrlFileIsInvalid() { boolean exists = URLChecker.exists("hello world"); assertFalse(exists); } /** * Check when url is invalid */ @Test public void checkUrlIsInvalid() throws MalformedURLException { // test to check if this url exist URL urlJson = URLCheckerTest.class.getResource("/" + URLCheckerTest.class.getPackage().getName().replace('.', '/') + "/.che.json"); Assert.assertNotNull(urlJson); boolean exists = URLChecker.exists(new URL(urlJson.toString() + "-notfound")); assertFalse(exists); } /** * Check HTTP url. */ @Test public void checkHTTPUrl() throws IOException { HttpURLConnection httpURLConnection = mock(HttpURLConnection.class); // if 200, it's ok when(httpURLConnection.getResponseCode()).thenReturn(OK_200); boolean exists = URLChecker.exists(httpURLConnection); assertTrue(exists); // if 404, it's ko reset(httpURLConnection); when(httpURLConnection.getResponseCode()).thenReturn(NOT_FOUND_404); exists = URLChecker.exists(httpURLConnection); assertFalse(exists); // failure, it's ko reset(httpURLConnection); when(httpURLConnection.getResponseCode()).thenThrow(IOException.class); exists = URLChecker.exists(httpURLConnection); assertFalse(exists); // check local server exists = URLChecker.exists("http://localhost:" + port); assertTrue(exists); } /** * Start http server to really test a HTTP endpoint. * as URL can't be mock * * @throws Exception * if server is not started */ @BeforeClass public void startJetty() throws Exception { this.server = new Server(0); ServletContextHandler context = new ServletContextHandler(ServletContextHandler.SESSIONS); context.setContextPath("/"); context.addServlet(new ServletHolder(new MyServlet()), "/"); this.server.setHandler(context); this.server.start(); this.port = ((ServerConnector)server.getConnectors()[0]).getLocalPort(); } /** * Stops the server at the end * * @throws Exception */ @AfterClass public void stopJetty() throws Exception { server.stop(); } /** * Dummy servlet class. */ static class MyServlet extends HttpServlet { protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { resp.getOutputStream().print("hello"); } } }