package org.ovirt.engine.core.utils.servlet;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import java.io.File;
import java.io.IOException;
import java.util.Locale;
import javax.servlet.ServletConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.junit.Before;
import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.junit.MockitoJUnitRunner;
/**
* Unit tests for the {@code DocsServlet} class.
*/
@RunWith(MockitoJUnitRunner.class)
@Ignore
public class DocsServletTest {
DocsServlet testServlet;
/**
* The mockRequest used in the test.
*/
@Mock
HttpServletRequest mockRequest;
@Mock
HttpServletResponse mockResponse;
@Mock
HttpSession mockSession;
@Mock
ServletConfig mockConfig;
@Before
public void setUp() throws Exception {
testServlet = new DocsServlet();
when(mockConfig.getInitParameter("file")).thenReturn(this.getClass().getResource("filetest").toURI().
toASCIIString().replaceAll("file:", ""));
ServletContext mockContext = mock(ServletContext.class);
when(mockConfig.getServletContext()).thenReturn(mockContext);
testServlet.init(mockConfig);
when(mockRequest.getSession(true)).thenReturn(mockSession);
}
/**
* Test method for {@link org.ovirt.engine.core.DocsServlet#doGet(javax.servlet.http.HttpServletRequest,
* javax.servlet.http.HttpServletResponse)}.
* @throws ServletException If test fails
* @throws IOException If test fails
*/
@Test
public void testDoGet_CheckIndex() throws ServletException, IOException {
//Because we would have found the index file, we do a redirect and thus the response is committed.
when(mockResponse.isCommitted()).thenReturn(Boolean.TRUE);
when(mockRequest.getServletPath()).thenReturn("/docs");
testServlet.doGet(mockRequest, mockResponse);
verify(mockResponse).sendRedirect("/docs/index.html");
}
/**
* Test method for {@link org.ovirt.engine.core.DocsServlet#doGet(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)}.
*/
@Test
public void testDoGet_NotFound() throws ServletException, IOException {
when(mockRequest.getPathInfo()).thenReturn("/abc/def");
when(mockRequest.getServletPath()).thenReturn("/docs");
testServlet.doGet(mockRequest, mockResponse);
verify(mockResponse).sendError(HttpServletResponse.SC_NOT_FOUND);
}
/**
* Test method for {@link org.ovirt.engine.core.DocsServlet#doGet(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)}.
*/
@Test
public void testDoGet_ResponseLangOkay() throws ServletException, IOException {
ServletOutputStream responseOut = mock(ServletOutputStream.class);
when(mockResponse.getOutputStream()).thenReturn(responseOut);
when(mockRequest.getPathInfo()).thenReturn("/fr/index.html");
when(mockRequest.getServletPath()).thenReturn("/docs");
testServlet.doGet(mockRequest, mockResponse);
verify(responseOut).write(any(), eq(0), anyInt());
}
/**
* Test method for {@link org.ovirt.engine.core.DocsServlet#doGet(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)}.
*/
@Test
public void testDoGet_Lang_MissingFirstTimeNoDispatcher() throws ServletException, IOException {
ServletOutputStream responseOut = mock(ServletOutputStream.class);
ServletContext mockContext = mock(ServletContext.class);
when(mockConfig.getServletContext()).thenReturn(mockContext);
when(mockResponse.getOutputStream()).thenReturn(responseOut);
when(mockRequest.getPathInfo()).thenReturn("/ja/index.html");
when(mockRequest.getServletPath()).thenReturn("/docs");
testServlet.doGet(mockRequest, mockResponse);
verify(mockResponse).sendError(eq(HttpServletResponse.SC_INTERNAL_SERVER_ERROR), anyString());
}
/**
* Test method for {@link org.ovirt.engine.core.DocsServlet#doGet(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)}.
*/
@Test
public void testDoGet_Lang_MissingFirstTimeNoDispatcher_SessionFalse() throws ServletException, IOException {
ServletOutputStream responseOut = mock(ServletOutputStream.class);
ServletContext mockContext = mock(ServletContext.class);
when(mockSession.getAttribute(DocsServlet.LANG_PAGE_SHOWN)).thenReturn(Boolean.FALSE);
when(mockConfig.getServletContext()).thenReturn(mockContext);
when(mockResponse.getOutputStream()).thenReturn(responseOut);
when(mockRequest.getPathInfo()).thenReturn("/ja/index.html");
when(mockRequest.getServletPath()).thenReturn("/docs");
testServlet.doGet(mockRequest, mockResponse);
verify(mockResponse).sendError(eq(HttpServletResponse.SC_INTERNAL_SERVER_ERROR), anyString());
}
/**
* Test method for {@link org.ovirt.engine.core.DocsServlet#determineActualFile(javax.servlet.http.HttpServletRequest, java.lang.String)}.
*/
@Test
public void testDetermineActualFile_US() {
File originalFile = ServletUtils.makeFileFromSanePath("/" + Locale.US.toLanguageTag(), testServlet.base);
when(mockRequest.getPathInfo()).thenReturn("/" + Locale.US.toLanguageTag());
File actualFile = testServlet.determineActualFile(mockRequest, Locale.US);
assertNotNull("actualFile should not be null", actualFile);
assertTrue("actualFile should exist", actualFile.exists());
assertEquals("original and actual should match", originalFile, actualFile);
}
/**
* Test method for {@link org.ovirt.engine.core.DocsServlet#determineActualFile(javax.servlet.http.HttpServletRequest, java.lang.String)}.
*/
@Test
public void testDetermineActualFile_Fr() {
//Fr exists, so the original and actual should match.
File originalFile = ServletUtils.makeFileFromSanePath("/" + Locale.FRENCH.toLanguageTag(), testServlet.base);
when(mockRequest.getPathInfo()).thenReturn("/" + Locale.FRENCH.toLanguageTag());
File actualFile = testServlet.determineActualFile(mockRequest, Locale.US);
assertNotNull("actualFile should not be null", actualFile);
assertTrue("actualFile should exist", actualFile.exists());
assertEquals("original and actual should match", originalFile, actualFile);
}
/**
* Test method for {@link org.ovirt.engine.core.DocsServlet#determineActualFile(javax.servlet.http.HttpServletRequest, java.lang.String)}.
*/
@Test
public void testDetermineActualFile_Jp() {
//Japanese does not exist, so the original and actual should NOT match.
File originalFile = ServletUtils.makeFileFromSanePath("/" + Locale.JAPANESE.toLanguageTag(), testServlet.base);
when(mockRequest.getPathInfo()).thenReturn("/" + Locale.JAPANESE.toLanguageTag());
File actualFile = testServlet.determineActualFile(mockRequest, Locale.JAPANESE);
assertNotNull("actualFile should not be null", actualFile);
assertFalse("original and actual should not match", originalFile.equals(actualFile));
assertTrue("actual file should end in /en-US", actualFile.toString().endsWith(Locale.US.toLanguageTag()));
}
/**
* Test method for {@link org.ovirt.engine.core.DocsServlet#getLocaleFromRequest(javax.servlet.http.HttpServletRequest)}.
*/
@Test
public void testGetLocaleFromRequest() {
Locale result = testServlet.getLocaleFromRequest(mockRequest);
assertEquals("The locale should be en-US", Locale.US, result);
when(mockRequest.getHeader(DocsServlet.REFERER)).thenReturn("http://127.0.0.1:8700/webadmin/webadmin/WebAdmin.html?locale=fr");
result = testServlet.getLocaleFromRequest(mockRequest);
assertEquals("The locale should be fr", Locale.FRENCH, result);
}
/**
* Test method for {@link org.ovirt.engine.core.DocsServlet#getLocaleFromRequest(javax.servlet.http.HttpServletRequest)}.
*/
@Test
public void testGetLocaleFromRequest_withHash() {
Locale result = testServlet.getLocaleFromRequest(mockRequest);
assertEquals("The locale should be en-US", Locale.US, result);
when(mockRequest.getHeader(DocsServlet.REFERER)).thenReturn("http://127.0.0.1:8700/webadmin/webadmin/WebAdmin.html?locale=fr#basic");
result = testServlet.getLocaleFromRequest(mockRequest);
assertEquals("The locale should be fr", Locale.FRENCH, result);
}
/**
* Test method for {@link org.ovirt.engine.core.DocsServlet#getLocaleFromRequest(javax.servlet.http.HttpServletRequest)}.
*/
@Test
public void testGetLocaleFromRequest_Brazilian() {
Locale result = testServlet.getLocaleFromRequest(mockRequest);
assertEquals("The locale should be en-US", Locale.US, result);
when(mockRequest.getHeader(DocsServlet.REFERER)).thenReturn("http://127.0.0.1:8700/webadmin/webadmin/WebAdmin.html?locale=pt_BR");
result = testServlet.getLocaleFromRequest(mockRequest);
assertEquals("The locale should be pt_BR", new Locale("pt", "BR"), result);
}
/**
* Test method for {@link org.ovirt.engine.core.DocsServlet#getLocaleFromRequest(javax.servlet.http.HttpServletRequest)}.
*/
@Test
public void testGetLocaleFromRequest_Path() {
when(mockRequest.getPathInfo()).thenReturn("/ja/index.html");
Locale result = testServlet.getLocaleFromRequest(mockRequest);
assertEquals("The locale should be ja", Locale.JAPANESE, result);
}
/**
* Test method for {@link org.ovirt.engine.core.DocsServlet#getLocaleFromRequest(javax.servlet.http.HttpServletRequest)}.
*/
@Test
public void testGetLocaleFromRequest_Path_Underscore() {
when(mockRequest.getPathInfo()).thenReturn("/ja-JP/index.html");
Locale result = testServlet.getLocaleFromRequest(mockRequest);
assertEquals("The locale should be ja_JP", Locale.JAPAN, result);
}
/**
* Test method for {@link org.ovirt.engine.core.DocsServlet#getLocaleStringFromPath(java.lang.String)}.
*/
@Test
public void testGetLocaleStringFromPath() {
String result = testServlet.getLocaleStringFromPath(null);
assertNull("There should be no result", result);
result = testServlet.getLocaleStringFromPath("/index.html");
assertNull("There should be no result", result);
//File doesn't exist, it will end up with a 404 eventually
result = testServlet.getLocaleStringFromPath("/index2.html");
assertNotNull("There should be a result", result);
assertEquals("locale should be 'index2.html'", "index2.html", result);
//File does exist, but it is a directory.
result = testServlet.getLocaleStringFromPath("/fr/index.html");
assertNotNull("There should be a result", result);
assertEquals("locale should be 'fr'", "fr", result);
}
/**
* Test method for {@link org.ovirt.engine.core.DocsServlet#getLocaleStringFromPath(java.lang.String)}.
*/
@Test
public void testGetLocaleStringFromPath_IllegalPath() {
assertNull("Path without '/' should return null", testServlet.getLocaleStringFromPath("index.html"));
}
/**
* Test method for {@link org.ovirt.engine.core.DocsServlet#getLocaleStringFromReferer(javax.servlet.http.HttpServletRequest)}.
*/
@Test
public void testGetLocaleStringFromReferer() {
String result = testServlet.getLocaleStringFromReferer(mockRequest);
assertNull("There should be no result", result);
when(mockRequest.getHeader(DocsServlet.REFERER)).thenReturn("123thisisnot a uri");
result = testServlet.getLocaleStringFromReferer(mockRequest);
assertNull("There should be no result", result);
when(mockRequest.getHeader(DocsServlet.REFERER)).thenReturn("http://127.0.0.1:8700/webadmin/webadmin/WebAdmin.html#noparam");
result = testServlet.getLocaleStringFromReferer(mockRequest);
assertNull("There should be no result", result);
when(mockRequest.getHeader(DocsServlet.REFERER)).thenReturn("http://127.0.0.1:8700/webadmin/webadmin/WebAdmin.html?param1=something¶m2=somethingelse");
result = testServlet.getLocaleStringFromReferer(mockRequest);
assertNull("There should be no result", result);
}
/**
* Test method for {@link org.ovirt.engine.core.DocsServlet#getLocaleStringFromReferer(javax.servlet.http.HttpServletRequest)}.
*/
@Test
public void testGetLocaleStringFromReferer_Valid() {
when(mockRequest.getHeader(DocsServlet.REFERER)).thenReturn("http://127.0.0.1:8700/webadmin/webadmin/WebAdmin.html?locale=fr");
String result = testServlet.getLocaleStringFromReferer(mockRequest);
assertEquals("The result should be 'fr'", "fr", result);
when(mockRequest.getHeader(DocsServlet.REFERER)).thenReturn("http://127.0.0.1:8700/webadmin/webadmin/WebAdmin.html?param1=xxx&locale=fr");
result = testServlet.getLocaleStringFromReferer(mockRequest);
assertEquals("The result should be 'fr'", "fr", result);
when(mockRequest.getHeader(DocsServlet.REFERER)).thenReturn("http://127.0.0.1:8700/webadmin/webadmin/WebAdmin.html?param1=xxx&locale=fr¶m2=yyy");
result = testServlet.getLocaleStringFromReferer(mockRequest);
assertEquals("The result should be 'fr'", "fr", result);
}
}