package org.ovirt.engine.ui.frontend.server.gwt; import static org.junit.Assert.assertArrayEquals; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import static org.mockito.ArgumentMatchers.anyListOf; import static org.mockito.ArgumentMatchers.nullable; import static org.mockito.Mockito.atLeast; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import java.io.IOException; import java.io.UnsupportedEncodingException; import java.nio.charset.StandardCharsets; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.util.ArrayList; import java.util.List; import javax.servlet.ServletException; import org.codehaus.jackson.JsonNode; import org.codehaus.jackson.map.ObjectMapper; import org.codehaus.jackson.node.ArrayNode; import org.codehaus.jackson.node.ObjectNode; import org.junit.Before; import org.junit.ClassRule; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.junit.MockitoJUnitRunner; import org.ovirt.engine.core.utils.MockConfigRule; import org.ovirt.engine.ui.frontend.server.gwt.plugin.PluginData; @RunWith(MockitoJUnitRunner.class) public class WebAdminHostPageServletTest extends AbstractGwtDynamicHostPageServletTest<WebAdminHostPageServlet> { private static final String APPLICATION_MODE = "{ \"value\": \"123\" }"; //$NON-NLS-1$ @ClassRule public static MockConfigRule mcr = new MockConfigRule(); @Mock private ObjectNode mockApplicationModeObject; // Cannot use @Mock since ArrayNode is final private ArrayNode mockPluginDefinitionsArray; @Before public void setUpMockRequest() { ObjectMapper mapper = new ObjectMapper(); ObjectNode mockPluginDef = mapper.createObjectNode(); mockPluginDef.put("foo", "bar"); //$NON-NLS-1$ //$NON-NLS-2$ mockPluginDefinitionsArray = mapper.createArrayNode(); mockPluginDefinitionsArray.add(mockPluginDef); when(mockApplicationModeObject.toString()).thenReturn(APPLICATION_MODE); when(mockRequest.getAttribute(WebAdminHostPageServlet.ATTR_APPLICATION_MODE)).thenReturn(mockApplicationModeObject); when(mockRequest.getAttribute(WebAdminHostPageServlet.ATTR_PLUGIN_DEFS)).thenReturn(mockPluginDefinitionsArray); } @Override protected WebAdminHostPageServlet getTestServletSpy() { return spy(new WebAdminHostPageServlet()); } @Override protected void setUpTestServlet() throws NoSuchAlgorithmException { super.setUpTestServlet(); // Avoid touching PluginDataManager via getPluginData method doReturn(new ArrayList<PluginData>()).when(testServlet).getPluginData(); } @Test public void testGetSelectorScriptName() { assertEquals("webadmin.nocache.js", testServlet.getSelectorScriptName()); //$NON-NLS-1$ } @Test public void testFilterQueries() { assertFalse(testServlet.filterQueries()); } @Test public void testDoGet_ExtraAttributes_WithoutUserInfoObject() throws IOException, ServletException { doReturn(mockApplicationModeObject).when(testServlet).getApplicationModeObject(nullable(Integer.class)); doReturn(mockPluginDefinitionsArray).when(testServlet).getPluginDefinitionsArray(anyListOf(PluginData.class)); testServlet.doGet(mockRequest, mockResponse); verify(mockRequest).setAttribute(WebAdminHostPageServlet.ATTR_APPLICATION_MODE, mockApplicationModeObject); verify(mockRequest).setAttribute(WebAdminHostPageServlet.ATTR_PLUGIN_DEFS, mockPluginDefinitionsArray); } @Test public void testGetMd5Digest_WithExtraObjects_WithoutUserInfoObject() throws NoSuchAlgorithmException, UnsupportedEncodingException { MessageDigest result = testServlet.getMd5Digest(mockRequest); assertEquals(result, mockDigest); verify(mockDigest, atLeast(3)).update(byteArrayCaptor.capture()); assertArrayEquals(SELECTOR_SCRIPT.getBytes(StandardCharsets.UTF_8), byteArrayCaptor.getAllValues().get(0)); assertArrayEquals(APPLICATION_MODE.getBytes(StandardCharsets.UTF_8), byteArrayCaptor.getAllValues().get(1)); assertArrayEquals(mockPluginDefinitionsArray.toString().getBytes(StandardCharsets.UTF_8), byteArrayCaptor.getAllValues().get(2)); } @Test public void testGetApplicationModeObject() { ObjectNode result = testServlet.getApplicationModeObject(255); assertEquals("255", result.get("value").asText()); //$NON-NLS-1$ //$NON-NLS-2$ } @Test public void testGetPluginDefinitionsArray() { int mockDataCount = 10; List<PluginData> pluginData = new ArrayList<>(); for (int i = 0; i < mockDataCount; i++) { PluginData mockData = mock(PluginData.class); when(mockData.getName()).thenReturn("name" + i); //$NON-NLS-1$ when(mockData.getUrl()).thenReturn("url" + i); //$NON-NLS-1$ when(mockData.mergeConfiguration()).thenReturn(mock(ObjectNode.class)); when(mockData.isEnabled()).thenReturn(true); pluginData.add(mockData); } ArrayNode result = testServlet.getPluginDefinitionsArray(pluginData); assertEquals(mockDataCount, result.size()); for (int i = 0; i < mockDataCount; i++) { JsonNode item = result.get(i); assertEquals(item.get("name").asText(), "name" + i); //$NON-NLS-1$ //$NON-NLS-2$ assertEquals(item.get("url").asText(), "url" + i); //$NON-NLS-1$ //$NON-NLS-2$ assertTrue(item.get("config") instanceof ObjectNode); //$NON-NLS-1$ assertTrue(item.get("enabled").asBoolean()); //$NON-NLS-1$ } } }