You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@geode.apache.org by kl...@apache.org on 2017/05/23 22:39:08 UTC

[03/33] geode git commit: GEODE-2420: Resolve conflicts with recent checkin

GEODE-2420: Resolve conflicts with recent checkin

Use InternalCache instead of GemnFireCachImpl.

Refactored product and tests
- Combined LogExporter and LogSizer.
- Remove classes no longer needed


Project: http://git-wip-us.apache.org/repos/asf/geode/repo
Commit: http://git-wip-us.apache.org/repos/asf/geode/commit/c5962aa9
Tree: http://git-wip-us.apache.org/repos/asf/geode/tree/c5962aa9
Diff: http://git-wip-us.apache.org/repos/asf/geode/diff/c5962aa9

Branch: refs/heads/feature/GEODE-2632-17
Commit: c5962aa9308764bb964e4b4160e969f2dfae062d
Parents: 3ce3437
Author: Ken Howe <kh...@pivotal.io>
Authored: Mon May 15 15:00:00 2017 -0700
Committer: Ken Howe <kh...@pivotal.io>
Committed: Tue May 23 08:16:17 2017 -0700

----------------------------------------------------------------------
 .../cli/commands/ExportLogsCommand.java         | 199 ++++++++-----------
 .../cli/functions/ExportLogsFunction.java       |   3 +-
 .../cli/functions/ExportedLogsSizeInfo.java     | 105 ----------
 .../cli/functions/SizeExportLogsFunction.java   |  29 ++-
 .../internal/cli/i18n/CliStrings.java           |   2 +-
 .../internal/cli/util/LogExporter.java          |  63 +++++-
 .../management/internal/cli/util/LogSizer.java  | 118 -----------
 .../cli/commands/ExportLogsCommandTest.java     | 121 ++---------
 .../cli/commands/ExportLogsDUnitTest.java       |  21 +-
 .../commands/ExportLogsFileSizeLimitTest.java   |   4 +-
 .../cli/commands/ExportLogsTestSuite.java       |  10 +-
 .../cli/functions/ExportedLogsSizeInfoTest.java | 133 -------------
 .../SizeExportLogsFunctionCacheTest.java        | 174 ----------------
 .../functions/SizeExportLogsFunctionTest.java   | 178 +++++++++++++++++
 .../cli/functions/SizeExportLogsTestSuite.java  |  29 ---
 .../internal/cli/util/LogExporterTest.java      |   6 +-
 .../internal/cli/util/LogSizerTest.java         |  17 +-
 17 files changed, 376 insertions(+), 836 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/geode/blob/c5962aa9/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/ExportLogsCommand.java
----------------------------------------------------------------------
diff --git a/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/ExportLogsCommand.java b/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/ExportLogsCommand.java
index af681da..ab93f94 100644
--- a/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/ExportLogsCommand.java
+++ b/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/ExportLogsCommand.java
@@ -44,7 +44,6 @@ import org.apache.geode.management.cli.ConverterHint;
 import org.apache.geode.management.cli.Result;
 import org.apache.geode.management.internal.cli.CliUtil;
 import org.apache.geode.management.internal.cli.functions.ExportLogsFunction;
-import org.apache.geode.management.internal.cli.functions.ExportedLogsSizeInfo;
 import org.apache.geode.management.internal.cli.functions.SizeExportLogsFunction;
 import org.apache.geode.management.internal.cli.i18n.CliStrings;
 import org.apache.geode.management.internal.cli.result.ResultBuilder;
@@ -65,7 +64,7 @@ public class ExportLogsCommand implements CommandMarker {
 
   private static final Pattern DISK_SPACE_LIMIT_PATTERN = Pattern.compile("(\\d+)([kmgtKMGT]?)");
 
-  private InternalCache getCache() {
+  InternalCache getCache() {
     return (InternalCache) CacheFactory.getAnyInstance();
   }
 
@@ -129,106 +128,88 @@ public class ExportLogsCommand implements CommandMarker {
 
           List<Object> results = (List<Object>) estimateLogSize(args, server).getResult();
           long estimatedSize = 0;
-          long diskAvailable = 0;
-          long diskSize = 0;
           if (!results.isEmpty()) {
             List<?> res = (List<?>) results.get(0);
-            if (res.get(0) instanceof ExportedLogsSizeInfo) {
-              ExportedLogsSizeInfo sizeInfo = (ExportedLogsSizeInfo) res.get(0);
-              estimatedSize = sizeInfo.getLogsSize();
-              diskAvailable = sizeInfo.getDiskAvailable();
-              diskSize = sizeInfo.getDiskSize();
+            if (res.get(0) instanceof Long) {
+              estimatedSize = (Long) res.get(0);
             }
           }
           logger.info("Received estimated export size from member {}: {}", server.getId(),
               estimatedSize);
           totalEstimatedExportSize += estimatedSize;
-
-          // If export size checking is enabled, then estimated size on each member shouldn't exceed
-          // the available disk on that member
-          try {
-            isSizeCheckEnabledAndWithinDiskSpaceOfMember(server.getName(),
-                parseFileSizeLimit(fileSizeLimit), estimatedSize, diskAvailable, diskSize);
-          } catch (ManagementException e) {
-            return ResultBuilder.createUserErrorResult(e.getMessage());
-          }
         }
 
         // The sum of the estimated export sizes from each member should not exceed the
-        // disk availble on the locator
+        // disk available on the locator
         try {
-          isSizeCheckEnabledAndWithinDiskSpaceOfMember("locator", parseFileSizeLimit(fileSizeLimit),
-              totalEstimatedExportSize, getLocalDiskAvailable(), getLocalDiskSize());
+          sizeCheckIsEnabledAndWithinDiskSpaceOfMember("locator", parseFileSizeLimit(fileSizeLimit),
+              totalEstimatedExportSize, getLocalDiskAvailable());
         } catch (ManagementException e) {
           return ResultBuilder.createUserErrorResult(e.getMessage());
         }
       }
 
-      if (testhookSkipExports()) {
-        result = ResultBuilder.createInfoResult("Estimated size of exported logs is "
-            + new BytesToString().of(totalEstimatedExportSize));
-      } else {
-        // get zipped files from all servers next
-        Map<String, Path> zipFilesFromMembers = new HashMap<>();
-        for (DistributedMember server : targetMembers) {
-          Region region = ExportLogsFunction.createOrGetExistingExportLogsRegion(true, cache);
+      // get zipped files from all servers next
+      Map<String, Path> zipFilesFromMembers = new HashMap<>();
+      for (DistributedMember server : targetMembers) {
+        Region region = ExportLogsFunction.createOrGetExistingExportLogsRegion(true, cache);
 
-          ExportLogsCacheWriter cacheWriter =
-              (ExportLogsCacheWriter) region.getAttributes().getCacheWriter();
+        ExportLogsCacheWriter cacheWriter =
+            (ExportLogsCacheWriter) region.getAttributes().getCacheWriter();
 
-          cacheWriter.startFile(server.getName());
+        cacheWriter.startFile(server.getName());
 
-          CliUtil.executeFunction(new ExportLogsFunction(),
-              new ExportLogsFunction.Args(start, end, logLevel, onlyLogLevel, logsOnly, statsOnly),
-              server).getResult();
-          Path zipFile = cacheWriter.endFile();
-          ExportLogsFunction.destroyExportLogsRegion(cache);
-
-          // only put the zipfile in the map if it is not null
-          if (zipFile != null) {
-            logger.info("Received zip file from member {}: {}", server.getId(), zipFile);
-            zipFilesFromMembers.put(server.getId(), zipFile);
-          }
-        }
+        CliUtil.executeFunction(new ExportLogsFunction(),
+            new ExportLogsFunction.Args(start, end, logLevel, onlyLogLevel, logsOnly, statsOnly),
+            server).getResult();
+        Path zipFile = cacheWriter.endFile();
+        ExportLogsFunction.destroyExportLogsRegion(cache);
 
-        if (zipFilesFromMembers.isEmpty()) {
-          return ResultBuilder.createUserErrorResult("No files to be exported.");
+        // only put the zipfile in the map if it is not null
+        if (zipFile != null) {
+          logger.info("Received zip file from member {}: {}", server.getId(), zipFile);
+          zipFilesFromMembers.put(server.getId(), zipFile);
         }
+      }
 
-        Path tempDir = Files.createTempDirectory("exportedLogs");
-        // make sure the directory is created, so that even if there is no files unzipped to this
-        // dir, we can still zip it and send an empty zip file back to the client
-        Path exportedLogsDir = tempDir.resolve("exportedLogs");
-        FileUtils.forceMkdir(exportedLogsDir.toFile());
-
-        for (Path zipFile : zipFilesFromMembers.values()) {
-          Path unzippedMemberDir =
-              exportedLogsDir.resolve(zipFile.getFileName().toString().replace(".zip", ""));
-          ZipUtils.unzip(zipFile.toAbsolutePath().toString(), unzippedMemberDir.toString());
-          FileUtils.deleteQuietly(zipFile.toFile());
-        }
+      if (zipFilesFromMembers.isEmpty()) {
+        return ResultBuilder.createUserErrorResult("No files to be exported.");
+      }
 
-        Path dirPath;
-        if (StringUtils.isBlank(dirName)) {
-          dirPath = Paths.get(System.getProperty("user.dir"));
-        } else {
-          dirPath = Paths.get(dirName);
-        }
-        Path exportedLogsZipFile =
-            dirPath.resolve("exportedLogs_" + System.currentTimeMillis() + ".zip").toAbsolutePath();
+      Path tempDir = Files.createTempDirectory("exportedLogs");
+      // make sure the directory is created, so that even if there is no files unzipped to this
+      // dir, we can still zip it and send an empty zip file back to the client
+      Path exportedLogsDir = tempDir.resolve("exportedLogs");
+      FileUtils.forceMkdir(exportedLogsDir.toFile());
+
+      for (Path zipFile : zipFilesFromMembers.values()) {
+        Path unzippedMemberDir =
+            exportedLogsDir.resolve(zipFile.getFileName().toString().replace(".zip", ""));
+        ZipUtils.unzip(zipFile.toAbsolutePath().toString(), unzippedMemberDir.toString());
+        FileUtils.deleteQuietly(zipFile.toFile());
+      }
 
-        logger.info("Zipping into: " + exportedLogsZipFile.toString());
-        ZipUtils.zipDirectory(exportedLogsDir, exportedLogsZipFile);
-        try {
-          isFileSizeCheckEnabledAndWithinLimit(parseFileSizeLimit(fileSizeLimit),
-              exportedLogsZipFile.toFile());
-        } catch (ManagementException e) {
-          return ResultBuilder.createUserErrorResult(e.getMessage());
-        } finally {
-          FileUtils.deleteDirectory(tempDir.toFile());
-        }
-        result = ResultBuilder.createInfoResult(exportedLogsZipFile.toString());
+      Path dirPath;
+      if (StringUtils.isBlank(dirName)) {
+        dirPath = Paths.get(System.getProperty("user.dir"));
+      } else {
+        dirPath = Paths.get(dirName);
+      }
+      Path exportedLogsZipFile =
+          dirPath.resolve("exportedLogs_" + System.currentTimeMillis() + ".zip").toAbsolutePath();
+
+      logger.info("Zipping into: " + exportedLogsZipFile.toString());
+      ZipUtils.zipDirectory(exportedLogsDir, exportedLogsZipFile);
+      try {
+        isFileSizeCheckEnabledAndWithinLimit(parseFileSizeLimit(fileSizeLimit),
+            exportedLogsZipFile.toFile());
+      } catch (ManagementException e) {
+        FileUtils.deleteQuietly(exportedLogsZipFile.toFile());
+        return ResultBuilder.createUserErrorResult(e.getMessage());
+      } finally {
+        FileUtils.deleteDirectory(tempDir.toFile());
       }
+      result = ResultBuilder.createInfoResult(exportedLogsZipFile.toString());
     } catch (Exception ex) {
       logger.error(ex.getMessage(), ex);
       result = ResultBuilder.createGemFireErrorResult(ex.getMessage());
@@ -240,15 +221,6 @@ public class ExportLogsCommand implements CommandMarker {
   }
 
   /**
-   * Test hook for unit testing. To limit scope of test to only estimate size of exports (i.e. skip
-   * the filtering and exporting logs & stats from cluster members), stub this method to return true
-   * to skip exporting.
-   */
-  boolean testhookSkipExports() {
-    return false;
-  }
-
-  /**
    * Wrapper to enable stubbing of static method call for unit testing
    */
   Set<DistributedMember> getMembers(String[] groups, String[] memberIds) {
@@ -292,47 +264,38 @@ public class ExportLogsCommand implements CommandMarker {
 
   /**
    * Throws ManagementException if file size is over fileSizeLimit bytes
-   *
-   * @return false == limit is zero (checking disabled)<br>
-   *         true == file size is less than limit<br>
-   *         exception == file size is over limit
    */
-  boolean isFileSizeCheckEnabledAndWithinLimit(long fileSizeLimitBytes, File file) {
-    if (fileSizeLimitBytes < 1) {
-      // size checks disabled
-      return false;
-    }
-    if (FileUtils.sizeOf(file) < fileSizeLimitBytes) {
-      return true;
+  void isFileSizeCheckEnabledAndWithinLimit(long fileSizeLimitBytes, File file) {
+    if (fileSizeLimitBytes > 0) {
+      if (FileUtils.sizeOf(file) > fileSizeLimitBytes) {
+        StringBuilder sb = new StringBuilder();
+        sb.append("Exported logs zip file size = ").append(FileUtils.sizeOf(file)).append(", ")
+            .append(CliStrings.EXPORT_LOGS__FILESIZELIMIT).append(" = ").append(fileSizeLimitBytes)
+            .append(
+                ". To disable exported logs file size check use option \"--file-size-limit=0\".");
+        throw new ManagementException(sb.toString()); // FileTooBigException
+      }
     }
-    StringBuilder sb = new StringBuilder();
-    sb.append("Exported logs zip file size = ").append(FileUtils.sizeOf(file)).append(", ")
-        .append(CliStrings.EXPORT_LOGS__FILESIZELIMIT).append(" = ").append(fileSizeLimitBytes)
-        .append(". To disable exported logs file size check use option \"--file-size-limit=0\".");
-    throw new ManagementException(sb.toString()); // FileTooBigException
   }
 
+
   /**
    * Throws ManagementException if export file size checking is enabled and the space required on a
    * cluster member to filter and zip up files to be exported exceeds the disk space available
    */
-  boolean isSizeCheckEnabledAndWithinDiskSpaceOfMember(String memberName, long fileSizeLimitBytes,
-      long estimatedSize, long diskAvailable, long diskSize) {
-    // TODO:GEODE-2420: warn user if exportedLogs filtering will exceed disk available
-    if (fileSizeLimitBytes < 1) {
-      // size checks disabled
-      return false;
-    }
-    StringBuilder sb = new StringBuilder();
-    BytesToString bytesToString = new BytesToString();
-    if (estimatedSize > diskAvailable) {
-      sb.append("Estimated disk space required (").append(bytesToString.of(estimatedSize))
-          .append(") to consolidate logs on member ").append(memberName)
-          .append(" will exceed available disk space (").append(bytesToString.of(diskAvailable))
-          .append(")");
-      throw new ManagementException(sb.toString()); // FileTooBigException
+  void sizeCheckIsEnabledAndWithinDiskSpaceOfMember(String memberName, long fileSizeLimitBytes,
+      long estimatedSize, long diskAvailable) {
+    if (fileSizeLimitBytes > 0) {
+      StringBuilder sb = new StringBuilder();
+      BytesToString bytesToString = new BytesToString();
+      if (estimatedSize > diskAvailable) {
+        sb.append("Estimated disk space required (").append(bytesToString.of(estimatedSize))
+            .append(") to consolidate logs on member ").append(memberName)
+            .append(" will exceed available disk space (").append(bytesToString.of(diskAvailable))
+            .append(")");
+        throw new ManagementException(sb.toString()); // FileTooBigException
+      }
     }
-    return true;
   }
 
   static int parseSize(String diskSpaceLimit) {

http://git-wip-us.apache.org/repos/asf/geode/blob/c5962aa9/geode-core/src/main/java/org/apache/geode/management/internal/cli/functions/ExportLogsFunction.java
----------------------------------------------------------------------
diff --git a/geode-core/src/main/java/org/apache/geode/management/internal/cli/functions/ExportLogsFunction.java b/geode-core/src/main/java/org/apache/geode/management/internal/cli/functions/ExportLogsFunction.java
index 663a08e..86b506e 100644
--- a/geode-core/src/main/java/org/apache/geode/management/internal/cli/functions/ExportLogsFunction.java
+++ b/geode-core/src/main/java/org/apache/geode/management/internal/cli/functions/ExportLogsFunction.java
@@ -125,8 +125,7 @@ public class ExportLogsFunction implements Function, InternalEntity {
 
     Region exportLogsRegion = cache.getRegion(EXPORT_LOGS_REGION);
     if (exportLogsRegion == null) {
-      AttributesFactory<String, Configuration> regionAttrsFactory =
-          new AttributesFactory<String, Configuration>();
+      AttributesFactory<String, Configuration> regionAttrsFactory = new AttributesFactory<>();
       regionAttrsFactory.setDataPolicy(DataPolicy.EMPTY);
       regionAttrsFactory.setScope(Scope.DISTRIBUTED_ACK);
 

http://git-wip-us.apache.org/repos/asf/geode/blob/c5962aa9/geode-core/src/main/java/org/apache/geode/management/internal/cli/functions/ExportedLogsSizeInfo.java
----------------------------------------------------------------------
diff --git a/geode-core/src/main/java/org/apache/geode/management/internal/cli/functions/ExportedLogsSizeInfo.java b/geode-core/src/main/java/org/apache/geode/management/internal/cli/functions/ExportedLogsSizeInfo.java
deleted file mode 100644
index c175e1a..0000000
--- a/geode-core/src/main/java/org/apache/geode/management/internal/cli/functions/ExportedLogsSizeInfo.java
+++ /dev/null
@@ -1,105 +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.geode.management.internal.cli.functions;
-
-import org.apache.geode.DataSerializable;
-import org.apache.geode.DataSerializer;
-
-import java.io.DataInput;
-import java.io.DataOutput;
-import java.io.IOException;
-import java.util.Objects;
-
-public class ExportedLogsSizeInfo implements DataSerializable {
-  private long logsSize;
-  private long diskAvailable;
-  private long diskSize;
-
-  // Used for deserialization only
-  public ExportedLogsSizeInfo() {
-    logsSize = 0;
-    diskAvailable = 0;
-    diskSize = 0;
-  }
-
-  public ExportedLogsSizeInfo(long logsSize, long diskAvailable, long diskSize) {
-    this.logsSize = logsSize;
-    this.diskAvailable = diskAvailable;
-    this.diskSize = diskSize;
-  }
-
-  public long getDiskSize() {
-    return diskSize;
-  }
-
-  public long getDiskAvailable() {
-    return diskAvailable;
-  }
-
-  public long getLogsSize() {
-
-    return logsSize;
-  }
-
-  @Override
-  public boolean equals(Object o) {
-    if (this == o) {
-      return true;
-    }
-    if (o == null || getClass() != o.getClass()) {
-      return false;
-    }
-
-    ExportedLogsSizeInfo that = (ExportedLogsSizeInfo) o;
-
-    if (logsSize != that.logsSize) {
-      return false;
-    }
-    if (diskAvailable != that.diskAvailable) {
-      return false;
-    }
-    return diskSize == that.diskSize;
-  }
-
-  @Override
-  public int hashCode() {
-    return Objects.hash(logsSize, diskAvailable, diskSize);
-  }
-
-  @Override
-  public void toData(DataOutput out) throws IOException {
-    DataSerializer.writeLong(logsSize, out);
-    DataSerializer.writeLong(diskAvailable, out);
-    DataSerializer.writeLong(diskSize, out);
-  }
-
-  @Override
-  public void fromData(DataInput in) throws IOException, ClassNotFoundException {
-    logsSize = DataSerializer.readLong(in);
-    diskAvailable = DataSerializer.readLong(in);
-    diskSize = DataSerializer.readLong(in);
-  }
-
-  @Override
-  public String toString() {
-    StringBuilder result = new StringBuilder();
-    result.append("[");
-    result.append("logsSize: " + logsSize);
-    result.append(", diskAvailable: " + diskAvailable);
-    result.append(", diskSize: " + diskSize);
-    result.append("]");
-    return result.toString();
-  }
-}

http://git-wip-us.apache.org/repos/asf/geode/blob/c5962aa9/geode-core/src/main/java/org/apache/geode/management/internal/cli/functions/SizeExportLogsFunction.java
----------------------------------------------------------------------
diff --git a/geode-core/src/main/java/org/apache/geode/management/internal/cli/functions/SizeExportLogsFunction.java b/geode-core/src/main/java/org/apache/geode/management/internal/cli/functions/SizeExportLogsFunction.java
index 3d98fe9..57355c0 100644
--- a/geode-core/src/main/java/org/apache/geode/management/internal/cli/functions/SizeExportLogsFunction.java
+++ b/geode-core/src/main/java/org/apache/geode/management/internal/cli/functions/SizeExportLogsFunction.java
@@ -16,9 +16,11 @@ package org.apache.geode.management.internal.cli.functions;
 
 import java.io.File;
 import java.io.IOException;
-import java.text.ParseException;
 import java.util.Arrays;
 
+import org.apache.geode.management.ManagementException;
+import org.apache.geode.management.internal.cli.util.BytesToString;
+import org.apache.geode.management.internal.cli.util.LogExporter;
 import org.apache.logging.log4j.Logger;
 
 import org.apache.geode.cache.execute.Function;
@@ -30,7 +32,6 @@ import org.apache.geode.internal.cache.GemFireCacheImpl;
 import org.apache.geode.internal.cache.InternalCache;
 import org.apache.geode.internal.logging.LogService;
 import org.apache.geode.management.internal.cli.util.LogFilter;
-import org.apache.geode.management.internal.cli.util.LogSizer;
 
 public class SizeExportLogsFunction extends ExportLogsFunction implements Function, InternalEntity {
   private static final Logger LOGGER = LogService.getLogger();
@@ -42,13 +43,20 @@ public class SizeExportLogsFunction extends ExportLogsFunction implements Functi
       InternalCache cache = GemFireCacheImpl.getInstance();
       DistributionConfig config = cache.getInternalDistributedSystem().getConfig();
       Args args = (Args) context.getArguments();
-      long diskAvailable = config.getLogFile().getUsableSpace();
-      long diskSize = config.getLogFile().getTotalSpace();
+      long diskAvailable = getDiskAvailable(config);
       long estimatedSize = estimateLogFileSize(cache.getMyId(), config.getLogFile(),
           config.getStatisticArchiveFile(), args);
 
-      context.getResultSender().lastResult(
-          Arrays.asList(new ExportedLogsSizeInfo(estimatedSize, diskAvailable, diskSize)));
+      BytesToString bytesToString = new BytesToString();
+      if (estimatedSize == 0 || estimatedSize < diskAvailable) {
+        context.getResultSender().lastResult(Arrays.asList(estimatedSize));
+      } else {
+        StringBuilder sb = new StringBuilder().append("Estimated disk space required (")
+            .append(bytesToString.of(estimatedSize)).append(") to consolidate logs on member ")
+            .append(cache.getName()).append(" will exceed available disk space (")
+            .append(bytesToString.of(diskAvailable)).append(")");
+        context.getResultSender().sendException(new ManagementException(sb.toString())); // FileTooBigException
+      }
 
     } catch (Exception e) {
       e.printStackTrace();
@@ -57,8 +65,12 @@ public class SizeExportLogsFunction extends ExportLogsFunction implements Functi
     }
   }
 
+  long getDiskAvailable(DistributionConfig config) {
+    return config.getLogFile().getUsableSpace();
+  }
+
   long estimateLogFileSize(final DistributedMember member, final File logFile,
-      final File statArchive, final Args args) throws ParseException, IOException {
+      final File statArchive, final Args args) throws IOException {
     if (LOGGER.isDebugEnabled()) {
       LOGGER.debug("SizeExportLogsFunction started for member {}", member);
     }
@@ -76,7 +88,8 @@ public class SizeExportLogsFunction extends ExportLogsFunction implements Functi
     LogFilter logFilter = new LogFilter(args.getLogLevel(), args.isThisLogLevelOnly(),
         args.getStartTime(), args.getEndTime());
 
-    long estimatedSize = new LogSizer(logFilter, baseLogFile, baseStatsFile).getFilteredSize();
+    long estimatedSize =
+        new LogExporter(logFilter, baseLogFile, baseStatsFile).estimateFilteredSize();
 
     LOGGER.info("Estimated log file size: " + estimatedSize);
 

http://git-wip-us.apache.org/repos/asf/geode/blob/c5962aa9/geode-core/src/main/java/org/apache/geode/management/internal/cli/i18n/CliStrings.java
----------------------------------------------------------------------
diff --git a/geode-core/src/main/java/org/apache/geode/management/internal/cli/i18n/CliStrings.java b/geode-core/src/main/java/org/apache/geode/management/internal/cli/i18n/CliStrings.java
index 68d055c..cbeee99 100644
--- a/geode-core/src/main/java/org/apache/geode/management/internal/cli/i18n/CliStrings.java
+++ b/geode-core/src/main/java/org/apache/geode/management/internal/cli/i18n/CliStrings.java
@@ -1441,7 +1441,7 @@ public class CliStrings {
   public static final String EXPORT_LOGS__STATSONLY__HELP = "Whether to only export statistics";
   public static final String EXPORT_LOGS__FILESIZELIMIT = "file-size-limit";
   public static final String EXPORT_LOGS__FILESIZELIMIT__HELP =
-      "Limits size of the file that can be exported. Specify zero for no limit. Value is in megabytes by default or [m|g|t] may be specified.";
+      "Limits size of the file that can be exported. Specify zero for no limit. Value is in megabytes by default or [k|m|g|t] may be specified.";
   public static final String EXPORT_LOGS__FILESIZELIMIT__SPECIFIED_DEFAULT = "0";
   public static final String EXPORT_LOGS__FILESIZELIMIT__UNSPECIFIED_DEFAULT = "100m";
 

http://git-wip-us.apache.org/repos/asf/geode/blob/c5962aa9/geode-core/src/main/java/org/apache/geode/management/internal/cli/util/LogExporter.java
----------------------------------------------------------------------
diff --git a/geode-core/src/main/java/org/apache/geode/management/internal/cli/util/LogExporter.java b/geode-core/src/main/java/org/apache/geode/management/internal/cli/util/LogExporter.java
index a0be7fb..5802f79 100644
--- a/geode-core/src/main/java/org/apache/geode/management/internal/cli/util/LogExporter.java
+++ b/geode-core/src/main/java/org/apache/geode/management/internal/cli/util/LogExporter.java
@@ -31,7 +31,7 @@ import java.io.FileWriter;
 import java.io.IOException;
 import java.nio.file.Files;
 import java.nio.file.Path;
-import java.text.ParseException;
+import java.util.Collections;
 import java.util.List;
 import java.util.function.Predicate;
 import java.util.stream.Stream;
@@ -51,10 +51,8 @@ public class LogExporter {
    * @param logFilter the filter that's used to check if we need to accept the file or the logLine
    * @param baseLogFile if not null, we will export the logs in that directory
    * @param baseStatsFile if not null, we will export stats in that directory
-   * @throws ParseException
    */
-  public LogExporter(LogFilter logFilter, File baseLogFile, File baseStatsFile)
-      throws ParseException {
+  public LogExporter(LogFilter logFilter, File baseLogFile, File baseStatsFile) {
     assert logFilter != null;
     this.logFilter = logFilter;
     this.baseLogFile = baseLogFile;
@@ -65,7 +63,6 @@ public class LogExporter {
    *
    * @return Path to the zip file that has all the filtered files, null if no files are selected to
    *         export.
-   * @throws IOException
    */
   public Path export() throws IOException {
     Path tempDirectory = Files.createTempDirectory("exportLogs");
@@ -127,24 +124,68 @@ public class LogExporter {
     }
   }
 
-  protected List<Path> findLogFiles(Path workingDir) throws IOException {
+  /**
+   * @return combined size of stat archives and filtered log files in bytes
+   */
+  public long estimateFilteredSize() throws IOException {
+    long filteredSize = 0;
+    if (baseLogFile != null) {
+      for (Path logFile : findLogFiles(baseLogFile.toPath().getParent())) {
+        filteredSize += filterAndSize(logFile);
+      }
+    }
+
+    if (baseStatsFile != null) {
+      for (Path statFile : findStatFiles(baseStatsFile.toPath().getParent())) {
+        filteredSize += statFile.toFile().length();
+      }
+    }
+
+    return filteredSize;
+  }
+
+  /**
+   * @return size of file in bytes
+   */
+  private long filterAndSize(Path originalLogFile) throws IOException {
+    long size = 0;
+    this.logFilter.startNewFile();
+
+    try (BufferedReader reader = new BufferedReader(new FileReader(originalLogFile.toFile()))) {
+      String line;
+      while ((line = reader.readLine()) != null) {
+        LogFilter.LineFilterResult result = this.logFilter.acceptsLine(line);
+
+        if (result == LogFilter.LineFilterResult.REMAINDER_OF_FILE_REJECTED) {
+          break;
+        }
+        if (result == LogFilter.LineFilterResult.LINE_ACCEPTED) {
+          size += line.length() + File.separator.length();
+        }
+      }
+    }
+    return size;
+  }
+
+  List<Path> findLogFiles(Path workingDir) throws IOException {
     Predicate<Path> logFileSelector = (Path file) -> file.toString().toLowerCase().endsWith(".log");
     return findFiles(workingDir, logFileSelector);
   }
 
 
-  protected List<Path> findStatFiles(Path workingDir) throws IOException {
+  List<Path> findStatFiles(Path workingDir) throws IOException {
     Predicate<Path> statFileSelector =
         (Path file) -> file.toString().toLowerCase().endsWith(".gfs");
     return findFiles(workingDir, statFileSelector);
   }
 
   private List<Path> findFiles(Path workingDir, Predicate<Path> fileSelector) throws IOException {
-    Stream<Path> selectedFiles =
-        Files.list(workingDir).filter(fileSelector).filter(this.logFilter::acceptsFile);
+    Stream<Path> selectedFiles/* = null */;
+    if (!workingDir.toFile().isDirectory()) {
+      return Collections.emptyList();
+    }
+    selectedFiles = Files.list(workingDir).filter(fileSelector).filter(this.logFilter::acceptsFile);
 
     return selectedFiles.collect(toList());
   }
-
-
 }

http://git-wip-us.apache.org/repos/asf/geode/blob/c5962aa9/geode-core/src/main/java/org/apache/geode/management/internal/cli/util/LogSizer.java
----------------------------------------------------------------------
diff --git a/geode-core/src/main/java/org/apache/geode/management/internal/cli/util/LogSizer.java b/geode-core/src/main/java/org/apache/geode/management/internal/cli/util/LogSizer.java
deleted file mode 100644
index f1adae6..0000000
--- a/geode-core/src/main/java/org/apache/geode/management/internal/cli/util/LogSizer.java
+++ /dev/null
@@ -1,118 +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.geode.management.internal.cli.util;
-
-import static java.util.stream.Collectors.toList;
-
-import org.apache.geode.internal.logging.LogService;
-import org.apache.logging.log4j.Logger;
-
-import java.io.File;
-import java.io.FileNotFoundException;
-import java.io.IOException;
-import java.nio.file.Files;
-import java.nio.file.Path;
-import java.text.ParseException;
-import java.util.Collections;
-import java.util.List;
-import java.util.Scanner;
-import java.util.function.Predicate;
-import java.util.stream.Stream;
-
-public class LogSizer {
-  private static final Logger LOGGER = LogService.getLogger();
-
-  private final LogFilter logFilter;
-  private final File baseLogFile;
-  private final File baseStatsFile;
-
-  private long filteredSize;
-
-  /**
-   * @param logFilter the filter that's used to check if we need to accept the file or the logLine
-   * @param baseLogFile if not null, we will estimate the additional disk space required to filter
-   *        and export the logs in that directory
-   * @param baseStatsFile if not null, we will estimate the additional disk space required to filter
-   *        and export the stats in that directory
-   */
-  public LogSizer(LogFilter logFilter, File baseLogFile, File baseStatsFile) throws ParseException {
-    assert logFilter != null;
-    this.logFilter = logFilter;
-    this.baseLogFile = baseLogFile;
-    this.baseStatsFile = baseStatsFile;
-    filteredSize = 0;
-  }
-
-  /**
-   * @return combined size of stat archives and filtered log files in bytes
-   */
-  public long getFilteredSize() throws IOException {
-
-    if (baseLogFile != null) {
-      for (Path logFile : findLogFiles(baseLogFile.toPath().getParent())) {
-        filteredSize += filterAndSize(logFile);
-      }
-    }
-
-    if (baseStatsFile != null) {
-      for (Path statFile : findStatFiles(baseStatsFile.toPath().getParent())) {
-        filteredSize += statFile.toFile().length();
-      }
-    }
-
-    return filteredSize;
-  }
-
-  /**
-   * @return size of file in bytes
-   */
-  protected long filterAndSize(Path originalLogFile) throws FileNotFoundException {
-    long size = 0;
-    Scanner in = new Scanner(originalLogFile.toFile());
-    while (in.hasNextLine()) {
-      String line = in.nextLine();
-
-      LogFilter.LineFilterResult result = this.logFilter.acceptsLine(line);
-
-      if (result == LogFilter.LineFilterResult.REMAINDER_OF_FILE_REJECTED) {
-        break;
-      }
-      size += line.length() + File.separator.length();
-    }
-    return size;
-  }
-
-  protected List<Path> findLogFiles(Path workingDir) throws IOException {
-    Predicate<Path> logFileSelector = (Path file) -> file.toString().toLowerCase().endsWith(".log");
-    return findFiles(workingDir, logFileSelector);
-  }
-
-
-  protected List<Path> findStatFiles(Path workingDir) throws IOException {
-    Predicate<Path> statFileSelector =
-        (Path file) -> file.toString().toLowerCase().endsWith(".gfs");
-    return findFiles(workingDir, statFileSelector);
-  }
-
-  private List<Path> findFiles(Path workingDir, Predicate<Path> fileSelector) throws IOException {
-    Stream<Path> selectedFiles = null;
-    if (!workingDir.toFile().isDirectory()) {
-      return Collections.emptyList();
-    }
-    selectedFiles = Files.list(workingDir).filter(fileSelector).filter(this.logFilter::acceptsFile);
-
-    return selectedFiles.collect(toList());
-  }
-}

http://git-wip-us.apache.org/repos/asf/geode/blob/c5962aa9/geode-core/src/test/java/org/apache/geode/management/internal/cli/commands/ExportLogsCommandTest.java
----------------------------------------------------------------------
diff --git a/geode-core/src/test/java/org/apache/geode/management/internal/cli/commands/ExportLogsCommandTest.java b/geode-core/src/test/java/org/apache/geode/management/internal/cli/commands/ExportLogsCommandTest.java
index 2b7839a..8888a91 100644
--- a/geode-core/src/test/java/org/apache/geode/management/internal/cli/commands/ExportLogsCommandTest.java
+++ b/geode-core/src/test/java/org/apache/geode/management/internal/cli/commands/ExportLogsCommandTest.java
@@ -28,10 +28,9 @@ import org.apache.geode.cache.execute.FunctionException;
 import org.apache.geode.cache.execute.ResultCollector;
 import org.apache.geode.distributed.DistributedMember;
 import org.apache.geode.distributed.internal.membership.InternalDistributedMember;
-import org.apache.geode.internal.cache.GemFireCacheImpl;
+import org.apache.geode.internal.cache.InternalCache;
 import org.apache.geode.management.ManagementException;
 import org.apache.geode.management.cli.Result;
-import org.apache.geode.management.internal.cli.functions.ExportedLogsSizeInfo;
 import org.apache.geode.management.internal.cli.functions.SizeExportLogsFunction;
 import org.apache.geode.test.junit.categories.UnitTest;
 import org.junit.Test;
@@ -125,122 +124,38 @@ public class ExportLogsCommandTest {
   public void sizeTooBigOnMember_sizeChecksDisabled_returnsFalse() throws Exception {
     final Cache mockCache = mock(Cache.class);
     final DistributedMember mockDistributedMember = mock(DistributedMember.class);
-    final Execution mockFuntionExecutor = mock(Execution.class);
+    final Execution mockFunctionExecutor = mock(Execution.class);
     final ExportLogsCommand cmd =
-        createExportLogsCommand(mockCache, mockDistributedMember, mockFuntionExecutor);
-    assertThat(cmd.isSizeCheckEnabledAndWithinDiskSpaceOfMember("clusterMember", 0, MEGABYTE + 1024,
-        MEGABYTE, TERABYTE)).isFalse();
+        createExportLogsCommand(mockCache, mockDistributedMember, mockFunctionExecutor);
+    cmd.sizeCheckIsEnabledAndWithinDiskSpaceOfMember("clusterMember", 0, MEGABYTE + 1024, MEGABYTE);
   }
 
   @Test
-  public void sizeOKOnMember_sizeChecksEnabled_returnsTrue() throws Exception {
+  public void sizeOKOnMember_sizeChecksEnabled_doesNotThrow() throws Exception {
     final Cache mockCache = mock(Cache.class);
     final DistributedMember mockDistributedMember = mock(DistributedMember.class);
-    final Execution mockFuntionExecutor = mock(Execution.class);
+    final Execution mockFunctionExecutor = mock(Execution.class);
     final ExportLogsCommand cmd =
-        createExportLogsCommand(mockCache, mockDistributedMember, mockFuntionExecutor);
-    assertThat(cmd.isSizeCheckEnabledAndWithinDiskSpaceOfMember("clusterMember", 10 * MEGABYTE,
-        MEGABYTE - 1024, MEGABYTE, TERABYTE)).isTrue();
+        createExportLogsCommand(mockCache, mockDistributedMember, mockFunctionExecutor);
+    cmd.sizeCheckIsEnabledAndWithinDiskSpaceOfMember("clusterMember", 10 * MEGABYTE,
+        MEGABYTE - 1024, MEGABYTE);
   }
 
   @Test
   public void sizeTooBigOnMember_sizeChecksEnabled_shouldThrow() throws Exception {
     final Cache mockCache = mock(Cache.class);
     final DistributedMember mockDistributedMember = mock(DistributedMember.class);
-    final Execution mockFuntionExecutor = mock(Execution.class);
+    final Execution mockFunctionExecutor = mock(Execution.class);
     final ExportLogsCommand cmd =
-        createExportLogsCommand(mockCache, mockDistributedMember, mockFuntionExecutor);
-    assertThatThrownBy(() -> cmd.isSizeCheckEnabledAndWithinDiskSpaceOfMember("clusterMember",
-        10 * MEGABYTE, MEGABYTE + 1024, MEGABYTE, TERABYTE))
-            .isInstanceOf(ManagementException.class);
-  }
-
-  @Test
-  public void sizeFromMember_withinLimits() throws Exception {
-    final GemFireCacheImpl mockCache = mock(GemFireCacheImpl.class);
-    final ExportLogsCommand realCmd = new ExportLogsCommand();
-
-    ExportLogsCommand spyCmd = spy(realCmd);
-    String start = null;
-    String end = null;
-    String logLevel = null;
-    boolean onlyLogLevel = false;
-    boolean logsOnly = false;
-    boolean statsOnly = false;
-
-    InternalDistributedMember member1 = new InternalDistributedMember("member1", 12345);
-    InternalDistributedMember member2 = new InternalDistributedMember("member2", 98765);
-    member1.getNetMember().setName("member1");
-    member2.getNetMember().setName("member2");
-    Set<DistributedMember> testMembers = new HashSet<>();
-    testMembers.add(member1);
-    testMembers.add(member2);
-
-    ResultCollector testResults1 = new CustomCollector();
-    testResults1.addResult(member1,
-        Arrays.asList(new ExportedLogsSizeInfo(MEGABYTE, 2 * MEGABYTE, TERABYTE)));
-    ResultCollector testResults2 = new CustomCollector();
-    testResults2.addResult(member2,
-        Arrays.asList(new ExportedLogsSizeInfo(2 * MEGABYTE, 2 * MEGABYTE, TERABYTE)));
-
-    doReturn(mockCache).when(spyCmd).getCache();
-    doReturn(testMembers).when(spyCmd).getMembers(null, null);
-    doReturn(testResults1).when(spyCmd)
-        .estimateLogSize(Matchers.any(SizeExportLogsFunction.Args.class), eq(member1));
-    doReturn(testResults2).when(spyCmd)
-        .estimateLogSize(Matchers.any(SizeExportLogsFunction.Args.class), eq(member2));
-    doReturn(true).when(spyCmd).testhookSkipExports();
-
-    Result res = spyCmd.exportLogs("working dir", null, null, logLevel, onlyLogLevel, false, start,
-        end, logsOnly, statsOnly, "1g");
-    assertThat(res.getStatus()).isEqualTo(Result.Status.OK);
-  }
-
-  @Test
-  public void sizeFromMember_greaterThanDiskAvailable_shouldReturnErrorResult() throws Exception {
-    final GemFireCacheImpl mockCache = mock(GemFireCacheImpl.class);
-    final ExportLogsCommand realCmd = new ExportLogsCommand();
-    ExportLogsCommand spyCmd = spy(realCmd);
-
-    String start = null;
-    String end = null;
-    String logLevel = null;
-    boolean onlyLogLevel = false;
-    boolean logsOnly = false;
-    boolean statsOnly = false;
-
-    InternalDistributedMember member1 = new InternalDistributedMember("member1", 12345);
-    InternalDistributedMember member2 = new InternalDistributedMember("member2", 98765);
-    member1.getNetMember().setName("member1");
-    member2.getNetMember().setName("member2");
-    Set<DistributedMember> testMembers = new HashSet<>();
-    testMembers.add(member1);
-    testMembers.add(member2);
-
-    ResultCollector testResults1 = new CustomCollector();
-    testResults1.addResult(member1,
-        Arrays.asList(new ExportedLogsSizeInfo(2 * MEGABYTE, MEGABYTE, TERABYTE)));
-    ResultCollector testResults2 = new CustomCollector();
-    testResults2.addResult(member2,
-        Arrays.asList(new ExportedLogsSizeInfo(2 * MEGABYTE, 2 * MEGABYTE, TERABYTE)));
-
-    doReturn(mockCache).when(spyCmd).getCache();
-    doReturn(testMembers).when(spyCmd).getMembers(null, null);
-    doReturn(testResults1).when(spyCmd)
-        .estimateLogSize(Matchers.any(SizeExportLogsFunction.Args.class), eq(member1));
-    doReturn(testResults2).when(spyCmd)
-        .estimateLogSize(Matchers.any(SizeExportLogsFunction.Args.class), eq(member2));
-    doReturn(true).when(spyCmd).testhookSkipExports();
-
-    Result res = spyCmd.exportLogs("working dir", null, null, logLevel, onlyLogLevel, false, start,
-        end, logsOnly, statsOnly, "1g");
-    assertThat(res.getStatus()).isEqualTo(Result.Status.ERROR);
+        createExportLogsCommand(mockCache, mockDistributedMember, mockFunctionExecutor);
+    assertThatThrownBy(() -> cmd.sizeCheckIsEnabledAndWithinDiskSpaceOfMember("clusterMember",
+        10 * MEGABYTE, MEGABYTE + 1024, MEGABYTE)).isInstanceOf(ManagementException.class);
   }
 
   @Test
   public void sizeFromAllMembers_greaterThanLocalDiskAvailable_shouldReturnErrorResult()
       throws Exception {
-    final GemFireCacheImpl mockCache = mock(GemFireCacheImpl.class);
+    final InternalCache mockCache = mock(InternalCache.class);
     final ExportLogsCommand realCmd = new ExportLogsCommand();
     ExportLogsCommand spyCmd = spy(realCmd);
 
@@ -260,11 +175,9 @@ public class ExportLogsCommandTest {
     testMembers.add(member2);
 
     ResultCollector testResults1 = new CustomCollector();
-    testResults1.addResult(member1,
-        Arrays.asList(new ExportedLogsSizeInfo(75 * MEGABYTE, GIGABYTE, TERABYTE)));
+    testResults1.addResult(member1, Arrays.asList(75 * MEGABYTE));
     ResultCollector testResults2 = new CustomCollector();
-    testResults2.addResult(member2,
-        Arrays.asList(new ExportedLogsSizeInfo(60 * MEGABYTE, GIGABYTE, TERABYTE)));
+    testResults2.addResult(member2, Arrays.asList(60 * MEGABYTE));
 
     doReturn(mockCache).when(spyCmd).getCache();
     doReturn(testMembers).when(spyCmd).getMembers(null, null);
@@ -275,8 +188,6 @@ public class ExportLogsCommandTest {
     doReturn(125 * MEGABYTE).when(spyCmd).getLocalDiskAvailable();
     doReturn(GIGABYTE).when(spyCmd).getLocalDiskSize();
 
-    doReturn(true).when(spyCmd).testhookSkipExports();
-
     Result res = spyCmd.exportLogs("working dir", null, null, logLevel, onlyLogLevel, false, start,
         end, logsOnly, statsOnly, "125m");
     assertThat(res.getStatus()).isEqualTo(Result.Status.ERROR);

http://git-wip-us.apache.org/repos/asf/geode/blob/c5962aa9/geode-core/src/test/java/org/apache/geode/management/internal/cli/commands/ExportLogsDUnitTest.java
----------------------------------------------------------------------
diff --git a/geode-core/src/test/java/org/apache/geode/management/internal/cli/commands/ExportLogsDUnitTest.java b/geode-core/src/test/java/org/apache/geode/management/internal/cli/commands/ExportLogsDUnitTest.java
index 0e0f6aa..8609b3a 100644
--- a/geode-core/src/test/java/org/apache/geode/management/internal/cli/commands/ExportLogsDUnitTest.java
+++ b/geode-core/src/test/java/org/apache/geode/management/internal/cli/commands/ExportLogsDUnitTest.java
@@ -39,7 +39,6 @@ import org.apache.geode.test.dunit.rules.LocatorServerStartupRule;
 import org.apache.geode.test.dunit.rules.Member;
 import org.apache.geode.test.dunit.rules.MemberVM;
 import org.apache.geode.test.junit.categories.DistributedTest;
-import org.apache.geode.test.junit.categories.FlakyTest;
 import org.apache.logging.log4j.Logger;
 import org.junit.Before;
 import org.junit.Rule;
@@ -157,8 +156,7 @@ public class ExportLogsDUnitTest {
   @Test
   public void testExportWithThresholdLogLevelFilter() throws Exception {
 
-    CommandResult result = gfshConnector
-        .executeAndVerifyCommand("export logs --log-level=info --only-log-level=false");
+    gfshConnector.executeAndVerifyCommand("export logs --log-level=info --only-log-level=false");
 
     Set<String> acceptedLogLevels = Stream.of("info", "error").collect(toSet());
     verifyZipFileContents(acceptedLogLevels);
@@ -167,8 +165,7 @@ public class ExportLogsDUnitTest {
 
   @Test
   public void testExportWithExactLogLevelFilter() throws Exception {
-    CommandResult result =
-        gfshConnector.executeAndVerifyCommand("export logs --log-level=info --only-log-level=true");
+    gfshConnector.executeAndVerifyCommand("export logs --log-level=info --only-log-level=true");
 
 
     Set<String> acceptedLogLevels = Stream.of("info").collect(toSet());
@@ -177,7 +174,7 @@ public class ExportLogsDUnitTest {
 
   @Test
   public void testExportWithNoOptionsGiven() throws Exception {
-    CommandResult result = gfshConnector.executeAndVerifyCommand("export logs");
+    gfshConnector.executeAndVerifyCommand("export logs");
     Set<String> acceptedLogLevels = Stream.of("info", "error", "debug").collect(toSet());
     verifyZipFileContents(acceptedLogLevels);
   }
@@ -229,7 +226,7 @@ public class ExportLogsDUnitTest {
   }
 
 
-  public void verifyZipFileContents(Set<String> acceptedLogLevels) throws IOException {
+  private void verifyZipFileContents(Set<String> acceptedLogLevels) throws IOException {
     File unzippedLogFileDir = unzipExportedLogs();
 
     Set<File> dirsFromZipFile =
@@ -247,7 +244,7 @@ public class ExportLogsDUnitTest {
     }
   }
 
-  public void verifyLogFileContents(Set<String> acceptedLogLevels, File dirForMember)
+  private void verifyLogFileContents(Set<String> acceptedLogLevels, File dirForMember)
       throws IOException {
 
     String memberName = dirForMember.getName();
@@ -312,13 +309,13 @@ public class ExportLogsDUnitTest {
     String message;
     boolean shouldBeIgnoredDueToTimestamp;
 
-    public LogLine(String message, String level, boolean shouldBeIgnoredDueToTimestamp) {
+    LogLine(String message, String level, boolean shouldBeIgnoredDueToTimestamp) {
       this.message = message;
       this.level = level;
       this.shouldBeIgnoredDueToTimestamp = shouldBeIgnoredDueToTimestamp;
     }
 
-    public LogLine(Member member, String level) {
+    LogLine(Member member, String level) {
       this.level = level;
       this.message = buildMessage(member.getName());
     }
@@ -332,13 +329,13 @@ public class ExportLogsDUnitTest {
       if (Objects.equals(level, "error")) {
         stringBuilder.append(ERROR_LOG_PREFIX + "-");
       }
-      stringBuilder.append(level + "-");
+      stringBuilder.append(level).append("-");
 
       return stringBuilder.append(memberName).toString();
     }
 
 
-    public void writeLog(Logger logger) {
+    void writeLog(Logger logger) {
       switch (this.level) {
         case "info":
           logger.info(getMessage());

http://git-wip-us.apache.org/repos/asf/geode/blob/c5962aa9/geode-core/src/test/java/org/apache/geode/management/internal/cli/commands/ExportLogsFileSizeLimitTest.java
----------------------------------------------------------------------
diff --git a/geode-core/src/test/java/org/apache/geode/management/internal/cli/commands/ExportLogsFileSizeLimitTest.java b/geode-core/src/test/java/org/apache/geode/management/internal/cli/commands/ExportLogsFileSizeLimitTest.java
index 1058053..4ab88b6 100644
--- a/geode-core/src/test/java/org/apache/geode/management/internal/cli/commands/ExportLogsFileSizeLimitTest.java
+++ b/geode-core/src/test/java/org/apache/geode/management/internal/cli/commands/ExportLogsFileSizeLimitTest.java
@@ -64,7 +64,7 @@ public class ExportLogsFileSizeLimitTest {
 
     ExportLogsCommand exportLogsCommand = new ExportLogsCommand();
 
-    assertThat(exportLogsCommand.isFileSizeCheckEnabledAndWithinLimit(MEGABYTE, file)).isTrue();
+    exportLogsCommand.isFileSizeCheckEnabledAndWithinLimit(MEGABYTE, file);
   }
 
   @Test
@@ -74,7 +74,7 @@ public class ExportLogsFileSizeLimitTest {
 
     ExportLogsCommand exportLogsCommand = new ExportLogsCommand();
 
-    assertThat(exportLogsCommand.isFileSizeCheckEnabledAndWithinLimit(0, file)).isFalse();
+    exportLogsCommand.isFileSizeCheckEnabledAndWithinLimit(0, file);
   }
 
   private void fillUpFile(File file, long sizeInBytes) throws IOException {

http://git-wip-us.apache.org/repos/asf/geode/blob/c5962aa9/geode-core/src/test/java/org/apache/geode/management/internal/cli/commands/ExportLogsTestSuite.java
----------------------------------------------------------------------
diff --git a/geode-core/src/test/java/org/apache/geode/management/internal/cli/commands/ExportLogsTestSuite.java b/geode-core/src/test/java/org/apache/geode/management/internal/cli/commands/ExportLogsTestSuite.java
index 8f8c532..4e1dac0 100644
--- a/geode-core/src/test/java/org/apache/geode/management/internal/cli/commands/ExportLogsTestSuite.java
+++ b/geode-core/src/test/java/org/apache/geode/management/internal/cli/commands/ExportLogsTestSuite.java
@@ -14,8 +14,10 @@
  */
 package org.apache.geode.management.internal.cli.commands;
 
-import org.apache.geode.management.internal.cli.functions.SizeExportLogsFunctionCacheTest;
+import org.apache.geode.management.internal.cli.functions.SizeExportLogsFunctionTest;
 import org.apache.geode.management.internal.cli.functions.SizeExportLogsFunctionFileTest;
+import org.apache.geode.management.internal.cli.util.LogExporterIntegrationTest;
+import org.apache.geode.management.internal.cli.util.LogExporterTest;
 import org.apache.geode.management.internal.cli.util.LogSizerTest;
 import org.junit.Ignore;
 import org.junit.runner.RunWith;
@@ -27,9 +29,9 @@ import org.junit.runners.Suite;
 
 @Ignore
 @Suite.SuiteClasses({ExportLogsCommandTest.class, ExportLogsFileSizeLimitTest.class,
-    ExportLogsIntegrationTest.class, ExportLogsDUnitTest.class,
-    SizeExportLogsFunctionCacheTest.class, SizeExportLogsFunctionFileTest.class,
-    LogSizerTest.class})
+    ExportLogsIntegrationTest.class, ExportLogsDUnitTest.class, SizeExportLogsFunctionTest.class,
+    SizeExportLogsFunctionFileTest.class, LogSizerTest.class, LogExporterTest.class,
+    LogExporterIntegrationTest.class})
 @RunWith(Suite.class)
 public class ExportLogsTestSuite {
 }

http://git-wip-us.apache.org/repos/asf/geode/blob/c5962aa9/geode-core/src/test/java/org/apache/geode/management/internal/cli/functions/ExportedLogsSizeInfoTest.java
----------------------------------------------------------------------
diff --git a/geode-core/src/test/java/org/apache/geode/management/internal/cli/functions/ExportedLogsSizeInfoTest.java b/geode-core/src/test/java/org/apache/geode/management/internal/cli/functions/ExportedLogsSizeInfoTest.java
deleted file mode 100644
index 0bfbefa..0000000
--- a/geode-core/src/test/java/org/apache/geode/management/internal/cli/functions/ExportedLogsSizeInfoTest.java
+++ /dev/null
@@ -1,133 +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.geode.management.internal.cli.functions;
-
-import static org.assertj.core.api.Assertions.*;
-
-import org.apache.geode.test.junit.categories.UnitTest;
-import org.junit.Test;
-import org.junit.experimental.categories.Category;
-
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
-import java.io.DataInputStream;
-import java.io.DataOutput;
-import java.io.DataOutputStream;
-
-@Category(UnitTest.class)
-public class ExportedLogsSizeInfoTest {
-
-  @Test
-  public void testExportedLogsSizeInfoConstructor() {
-    ExportedLogsSizeInfo sizeDetail = new ExportedLogsSizeInfo(1L, 11L, 111L);
-    assertThat(sizeDetail).isNotNull();
-    assertThat(sizeDetail.getLogsSize()).isEqualTo(1L);
-    assertThat(sizeDetail.getDiskAvailable()).isEqualTo(11L);
-    assertThat(sizeDetail.getDiskSize()).isEqualTo(111L);
-  }
-
-  @Test
-  public void testExportedLogsSizeInfoZeroArgConstructor() {
-    ExportedLogsSizeInfo sizeDetail = new ExportedLogsSizeInfo();
-    assertThat(sizeDetail).isNotNull();
-    assertThat(sizeDetail.getLogsSize()).isEqualTo(0L);
-    assertThat(sizeDetail.getDiskAvailable()).isEqualTo(0L);
-    assertThat(sizeDetail.getDiskSize()).isEqualTo(0L);
-  }
-
-  @Test
-  public void equals_returnsTrueForTwoInstancesWithTheSameFieldValues() throws Exception {
-    ExportedLogsSizeInfo sizeDetail1 = new ExportedLogsSizeInfo(2L, 22L, 222L);
-    ExportedLogsSizeInfo sizeDetail2 = new ExportedLogsSizeInfo(2L, 22L, 222L);
-    assertThat(sizeDetail1.equals(sizeDetail1)).isTrue();
-    assertThat(sizeDetail1.equals(sizeDetail2)).isTrue();
-    assertThat(sizeDetail2.equals(sizeDetail1)).isTrue();
-  }
-
-  @Test
-  public void equals_returnsFalseWhenLogsSizeDiffers() throws Exception {
-    ExportedLogsSizeInfo sizeDetail1 = new ExportedLogsSizeInfo(3L, 33L, 333L);
-    ExportedLogsSizeInfo sizeDetail2 = new ExportedLogsSizeInfo(33L, 33L, 333L);
-    assertThat(sizeDetail1.equals(sizeDetail2)).isFalse();
-    assertThat(sizeDetail2.equals(sizeDetail1)).isFalse();
-  }
-
-  @Test
-  public void equals_returnsFalseWhenAvailableDiskDiffers() throws Exception {
-    ExportedLogsSizeInfo sizeDetail1 = new ExportedLogsSizeInfo(4L, 44L, 444L);
-    ExportedLogsSizeInfo sizeDetail2 = new ExportedLogsSizeInfo(4L, 4L, 444L);
-    assertThat(sizeDetail1.equals(sizeDetail2)).isFalse();
-    assertThat(sizeDetail2.equals(sizeDetail1)).isFalse();
-  }
-
-  @Test
-  public void equals_returnsFalseWheneDiskSizeDiffers() throws Exception {
-    ExportedLogsSizeInfo sizeDetail1 = new ExportedLogsSizeInfo(5L, 55L, 555L);
-    ExportedLogsSizeInfo sizeDetail2 = new ExportedLogsSizeInfo(5L, 55L, 55L);
-    assertThat(sizeDetail1.equals(sizeDetail2)).isFalse();
-    assertThat(sizeDetail2.equals(sizeDetail1)).isFalse();
-  }
-
-  @Test
-  public void equals_returnsFalseForComparisonWithNullObject() throws Exception {
-    ExportedLogsSizeInfo sizeDetail1 = new ExportedLogsSizeInfo(6L, 66L, 666L);
-    ExportedLogsSizeInfo sizeDetail2 = null;
-    assertThat(sizeDetail1.equals(sizeDetail2)).isFalse();
-  }
-
-  @Test
-  public void testClassInequality() {
-    ExportedLogsSizeInfo sizeDeatai1 = new ExportedLogsSizeInfo(7L, 77L, 777L);
-    String sizeDetail2 = sizeDeatai1.toString();
-    assertThat(sizeDeatai1.equals(sizeDetail2)).isFalse();
-    assertThat(sizeDetail2.equals(sizeDeatai1)).isFalse();
-  }
-
-  @Test
-  public void testHashCode() throws Exception {
-    ExportedLogsSizeInfo sizeDetail1 = new ExportedLogsSizeInfo();
-    ExportedLogsSizeInfo sizeDetail2 = new ExportedLogsSizeInfo(8L, 88L, 888L);
-    ExportedLogsSizeInfo sizeDetail3 = new ExportedLogsSizeInfo(88L, 8L, 888L);
-
-    assertThat(sizeDetail1.hashCode()).isNotEqualTo(sizeDetail2.hashCode());
-    assertThat(sizeDetail1.hashCode()).isNotEqualTo(sizeDetail3.hashCode());
-    assertThat(sizeDetail2.hashCode()).isNotEqualTo(sizeDetail3.hashCode());
-
-    assertThat(sizeDetail1.hashCode()).isEqualTo(29791);
-    assertThat(sizeDetail2.hashCode()).isEqualTo(41095);
-    assertThat(sizeDetail3.hashCode()).isEqualTo(115495);
-  }
-
-  @Test
-  public void deserialization_setsFieldsToOriginalUnserializedValues() throws Exception {
-    ExportedLogsSizeInfo sizeDetail = new ExportedLogsSizeInfo(9L, 99L, 999L);
-    ByteArrayOutputStream baos = new ByteArrayOutputStream();
-    DataOutput out = new DataOutputStream(baos);
-    sizeDetail.toData(out);
-    ExportedLogsSizeInfo sizeDetailIn = new ExportedLogsSizeInfo();
-    sizeDetailIn.fromData(new DataInputStream(new ByteArrayInputStream(baos.toByteArray())));
-
-    assertThat(sizeDetailIn).isEqualTo(sizeDetail);
-  }
-
-  @Test
-  public void testToString() throws Exception {
-    ExportedLogsSizeInfo sizeDetail = new ExportedLogsSizeInfo(10L, 100L, 1000L);
-    assertThat(sizeDetail.toString())
-        .isEqualTo("[logsSize: 10, diskAvailable: 100, diskSize: 1000]");
-
-  }
-
-}

http://git-wip-us.apache.org/repos/asf/geode/blob/c5962aa9/geode-core/src/test/java/org/apache/geode/management/internal/cli/functions/SizeExportLogsFunctionCacheTest.java
----------------------------------------------------------------------
diff --git a/geode-core/src/test/java/org/apache/geode/management/internal/cli/functions/SizeExportLogsFunctionCacheTest.java b/geode-core/src/test/java/org/apache/geode/management/internal/cli/functions/SizeExportLogsFunctionCacheTest.java
deleted file mode 100644
index 0e8348d..0000000
--- a/geode-core/src/test/java/org/apache/geode/management/internal/cli/functions/SizeExportLogsFunctionCacheTest.java
+++ /dev/null
@@ -1,174 +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.geode.management.internal.cli.functions;
-
-import static org.assertj.core.api.Assertions.*;
-import static org.apache.geode.distributed.ConfigurationProperties.*;
-
-import org.apache.commons.io.FileUtils;
-import org.apache.geode.cache.Cache;
-import org.apache.geode.cache.execute.FunctionContext;
-import org.apache.geode.cache.execute.ResultSender;
-import org.apache.geode.distributed.DistributedMember;
-import org.apache.geode.internal.cache.execute.FunctionContextImpl;
-import org.apache.geode.test.dunit.rules.ServerStarterRule;
-import org.apache.geode.test.junit.categories.IntegrationTest;
-import org.junit.Before;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.experimental.categories.Category;
-import org.junit.rules.TemporaryFolder;
-import org.junit.rules.TestName;
-
-import java.io.File;
-import java.util.Collections;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Properties;
-
-@Category(IntegrationTest.class)
-public class SizeExportLogsFunctionCacheTest {
-
-  private Cache cache;
-
-  private SizeExportLogsFunction.Args nonFilteringArgs;
-  private TestResultSender resultSender;
-  private FunctionContext functionContext;
-  private File dir;
-  private DistributedMember member;
-  private File logFile;
-  private File statFile;
-  private String name;
-
-  @Rule
-  public TemporaryFolder temporaryFolder = new TemporaryFolder();
-
-  @Rule
-  public TestName testName = new TestName();
-
-  @Rule
-  public ServerStarterRule server = new ServerStarterRule();
-
-  @Before
-  public void before() throws Throwable {
-    name = testName.getMethodName();
-
-    this.dir = this.temporaryFolder.getRoot();
-    logFile = new File(dir, name + ".log");
-    statFile = new File(dir, name + ".gfs");
-
-    this.nonFilteringArgs = new ExportLogsFunction.Args(null, null, null, false, false, false);
-    functionContext = new FunctionContextImpl("functionId", nonFilteringArgs, resultSender);
-
-  }
-
-  @Test
-  public void withFiles_returnsCombinedSizeResult() throws Throwable {
-    Properties config = new Properties();
-    config.setProperty(NAME, name);
-    config.setProperty(LOG_FILE, logFile.getAbsolutePath());
-    config.setProperty(STATISTIC_ARCHIVE_FILE, statFile.getAbsolutePath());
-
-    server.withProperties(config).startServer();
-    TestResultSender resultSender = new TestResultSender();
-    FunctionContext context = new FunctionContextImpl("functionId", nonFilteringArgs, resultSender);
-
-    // log and stat files sizes are not constant with a real cache running, so check for the sizer
-    // estimate within a range
-    long initalFileSizes = FileUtils.sizeOf(logFile) + FileUtils.sizeOf(statFile);
-    new SizeExportLogsFunction().execute(context);
-    long finalFileSizes = FileUtils.sizeOf(logFile) + FileUtils.sizeOf(statFile);
-    getAndVerifySizeEstimate(resultSender, initalFileSizes, finalFileSizes);
-  }
-
-  @Test
-  public void noFiles_returnsZeroResult() throws Throwable {
-    Properties config = new Properties();
-    config.setProperty(NAME, name);
-    config.setProperty(LOG_FILE, "");
-    config.setProperty(STATISTIC_ARCHIVE_FILE, "");
-
-    server.withProperties(config).startServer();
-
-    TestResultSender resultSender = new TestResultSender();
-    FunctionContext context = new FunctionContextImpl("functionId", nonFilteringArgs, resultSender);
-
-    new SizeExportLogsFunction().execute(context);
-    getAndVerifySizeEstimate(resultSender, 0L);
-  }
-
-  private void getAndVerifySizeEstimate(TestResultSender resultSender, long expectedSize)
-      throws Throwable {
-    getAndVerifySizeEstimate(resultSender, expectedSize, expectedSize);
-  }
-
-  private void getAndVerifySizeEstimate(TestResultSender resultSender, long minExpected,
-      long maxExpected) throws Throwable {
-    List<?> results = resultSender.getResults();
-
-    assertThat(results).isNotNull();
-    assertThat(results.size()).isEqualTo(1);
-    List<?> result = (List<?>) results.get(0);
-    assertThat(result).isNotNull();
-    if (minExpected == maxExpected) {
-      assertThat(((ExportedLogsSizeInfo) result.get(0)).getLogsSize()).isEqualTo(minExpected);
-    }
-    assertThat(((ExportedLogsSizeInfo) result.get(0)).getLogsSize())
-        .isGreaterThanOrEqualTo(minExpected).isLessThanOrEqualTo(maxExpected);
-  }
-
-  @Test
-  public void withFunctionError_shouldThrow() throws Throwable {
-    Properties config = new Properties();
-    config.setProperty(NAME, name);
-
-    server.withProperties(config).startServer();
-
-    TestResultSender resultSender = new TestResultSender();
-    FunctionContext context = new FunctionContextImpl("functionId", null, resultSender);
-
-    new SizeExportLogsFunction().execute(context);
-    assertThatThrownBy(resultSender::getResults).isInstanceOf(NullPointerException.class);
-  }
-
-  private static class TestResultSender implements ResultSender {
-
-    private final List<Object> results = new LinkedList<>();
-
-    private Throwable t;
-
-    protected List<Object> getResults() throws Throwable {
-      if (t != null) {
-        throw t;
-      }
-      return Collections.unmodifiableList(results);
-    }
-
-    @Override
-    public void lastResult(final Object lastResult) {
-      results.add(lastResult);
-    }
-
-    @Override
-    public void sendResult(final Object oneResult) {
-      results.add(oneResult);
-    }
-
-    @Override
-    public void sendException(final Throwable t) {
-      this.t = t;
-    }
-  }
-}

http://git-wip-us.apache.org/repos/asf/geode/blob/c5962aa9/geode-core/src/test/java/org/apache/geode/management/internal/cli/functions/SizeExportLogsFunctionTest.java
----------------------------------------------------------------------
diff --git a/geode-core/src/test/java/org/apache/geode/management/internal/cli/functions/SizeExportLogsFunctionTest.java b/geode-core/src/test/java/org/apache/geode/management/internal/cli/functions/SizeExportLogsFunctionTest.java
new file mode 100644
index 0000000..cc5e7d5
--- /dev/null
+++ b/geode-core/src/test/java/org/apache/geode/management/internal/cli/functions/SizeExportLogsFunctionTest.java
@@ -0,0 +1,178 @@
+/*
+ * 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.geode.management.internal.cli.functions;
+
+import static org.assertj.core.api.Assertions.*;
+import static org.apache.geode.distributed.ConfigurationProperties.*;
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.spy;
+
+import org.apache.commons.io.FileUtils;
+import org.apache.geode.cache.execute.FunctionContext;
+import org.apache.geode.cache.execute.ResultSender;
+import org.apache.geode.distributed.internal.DistributionConfig;
+import org.apache.geode.internal.cache.execute.FunctionContextImpl;
+import org.apache.geode.management.ManagementException;
+import org.apache.geode.test.dunit.rules.ServerStarterRule;
+import org.apache.geode.test.junit.categories.IntegrationTest;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.experimental.categories.Category;
+import org.junit.rules.TemporaryFolder;
+import org.junit.rules.TestName;
+import org.mockito.Matchers;
+
+import java.io.File;
+import java.util.Collections;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Properties;
+
+@Category(IntegrationTest.class)
+public class SizeExportLogsFunctionTest {
+
+
+  private SizeExportLogsFunction.Args nonFilteringArgs;
+  private File logFile;
+  private File statFile;
+  private Properties config;
+  private TestResultSender resultSender;
+
+  @Rule
+  public TemporaryFolder temporaryFolder = new TemporaryFolder();
+
+  @Rule
+  public TestName testName = new TestName();
+
+  @Rule
+  public ServerStarterRule server = new ServerStarterRule();
+
+  @Before
+  public void before() throws Throwable {
+    String name = testName.getMethodName();
+    config = new Properties();
+    config.setProperty(NAME, name);
+
+    File dir = this.temporaryFolder.getRoot();
+    logFile = new File(dir, name + ".log");
+    statFile = new File(dir, name + ".gfs");
+
+    resultSender = new TestResultSender();
+    this.nonFilteringArgs = new SizeExportLogsFunction.Args(null, null, null, false, false, false);
+
+  }
+
+  @Test
+  public void withFiles_returnsCombinedSizeResult() throws Throwable {
+    config.setProperty(LOG_FILE, logFile.getAbsolutePath());
+    config.setProperty(STATISTIC_ARCHIVE_FILE, statFile.getAbsolutePath());
+
+    server.withProperties(config).startServer();
+    FunctionContext context = new FunctionContextImpl("functionId", nonFilteringArgs, resultSender);
+
+    // log and stat files sizes are not constant with a real cache running, so check for the sizer
+    // estimate within a range
+    long initialFileSizes = FileUtils.sizeOf(logFile) + FileUtils.sizeOf(statFile);
+    new SizeExportLogsFunction().execute(context);
+    long finalFileSizes = FileUtils.sizeOf(logFile) + FileUtils.sizeOf(statFile);
+    getAndVerifySizeEstimate(resultSender, initialFileSizes, finalFileSizes);
+  }
+
+  @Test
+  public void noFiles_returnsZeroResult() throws Throwable {
+    config.setProperty(LOG_FILE, "");
+    config.setProperty(STATISTIC_ARCHIVE_FILE, "");
+
+    server.withProperties(config).startServer();
+
+    FunctionContext context = new FunctionContextImpl("functionId", nonFilteringArgs, resultSender);
+    new SizeExportLogsFunction().execute(context);
+    getAndVerifySizeEstimate(resultSender, 0L);
+  }
+
+  @Test
+  public void withFunctionError_shouldThrow() throws Throwable {
+    server.withProperties(config).startServer();
+
+    FunctionContext context = new FunctionContextImpl("functionId", null, resultSender);
+    new SizeExportLogsFunction().execute(context);
+    assertThatThrownBy(resultSender::getResults).isInstanceOf(NullPointerException.class);
+  }
+
+  @Test
+  public void sizeGreaterThanDiskAvailable_sendsErrorResult() throws Throwable {
+    server.withProperties(config).startServer();
+
+    FunctionContext context = new FunctionContextImpl("functionId", nonFilteringArgs, resultSender);
+    SizeExportLogsFunction testFunction = new SizeExportLogsFunction();
+    SizeExportLogsFunction spyFunction = spy(testFunction);
+    long fakeDiskAvailable = 1024;
+    doReturn(fakeDiskAvailable).when(spyFunction)
+        .getDiskAvailable(Matchers.any(DistributionConfig.class));
+
+    spyFunction.execute(context);
+    assertThatThrownBy(resultSender::getResults).isInstanceOf(ManagementException.class);
+  }
+
+  private void getAndVerifySizeEstimate(TestResultSender resultSender, long expectedSize)
+      throws Throwable {
+    getAndVerifySizeEstimate(resultSender, expectedSize, expectedSize);
+  }
+
+  private void getAndVerifySizeEstimate(TestResultSender resultSender, long minExpected,
+      long maxExpected) throws Throwable {
+    List<?> results = resultSender.getResults();
+
+    assertThat(results).isNotNull();
+    assertThat(results.size()).isEqualTo(1);
+    List<?> result = (List<?>) results.get(0);
+    assertThat(result).isNotNull();
+    if (minExpected == maxExpected) {
+      assertThat(((Long) result.get(0))).isEqualTo(minExpected);
+    }
+    assertThat(((Long) result.get(0))).isGreaterThanOrEqualTo(minExpected)
+        .isLessThanOrEqualTo(maxExpected);
+  }
+
+  private static class TestResultSender implements ResultSender {
+
+    private final List<Object> results = new LinkedList<>();
+
+    private Throwable t;
+
+    List<Object> getResults() throws Throwable {
+      if (t != null) {
+        throw t;
+      }
+      return Collections.unmodifiableList(results);
+    }
+
+    @Override
+    public void lastResult(final Object lastResult) {
+      results.add(lastResult);
+    }
+
+    @Override
+    public void sendResult(final Object oneResult) {
+      results.add(oneResult);
+    }
+
+    @Override
+    public void sendException(final Throwable t) {
+      this.t = t;
+    }
+  }
+}

http://git-wip-us.apache.org/repos/asf/geode/blob/c5962aa9/geode-core/src/test/java/org/apache/geode/management/internal/cli/functions/SizeExportLogsTestSuite.java
----------------------------------------------------------------------
diff --git a/geode-core/src/test/java/org/apache/geode/management/internal/cli/functions/SizeExportLogsTestSuite.java b/geode-core/src/test/java/org/apache/geode/management/internal/cli/functions/SizeExportLogsTestSuite.java
deleted file mode 100644
index e70a750..0000000
--- a/geode-core/src/test/java/org/apache/geode/management/internal/cli/functions/SizeExportLogsTestSuite.java
+++ /dev/null
@@ -1,29 +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.geode.management.internal.cli.functions;
-
-import org.apache.geode.management.internal.cli.util.LogSizerTest;
-import org.junit.runner.RunWith;
-import org.junit.runners.Suite;
-
-/**
- * JUnit, DUnit and Integration tests for SizeExportLogsFunction.
- */
-@Suite.SuiteClasses({SizeExportLogsFunctionCacheTest.class, SizeExportLogsFunctionFileTest.class,
-    LogSizerTest.class, ExportedLogsSizeInfoTest.class})
-@RunWith(Suite.class)
-public class SizeExportLogsTestSuite {
-
-}

http://git-wip-us.apache.org/repos/asf/geode/blob/c5962aa9/geode-core/src/test/java/org/apache/geode/management/internal/cli/util/LogExporterTest.java
----------------------------------------------------------------------
diff --git a/geode-core/src/test/java/org/apache/geode/management/internal/cli/util/LogExporterTest.java b/geode-core/src/test/java/org/apache/geode/management/internal/cli/util/LogExporterTest.java
index a387af3..83f0b44 100644
--- a/geode-core/src/test/java/org/apache/geode/management/internal/cli/util/LogExporterTest.java
+++ b/geode-core/src/test/java/org/apache/geode/management/internal/cli/util/LogExporterTest.java
@@ -50,7 +50,7 @@ public class LogExporterTest {
   public TemporaryFolder temporaryFolder = new TemporaryFolder();
 
   private LogExporter logExporter;
-  LogFilter logFilter;
+  private LogFilter logFilter;
   private File workingDir;
 
   @Before
@@ -71,7 +71,7 @@ public class LogExporterTest {
   }
 
   @Test
-  public void exporterShouldStillReturnFilefNoAcceptableLogs() throws Exception {
+  public void exporterShouldStillReturnFileIfNoAcceptableLogs() throws Exception {
     File logFile1 = new File(workingDir, "server1.log");
     FileUtils.writeStringToFile(logFile1, "some log for server1 \n some other log line");
     when(logFilter.acceptsLine(any())).thenReturn(LogFilter.LineFilterResult.LINE_REJECTED);
@@ -138,7 +138,7 @@ public class LogExporterTest {
     assertThat(logExporter.findStatFiles(workingDir.toPath())).doesNotContain(notALogFile.toPath());
   }
 
-  public static Set<String> getZipEntries(String zipFilePath) throws IOException {
+  static Set<String> getZipEntries(String zipFilePath) throws IOException {
     return new ZipFile(zipFilePath).stream().map(ZipEntry::getName).collect(Collectors.toSet());
   }
 

http://git-wip-us.apache.org/repos/asf/geode/blob/c5962aa9/geode-core/src/test/java/org/apache/geode/management/internal/cli/util/LogSizerTest.java
----------------------------------------------------------------------
diff --git a/geode-core/src/test/java/org/apache/geode/management/internal/cli/util/LogSizerTest.java b/geode-core/src/test/java/org/apache/geode/management/internal/cli/util/LogSizerTest.java
index c7b3ab9..f0b7f96 100644
--- a/geode-core/src/test/java/org/apache/geode/management/internal/cli/util/LogSizerTest.java
+++ b/geode-core/src/test/java/org/apache/geode/management/internal/cli/util/LogSizerTest.java
@@ -32,7 +32,6 @@ import org.junit.rules.TestName;
 
 import java.io.File;
 import java.io.IOException;
-import java.nio.file.Path;
 import java.text.ParseException;
 
 @Category(UnitTest.class)
@@ -40,8 +39,6 @@ public class LogSizerTest {
   private LogFilter logFilter;
   private SizeExportLogsFunction.Args nonFilteringArgs;
 
-  private File dir;
-
   @Rule
   public TemporaryFolder temporaryFolder = new TemporaryFolder();
   @Rule
@@ -50,9 +47,7 @@ public class LogSizerTest {
   @Before
   public void setUp() throws Exception {
     logFilter = mock(LogFilter.class);
-    dir = temporaryFolder.getRoot();
     nonFilteringArgs = new ExportLogsFunction.Args(null, null, null, false, false, false);
-
   }
 
   @After
@@ -62,8 +57,8 @@ public class LogSizerTest {
 
   @Test
   public void nullFileArgs_returnsZeroSize() throws ParseException, IOException {
-    LogSizer sizer = new LogSizer(logFilter, null, null);
-    assertThat(sizer.getFilteredSize()).isEqualTo(0L);
+    LogExporter sizer = new LogExporter(logFilter, null, null);
+    assertThat(sizer.estimateFilteredSize()).isEqualTo(0L);
   }
 
   @Test
@@ -75,8 +70,8 @@ public class LogSizerTest {
         new File("root" + separator + "parent" + separator + testName + ".log").toPath());
     when(mockStatFile.toPath()).thenReturn(
         new File("root" + separator + "parent" + separator + testName + ".gfs").toPath());
-    LogSizer sizer = new LogSizer(logFilter, mockLogFile, mockStatFile);
-    assertThat(sizer.getFilteredSize()).isEqualTo(0L);
+    LogExporter sizer = new LogExporter(logFilter, mockLogFile, mockStatFile);
+    assertThat(sizer.estimateFilteredSize()).isEqualTo(0L);
   }
 
   @Test
@@ -92,8 +87,8 @@ public class LogSizerTest {
         new LogFilter(nonFilteringArgs.getLogLevel(), nonFilteringArgs.isThisLogLevelOnly(),
             nonFilteringArgs.getStartTime(), nonFilteringArgs.getEndTime());
 
-    LogSizer sizer = new LogSizer(logFilter, mockLogFile, mockStatFile);
-    assertThat(sizer.getFilteredSize()).isEqualTo(0L);
+    LogExporter sizer = new LogExporter(logFilter, mockLogFile, mockStatFile);
+    assertThat(sizer.estimateFilteredSize()).isEqualTo(0L);
   }
 
 }