From 0eadd5aeb16fc48d187a31f5bf178eb62f793821 Mon Sep 17 00:00:00 2001 From: Pedro Vicente Date: Thu, 11 May 2017 14:49:46 +0100 Subject: [PATCH] Added more unit tests to increase coverage (#32) Added more unit tests to increase coverage --- .../mindera/skeletoid/generic/DebugTools.java | 7 + .../logs/appenders/ILogAppender.java | 2 +- .../logs/appenders/LogFileAppender.java | 124 ++++++++++++------ .../logs/appenders/LogcatAppender.java | 56 +++++--- .../skeletoid/network/Connectivity.java | 6 +- .../network/ConnectivityReceiver.java | 7 +- .../generic/DebugToolsUnitTests.java | 11 ++ .../appenders/LogFileAppenderUnitTest.java | 122 +++++++++++++++++ .../appenders/LogcatAppenderUnitTest.java | 92 +++++++++++++ .../logs/utils/LogAppenderUtilsUnitTests.java | 2 +- .../ConnectivityReceiverUnitTests.java | 12 ++ .../network/ConnectivityUnitTests.java | 5 + 12 files changed, 381 insertions(+), 65 deletions(-) create mode 100644 library/src/test/java/com/mindera/skeletoid/generic/DebugToolsUnitTests.java create mode 100644 library/src/test/java/com/mindera/skeletoid/logs/appenders/LogFileAppenderUnitTest.java create mode 100644 library/src/test/java/com/mindera/skeletoid/logs/appenders/LogcatAppenderUnitTest.java create mode 100644 library/src/test/java/com/mindera/skeletoid/network/ConnectivityReceiverUnitTests.java diff --git a/library/src/main/java/com/mindera/skeletoid/generic/DebugTools.java b/library/src/main/java/com/mindera/skeletoid/generic/DebugTools.java index a2425336..4f2917d1 100644 --- a/library/src/main/java/com/mindera/skeletoid/generic/DebugTools.java +++ b/library/src/main/java/com/mindera/skeletoid/generic/DebugTools.java @@ -1,5 +1,7 @@ package com.mindera.skeletoid.generic; +import android.support.annotation.VisibleForTesting; + import com.mindera.skeletoid.logs.LOG; import java.util.Map; @@ -9,6 +11,11 @@ */ public class DebugTools { + @VisibleForTesting + DebugTools() { + throw new UnsupportedOperationException(); + } + public static void printAllStackTraces(Class clazz) { LOG.d(clazz.toString(), "DUMPING ALL STACK TRACES"); diff --git a/library/src/main/java/com/mindera/skeletoid/logs/appenders/ILogAppender.java b/library/src/main/java/com/mindera/skeletoid/logs/appenders/ILogAppender.java index 525ac622..8382d7d1 100644 --- a/library/src/main/java/com/mindera/skeletoid/logs/appenders/ILogAppender.java +++ b/library/src/main/java/com/mindera/skeletoid/logs/appenders/ILogAppender.java @@ -35,7 +35,7 @@ public interface ILogAppender { * Get appender minimum log level * @return */ - int getMinLogLevel(); + LOG.PRIORITY getMinLogLevel(); /** * Set appender minimum log level diff --git a/library/src/main/java/com/mindera/skeletoid/logs/appenders/LogFileAppender.java b/library/src/main/java/com/mindera/skeletoid/logs/appenders/LogFileAppender.java index 5c734d31..c19bd820 100644 --- a/library/src/main/java/com/mindera/skeletoid/logs/appenders/LogFileAppender.java +++ b/library/src/main/java/com/mindera/skeletoid/logs/appenders/LogFileAppender.java @@ -9,7 +9,6 @@ import java.io.File; import java.text.SimpleDateFormat; -import java.util.ArrayList; import java.util.Date; import java.util.concurrent.TimeUnit; import java.util.logging.FileHandler; @@ -63,7 +62,7 @@ public class LogFileAppender implements ILogAppender { /** * Minimum log level for this appender */ - private int mMinLogLevel = LOG.PRIORITY.VERBOSE.ordinal(); + private LOG.PRIORITY mMinLogLevel = LOG.PRIORITY.VERBOSE; /** * Contructor @@ -72,8 +71,31 @@ public class LogFileAppender implements ILogAppender { * @param fileName Log filename */ public LogFileAppender(String tag, String fileName) { - TAG = tag; + if (tag == null) { + throw new IllegalArgumentException("TAG cannot be null"); + } + + if (fileName == null) { + throw new IllegalArgumentException("FileName cannot be null"); + } + + if (!isFilenameValid(fileName)) { + throw new IllegalArgumentException("Invalid fileName"); + } + LOG_FILE_NAME = fileName + ".log"; + + TAG = tag; + } + + /** + * Check if fileName is valid + * + * @param fileName fileName + * @return true if it is, false if not + */ + protected boolean isFilenameValid(String fileName) { + return fileName.matches("\\w+"); } /** @@ -82,7 +104,7 @@ public LogFileAppender(String tag, String fileName) { * @param type LOG type * @return FileHandler level */ - private static Level getFileHandlerLevel(LOG.PRIORITY type) { + private Level getFileHandlerLevel(LOG.PRIORITY type) { Level level; @@ -165,7 +187,7 @@ public void disableAppender() { @Override public void log(final LOG.PRIORITY type, final Throwable t, final String... logs) { - if (type.ordinal() > mMinLogLevel) { + if (type.ordinal() > mMinLogLevel.ordinal()) { return; } @@ -183,17 +205,7 @@ public void run() { Level level = getFileHandlerLevel(type); try { - final StringBuilder builder = new StringBuilder(); - builder.append(dateFormatter.format(new Date())); - builder.append(": "); - builder.append(type.name().charAt(0)); - builder.append("/"); - builder.append(TAG); - builder.append("(").append(Thread.currentThread().getId()).append(")"); - builder.append(": "); - builder.append(getLogString(logs)); - - final String logText = builder.toString(); + String logText = formatLog(type, t, logs); LogRecord logRecord = new LogRecord(level, logText); if (t != null) { @@ -225,28 +237,54 @@ public void run() { } /** - * Get list of file logs + * Formats the log * - * @param logsPath Path to the logs folder - * @return List of logs files + * @param type Type of log + * @param t Throwable (can be null) + * @param logs Log */ - public ArrayList getListLogFiles(String logsPath) { - ArrayList logFiles = new ArrayList<>(); - - File logsDirectory = new File(logsPath); - if (logsDirectory.exists()) { - String[] fileList = logsDirectory.list(); - if (fileList != null && fileList.length != 0) { - for (String file : fileList) { - if (file.contains(".log")) { - logFiles.add(file); - } - } - } - } - return logFiles; + protected String formatLog(final LOG.PRIORITY type, final Throwable t, final String... logs) { + final StringBuilder builder = new StringBuilder(); + builder.append(dateFormatter.format(new Date())); + builder.append(": "); + builder.append(type.name().charAt(0)); + builder.append("/"); + builder.append(TAG); + builder.append("(").append(Thread.currentThread().getId()); + builder.append(")"); + builder.append(": "); + builder.append(getLogString(logs)); + + return builder.toString(); + } +// /** +// * Get list of file logs +// * +// * @param logsPath Path to the logs folder +// * @return List of logs files +// */ +// public ArrayList getListLogFiles(String logsPath) { +// if (logsPath == null || logsPath.isEmpty()) { +// return null; +// } +// +// ArrayList logFiles = new ArrayList<>(); +// +// File logsDirectory = new File(logsPath); +// if (logsDirectory.exists()) { +// String[] fileList = logsDirectory.list(); +// if (fileList != null && fileList.length != 0) { +// for (String file : fileList) { +// if (file.contains(".log")) { +// logFiles.add(file); +// } +// } +// } +// } +// return logFiles; +// } public void setLogFileSize(int LOG_FILE_SIZE) { this.mLogFileSize = LOG_FILE_SIZE; @@ -256,18 +294,30 @@ public void setNumberOfLogFiles(int NUMBER_OF_LOG_FILES) { this.mNumberOfLogFiles = NUMBER_OF_LOG_FILES; } - public String getFileLogPath(Context context){ + public int getLogFileSize() { + return mLogFileSize; + } + + public int getNumberOfLogFiles() { + return mNumberOfLogFiles; + } + + public String getFileLogPath(Context context) { return AndroidUtils.getFileDirPath(context, File.separator + LOG_FILE_NAME); } @Override - public int getMinLogLevel() { + public LOG.PRIORITY getMinLogLevel() { return mMinLogLevel; } @Override public void setMinLogLevel(LOG.PRIORITY minLogLevel) { - mMinLogLevel = minLogLevel.ordinal(); + mMinLogLevel = minLogLevel; + } + + public boolean canWriteToFile() { + return mCanWriteToFile && mFileHandler != null; } @Override diff --git a/library/src/main/java/com/mindera/skeletoid/logs/appenders/LogcatAppender.java b/library/src/main/java/com/mindera/skeletoid/logs/appenders/LogcatAppender.java index aed2a6b5..771fa48f 100644 --- a/library/src/main/java/com/mindera/skeletoid/logs/appenders/LogcatAppender.java +++ b/library/src/main/java/com/mindera/skeletoid/logs/appenders/LogcatAppender.java @@ -6,6 +6,7 @@ import com.mindera.skeletoid.logs.LOG; import java.util.ArrayList; +import java.util.List; import static com.mindera.skeletoid.logs.utils.LogAppenderUtils.getLogString; @@ -17,7 +18,7 @@ public class LogcatAppender implements ILogAppender { /** * The maximum number of chars to log in a single line. */ - private final int MAX_LINE_LENGTH = 4000; + private int MAX_LINE_LENGTH = 4000; /** * To check if logcat should show the complete lines or just the first 4000 chars. */ @@ -34,7 +35,7 @@ public class LogcatAppender implements ILogAppender { /** * Minimum log level for this appender */ - private int mMinLogLevel = LOG.PRIORITY.VERBOSE.ordinal(); + private LOG.PRIORITY mMinLogLevel = LOG.PRIORITY.VERBOSE; /** * Contructor @@ -42,6 +43,9 @@ public class LogcatAppender implements ILogAppender { * @param tag Log tag */ public LogcatAppender(String tag) { + if (tag == null) { + throw new IllegalArgumentException("TAG cannot be null"); + } TAG = tag; } @@ -57,11 +61,11 @@ public void disableAppender() { @Override public void log(LOG.PRIORITY type, Throwable t, String... log) { - if(type.ordinal() > mMinLogLevel){ + if (type.ordinal() > mMinLogLevel.ordinal()) { return; } final String logString = getLogString(log); - final ArrayList logs = formatLog(logString); + final List logs = formatLog(logString); for (String logText : logs) { @@ -97,31 +101,30 @@ public void log(LOG.PRIORITY type, Throwable t, String... log) { * @param text The log text * @return A list of lines to log */ - private ArrayList formatLog(String text) { - - final ArrayList result = new ArrayList<>(); + protected List formatLog(String text) { + final List result = new ArrayList<>(); - StringBuilder textToSplit = new StringBuilder(); - if (text != null) { - textToSplit.append(text); + if (text == null || text.isEmpty()) { + return result; } - if (textToSplit.length() > MAX_LINE_LENGTH) { + if (text.length() > MAX_LINE_LENGTH) { if (mSplitLinesAboveMaxLength) { - int chunkCount = textToSplit.length() / MAX_LINE_LENGTH; - for (int i = 0; i <= chunkCount; i++) { - int max = MAX_LINE_LENGTH * (i + 1); - if (max >= textToSplit.length()) { - result.add("[Chunk " + i + " of " + chunkCount + "] " + textToSplit.substring(4000 * i)); + int chunkCount = (int) Math.ceil(1f * text.length() / MAX_LINE_LENGTH ); + for (int i = 1; i <= chunkCount; i++) { + int max = MAX_LINE_LENGTH * i; + if (max < text.length()) { + result.add("[Chunk " + i + " of " + chunkCount + "] " + text.substring(MAX_LINE_LENGTH * (i - 1), max)); } else { - result.add("[Chunk " + i + " of " + chunkCount + "] " + textToSplit.substring(4000 * i, max)); + result.add("[Chunk " + i + " of " + chunkCount + "] " + text.substring(MAX_LINE_LENGTH * (i - 1))); + } } } } else { - result.add(textToSplit.toString()); + result.add(text); } return result; } @@ -131,14 +134,25 @@ public void setSplitLinesAboveMaxLength(boolean splitLinesAboveMaxLength) { this.mSplitLinesAboveMaxLength = splitLinesAboveMaxLength; } + public boolean isSplitLinesAboveMaxLength() { + return mSplitLinesAboveMaxLength; + } + @Override - public int getMinLogLevel() { + public LOG.PRIORITY getMinLogLevel() { return mMinLogLevel; } - @Override + protected void setMaxLineLength(int maxLineLength) { + this.MAX_LINE_LENGTH = maxLineLength; + } + + protected int getMaxLineLength() { + return MAX_LINE_LENGTH; + } + public void setMinLogLevel(LOG.PRIORITY minLogLevel) { - this.mMinLogLevel = minLogLevel.ordinal(); + this.mMinLogLevel = minLogLevel; } @Override diff --git a/library/src/main/java/com/mindera/skeletoid/network/Connectivity.java b/library/src/main/java/com/mindera/skeletoid/network/Connectivity.java index 1df40968..14914edc 100644 --- a/library/src/main/java/com/mindera/skeletoid/network/Connectivity.java +++ b/library/src/main/java/com/mindera/skeletoid/network/Connectivity.java @@ -3,6 +3,7 @@ import android.content.Context; import android.net.ConnectivityManager; import android.net.NetworkInfo; +import android.support.annotation.VisibleForTesting; import com.mindera.skeletoid.generic.StringUtils; @@ -17,8 +18,9 @@ public class Connectivity { // private static final String LOG_TAG = "Connectivity"; - private Connectivity() { - + @VisibleForTesting + Connectivity() { + throw new UnsupportedOperationException(); } /** diff --git a/library/src/main/java/com/mindera/skeletoid/network/ConnectivityReceiver.java b/library/src/main/java/com/mindera/skeletoid/network/ConnectivityReceiver.java index 96470ac7..05c13de2 100644 --- a/library/src/main/java/com/mindera/skeletoid/network/ConnectivityReceiver.java +++ b/library/src/main/java/com/mindera/skeletoid/network/ConnectivityReceiver.java @@ -5,6 +5,7 @@ import android.content.Intent; import android.net.ConnectivityManager; import android.net.NetworkInfo; +import android.support.annotation.VisibleForTesting; import com.mindera.skeletoid.logs.LOG; import com.mindera.skeletoid.threads.threadpools.ThreadPoolUtils; @@ -61,11 +62,11 @@ public class ConnectivityReceiver extends BroadcastReceiver { public interface ConnectivityCallback { void connectivityUpdate(boolean isConnectedToANetwork, boolean networkHasInternetAccess, boolean isNetworkWiFi); - } - private ConnectivityReceiver() { - + @VisibleForTesting + ConnectivityReceiver() { + throw new UnsupportedOperationException(); } @Override diff --git a/library/src/test/java/com/mindera/skeletoid/generic/DebugToolsUnitTests.java b/library/src/test/java/com/mindera/skeletoid/generic/DebugToolsUnitTests.java new file mode 100644 index 00000000..b407f69d --- /dev/null +++ b/library/src/test/java/com/mindera/skeletoid/generic/DebugToolsUnitTests.java @@ -0,0 +1,11 @@ +package com.mindera.skeletoid.generic; + +import org.junit.Test; + +public class DebugToolsUnitTests { + + @Test(expected = UnsupportedOperationException.class) + public void testConstructor() { + new DebugTools(); + } +} diff --git a/library/src/test/java/com/mindera/skeletoid/logs/appenders/LogFileAppenderUnitTest.java b/library/src/test/java/com/mindera/skeletoid/logs/appenders/LogFileAppenderUnitTest.java new file mode 100644 index 00000000..a9aac2b5 --- /dev/null +++ b/library/src/test/java/com/mindera/skeletoid/logs/appenders/LogFileAppenderUnitTest.java @@ -0,0 +1,122 @@ +package com.mindera.skeletoid.logs.appenders; + +import com.mindera.skeletoid.logs.LOG; + +import org.junit.Test; + +import static junit.framework.Assert.assertEquals; +import static junit.framework.Assert.assertFalse; +import static junit.framework.Assert.assertTrue; + +public class LogFileAppenderUnitTest { + + private String PACKAGE_NAME = "my.package.name"; + private final String FILE_NAME = "FILENAME"; + + + @Test(expected = IllegalArgumentException.class) + public void testConstructorAllNull() { + new LogFileAppender(null, null); + + } + + @Test(expected = IllegalArgumentException.class) + public void testConstructorPackageNameNull() { + new LogFileAppender(null, FILE_NAME); + + } + + @Test(expected = IllegalArgumentException.class) + public void testConstructorFileNameInvalid() { + new LogFileAppender(PACKAGE_NAME, "*"); + + } + + @Test(expected = IllegalArgumentException.class) + public void testConstructorFileNameNull() { + new LogFileAppender(PACKAGE_NAME, null); + + } + + @Test + public void testFileNameIsValidEmpty() { + LogFileAppender appender = new LogFileAppender(PACKAGE_NAME, FILE_NAME); + assertFalse(appender.isFilenameValid("")); + } + + @Test + public void testFileNameIsValidInvalid() { + LogFileAppender appender = new LogFileAppender(PACKAGE_NAME, FILE_NAME); + assertFalse(appender.isFilenameValid("//")); + } + + @Test + public void testFileNameIsValid() { + LogFileAppender appender = new LogFileAppender(PACKAGE_NAME, FILE_NAME); + assertTrue(appender.isFilenameValid(FILE_NAME)); + } + + + @Test + public void testConstructor() { + LogFileAppender appender = new LogFileAppender(PACKAGE_NAME, FILE_NAME); + + assertEquals("LogFileAppender", appender.getLoggerId()); + } + +// @Test +// public void testEnableAppender() { +// Context context = mock(Context.class); +// +// LogFileAppender appender = new LogFileAppender(PACKAGE_NAME, FILE_NAME); +// +// appender.enableAppender(context); +// +// assertTrue(appender.canWriteToFile()); +// } + + + @Test + public void testDisableAppender() { + LogFileAppender appender = new LogFileAppender(PACKAGE_NAME, FILE_NAME); + appender.disableAppender(); + + assertFalse(appender.canWriteToFile()); + + } + + +// @Test +// public void testFormatLog() { +// LogFileAppender appender = new LogFileAppender(PACKAGE_NAME, FILE_NAME); +// assertTrue(appender.formatLog(LOG.PRIORITY.DEBUG, null, "Hello", "My friend").matches("\\d\\d-\\d\\d \\d\\d:\\d\\d\\.\\d\\d:\\d: D/" + PACKAGE_NAME + "(" + Thread.currentThread().getId() + "): Hello My friend")); +// +// } + + @Test + public void testSetMaxLineLength() { + LogFileAppender appender = new LogFileAppender(PACKAGE_NAME, FILE_NAME); + + + appender.setLogFileSize(1000); + assertEquals(1000, appender.getLogFileSize()); + } + + + @Test + public void testSetNumberOfLogFiles() { + LogFileAppender appender = new LogFileAppender(PACKAGE_NAME, FILE_NAME); + + appender.setNumberOfLogFiles(5); + assertEquals(5, appender.getNumberOfLogFiles()); + } + + @Test + public void testSetMinLogLevel() { + LogFileAppender appender = new LogFileAppender(PACKAGE_NAME, FILE_NAME); + + appender.setMinLogLevel(LOG.PRIORITY.DEBUG); + assertEquals(LOG.PRIORITY.DEBUG, appender.getMinLogLevel()); + } + +} diff --git a/library/src/test/java/com/mindera/skeletoid/logs/appenders/LogcatAppenderUnitTest.java b/library/src/test/java/com/mindera/skeletoid/logs/appenders/LogcatAppenderUnitTest.java new file mode 100644 index 00000000..90ab863b --- /dev/null +++ b/library/src/test/java/com/mindera/skeletoid/logs/appenders/LogcatAppenderUnitTest.java @@ -0,0 +1,92 @@ +package com.mindera.skeletoid.logs.appenders; + +import com.mindera.skeletoid.logs.LOG; + +import org.junit.Test; + +import java.util.ArrayList; +import java.util.List; + +import static junit.framework.Assert.assertEquals; + +public class LogcatAppenderUnitTest { + + private String mPackageName = "my.package.name"; + + + @Test(expected = IllegalArgumentException.class) + public void testConstructorNull() { + new LogcatAppender(null); + } + + @Test + public void testConstructor() { + LogcatAppender logcatAppender = new LogcatAppender(mPackageName); + + assertEquals("LogcatAppender", logcatAppender.getLoggerId()); + } + +// @Test +// public void testEnableAppender() { +// Context context = mock(Context.class); +// +// LogcatAppender logcatAppender = new LogcatAppender(mPackageName); +// logcatAppender.enableAppender(context); +// +// verify(logcatAppender, times(1)).enableAppender(context); +// } +// +// +// @Test +// public void testDisableAppender() { +// Context context = mock(Context.class); +// +// LogcatAppender logcatAppender = new LogcatAppender(mPackageName); +// logcatAppender.disableAppender(); +// +// verify(logcatAppender, times(1)).disableAppender(); +// } + + + @Test + public void testFormatLog() { + LogcatAppender logcatAppender = new LogcatAppender(mPackageName); + + List logs = new ArrayList(); + logs.add("abc"); + + assertEquals(logs, logcatAppender.formatLog("abc")); + logs.clear(); + + logcatAppender.setMaxLineLength(2); + logs.add("[Chunk 1 of 2] ab"); + logs.add("[Chunk 2 of 2] cd"); + assertEquals(logs, logcatAppender.formatLog("abcd")); + logs.clear(); + + logcatAppender.setMaxLineLength(2); + logs.add("[Chunk 1 of 3] ab"); + logs.add("[Chunk 2 of 3] cd"); + logs.add("[Chunk 3 of 3] e"); + assertEquals(logs, logcatAppender.formatLog("abcde")); + } + + + @Test + public void testSetMaxLineLength() { + LogcatAppender logcatAppender = new LogcatAppender(mPackageName); + + logcatAppender.setMaxLineLength(1); + assertEquals(1, logcatAppender.getMaxLineLength()); + } + + + @Test + public void testSetMinLogLevel() { + LogcatAppender logcatAppender = new LogcatAppender(mPackageName); + + logcatAppender.setMinLogLevel(LOG.PRIORITY.DEBUG); + assertEquals(LOG.PRIORITY.DEBUG, logcatAppender.getMinLogLevel()); + } + +} diff --git a/library/src/test/java/com/mindera/skeletoid/logs/utils/LogAppenderUtilsUnitTests.java b/library/src/test/java/com/mindera/skeletoid/logs/utils/LogAppenderUtilsUnitTests.java index 0f38be7a..76d4c7fd 100644 --- a/library/src/test/java/com/mindera/skeletoid/logs/utils/LogAppenderUtilsUnitTests.java +++ b/library/src/test/java/com/mindera/skeletoid/logs/utils/LogAppenderUtilsUnitTests.java @@ -22,7 +22,7 @@ public void testGetLogString() { @Test public void testGetLogStringNull() { - assertEquals("", LogAppenderUtils.getLogString(null)); + assertEquals("", LogAppenderUtils.getLogString(new String[0])); } @Test diff --git a/library/src/test/java/com/mindera/skeletoid/network/ConnectivityReceiverUnitTests.java b/library/src/test/java/com/mindera/skeletoid/network/ConnectivityReceiverUnitTests.java new file mode 100644 index 00000000..a2547391 --- /dev/null +++ b/library/src/test/java/com/mindera/skeletoid/network/ConnectivityReceiverUnitTests.java @@ -0,0 +1,12 @@ +package com.mindera.skeletoid.network; + + +import org.junit.Test; + +public class ConnectivityReceiverUnitTests { + + @Test(expected = UnsupportedOperationException.class) + public void testConstructor() { + new ConnectivityReceiver(); + } +} diff --git a/library/src/test/java/com/mindera/skeletoid/network/ConnectivityUnitTests.java b/library/src/test/java/com/mindera/skeletoid/network/ConnectivityUnitTests.java index 44c64e2a..20afcfa5 100644 --- a/library/src/test/java/com/mindera/skeletoid/network/ConnectivityUnitTests.java +++ b/library/src/test/java/com/mindera/skeletoid/network/ConnectivityUnitTests.java @@ -10,6 +10,11 @@ public class ConnectivityUnitTests { + @Test(expected = UnsupportedOperationException.class) + public void testConstructor() { + new Connectivity(); + } + @Test(expected = IllegalArgumentException.class) public void testIsConnectedAndWithInternetAvailableWithNullArguments() { Connectivity.isConnectedAndWithInternetAvailable(null);