http://git-wip-us.apache.org/repos/asf/storm/blob/6a041a98/storm-webapp/src/main/java/org/apache/storm/daemon/utils/ListFunctionalSupport.java ---------------------------------------------------------------------- diff --git a/storm-webapp/src/main/java/org/apache/storm/daemon/utils/ListFunctionalSupport.java b/storm-webapp/src/main/java/org/apache/storm/daemon/utils/ListFunctionalSupport.java index 83b3588..700fbb7 100644 --- a/storm-webapp/src/main/java/org/apache/storm/daemon/utils/ListFunctionalSupport.java +++ b/storm-webapp/src/main/java/org/apache/storm/daemon/utils/ListFunctionalSupport.java @@ -21,7 +21,17 @@ package org.apache.storm.daemon.utils; import java.util.List; import java.util.stream.Collectors; +/** + * Implements missing sequence functions in Java compared to Clojure. + * To make thing simpler, it only supports List type. + */ public class ListFunctionalSupport { + /** + * Get the first element in list. + * + * @param list list to get + * @return the first element. null if list is null or empty. + */ public static <T> T first(List<T> list) { if (list == null || list.size() <= 0) { return null; @@ -30,6 +40,28 @@ public class ListFunctionalSupport { return list.get(0); } + /** + * get the last element in list. + * + * @param list list to get + * @return the last element. null if list is null or empty. + */ + public static <T> T last(List<T> list) { + if (list == null || list.size() <= 0) { + return null; + } + + return list.get(list.size() - 1); + } + + /** + * Get the last N elements as a new list. + * + * @param list list to get + * @param count element count to get + * @return the first element. null if list is null. + * elements in a new list may be less than count if there're not enough elements in the list. + */ public static <T> List<T> takeLast(List<T> list, int count) { if (list == null) { return null; @@ -45,6 +77,13 @@ public class ListFunctionalSupport { } } + /** + * Drop the first N elements and create a new list. + * + * @param list the list + * @param count element count to drop + * @return newly created sublist that drops the first N elements from origin list. null if list is null. + */ public static <T> List<T> drop(List<T> list, int count) { if (list == null) { return null; @@ -55,15 +94,15 @@ public class ListFunctionalSupport { .collect(Collectors.toList()); } + /** + * Drop the only first element and create a new list. equivalent to drop(list, 1). + * + * @see {@link ListFunctionalSupport#drop(List, int)} + * @param list the list + * @return newly created sublist that drops the first element from origin list. null if list is null. + */ public static <T> List<T> rest(List<T> list) { return drop(list, 1); } - public static <T> T last(List<T> list) { - if (list == null || list.size() <= 0) { - return null; - } - - return list.get(list.size() - 1); - } }
http://git-wip-us.apache.org/repos/asf/storm/blob/6a041a98/storm-webapp/src/main/java/org/apache/storm/daemon/utils/StreamUtil.java ---------------------------------------------------------------------- diff --git a/storm-webapp/src/main/java/org/apache/storm/daemon/utils/StreamUtil.java b/storm-webapp/src/main/java/org/apache/storm/daemon/utils/StreamUtil.java index 24c630d..8e8b5d0 100644 --- a/storm-webapp/src/main/java/org/apache/storm/daemon/utils/StreamUtil.java +++ b/storm-webapp/src/main/java/org/apache/storm/daemon/utils/StreamUtil.java @@ -21,12 +21,21 @@ package org.apache.storm.daemon.utils; import java.io.IOException; import java.io.InputStream; +/** + * Utility class for (Input/Output)Stream. + */ public class StreamUtil { private StreamUtil() { } /** + * Skips over and discards N bytes of data from the input stream. + * <p/> * FileInputStream#skip may not work the first time, so ensure it successfully skips the given number of bytes. + * + * @see {@link java.io.FileInputStream#skip(long)} + * @param stream the stream to skip + * @param n bytes to skip */ public static void skipBytes(InputStream stream, Integer n) throws IOException { long skipped = 0; http://git-wip-us.apache.org/repos/asf/storm/blob/6a041a98/storm-webapp/src/main/java/org/apache/storm/daemon/utils/URLBuilder.java ---------------------------------------------------------------------- diff --git a/storm-webapp/src/main/java/org/apache/storm/daemon/utils/URLBuilder.java b/storm-webapp/src/main/java/org/apache/storm/daemon/utils/URLBuilder.java deleted file mode 100644 index d30ac65..0000000 --- a/storm-webapp/src/main/java/org/apache/storm/daemon/utils/URLBuilder.java +++ /dev/null @@ -1,43 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.apache.storm.daemon.utils; - -import java.net.URLEncoder; -import java.util.Map; - -import static java.util.stream.Collectors.joining; - -public class URLBuilder { - private URLBuilder() { - } - - public static String build(String urlPath, Map<String, Object> parameters) { - StringBuilder sb = new StringBuilder(); - sb.append(urlPath); - if (parameters.size() > 0) { - sb.append("?"); - - String queryParam = parameters.entrySet().stream() - .map(entry -> URLEncoder.encode(entry.getKey()) + "=" + URLEncoder.encode(entry.getValue().toString())) - .collect(joining("&")); - sb.append(queryParam); - } - return sb.toString(); - } -} http://git-wip-us.apache.org/repos/asf/storm/blob/6a041a98/storm-webapp/src/main/java/org/apache/storm/daemon/utils/UrlBuilder.java ---------------------------------------------------------------------- diff --git a/storm-webapp/src/main/java/org/apache/storm/daemon/utils/UrlBuilder.java b/storm-webapp/src/main/java/org/apache/storm/daemon/utils/UrlBuilder.java new file mode 100644 index 0000000..cea6dcc --- /dev/null +++ b/storm-webapp/src/main/java/org/apache/storm/daemon/utils/UrlBuilder.java @@ -0,0 +1,53 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.storm.daemon.utils; + +import static java.util.stream.Collectors.joining; + +import java.net.URLEncoder; +import java.util.Map; + +/** + * Convenient utility class to build the URL. + */ +public class UrlBuilder { + private UrlBuilder() { + } + + /** + * Build the URL. the key and value of query parameters will be encoded. + * + * @param urlPath URL except query parameter + * @param parameters query parameter + * @return the url concatenating url path and query parameters + */ + public static String build(String urlPath, Map<String, Object> parameters) { + StringBuilder sb = new StringBuilder(); + sb.append(urlPath); + if (parameters.size() > 0) { + sb.append("?"); + + String queryParam = parameters.entrySet().stream() + .map(entry -> URLEncoder.encode(entry.getKey()) + "=" + URLEncoder.encode(entry.getValue().toString())) + .collect(joining("&")); + sb.append(queryParam); + } + return sb.toString(); + } +} http://git-wip-us.apache.org/repos/asf/storm/blob/6a041a98/storm-webapp/src/test/java/org/apache/storm/daemon/drpc/DRPCServerTest.java ---------------------------------------------------------------------- diff --git a/storm-webapp/src/test/java/org/apache/storm/daemon/drpc/DRPCServerTest.java b/storm-webapp/src/test/java/org/apache/storm/daemon/drpc/DRPCServerTest.java index 9ab623f..a8452a9 100644 --- a/storm-webapp/src/test/java/org/apache/storm/daemon/drpc/DRPCServerTest.java +++ b/storm-webapp/src/test/java/org/apache/storm/daemon/drpc/DRPCServerTest.java @@ -15,6 +15,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + package org.apache.storm.daemon.drpc; import static org.junit.Assert.assertEquals; @@ -90,8 +91,8 @@ public class DRPCServerTest { try (DRPCServer server = new DRPCServer(conf)) { server.start(); try (DRPCClient client = new DRPCClient(conf, "localhost", server.getDrpcPort()); - DRPCInvocationsClient invoke = new DRPCInvocationsClient(conf, "localhost", server.getDrpcInvokePort())) { - Future<String> found = exec.submit(() -> client.getClient().execute("testing", "test")); + DRPCInvocationsClient invoke = new DRPCInvocationsClient(conf, "localhost", server.getDrpcInvokePort())) { + final Future<String> found = exec.submit(() -> client.getClient().execute("testing", "test")); DRPCRequest request = getNextAvailableRequest(invoke, "testing"); assertNotNull(request); assertEquals("test", request.get_func_args()); @@ -129,9 +130,9 @@ public class DRPCServerTest { } } - public static String GET(int port, String func, String args) { + private static String doGet(int port, String func, String args) { try { - URL url = new URL("http://localhost:"+port+"/drpc/"+func+"/"+args); + URL url = new URL("http://localhost:" + port + "/drpc/" + func + "/" + args); InputStream in = url.openStream(); byte[] buffer = new byte[1024]; int read = in.read(buffer); @@ -150,7 +151,7 @@ public class DRPCServerTest { //TODO need a better way to do this Thread.sleep(2000); try (DRPCInvocationsClient invoke = new DRPCInvocationsClient(conf, "localhost", server.getDrpcInvokePort())) { - Future<String> found = exec.submit(() -> GET(server.getHttpServerPort(), "testing", "test")); + final Future<String> found = exec.submit(() -> doGet(server.getHttpServerPort(), "testing", "test")); DRPCRequest request = getNextAvailableRequest(invoke, "testing"); assertNotNull(request); assertEquals("test", request.get_func_args()); @@ -171,7 +172,7 @@ public class DRPCServerTest { //TODO need a better way to do this Thread.sleep(2000); try (DRPCInvocationsClient invoke = new DRPCInvocationsClient(conf, "localhost", server.getDrpcInvokePort())) { - Future<String> found = exec.submit(() -> GET(server.getHttpServerPort(), "testing", "test")); + Future<String> found = exec.submit(() -> doGet(server.getHttpServerPort(), "testing", "test")); DRPCRequest request = getNextAvailableRequest(invoke, "testing"); assertNotNull(request); assertEquals("test", request.get_func_args()); http://git-wip-us.apache.org/repos/asf/storm/blob/6a041a98/storm-webapp/src/test/java/org/apache/storm/daemon/logviewer/LogviewerTest.java ---------------------------------------------------------------------- diff --git a/storm-webapp/src/test/java/org/apache/storm/daemon/logviewer/LogviewerTest.java b/storm-webapp/src/test/java/org/apache/storm/daemon/logviewer/LogviewerTest.java deleted file mode 100644 index 6abe153..0000000 --- a/storm-webapp/src/test/java/org/apache/storm/daemon/logviewer/LogviewerTest.java +++ /dev/null @@ -1,51 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.apache.storm.daemon.logviewer; - -import java.io.File; -import java.io.IOException; -import java.nio.file.DirectoryStream; -import java.nio.file.Path; -import java.util.Iterator; -import java.util.List; - -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.when; - -public class LogviewerTest { - private Path mkMockPath(File file) { - Path mockPath = mock(Path.class); - when(mockPath.toFile()).thenReturn(file); - return mockPath; - } - - private DirectoryStream<Path> mkDirectoryStream(List<Path> listOfPaths) { - return new DirectoryStream<Path>() { - @Override - public Iterator<Path> iterator() { - return listOfPaths.iterator(); - } - - @Override - public void close() throws IOException { - } - }; - } - -} http://git-wip-us.apache.org/repos/asf/storm/blob/6a041a98/storm-webapp/src/test/java/org/apache/storm/daemon/logviewer/handler/LogviewerLogPageHandlerTest.java ---------------------------------------------------------------------- diff --git a/storm-webapp/src/test/java/org/apache/storm/daemon/logviewer/handler/LogviewerLogPageHandlerTest.java b/storm-webapp/src/test/java/org/apache/storm/daemon/logviewer/handler/LogviewerLogPageHandlerTest.java index 2c05972..58daa30 100644 --- a/storm-webapp/src/test/java/org/apache/storm/daemon/logviewer/handler/LogviewerLogPageHandlerTest.java +++ b/storm-webapp/src/test/java/org/apache/storm/daemon/logviewer/handler/LogviewerLogPageHandlerTest.java @@ -18,15 +18,11 @@ package org.apache.storm.daemon.logviewer.handler; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; + import com.fasterxml.jackson.databind.ObjectMapper; -import org.apache.storm.daemon.logviewer.utils.LogviewerResponseBuilder; -import org.apache.storm.daemon.logviewer.utils.ResourceAuthorizer; -import org.apache.storm.daemon.logviewer.utils.WorkerLogs; -import org.apache.storm.utils.Utils; -import org.assertj.core.util.Lists; -import org.junit.Test; -import javax.ws.rs.core.Response; import java.io.File; import java.io.IOException; import java.nio.file.Files; @@ -34,8 +30,14 @@ import java.nio.file.attribute.FileAttribute; import java.util.List; import java.util.Map; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertTrue; +import javax.ws.rs.core.Response; + +import org.apache.storm.daemon.logviewer.utils.LogviewerResponseBuilder; +import org.apache.storm.daemon.logviewer.utils.ResourceAuthorizer; +import org.apache.storm.daemon.logviewer.utils.WorkerLogs; +import org.apache.storm.utils.Utils; +import org.assertj.core.util.Lists; +import org.junit.Test; public class LogviewerLogPageHandlerTest { @@ -62,27 +64,27 @@ public class LogviewerLogPageHandlerTest { LogviewerLogPageHandler handler = new LogviewerLogPageHandler(rootPath, null, new WorkerLogs(stormConf, new File(rootPath)), new ResourceAuthorizer(stormConf)); - Response expectedAll = LogviewerResponseBuilder.buildSuccessJsonResponse( + final Response expectedAll = LogviewerResponseBuilder.buildSuccessJsonResponse( Lists.newArrayList("topoA/port1/worker.log", "topoA/port2/worker.log", "topoB/port1/worker.log"), null, origin ); - Response expectedFilterPort = LogviewerResponseBuilder.buildSuccessJsonResponse( + final Response expectedFilterPort = LogviewerResponseBuilder.buildSuccessJsonResponse( Lists.newArrayList("topoA/port1/worker.log", "topoB/port1/worker.log"), null, origin ); - Response expectedFilterTopoId = LogviewerResponseBuilder.buildSuccessJsonResponse( + final Response expectedFilterTopoId = LogviewerResponseBuilder.buildSuccessJsonResponse( Lists.newArrayList("topoB/port1/worker.log"), null, origin ); - Response returnedAll = handler.listLogFiles("user", null, null, null, origin); - Response returnedFilterPort = handler.listLogFiles("user", 1111, null, null, origin); - Response returnedFilterTopoId = handler.listLogFiles("user", null, "topoB", null, origin); + final Response returnedAll = handler.listLogFiles("user", null, null, null, origin); + final Response returnedFilterPort = handler.listLogFiles("user", 1111, null, null, origin); + final Response returnedFilterTopoId = handler.listLogFiles("user", null, "topoB", null, origin); Utils.forceDelete(rootPath); http://git-wip-us.apache.org/repos/asf/storm/blob/6a041a98/storm-webapp/src/test/java/org/apache/storm/daemon/logviewer/handler/LogviewerLogSearchHandlerTest.java ---------------------------------------------------------------------- diff --git a/storm-webapp/src/test/java/org/apache/storm/daemon/logviewer/handler/LogviewerLogSearchHandlerTest.java b/storm-webapp/src/test/java/org/apache/storm/daemon/logviewer/handler/LogviewerLogSearchHandlerTest.java index 9e36b5a..c7f927b 100644 --- a/storm-webapp/src/test/java/org/apache/storm/daemon/logviewer/handler/LogviewerLogSearchHandlerTest.java +++ b/storm-webapp/src/test/java/org/apache/storm/daemon/logviewer/handler/LogviewerLogSearchHandlerTest.java @@ -18,6 +18,33 @@ package org.apache.storm.daemon.logviewer.handler; +import static java.util.stream.Collectors.joining; +import static org.junit.Assert.assertEquals; +import static org.mockito.Matchers.any; +import static org.mockito.Matchers.anyInt; +import static org.mockito.Matchers.anyListOf; +import static org.mockito.Matchers.anyString; +import static org.mockito.Mockito.doAnswer; +import static org.mockito.Mockito.doReturn; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.never; +import static org.mockito.Mockito.spy; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; +import static org.mockito.internal.verification.VerificationModeFactory.times; + +import java.io.File; +import java.io.IOException; +import java.net.UnknownHostException; +import java.nio.file.Files; +import java.nio.file.attribute.FileAttribute; +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.function.Function; + import org.apache.commons.lang.StringUtils; import org.apache.storm.DaemonConfig; import org.apache.storm.daemon.logviewer.LogviewerConstant; @@ -34,33 +61,6 @@ import org.junit.experimental.runners.Enclosed; import org.junit.runner.RunWith; import org.mockito.ArgumentCaptor; -import java.io.File; -import java.io.IOException; -import java.net.UnknownHostException; -import java.nio.file.Files; -import java.nio.file.attribute.FileAttribute; -import java.util.ArrayList; -import java.util.Collections; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.function.Function; - -import static java.util.stream.Collectors.joining; -import static org.junit.Assert.assertEquals; -import static org.mockito.Matchers.any; -import static org.mockito.Matchers.anyInt; -import static org.mockito.Matchers.anyListOf; -import static org.mockito.Matchers.anyString; -import static org.mockito.Mockito.doAnswer; -import static org.mockito.Mockito.doReturn; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.never; -import static org.mockito.Mockito.spy; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.when; -import static org.mockito.internal.verification.VerificationModeFactory.times; - @RunWith(Enclosed.class) public class LogviewerLogSearchHandlerTest { @@ -98,8 +98,8 @@ public class LogviewerLogSearchHandlerTest { String actualUrl = handler.urlToMatchCenteredInLogPage(new byte[42], expectedFname, 27526, 8888); - assertEquals("http://" + expectedHost + ":" + expectedPort + "/api/v1/log?file=" + expectedFname + - "&start=1947&length=" + LogviewerConstant.DEFAULT_BYTES_PER_PAGE, actualUrl); + assertEquals("http://" + expectedHost + ":" + expectedPort + "/api/v1/log?file=" + expectedFname + + "&start=1947&length=" + LogviewerConstant.DEFAULT_BYTES_PER_PAGE, actualUrl); } finally { Utils.setInstance(prevUtils); } @@ -119,13 +119,14 @@ public class LogviewerLogSearchHandlerTest { String actualUrl = handler.urlToMatchCenteredInLogPageDaemonFile(new byte[42], expectedFname, 27526, 8888); - assertEquals("http://" + expectedHost + ":" + expectedPort + "/api/v1/daemonlog?file=" + expectedFname + - "&start=1947&length=" + LogviewerConstant.DEFAULT_BYTES_PER_PAGE, actualUrl); + assertEquals("http://" + expectedHost + ":" + expectedPort + "/api/v1/daemonlog?file=" + expectedFname + + "&start=1947&length=" + LogviewerConstant.DEFAULT_BYTES_PER_PAGE, actualUrl); } finally { Utils.setInstance(prevUtils); } } + @SuppressWarnings("checkstyle:LineLength") @Test public void testReturnsCorrectBeforeAndAfterContext() throws InvalidRequestException, UnknownHostException { Utils prevUtils = null; @@ -135,12 +136,9 @@ public class LogviewerLogSearchHandlerTest { when(mockedUtil.hostname()).thenReturn(expectedHost); - File file = new File(String.join(File.separator, "src", "test", "resources"), + final File file = new File(String.join(File.separator, "src", "test", "resources"), "logviewer-search-context-tests.log.test"); - LogviewerLogSearchHandler handler = getSearchHandlerWithPort(expectedPort); - Map<String, Object> searchResult = handler.substringSearch(file, pattern); - Map<String, Object> expected = new HashMap<>(); expected.put("isDaemon", "no"); expected.put("searchString", pattern); @@ -176,6 +174,9 @@ public class LogviewerLogSearchHandlerTest { expected.put("matches", matches); + LogviewerLogSearchHandler handler = getSearchHandlerWithPort(expectedPort); + Map<String, Object> searchResult = handler.substringSearch(file, pattern); + assertEquals(expected, searchResult); } finally { Utils.setInstance(prevUtils); @@ -191,12 +192,9 @@ public class LogviewerLogSearchHandlerTest { when(mockedUtil.hostname()).thenReturn(expectedHost); - File file = new File(String.join(File.separator, "src", "test", "resources"), + final File file = new File(String.join(File.separator, "src", "test", "resources"), "small-worker.log.test"); - LogviewerLogSearchHandler handler = getSearchHandlerWithPort(expectedPort); - Map<String, Object> searchResult = handler.substringSearch(file, pattern); - Map<String, Object> expected = new HashMap<>(); expected.put("isDaemon", "no"); expected.put("searchString", pattern); @@ -212,6 +210,9 @@ public class LogviewerLogSearchHandlerTest { expected.put("matches", matches); + LogviewerLogSearchHandler handler = getSearchHandlerWithPort(expectedPort); + Map<String, Object> searchResult = handler.substringSearch(file, pattern); + assertEquals(expected, searchResult); } finally { Utils.setInstance(prevUtils); @@ -227,12 +228,9 @@ public class LogviewerLogSearchHandlerTest { when(mockedUtil.hostname()).thenReturn(expectedHost); - File file = new File(String.join(File.separator, "src", "test", "resources"), + final File file = new File(String.join(File.separator, "src", "test", "resources"), "small-worker.log.test"); - LogviewerLogSearchHandler handler = getSearchHandlerWithPort(expectedPort); - Map<String, Object> searchResult = handler.substringSearchDaemonLog(file, pattern); - Map<String, Object> expected = new HashMap<>(); expected.put("isDaemon", "yes"); expected.put("searchString", pattern); @@ -248,6 +246,9 @@ public class LogviewerLogSearchHandlerTest { expected.put("matches", matches); + LogviewerLogSearchHandler handler = getSearchHandlerWithPort(expectedPort); + Map<String, Object> searchResult = handler.substringSearchDaemonLog(file, pattern); + assertEquals(expected, searchResult); } finally { Utils.setInstance(prevUtils); @@ -263,13 +264,9 @@ public class LogviewerLogSearchHandlerTest { when(mockedUtil.hostname()).thenReturn(expectedHost); - File file = new File(String.join(File.separator, "src", "test", "resources"), + final File file = new File(String.join(File.separator, "src", "test", "resources"), "test-3072.log.test"); - LogviewerLogSearchHandler handler = getSearchHandlerWithPort(expectedPort); - Map<String, Object> searchResult = handler.substringSearch(file, pattern); - Map<String, Object> searchResult2 = handler.substringSearch(file, pattern, 1); - Map<String, Object> expected = new HashMap<>(); expected.put("isDaemon", "no"); expected.put("searchString", pattern); @@ -286,6 +283,10 @@ public class LogviewerLogSearchHandlerTest { expected.put("matches", matches); + LogviewerLogSearchHandler handler = getSearchHandlerWithPort(expectedPort); + Map<String, Object> searchResult = handler.substringSearch(file, pattern); + Map<String, Object> searchResult2 = handler.substringSearch(file, pattern, 1); + assertEquals(expected, searchResult); assertEquals(expected, searchResult2); } finally { @@ -293,6 +294,7 @@ public class LogviewerLogSearchHandlerTest { } } + @SuppressWarnings("checkstyle:LineLength") @Test public void testNextByteOffsetsAreCorrectForEachMatch() throws UnknownHostException, InvalidRequestException { Utils prevUtils = null; @@ -329,8 +331,6 @@ public class LogviewerLogSearchHandlerTest { assertEquals(data.v2().intValue(), ((List) result.get("matches")).size()); })); - Map<String, Object> searchResult = handler.substringSearch(file, pattern, 7); - Map<String, Object> expected = new HashMap<>(); expected.put("isDaemon", "no"); expected.put("searchString", pattern); @@ -390,12 +390,15 @@ public class LogviewerLogSearchHandlerTest { expected.put("matches", matches); + Map<String, Object> searchResult = handler.substringSearch(file, pattern, 7); + assertEquals(expected, searchResult); } finally { Utils.setInstance(prevUtils); } } + @SuppressWarnings("checkstyle:LineLength") @Test public void testCorrectMatchOffsetIsReturnedWhenSkippingBytes() throws InvalidRequestException, UnknownHostException { Utils prevUtils = null; @@ -405,13 +408,10 @@ public class LogviewerLogSearchHandlerTest { when(mockedUtil.hostname()).thenReturn(expectedHost); - File file = new File(String.join(File.separator, "src", "test", "resources"), + final File file = new File(String.join(File.separator, "src", "test", "resources"), "test-worker.log.test"); - LogviewerLogSearchHandler handler = getSearchHandlerWithPort(expectedPort); - int startByteOffset = 3197; - Map<String, Object> searchResult = handler.substringSearch(file, pattern, 1, startByteOffset); Map<String, Object> expected = new HashMap<>(); expected.put("isDaemon", "no"); @@ -430,12 +430,16 @@ public class LogviewerLogSearchHandlerTest { expected.put("matches", matches); + LogviewerLogSearchHandler handler = getSearchHandlerWithPort(expectedPort); + Map<String, Object> searchResult = handler.substringSearch(file, pattern, 1, startByteOffset); + assertEquals(expected, searchResult); } finally { Utils.setInstance(prevUtils); } } + @SuppressWarnings("checkstyle:LineLength") @Test public void testAnotherPatterns1() throws UnknownHostException, InvalidRequestException { Utils prevUtils = null; @@ -445,13 +449,10 @@ public class LogviewerLogSearchHandlerTest { when(mockedUtil.hostname()).thenReturn(expectedHost); - File file = new File(String.join(File.separator, "src", "test", "resources"), + final File file = new File(String.join(File.separator, "src", "test", "resources"), "test-worker.log.test"); - LogviewerLogSearchHandler handler = getSearchHandlerWithPort(expectedPort); - String pattern = Seq.range(0, 1024).map(x -> "X").collect(joining()); - Map<String, Object> searchResult = handler.substringSearch(file, pattern, 2); Map<String, Object> expected = new HashMap<>(); expected.put("isDaemon", "no"); @@ -477,12 +478,16 @@ public class LogviewerLogSearchHandlerTest { expected.put("matches", matches); + LogviewerLogSearchHandler handler = getSearchHandlerWithPort(expectedPort); + Map<String, Object> searchResult = handler.substringSearch(file, pattern, 2); + assertEquals(expected, searchResult); } finally { Utils.setInstance(prevUtils); } } + @SuppressWarnings("checkstyle:LineLength") @Test public void testAnotherPatterns2() throws UnknownHostException, InvalidRequestException { Utils prevUtils = null; @@ -492,13 +497,9 @@ public class LogviewerLogSearchHandlerTest { when(mockedUtil.hostname()).thenReturn(expectedHost); - File file = new File(String.join(File.separator, "src", "test", "resources"), + final File file = new File(String.join(File.separator, "src", "test", "resources"), "test-worker.log.test"); - - LogviewerLogSearchHandler handler = getSearchHandlerWithPort(expectedPort); - String pattern = "ððð"; - Map<String, Object> searchResult = handler.substringSearch(file, pattern, 1); Map<String, Object> expected = new HashMap<>(); expected.put("isDaemon", "no"); @@ -517,6 +518,9 @@ public class LogviewerLogSearchHandlerTest { expected.put("matches", matches); + LogviewerLogSearchHandler handler = getSearchHandlerWithPort(expectedPort); + Map<String, Object> searchResult = handler.substringSearch(file, pattern, 1); + assertEquals(expected, searchResult); } finally { Utils.setInstance(prevUtils); @@ -534,13 +538,9 @@ public class LogviewerLogSearchHandlerTest { when(mockedUtil.hostname()).thenReturn(expectedHost); - File file = new File(String.join(File.separator, "src", "test", "resources"), + final File file = new File(String.join(File.separator, "src", "test", "resources"), "test-worker.log.test"); - LogviewerLogSearchHandler handler = getSearchHandlerWithPort(expectedPort); - - Map<String, Object> searchResult = handler.substringSearch(file, pattern); - Map<String, Object> expected = new HashMap<>(); expected.put("isDaemon", "no"); expected.put("searchString", pattern); @@ -548,6 +548,9 @@ public class LogviewerLogSearchHandlerTest { expected.put("matches", Collections.emptyList()); + LogviewerLogSearchHandler handler = getSearchHandlerWithPort(expectedPort); + Map<String, Object> searchResult = handler.substringSearch(file, pattern); + assertEquals(expected, searchResult); } finally { Utils.setInstance(prevUtils); @@ -578,11 +581,11 @@ public class LogviewerLogSearchHandlerTest { files.add(new File(String.join(File.separator, "src", "test", "resources"), "logviewer-search-context-tests.log.gz")); - LogviewerLogSearchHandler handler = getSearchHandler(); + final LogviewerLogSearchHandler handler = getSearchHandler(); - List<Map<String, Object>> matches1 = handler.findNMatches(files, 20, 0, 0, "needle").getMatches(); - List<Map<String, Object>> matches2 = handler.findNMatches(files, 20, 0, 126, "needle").getMatches(); - List<Map<String, Object>> matches3 = handler.findNMatches(files, 20, 1, 0, "needle").getMatches(); + final List<Map<String, Object>> matches1 = handler.findNMatches(files, 20, 0, 0, "needle").getMatches(); + final List<Map<String, Object>> matches2 = handler.findNMatches(files, 20, 0, 126, "needle").getMatches(); + final List<Map<String, Object>> matches3 = handler.findNMatches(files, 20, 1, 0, "needle").getMatches(); assertEquals(2, matches1.size()); assertEquals(4, ((List) matches1.get(0).get("matches")).size()); @@ -603,6 +606,9 @@ public class LogviewerLogSearchHandlerTest { private List<File> logFiles; private String topoPath; + /** + * Setup test environment for each test. + */ @Before public void setUp() throws IOException { logFiles = new ArrayList<>(); @@ -619,6 +625,9 @@ public class LogviewerLogSearchHandlerTest { new File(topoPath, "6700").createNewFile(); } + /** + * Clean up test environment. + */ @After public void tearDown() { if (StringUtils.isNotEmpty(topoPath)) { http://git-wip-us.apache.org/repos/asf/storm/blob/6a041a98/storm-webapp/src/test/java/org/apache/storm/daemon/logviewer/testsupport/ArgumentsVerifier.java ---------------------------------------------------------------------- diff --git a/storm-webapp/src/test/java/org/apache/storm/daemon/logviewer/testsupport/ArgumentsVerifier.java b/storm-webapp/src/test/java/org/apache/storm/daemon/logviewer/testsupport/ArgumentsVerifier.java index e52c9db..7fc0ab6 100644 --- a/storm-webapp/src/test/java/org/apache/storm/daemon/logviewer/testsupport/ArgumentsVerifier.java +++ b/storm-webapp/src/test/java/org/apache/storm/daemon/logviewer/testsupport/ArgumentsVerifier.java @@ -18,13 +18,22 @@ package org.apache.storm.daemon.logviewer.testsupport; -import org.mockito.ArgumentCaptor; +import static org.junit.Assert.assertEquals; import java.util.function.Consumer; +import org.mockito.ArgumentCaptor; -import static org.junit.Assert.assertEquals; - +/** + * Help verifying captured argument in Mockito. + */ public class ArgumentsVerifier { + /** + * Asserting that method is called with expected first argument. + * + * @param verifyConsumer Consumer implementation that takes ArgumentCaptor and call 'Mockito.verify' + * @param argClazz Class type for argument + * @param expectedArg expected argument + */ public static <T> void verifyFirstCallArgsForSingleArgMethod(Consumer<ArgumentCaptor<T>> verifyConsumer, Class<T> argClazz, T expectedArg) { ArgumentCaptor<T> captor = ArgumentCaptor.forClass(argClazz); http://git-wip-us.apache.org/repos/asf/storm/blob/6a041a98/storm-webapp/src/test/java/org/apache/storm/daemon/logviewer/testsupport/MockDirectoryBuilder.java ---------------------------------------------------------------------- diff --git a/storm-webapp/src/test/java/org/apache/storm/daemon/logviewer/testsupport/MockDirectoryBuilder.java b/storm-webapp/src/test/java/org/apache/storm/daemon/logviewer/testsupport/MockDirectoryBuilder.java index 7215456..b8be8ad 100644 --- a/storm-webapp/src/test/java/org/apache/storm/daemon/logviewer/testsupport/MockDirectoryBuilder.java +++ b/storm-webapp/src/test/java/org/apache/storm/daemon/logviewer/testsupport/MockDirectoryBuilder.java @@ -18,17 +18,20 @@ package org.apache.storm.daemon.logviewer.testsupport; -import java.io.File; -import java.io.IOException; - import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; +import java.io.File; +import java.io.IOException; + public class MockDirectoryBuilder { private String dirName; private long mtime; private File[] files; + /** + * Constructor. + */ public MockDirectoryBuilder() { this.dirName = "adir"; this.mtime = 1; @@ -50,6 +53,9 @@ public class MockDirectoryBuilder { return this; } + /** + * Build mocked File object with given (or default) attributes for a directory. + */ public File build() { File mockFile = mock(File.class); when(mockFile.getName()).thenReturn(dirName); http://git-wip-us.apache.org/repos/asf/storm/blob/6a041a98/storm-webapp/src/test/java/org/apache/storm/daemon/logviewer/testsupport/MockFileBuilder.java ---------------------------------------------------------------------- diff --git a/storm-webapp/src/test/java/org/apache/storm/daemon/logviewer/testsupport/MockFileBuilder.java b/storm-webapp/src/test/java/org/apache/storm/daemon/logviewer/testsupport/MockFileBuilder.java index 385eec4..e6a7c20 100644 --- a/storm-webapp/src/test/java/org/apache/storm/daemon/logviewer/testsupport/MockFileBuilder.java +++ b/storm-webapp/src/test/java/org/apache/storm/daemon/logviewer/testsupport/MockFileBuilder.java @@ -18,17 +18,20 @@ package org.apache.storm.daemon.logviewer.testsupport; -import java.io.File; -import java.io.IOException; - import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; +import java.io.File; +import java.io.IOException; + public class MockFileBuilder { private String fileName; private long mtime; private long length; + /** + * Constructor. + */ public MockFileBuilder() { this.fileName = "afile"; this.mtime = 1; @@ -50,6 +53,9 @@ public class MockFileBuilder { return this; } + /** + * Build mocked File object with given (or default) attributes for a file. + */ public File build() { File mockFile = mock(File.class); when(mockFile.getName()).thenReturn(fileName); http://git-wip-us.apache.org/repos/asf/storm/blob/6a041a98/storm-webapp/src/test/java/org/apache/storm/daemon/logviewer/utils/LogCleanerTest.java ---------------------------------------------------------------------- diff --git a/storm-webapp/src/test/java/org/apache/storm/daemon/logviewer/utils/LogCleanerTest.java b/storm-webapp/src/test/java/org/apache/storm/daemon/logviewer/utils/LogCleanerTest.java index 21f4e9e..1031c04 100644 --- a/storm-webapp/src/test/java/org/apache/storm/daemon/logviewer/utils/LogCleanerTest.java +++ b/storm-webapp/src/test/java/org/apache/storm/daemon/logviewer/utils/LogCleanerTest.java @@ -18,15 +18,22 @@ package org.apache.storm.daemon.logviewer.utils; -import org.apache.storm.daemon.supervisor.SupervisorUtils; -import org.apache.storm.daemon.logviewer.testsupport.MockDirectoryBuilder; -import org.apache.storm.daemon.logviewer.testsupport.MockFileBuilder; -import org.apache.storm.generated.LSWorkerHeartbeat; -import org.apache.storm.utils.Time; -import org.apache.storm.utils.Utils; -import org.jooq.lambda.Seq; -import org.junit.Test; -import org.mockito.internal.util.collections.Sets; +import static java.util.stream.Collectors.toList; +import static org.apache.storm.Config.SUPERVISOR_WORKER_TIMEOUT_SECS; +import static org.apache.storm.DaemonConfig.LOGVIEWER_CLEANUP_AGE_MINS; +import static org.apache.storm.DaemonConfig.LOGVIEWER_CLEANUP_INTERVAL_SECS; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; +import static org.mockito.Matchers.any; +import static org.mockito.Matchers.anyBoolean; +import static org.mockito.Matchers.anyListOf; +import static org.mockito.Matchers.anyLong; +import static org.mockito.Matchers.anyMapOf; +import static org.mockito.Matchers.anySetOf; +import static org.mockito.Matchers.anyString; +import static org.mockito.Mockito.doAnswer; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; import java.io.File; import java.io.FileFilter; @@ -40,27 +47,19 @@ import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; -import java.util.Optional; import java.util.Set; import java.util.SortedSet; import java.util.TreeSet; -import static java.util.stream.Collectors.toList; -import static org.apache.storm.Config.SUPERVISOR_WORKER_TIMEOUT_SECS; -import static org.apache.storm.DaemonConfig.LOGVIEWER_CLEANUP_AGE_MINS; -import static org.apache.storm.DaemonConfig.LOGVIEWER_CLEANUP_INTERVAL_SECS; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertTrue; -import static org.mockito.Matchers.any; -import static org.mockito.Matchers.anyBoolean; -import static org.mockito.Matchers.anyListOf; -import static org.mockito.Matchers.anyLong; -import static org.mockito.Matchers.anyMapOf; -import static org.mockito.Matchers.anySetOf; -import static org.mockito.Matchers.anyString; -import static org.mockito.Mockito.doAnswer; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.when; +import org.apache.storm.daemon.logviewer.testsupport.MockDirectoryBuilder; +import org.apache.storm.daemon.logviewer.testsupport.MockFileBuilder; +import org.apache.storm.daemon.supervisor.SupervisorUtils; +import org.apache.storm.generated.LSWorkerHeartbeat; +import org.apache.storm.utils.Time; +import org.apache.storm.utils.Utils; +import org.jooq.lambda.Seq; +import org.junit.Test; +import org.mockito.internal.util.collections.Sets; public class LogCleanerTest { /** @@ -84,10 +83,10 @@ public class LogCleanerTest { LogCleaner logCleaner = new LogCleaner(conf, workerLogs, mockDirectoryCleaner, null); - long nowMillis = Time.currentTimeMillis(); - long cutoffMillis = logCleaner.cleanupCutoffAgeMillis(nowMillis); - long oldMtimeMillis = cutoffMillis - 500; - long newMtimeMillis = cutoffMillis + 500; + final long nowMillis = Time.currentTimeMillis(); + final long cutoffMillis = logCleaner.cleanupCutoffAgeMillis(nowMillis); + final long oldMtimeMillis = cutoffMillis - 500; + final long newMtimeMillis = cutoffMillis + 500; List<File> matchingFiles = new ArrayList<>(); matchingFiles.add(new MockDirectoryBuilder().setDirName("3031").setMtime(oldMtimeMillis).build()); @@ -278,7 +277,7 @@ public class LogCleanerTest { } /** - * cleanup function forceDeletes files of dead workers + * cleanup function forceDeletes files of dead workers. */ @Test public void testCleanupFn() throws IOException { http://git-wip-us.apache.org/repos/asf/storm/blob/6a041a98/storm-webapp/src/test/java/org/apache/storm/daemon/logviewer/utils/ResourceAuthorizerTest.java ---------------------------------------------------------------------- diff --git a/storm-webapp/src/test/java/org/apache/storm/daemon/logviewer/utils/ResourceAuthorizerTest.java b/storm-webapp/src/test/java/org/apache/storm/daemon/logviewer/utils/ResourceAuthorizerTest.java index 3d0e43e..63363fa 100644 --- a/storm-webapp/src/test/java/org/apache/storm/daemon/logviewer/utils/ResourceAuthorizerTest.java +++ b/storm-webapp/src/test/java/org/apache/storm/daemon/logviewer/utils/ResourceAuthorizerTest.java @@ -18,14 +18,6 @@ package org.apache.storm.daemon.logviewer.utils; -import org.apache.storm.daemon.logviewer.testsupport.ArgumentsVerifier; -import org.apache.storm.utils.Utils; -import org.junit.Test; - -import java.util.Collections; -import java.util.HashMap; -import java.util.Map; - import static org.apache.storm.Config.NIMBUS_ADMINS; import static org.apache.storm.Config.TOPOLOGY_GROUPS; import static org.apache.storm.Config.TOPOLOGY_USERS; @@ -38,6 +30,14 @@ import static org.mockito.Mockito.spy; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; + +import org.apache.storm.daemon.logviewer.testsupport.ArgumentsVerifier; +import org.apache.storm.utils.Utils; +import org.junit.Test; + public class ResourceAuthorizerTest { /** @@ -172,11 +172,11 @@ public class ResourceAuthorizerTest { private void verifyStubMethodsAreCalledProperly(ResourceAuthorizer authorizer) { ArgumentsVerifier.verifyFirstCallArgsForSingleArgMethod( - captor -> verify(authorizer, times(2)).getLogUserGroupWhitelist(captor.capture()), - String.class, "non-blank-fname"); + captor -> verify(authorizer, times(2)).getLogUserGroupWhitelist(captor.capture()), + String.class, "non-blank-fname"); ArgumentsVerifier.verifyFirstCallArgsForSingleArgMethod( - captor -> verify(authorizer).getUserGroups(captor.capture()), - String.class, "alice"); + captor -> verify(authorizer).getUserGroups(captor.capture()), + String.class, "alice"); } } http://git-wip-us.apache.org/repos/asf/storm/blob/6a041a98/storm-webapp/src/test/java/org/apache/storm/daemon/logviewer/utils/WorkerLogsTest.java ---------------------------------------------------------------------- diff --git a/storm-webapp/src/test/java/org/apache/storm/daemon/logviewer/utils/WorkerLogsTest.java b/storm-webapp/src/test/java/org/apache/storm/daemon/logviewer/utils/WorkerLogsTest.java index b8b5d8c..30b1678 100644 --- a/storm-webapp/src/test/java/org/apache/storm/daemon/logviewer/utils/WorkerLogsTest.java +++ b/storm-webapp/src/test/java/org/apache/storm/daemon/logviewer/utils/WorkerLogsTest.java @@ -18,11 +18,10 @@ package org.apache.storm.daemon.logviewer.utils; -import org.apache.storm.daemon.logviewer.testsupport.MockDirectoryBuilder; -import org.apache.storm.daemon.logviewer.testsupport.MockFileBuilder; -import org.apache.storm.daemon.supervisor.SupervisorUtils; -import org.apache.storm.utils.Utils; -import org.junit.Test; +import static org.junit.Assert.assertEquals; +import static org.mockito.Matchers.anyMapOf; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; import java.io.File; import java.io.IOException; @@ -30,10 +29,11 @@ import java.util.Collections; import java.util.Map; import java.util.Optional; -import static org.junit.Assert.assertEquals; -import static org.mockito.Matchers.anyMapOf; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.when; +import org.apache.storm.daemon.logviewer.testsupport.MockDirectoryBuilder; +import org.apache.storm.daemon.logviewer.testsupport.MockFileBuilder; +import org.apache.storm.daemon.supervisor.SupervisorUtils; +import org.apache.storm.utils.Utils; +import org.junit.Test; public class WorkerLogsTest {
