You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@geode.apache.org by je...@apache.org on 2015/12/08 18:24:01 UTC

[3/9] incubator-geode git commit: GEODE-563: Moving gfsh tests from closed

http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/eddef322/gemfire-core/src/test/java/com/gemstone/gemfire/management/internal/cli/commands/ListIndexCommandDUnitTest.java
----------------------------------------------------------------------
diff --git a/gemfire-core/src/test/java/com/gemstone/gemfire/management/internal/cli/commands/ListIndexCommandDUnitTest.java b/gemfire-core/src/test/java/com/gemstone/gemfire/management/internal/cli/commands/ListIndexCommandDUnitTest.java
new file mode 100644
index 0000000..22a38d2
--- /dev/null
+++ b/gemfire-core/src/test/java/com/gemstone/gemfire/management/internal/cli/commands/ListIndexCommandDUnitTest.java
@@ -0,0 +1,672 @@
+/*
+ * 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 com.gemstone.gemfire.management.internal.cli.commands;
+
+import com.gemstone.gemfire.cache.Cache;
+import com.gemstone.gemfire.cache.DataPolicy;
+import com.gemstone.gemfire.cache.Region;
+import com.gemstone.gemfire.cache.RegionFactory;
+import com.gemstone.gemfire.cache.Scope;
+import com.gemstone.gemfire.cache.query.Index;
+import com.gemstone.gemfire.cache.query.IndexStatistics;
+import com.gemstone.gemfire.cache.query.IndexType;
+import com.gemstone.gemfire.cache.query.SelectResults;
+import com.gemstone.gemfire.distributed.internal.DistributionConfig;
+import com.gemstone.gemfire.internal.lang.MutableIdentifiable;
+import com.gemstone.gemfire.internal.lang.ObjectUtils;
+import com.gemstone.gemfire.internal.lang.StringUtils;
+import com.gemstone.gemfire.management.cli.Result;
+import com.gemstone.gemfire.management.internal.cli.domain.IndexDetails;
+import com.gemstone.gemfire.management.internal.cli.i18n.CliStrings;
+import dunit.Host;
+import dunit.SerializableRunnable;
+import dunit.VM;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Properties;
+import java.util.Random;
+import java.util.Set;
+import java.util.concurrent.atomic.AtomicLong;
+
+/**
+ * The ListIndexCommandDUnitTest class is distributed test suite of test cases for testing the index-based GemFire shell
+ * (Gfsh) commands. </p>
+ *
+ * @author John Blum
+ * @see com.gemstone.gemfire.management.internal.cli.commands.CliCommandTestBase
+ * @see com.gemstone.gemfire.management.internal.cli.commands.IndexCommands
+ * @since 7.0
+ */
+@SuppressWarnings("unused")
+public class ListIndexCommandDUnitTest extends CliCommandTestBase {
+
+  protected static final int DEFAULT_REGION_INITIAL_CAPACITY = 10000;
+
+  private final AtomicLong idGenerator = new AtomicLong(0l);
+
+  protected static String toString(final Result result) {
+    assert result != null : "The Result object from the command execution cannot be null!";
+
+    final StringBuilder buffer = new StringBuilder(System.getProperty("line.separator"));
+
+    while (result.hasNextLine()) {
+      buffer.append(result.nextLine());
+      buffer.append(System.getProperty("line.separator"));
+    }
+
+    return buffer.toString();
+  }
+
+
+  public ListIndexCommandDUnitTest(final String testName) {
+    super(testName);
+  }
+
+  @Override
+  public void setUp() throws Exception {
+    super.setUp();
+    createDefaultSetup(null);
+    setupGemFire();
+  }
+
+  @Override
+  public void tearDown2() throws Exception {
+    super.tearDown2();
+  }
+
+  protected Index createIndex(final String name, final String indexedExpression, final String fromClause) {
+    return createIndex(name, IndexType.FUNCTIONAL, indexedExpression, fromClause);
+  }
+
+  protected Index createIndex(final String name, final IndexType type, final String indexedExpression,
+      final String fromClause) {
+    return new IndexAdapter(name, type, indexedExpression, fromClause);
+  }
+
+  protected Peer createPeer(final VM vm, final Properties distributedSystemProperties,
+      final RegionDefinition... regions) {
+    final Peer peer = new Peer(vm, distributedSystemProperties);
+    peer.add(regions);
+    return peer;
+  }
+
+  protected RegionDefinition createRegionDefinition(final String regionName, final Class<?> keyConstraint,
+      final Class<?> valueConstraint, final Index... indexes) {
+    final RegionDefinition regionDefinition = new RegionDefinition(regionName, keyConstraint, valueConstraint);
+    regionDefinition.add(indexes);
+    return regionDefinition;
+  }
+
+  protected void setupGemFire() throws Exception {
+    final Host host = Host.getHost(0);
+
+    final VM vm1 = host.getVM(1);
+    final VM vm2 = host.getVM(2);
+
+    final Peer peer1 = createPeer(vm1, createDistributedSystemProperties("consumerServer"),
+        createRegionDefinition("consumers", Long.class, Consumer.class,
+            createIndex("cidIdx", IndexType.PRIMARY_KEY, "id", "/consumers"),
+            createIndex("cnameIdx", "name", "/consumers")));
+
+    final Peer peer2 = createPeer(vm2, createDistributedSystemProperties("producerServer"),
+        createRegionDefinition("producers", Long.class, Producer.class, createIndex("pidIdx", "id", "/producers")));
+
+    createRegionWithIndexes(peer1);
+    createRegionWithIndexes(peer2);
+
+    loadConsumerData(peer1, 10000);
+    loadProducerData(peer2, 10000);
+  }
+
+  protected Properties createDistributedSystemProperties(final String gemfireName) {
+    final Properties distributedSystemProperties = new Properties();
+
+    distributedSystemProperties.setProperty(DistributionConfig.LOG_LEVEL_NAME, getDUnitLogLevel());
+    distributedSystemProperties.setProperty(DistributionConfig.NAME_NAME, gemfireName);
+
+    return distributedSystemProperties;
+  }
+
+  protected void createRegionWithIndexes(final Peer peer) {
+    peer.run(new SerializableRunnable(
+        String.format("Creating Regions with Indexes on GemFire peer (%1$s).", peer.getName())) {
+      public void run() {
+        // create the GemFire distributed system with custom configuration properties...
+        getSystem(peer.getConfiguration());
+
+        final Cache cache = getCache();
+        final RegionFactory regionFactory = cache.createRegionFactory();
+
+        for (RegionDefinition regionDefinition : peer) {
+          regionFactory.setDataPolicy(DataPolicy.REPLICATE);
+          regionFactory.setIndexMaintenanceSynchronous(true);
+          regionFactory.setInitialCapacity(DEFAULT_REGION_INITIAL_CAPACITY);
+          regionFactory.setKeyConstraint(regionDefinition.getKeyConstraint());
+          regionFactory.setScope(Scope.DISTRIBUTED_NO_ACK);
+          regionFactory.setStatisticsEnabled(true);
+          regionFactory.setValueConstraint(regionDefinition.getValueConstraint());
+
+          final Region region = regionFactory.create(regionDefinition.getRegionName());
+          String indexName = null;
+
+          try {
+            for (Index index : regionDefinition) {
+              indexName = index.getName();
+              if (IndexType.PRIMARY_KEY.equals(index.getType())) {
+                cache.getQueryService().createKeyIndex(indexName, index.getIndexedExpression(), region.getFullPath());
+              } else {
+                cache.getQueryService().createIndex(indexName, index.getIndexedExpression(), region.getFullPath());
+              }
+            }
+          } catch (Exception e) {
+            getLogWriter().error(
+                String.format("Error occurred creating Index (%1$s) on Region (%2$s) - (%3$s)", indexName,
+                    region.getFullPath(), e.getMessage()));
+          }
+        }
+      }
+    });
+  }
+
+  protected void loadConsumerData(final Peer peer, final int operationsTotal) {
+    peer.run(new SerializableRunnable("Load /consumers Region with data") {
+      public void run() {
+        final Cache cache = getCache();
+        final Region<Long, Consumer> consumerRegion = cache.getRegion("/consumers");
+
+        final Random random = new Random(System.currentTimeMillis());
+        int count = 0;
+
+        final List<Proxy> proxies = new ArrayList<Proxy>();
+
+        Consumer consumer;
+        Proxy proxy;
+
+        while (count++ < operationsTotal) {
+          switch (CrudOperation.values()[random.nextInt(CrudOperation.values().length)]) {
+            case RETRIEVE:
+              if (!proxies.isEmpty()) {
+                proxy = proxies.get(random.nextInt(proxies.size()));
+                consumer = query(consumerRegion, "id = " + proxy.getId() + "l"); // works
+                //consumer = query(consumerRegion, "Id = " + proxy.getId()); // works
+                //consumer = query(consumerRegion, "id = " + proxy.getId()); // does not work
+                proxy.setUnitsSnapshot(consumer.getUnits());
+                break;
+              }
+            case UPDATE:
+              if (!proxies.isEmpty()) {
+                proxy = proxies.get(random.nextInt(proxies.size()));
+                consumer = query(consumerRegion, "Name = " + proxy.getName());
+                consumer.consume();
+                break;
+              }
+            case CREATE:
+            default:
+              consumer = new Consumer(idGenerator.incrementAndGet());
+              proxies.add(new Proxy(consumer));
+              consumerRegion.put(consumer.getId(), consumer);
+              assertTrue(consumerRegion.containsKey(consumer.getId()));
+              assertTrue(consumerRegion.containsValueForKey(consumer.getId()));
+              assertSame(consumer, consumerRegion.get(consumer.getId()));
+          }
+        }
+      }
+    });
+  }
+
+  protected void loadProducerData(final Peer peer, final int operationsTotal) {
+    peer.run(new SerializableRunnable("Load /producers Region with data") {
+      public void run() {
+        final Cache cache = getCache();
+        final Region<Long, Producer> producerRegion = cache.getRegion("/producers");
+
+        final Random random = new Random(System.currentTimeMillis());
+        int count = 0;
+
+        final List<Proxy> proxies = new ArrayList<Proxy>();
+
+        Producer producer;
+        Proxy proxy;
+
+        while (count++ < operationsTotal) {
+          switch (CrudOperation.values()[random.nextInt(CrudOperation.values().length)]) {
+            case RETRIEVE:
+              if (!proxies.isEmpty()) {
+                proxy = proxies.get(random.nextInt(proxies.size()));
+                producer = query(producerRegion, "Id = " + proxy.getId());
+                proxy.setUnitsSnapshot(producer.getUnits());
+                break;
+              }
+            case UPDATE:
+              if (!proxies.isEmpty()) {
+                proxy = proxies.get(random.nextInt(proxies.size()));
+                producer = query(producerRegion, "Id = " + proxy.getId());
+                producer.produce();
+                break;
+              }
+            case CREATE:
+            default:
+              producer = new Producer(idGenerator.incrementAndGet());
+              proxies.add(new Proxy(producer));
+              producerRegion.put(producer.getId(), producer);
+              assertTrue(producerRegion.containsKey(producer.getId()));
+              assertTrue(producerRegion.containsValueForKey(producer.getId()));
+              assertSame(producer, producerRegion.get(producer.getId()));
+          }
+        }
+      }
+    });
+  }
+
+  @SuppressWarnings("unchecked")
+  protected <T extends Comparable<T>, B extends AbstractBean<T>> B query(final Cache cache, final String queryString) {
+    try {
+      getLogWriter().info(String.format("Running Query (%1$s) in GemFire...", queryString));
+
+      final SelectResults<B> results = (SelectResults<B>) cache.getQueryService().newQuery(queryString).execute();
+
+      getLogWriter().info(
+          String.format("Running Query (%1$s) in GemFire returned (%2$d) result(s).", queryString, results.size()));
+
+      return (results.iterator().hasNext() ? results.iterator().next() : null);
+    } catch (Exception e) {
+      throw new RuntimeException(String.format("An error occurred running Query (%1$s)!", queryString), e);
+    }
+  }
+
+  protected <T extends Comparable<T>, B extends AbstractBean<T>> B query(final Region<T, B> region,
+      final String queryPredicate) {
+    try {
+      getLogWriter().info(
+          String.format("Running Query (%1$s) on Region (%2$s)...", queryPredicate, region.getFullPath()));
+
+      final SelectResults<B> results = region.query(queryPredicate);
+
+      getLogWriter().info(
+          String.format("Running Query (%1$s) on Region (%2$s) returned (%3$d) result(s).", queryPredicate,
+              region.getFullPath(), results.size()));
+
+      return (results.iterator().hasNext() ? results.iterator().next() : null);
+    } catch (Exception e) {
+      throw new RuntimeException(
+          String.format("An error occurred running Query (%1$s) on Region (%2$s)!", queryPredicate,
+              region.getFullPath()), e);
+    }
+  }
+
+  public void testListIndex() throws Exception {
+    final Result result = executeCommand(CliStrings.LIST_INDEX + " --" + CliStrings.LIST_INDEX__STATS);
+
+    assertNotNull(result);
+    getLogWriter().info(toString(result));
+    assertEquals(Result.Status.OK, result.getStatus());
+  }
+
+  protected static class Peer implements Iterable<RegionDefinition>, Serializable {
+
+    private final Properties distributedSystemProperties;
+
+    private final Set<RegionDefinition> regions = new HashSet<RegionDefinition>();
+
+    private final VM vm;
+
+    public Peer(final VM vm, final Properties distributedSystemProperties) {
+      assert distributedSystemProperties != null : "The GemFire Distributed System configuration properties cannot be null!";
+      this.distributedSystemProperties = distributedSystemProperties;
+      this.vm = vm;
+    }
+
+    public Properties getConfiguration() {
+      return this.distributedSystemProperties;
+    }
+
+    public String getName() {
+      return getConfiguration().getProperty(DistributionConfig.NAME_NAME);
+    }
+
+    public VM getVm() {
+      return vm;
+    }
+
+    public boolean add(final RegionDefinition... regionDefinitions) {
+      return (regionDefinitions != null && regions.addAll(Arrays.asList(regionDefinitions)));
+    }
+
+    public Iterator<RegionDefinition> iterator() {
+      return Collections.unmodifiableSet(regions).iterator();
+    }
+
+    public boolean remove(final RegionDefinition... regionDefinitions) {
+      return (regionDefinitions != null && regions.removeAll(Arrays.asList(regionDefinitions)));
+    }
+
+    public void run(final Runnable runnable) {
+      if (getVm() == null) {
+        runnable.run();
+      } else {
+        getVm().invoke(runnable);
+      }
+    }
+
+    @Override
+    public String toString() {
+      final StringBuilder buffer = new StringBuilder(getClass().getSimpleName());
+      buffer.append(" {configuration = ").append(getConfiguration());
+      buffer.append(", name = ").append(getName());
+      buffer.append(", pid = ").append(getVm().getPid());
+      buffer.append("}");
+      return buffer.toString();
+    }
+  }
+
+  protected static class IndexAdapter implements Index, Serializable {
+
+    private final IndexDetails.IndexType type;
+
+    private final String fromClause;
+    private final String indexedExpression;
+    private final String name;
+
+    protected IndexAdapter(final String name, final String indexedExpression, final String fromClause) {
+      this(name, IndexType.FUNCTIONAL, indexedExpression, fromClause);
+    }
+
+    protected IndexAdapter(final String name, final IndexType type, final String indexedExpression,
+        final String fromClause) {
+      assert name != null : "The name of the Index cannot be null!";
+      assert indexedExpression != null : String.format("The expression to index for Index (%1$s) cannot be null!",
+          name);
+      assert fromClause != null : String.format("The from clause for Index (%1$s) cannot be null!", name);
+
+      this.type = ObjectUtils.defaultIfNull(IndexDetails.IndexType.valueOf(type), IndexDetails.IndexType.FUNCTIONAL);
+      this.name = name;
+      this.indexedExpression = indexedExpression;
+      this.fromClause = fromClause;
+    }
+
+    public String getName() {
+      return this.name;
+    }
+
+    public String getFromClause() {
+      return this.fromClause;
+    }
+
+    public String getCanonicalizedFromClause() {
+      return this.fromClause;
+    }
+
+    public String getIndexedExpression() {
+      return this.indexedExpression;
+    }
+
+    public String getCanonicalizedIndexedExpression() {
+      return this.indexedExpression;
+    }
+
+    public String getProjectionAttributes() {
+      throw new UnsupportedOperationException("Not Implemented!");
+    }
+
+    public String getCanonicalizedProjectionAttributes() {
+      throw new UnsupportedOperationException("Not Implemented!");
+    }
+
+    public Region<?, ?> getRegion() {
+      throw new UnsupportedOperationException("Not Implemented!");
+    }
+
+    public IndexStatistics getStatistics() {
+      throw new UnsupportedOperationException("Not Implemented!");
+    }
+
+    public IndexType getType() {
+      return type.getType();
+    }
+
+    @Override
+    public String toString() {
+      final StringBuilder buffer = new StringBuilder(getClass().getSimpleName());
+      buffer.append(" {indexName = ").append(getName());
+      buffer.append(", indexType = ").append(getType());
+      buffer.append(", indexedExpression = ").append(getIndexedExpression());
+      buffer.append(", fromClause = ").append(getFromClause());
+      buffer.append("}");
+      return buffer.toString();
+    }
+  }
+
+  protected static class RegionDefinition implements Iterable<Index>, Serializable {
+
+    private final Class<?> keyConstraint;
+    private final Class<?> valueConstraint;
+
+    private final Set<Index> indexes = new HashSet<Index>();
+
+    private final String regionName;
+
+    @SuppressWarnings("unchecked")
+    protected RegionDefinition(final String regionName, final Class<?> keyConstraint, final Class<?> valueConstraint) {
+      assert !StringUtils.isBlank(regionName) : "The name of the Region must be specified!";
+      this.regionName = regionName;
+      this.keyConstraint = ObjectUtils.defaultIfNull(keyConstraint, Object.class);
+      this.valueConstraint = ObjectUtils.defaultIfNull(valueConstraint, Object.class);
+    }
+
+    public String getRegionName() {
+      return regionName;
+    }
+
+    public Class<?> getKeyConstraint() {
+      return keyConstraint;
+    }
+
+    public Class<?> getValueConstraint() {
+      return valueConstraint;
+    }
+
+    public boolean add(final Index... indexes) {
+      return (indexes != null && this.indexes.addAll(Arrays.asList(indexes)));
+    }
+
+    public Iterator<Index> iterator() {
+      return Collections.unmodifiableSet(indexes).iterator();
+    }
+
+    public boolean remove(final Index... indexes) {
+      return (indexes != null && this.indexes.removeAll(Arrays.asList(indexes)));
+    }
+
+    @Override
+    public boolean equals(final Object obj) {
+      if (obj == this) {
+        return true;
+      }
+
+      if (!(obj instanceof RegionDefinition)) {
+        return false;
+      }
+
+      final RegionDefinition that = (RegionDefinition) obj;
+
+      return ObjectUtils.equals(getRegionName(), that.getRegionName());
+    }
+
+    @Override
+    public int hashCode() {
+      int hashValue = 17;
+      hashValue = 37 * hashValue + ObjectUtils.hashCode(getRegionName());
+      return hashValue;
+    }
+
+    @Override
+    public String toString() {
+      final StringBuilder buffer = new StringBuilder(getClass().getSimpleName());
+      buffer.append(" {regionName = ").append(getRegionName());
+      buffer.append(", keyConstraint = ").append(getKeyConstraint());
+      buffer.append(", valueConstraint = ").append(getValueConstraint());
+      buffer.append("}");
+      return buffer.toString();
+    }
+  }
+
+  protected static abstract class AbstractBean<T extends Comparable<T>> implements MutableIdentifiable<T>, Serializable {
+
+    private T id;
+    private String name;
+
+    public AbstractBean() {
+    }
+
+    public AbstractBean(final T id) {
+      this.id = id;
+    }
+
+    public T getId() {
+      return id;
+    }
+
+    public void setId(final T id) {
+      this.id = id;
+    }
+
+    public String getName() {
+      return name;
+    }
+
+    public void setName(final String name) {
+      this.name = name;
+    }
+
+    @Override
+    public boolean equals(final Object obj) {
+      if (obj == this) {
+        return true;
+      }
+
+      if (!(getClass().isInstance(obj))) {
+        return false;
+      }
+
+      final AbstractBean bean = (AbstractBean) obj;
+
+      return ObjectUtils.equals(getId(), bean.getId());
+    }
+
+    @Override
+    public int hashCode() {
+      int hashValue = 17;
+      hashValue = 37 * hashValue + ObjectUtils.hashCode(getId());
+      return hashValue;
+    }
+
+    @Override
+    public String toString() {
+      final StringBuilder buffer = new StringBuilder(getClass().getSimpleName());
+      buffer.append(" {id = ").append(getId());
+      buffer.append(", name = ").append(getName());
+      buffer.append("}");
+      return buffer.toString();
+    }
+  }
+
+  public static class Consumer extends AbstractBean<Long> {
+
+    private volatile int units;
+
+    public Consumer() {
+    }
+
+    public Consumer(final Long id) {
+      super(id);
+    }
+
+    public int getUnits() {
+      return units;
+    }
+
+    public int consume() {
+      return ++units;
+    }
+  }
+
+  public static class Producer extends AbstractBean<Long> {
+
+    private volatile int units;
+
+    public Producer() {
+    }
+
+    public Producer(final Long id) {
+      super(id);
+    }
+
+    public int getUnits() {
+      return units;
+    }
+
+    public int produce() {
+      return ++units;
+    }
+  }
+
+  public static class Proxy extends AbstractBean<Long> {
+
+    private final AbstractBean<Long> bean;
+    private int unitsSnapshot;
+
+    public Proxy(final AbstractBean<Long> bean) {
+      assert bean != null : "The bean to proxy cannot be null!";
+      this.bean = bean;
+    }
+
+    public AbstractBean<Long> getBean() {
+      return bean;
+    }
+
+    @Override
+    public Long getId() {
+      return getBean().getId();
+    }
+
+    @Override
+    public String getName() {
+      return getBean().getName();
+    }
+
+    public int getUnitsSnapshot() {
+      return unitsSnapshot;
+    }
+
+    public void setUnitsSnapshot(final int unitsSnapshot) {
+      this.unitsSnapshot = unitsSnapshot;
+    }
+  }
+
+  protected static enum CrudOperation {
+    CREATE,
+    RETRIEVE,
+    UPDATE,
+    DELETE
+  }
+}

http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/eddef322/gemfire-core/src/test/java/com/gemstone/gemfire/management/internal/cli/commands/MemberCommandsDUnitTest.java
----------------------------------------------------------------------
diff --git a/gemfire-core/src/test/java/com/gemstone/gemfire/management/internal/cli/commands/MemberCommandsDUnitTest.java b/gemfire-core/src/test/java/com/gemstone/gemfire/management/internal/cli/commands/MemberCommandsDUnitTest.java
new file mode 100644
index 0000000..6623403
--- /dev/null
+++ b/gemfire-core/src/test/java/com/gemstone/gemfire/management/internal/cli/commands/MemberCommandsDUnitTest.java
@@ -0,0 +1,286 @@
+/*
+ * 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 com.gemstone.gemfire.management.internal.cli.commands;
+
+import com.gemstone.gemfire.cache.Cache;
+import com.gemstone.gemfire.cache.CacheFactory;
+import com.gemstone.gemfire.cache.EvictionAction;
+import com.gemstone.gemfire.cache.EvictionAttributes;
+import com.gemstone.gemfire.cache.FixedPartitionAttributes;
+import com.gemstone.gemfire.cache.PartitionAttributes;
+import com.gemstone.gemfire.cache.PartitionAttributesFactory;
+import com.gemstone.gemfire.cache.Region;
+import com.gemstone.gemfire.cache.RegionFactory;
+import com.gemstone.gemfire.cache.RegionShortcut;
+import com.gemstone.gemfire.cache30.CacheTestCase;
+import com.gemstone.gemfire.distributed.DistributedMember;
+import com.gemstone.gemfire.distributed.Locator;
+import com.gemstone.gemfire.distributed.internal.DistributionConfig;
+import com.gemstone.gemfire.internal.AvailablePortHelper;
+import com.gemstone.gemfire.internal.cache.GemFireCacheImpl;
+import com.gemstone.gemfire.management.cli.Result;
+import com.gemstone.gemfire.management.cli.Result.Status;
+import com.gemstone.gemfire.management.internal.cli.CliUtil;
+import com.gemstone.gemfire.management.internal.cli.i18n.CliStrings;
+import com.gemstone.gemfire.management.internal.cli.remote.CommandProcessor;
+import com.gemstone.gemfire.management.internal.cli.util.CommandStringBuilder;
+import dunit.Host;
+import dunit.SerializableRunnable;
+import dunit.VM;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.Properties;
+import java.util.Set;
+
+/****
+ * @author bansods since 7.0
+ */
+
+public class MemberCommandsDUnitTest extends CacheTestCase {
+  private static final long serialVersionUID = 1L;
+  private static final Map<String, String> EMPTY_ENV = Collections.emptyMap();
+  private static final String REGION1 = "region1";
+  private static final String REGION2 = "region2";
+  private static final String REGION3 = "region3";
+  private static final String SUBREGION1A = "subregion1A";
+  private static final String SUBREGION1B = "subregion1B";
+  private static final String SUBREGION1C = "subregion1C";
+  private static final String PR1 = "PartitionedRegion1";
+  private static final String PR2 = "ParitionedRegion2";
+
+  public MemberCommandsDUnitTest(String name) {
+    super(name);
+  }
+
+  @Override
+  public void setUp() throws Exception {
+    super.setUp();
+    // This test does not require an actual Gfsh connection to work, however when run as part of a suite, prior tests
+    // may mess up the environment causing this test to fail. Setting this prevents false failures.
+    CliUtil.isGfshVM = false;
+  }
+
+  @Override
+  public void tearDown2() throws Exception {
+    super.tearDown2();
+    CliUtil.isGfshVM = true;
+  }
+
+  private Properties createProperties(String name, String groups) {
+    Properties props = new Properties();
+    props.setProperty(DistributionConfig.MCAST_PORT_NAME, "0");
+    props.setProperty(DistributionConfig.LOG_LEVEL_NAME, "info");
+    props.setProperty(DistributionConfig.STATISTIC_SAMPLING_ENABLED_NAME, "true");
+    props.setProperty(DistributionConfig.ENABLE_TIME_STATISTICS_NAME, "true");
+    props.setProperty(DistributionConfig.NAME_NAME, name);
+    props.setProperty(DistributionConfig.GROUPS_NAME, groups);
+    return props;
+  }
+
+  private void createRegionsWithSubRegions() {
+    final Cache cache = getCache();
+
+    RegionFactory<String, Integer> dataRegionFactory = cache.createRegionFactory(RegionShortcut.REPLICATE);
+    dataRegionFactory.setConcurrencyLevel(3);
+    Region<String, Integer> region1 = dataRegionFactory.create(REGION1);
+    region1.createSubregion(SUBREGION1C, region1.getAttributes());
+    Region<String, Integer> subregion2 = region1.createSubregion(SUBREGION1A, region1.getAttributes());
+
+    subregion2.createSubregion(SUBREGION1B, subregion2.getAttributes());
+    dataRegionFactory.create(REGION2);
+    dataRegionFactory.create(REGION3);
+  }
+
+  private void createPartitionedRegion1() {
+    final Cache cache = getCache();
+    // Create the data region
+    RegionFactory<String, Integer> dataRegionFactory = cache.createRegionFactory(RegionShortcut.PARTITION);
+    dataRegionFactory.create(PR1);
+  }
+
+  private void createPartitionedRegion(String regionName) {
+    final Cache cache = getCache();
+    // Create the data region
+    RegionFactory<String, Integer> dataRegionFactory = cache.createRegionFactory(RegionShortcut.PARTITION);
+    dataRegionFactory.setConcurrencyLevel(4);
+    EvictionAttributes ea = EvictionAttributes.createLIFOEntryAttributes(100, EvictionAction.LOCAL_DESTROY);
+    dataRegionFactory.setEvictionAttributes(ea);
+    dataRegionFactory.setEnableAsyncConflation(true);
+
+    FixedPartitionAttributes fpa = FixedPartitionAttributes.createFixedPartition("Par1", true);
+    PartitionAttributes pa = new PartitionAttributesFactory().setLocalMaxMemory(100).setRecoveryDelay(
+        2).setTotalMaxMemory(200).setRedundantCopies(1).addFixedPartitionAttributes(fpa).create();
+    dataRegionFactory.setPartitionAttributes(pa);
+
+    dataRegionFactory.create(regionName);
+  }
+
+
+  private void createLocalRegion() {
+    final Cache cache = getCache();
+    // Create the data region
+    RegionFactory<String, Integer> dataRegionFactory = cache.createRegionFactory(RegionShortcut.LOCAL);
+    dataRegionFactory.create("LocalRegion");
+  }
+
+  private void setupSystem() throws IOException {
+    disconnectAllFromDS();
+    final Host host = Host.getHost(0);
+    final VM[] servers = {host.getVM(0), host.getVM(1)};
+
+    final Properties propsMe = createProperties("me", "G1");
+    final Properties propsServer1 = createProperties("Server1", "G1");
+    final Properties propsServer2 = createProperties("Server2", "G2");
+
+
+    getSystem(propsMe);
+    final Cache cache = getCache();
+    RegionFactory<String, Integer> dataRegionFactory = cache.createRegionFactory(RegionShortcut.REPLICATE_PROXY);
+    dataRegionFactory.setConcurrencyLevel(5);
+    Region<String, Integer> region1 = dataRegionFactory.create(REGION1);
+
+
+    servers[1].invoke(new SerializableRunnable("Create cache for server1") {
+      public void run() {
+        getSystem(propsServer2);
+        createRegionsWithSubRegions();
+        createLocalRegion();
+        createPartitionedRegion("ParReg1");
+      }
+    });
+    servers[0].invoke(new SerializableRunnable("Create cache for server0") {
+      public void run() {
+        getSystem(propsServer1);
+        createRegionsWithSubRegions();
+        createLocalRegion();
+      }
+    });
+  }
+
+  private Properties createProperties(Host host, int locatorPort) {
+    Properties props = new Properties();
+
+    props.setProperty(DistributionConfig.MCAST_PORT_NAME, "0");
+    props.setProperty(DistributionConfig.LOCATORS_NAME, getServerHostName(host) + "[" + locatorPort + "]");
+    props.setProperty(DistributionConfig.LOG_LEVEL_NAME, "info");
+    props.setProperty(DistributionConfig.STATISTIC_SAMPLING_ENABLED_NAME, "true");
+    props.setProperty(DistributionConfig.ENABLE_TIME_STATISTICS_NAME, "true");
+    props.put(DistributionConfig.ENABLE_NETWORK_PARTITION_DETECTION_NAME, "true");
+
+    return props;
+  }
+
+  /**
+   * Creates the cache.
+   */
+  private void createCache(Properties props) {
+    getSystem(props);
+    final Cache cache = getCache();
+  }
+
+  /***
+   * Tests the execution of "list member" command which should list out all the members in the DS
+   *
+   * @throws IOException
+   * @throws ClassNotFoundException
+   */
+  public void testListMemberAll() throws IOException, ClassNotFoundException {
+    setupSystem();
+    CommandProcessor commandProcessor = new CommandProcessor();
+    Result result = commandProcessor.createCommandStatement(CliStrings.LIST_MEMBER, EMPTY_ENV).process();
+    getLogWriter().info("#SB" + getResultAsString(result));
+    assertEquals(true, result.getStatus().equals(Status.OK));
+  }
+
+  /****
+   * Tests the execution of "list member" command, when no cache is created
+   *
+   * @throws IOException
+   * @throws ClassNotFoundException
+   */
+  public void testListMemberWithNoCache() throws IOException, ClassNotFoundException {
+    final Host host = Host.getHost(0);
+    final VM[] servers = {host.getVM(0), host.getVM(1)};
+    final int openPorts[] = AvailablePortHelper.getRandomAvailableTCPPorts(1);
+    final File logFile = new File(getUniqueName() + "-locator" + openPorts[0] + ".log");
+
+    Locator locator = Locator.startLocator(openPorts[0], logFile);
+    try {
+
+      final Properties props = createProperties(host, openPorts[0]);
+      CommandProcessor commandProcessor = new CommandProcessor();
+      Result result = commandProcessor.createCommandStatement(CliStrings.LIST_MEMBER, EMPTY_ENV).process();
+
+      getLogWriter().info("#SB" + getResultAsString(result));
+      assertEquals(true, result.getStatus().equals(Status.ERROR));
+    } finally {
+      locator.stop(); // fix for bug 46562
+    }
+  }
+
+  /***
+   * Tests list member --group=G1
+   *
+   * @throws IOException
+   * @throws ClassNotFoundException
+   */
+  public void testListMemberWithGroups() throws IOException, ClassNotFoundException {
+    setupSystem();
+    CommandProcessor commandProcessor = new CommandProcessor();
+    CommandStringBuilder csb = new CommandStringBuilder(CliStrings.LIST_MEMBER);
+    csb.addOption(CliStrings.LIST_MEMBER__GROUP, "G1");
+    Result result = commandProcessor.createCommandStatement(csb.toString(), EMPTY_ENV).process();
+    getLogWriter().info("#SB" + getResultAsString(result));
+    assertEquals(true, result.getStatus().equals(Status.OK));
+  }
+
+  /***
+   * Tests the "describe member" command for all the members in the DS
+   *
+   * @throws IOException
+   * @throws ClassNotFoundException
+   */
+  public void testDescribeMember() throws IOException, ClassNotFoundException {
+    setupSystem();
+    CommandProcessor commandProcessor = new CommandProcessor();
+    GemFireCacheImpl cache = (GemFireCacheImpl) CacheFactory.getAnyInstance();
+    Set<DistributedMember> members = cache.getDistributedSystem().getAllOtherMembers();
+
+    Iterator<DistributedMember> iters = members.iterator();
+
+    while (iters.hasNext()) {
+      DistributedMember member = iters.next();
+      Result result = commandProcessor.createCommandStatement("describe member --name=" + member.getId(),
+          EMPTY_ENV).process();
+      assertEquals(true, result.getStatus().equals(Status.OK));
+      getLogWriter().info("#SB" + getResultAsString(result));
+      //assertEquals(true, result.getStatus().equals(Status.OK));
+    }
+  }
+
+  private String getResultAsString(Result result) {
+    StringBuilder sb = new StringBuilder();
+    while (result.hasNextLine()) {
+      sb.append(result.nextLine());
+    }
+    return sb.toString();
+  }
+}

http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/eddef322/gemfire-core/src/test/java/com/gemstone/gemfire/management/internal/cli/commands/MiscellaneousCommandsDUnitTest.java
----------------------------------------------------------------------
diff --git a/gemfire-core/src/test/java/com/gemstone/gemfire/management/internal/cli/commands/MiscellaneousCommandsDUnitTest.java b/gemfire-core/src/test/java/com/gemstone/gemfire/management/internal/cli/commands/MiscellaneousCommandsDUnitTest.java
new file mode 100644
index 0000000..ca3f94d
--- /dev/null
+++ b/gemfire-core/src/test/java/com/gemstone/gemfire/management/internal/cli/commands/MiscellaneousCommandsDUnitTest.java
@@ -0,0 +1,492 @@
+/*
+ * 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 com.gemstone.gemfire.management.internal.cli.commands;
+
+import com.gemstone.gemfire.cache.Cache;
+import com.gemstone.gemfire.cache.CacheClosedException;
+import com.gemstone.gemfire.cache.CacheFactory;
+import com.gemstone.gemfire.cache.Region;
+import com.gemstone.gemfire.cache.RegionFactory;
+import com.gemstone.gemfire.cache.RegionShortcut;
+import com.gemstone.gemfire.distributed.internal.DistributionConfig;
+import com.gemstone.gemfire.internal.cache.GemFireCacheImpl;
+import com.gemstone.gemfire.internal.lang.ThreadUtils;
+import com.gemstone.gemfire.management.cli.Result;
+import com.gemstone.gemfire.management.cli.Result.Status;
+import com.gemstone.gemfire.management.internal.cli.HeadlessGfsh;
+import com.gemstone.gemfire.management.internal.cli.i18n.CliStrings;
+import com.gemstone.gemfire.management.internal.cli.result.CommandResult;
+import com.gemstone.gemfire.management.internal.cli.result.CompositeResultData;
+import com.gemstone.gemfire.management.internal.cli.result.CompositeResultData.SectionResultData;
+import com.gemstone.gemfire.management.internal.cli.result.ResultBuilder;
+import com.gemstone.gemfire.management.internal.cli.result.ResultData;
+import com.gemstone.gemfire.management.internal.cli.result.TabularResultData;
+import dunit.Host;
+import dunit.SerializableCallable;
+import dunit.SerializableRunnable;
+import dunit.VM;
+import org.junit.Ignore;
+
+import java.io.IOException;
+import java.util.List;
+import java.util.Properties;
+
+/**
+ * Dunit class for testing gemfire function commands : GC, Shutdown
+ *
+ * @author apande
+ */
+public class MiscellaneousCommandsDUnitTest extends CliCommandTestBase {
+
+  private static final long serialVersionUID = 1L;
+  private static String cachedLogLevel;
+
+  public MiscellaneousCommandsDUnitTest(String name) {
+    super(name);
+  }
+
+  @Override
+  public void tearDown2() throws Exception {
+    invokeInEveryVM(new SerializableRunnable("reset log level") {
+      public void run() {
+        if (cachedLogLevel != null) {
+          System.setProperty("gemfire.log-level", cachedLogLevel);
+          cachedLogLevel = null;
+        }
+      }
+    });
+  }
+
+  public void testGCForGroup() {
+    Properties localProps = new Properties();
+    localProps.setProperty(DistributionConfig.NAME_NAME, "Manager");
+    localProps.setProperty(DistributionConfig.GROUPS_NAME, "Group1");
+    createDefaultSetup(localProps);
+    String command = "gc --group=Group1";
+    CommandResult cmdResult = executeCommand(command);
+    cmdResult.resetToFirstLine();
+    if (cmdResult != null) {
+      String cmdResultStr = commandResultToString(cmdResult);
+      getLogWriter().info("testGCForGroup cmdResultStr=" + cmdResultStr + "; cmdResult=" + cmdResult);
+      assertEquals(Result.Status.OK, cmdResult.getStatus());
+      if (cmdResult.getType().equals(ResultData.TYPE_TABULAR)) {
+        TabularResultData table = (TabularResultData) cmdResult.getResultData();
+        List<String> memberNames = table.retrieveAllValues(CliStrings.GC__MSG__MEMBER_NAME);
+        assertEquals(true, memberNames.size() == 1 ? true : false);
+      } else {
+        fail("testGCForGroup failed as CommandResult should be table type");
+      }
+    } else {
+      fail("testGCForGroup failed as did not get CommandResult");
+    }
+  }
+
+  public static String getMemberId() {
+    Cache cache = new GemfireDataCommandsDUnitTest("test").getCache();
+    return cache.getDistributedSystem().getDistributedMember().getId();
+  }
+
+  public void testGCForMemberID() {
+    createDefaultSetup(null);
+    final VM vm1 = Host.getHost(0).getVM(1);
+    final String vm1MemberId = (String) vm1.invoke(MiscellaneousCommandsDUnitTest.class, "getMemberId");
+    String command = "gc --member=" + vm1MemberId;
+    CommandResult cmdResult = executeCommand(command);
+    cmdResult.resetToFirstLine();
+    if (cmdResult != null) {
+      String cmdResultStr = commandResultToString(cmdResult);
+      getLogWriter().info("testGCForMemberID cmdResultStr=" + cmdResultStr);
+      assertEquals(Result.Status.OK, cmdResult.getStatus());
+      if (cmdResult.getType().equals(ResultData.TYPE_TABULAR)) {
+        TabularResultData table = (TabularResultData) cmdResult.getResultData();
+        List<String> memberNames = table.retrieveAllValues(CliStrings.GC__MSG__MEMBER_NAME);
+        assertEquals(true, memberNames.size() == 1 ? true : false);
+      } else {
+        fail("testGCForGroup failed as CommandResult should be table type");
+      }
+    } else {
+      fail("testGCForCluster failed as did not get CommandResult");
+    }
+  }
+
+  public void testShowLogDefault() throws IOException {
+    Properties props = new Properties();
+    try {
+      props.setProperty("log-file", "testShowLogDefault.log");
+      createDefaultSetup(props);
+      final VM vm1 = Host.getHost(0).getVM(0);
+      final String vm1MemberId = (String) vm1.invoke(MiscellaneousCommandsDUnitTest.class, "getMemberId");
+      String command = "show log --member=" + vm1MemberId;
+      CommandResult cmdResult = executeCommand(command);
+      if (cmdResult != null) {
+        String log = commandResultToString(cmdResult);
+        assertNotNull(log);
+        getLogWriter().info("Show Log is" + log);
+        assertEquals(Result.Status.OK, cmdResult.getStatus());
+      } else {
+        fail("testShowLog failed as did not get CommandResult");
+      }
+    } finally {
+      disconnectAllFromDS();
+    }
+  }
+
+  public void testShowLogNumLines() {
+    Properties props = new Properties();
+    props.setProperty("log-file", "testShowLogNumLines.log");
+    try {
+      createDefaultSetup(props);
+      final VM vm1 = Host.getHost(0).getVM(0);
+      final String vm1MemberId = (String) vm1.invoke(MiscellaneousCommandsDUnitTest.class, "getMemberId");
+      String command = "show log --member=" + vm1MemberId + " --lines=50";
+      CommandResult cmdResult = executeCommand(command);
+      if (cmdResult != null) {
+        String log = commandResultToString(cmdResult);
+        assertNotNull(log);
+        getLogWriter().info("Show Log is" + log);
+        assertEquals(Result.Status.OK, cmdResult.getStatus());
+      } else {
+        fail("testShowLog failed as did not get CommandResult");
+      }
+    } finally {
+      disconnectAllFromDS();
+    }
+  }
+
+  public void testGCForEntireCluster() {
+    setupForGC();
+    String command = "gc";
+    CommandResult cmdResult = executeCommand(command);
+    cmdResult.resetToFirstLine();
+    if (cmdResult != null) {
+      String cmdResultStr = commandResultToString(cmdResult);
+      getLogWriter().info("testGCForEntireCluster cmdResultStr=" + cmdResultStr + "; cmdResult=" + cmdResult);
+      assertEquals(Result.Status.OK, cmdResult.getStatus());
+      if (cmdResult.getType().equals(ResultData.TYPE_TABULAR)) {
+        TabularResultData table = (TabularResultData) cmdResult.getResultData();
+        List<String> memberNames = table.retrieveAllValues(CliStrings.GC__MSG__MEMBER_NAME);
+        assertEquals(3, memberNames.size());
+      } else {
+        fail("testGCForGroup failed as CommandResult should be table type");
+      }
+    } else {
+      fail("testGCForGroup failed as did not get CommandResult");
+    }
+  }
+
+  void setupForGC() {
+    disconnectAllFromDS();
+
+    final VM vm1 = Host.getHost(0).getVM(1);
+    final VM vm2 = Host.getHost(0).getVM(2);
+
+
+    createDefaultSetup(null);
+    vm1.invoke(new SerializableRunnable() {
+      public void run() {
+        // no need to close cache as it will be closed as part of teardown2
+        Cache cache = getCache();
+
+        RegionFactory<Integer, Integer> dataRegionFactory = cache.createRegionFactory(RegionShortcut.PARTITION);
+        Region region = dataRegionFactory.create("testRegion");
+        for (int i = 0; i < 10; i++) {
+          region.put("key" + (i + 200), "value" + (i + 200));
+        }
+      }
+    });
+    vm2.invoke(new SerializableRunnable() {
+      public void run() {
+        // no need to close cache as it will be closed as part of teardown2
+        Cache cache = getCache();
+
+        RegionFactory<Integer, Integer> dataRegionFactory = cache.createRegionFactory(RegionShortcut.PARTITION);
+        dataRegionFactory.create("testRegion");
+      }
+    });
+  }
+
+  public void testShutDownWithoutTimeout() {
+
+    addExpectedException("EntryDestroyedException");
+
+    setupForShutDown();
+    ThreadUtils.sleep(2500);
+
+    String command = "shutdown";
+    CommandResult cmdResult = executeCommand(command);
+
+    if (cmdResult != null) {
+      String cmdResultStr = commandResultToString(cmdResult);
+      getLogWriter().info("testShutDownWithoutTimeout cmdResultStr=" + cmdResultStr);
+    }
+
+    verifyShutDown();
+
+    final HeadlessGfsh defaultShell = getDefaultShell();
+
+    // Need for the Gfsh HTTP enablement during shutdown to properly assess the
+    // state of the connection.
+    waitForCriterion(new WaitCriterion() {
+      public boolean done() {
+        return !defaultShell.isConnectedAndReady();
+      }
+
+      public String description() {
+        return "Waits for the shell to disconnect!";
+      }
+    }, 1000, 250, true);
+
+    assertFalse(defaultShell.isConnectedAndReady());
+  }
+
+  @Ignore("Disabled for 52350")
+  public void DISABLED_testShutDownWithTimeout() {
+    setupForShutDown();
+    ThreadUtils.sleep(2500);
+
+    addExpectedException("EntryDestroyedException");
+
+    String command = "shutdown --time-out=15";
+    CommandResult cmdResult = executeCommand(command);
+
+    if (cmdResult != null) {
+      String cmdResultStr = commandResultToString(cmdResult);
+      getLogWriter().info("testShutDownWithTIMEOUT cmdResultStr=" + cmdResultStr);
+    }
+
+    verifyShutDown();
+
+    final HeadlessGfsh defaultShell = getDefaultShell();
+
+    // Need for the Gfsh HTTP enablement during shutdown to properly assess the state of the connection.
+    waitForCriterion(new WaitCriterion() {
+      public boolean done() {
+        return !defaultShell.isConnectedAndReady();
+      }
+
+      public String description() {
+        return "Waits for the shell to disconnect!";
+      }
+    }, 1000, 250, false);
+
+    assertFalse(defaultShell.isConnectedAndReady());
+  }
+
+  public void testShutDownForTIMEOUT() {
+    setupForShutDown();
+    ThreadUtils.sleep(2500);
+    final VM vm0 = Host.getHost(0).getVM(0);
+    vm0.invoke(new SerializableRunnable() {
+      public void run() {
+        System.setProperty("ThrowTimeoutException", "true");
+      }
+    });
+
+
+    String command = "shutdown --time-out=15";
+    CommandResult cmdResult = executeCommand(command);
+
+    if (cmdResult != null) {
+      String cmdResultStr = commandResultToString(cmdResult);
+      getLogWriter().info("testShutDownForTIMEOUT cmdResultStr = " + cmdResultStr);
+      CommandResult result = (CommandResult) ResultBuilder.createInfoResult(CliStrings.SHUTDOWN_TIMEDOUT);
+      String expectedResult = commandResultToString(result);
+      assertEquals(expectedResult, cmdResultStr);
+    }
+    vm0.invoke(new SerializableRunnable() {
+      public void run() {
+        System.clearProperty("ThrowTimeoutException");
+      }
+    });
+  }
+
+  void setupForChangeLogLelvel() {
+    final VM vm0 = Host.getHost(0).getVM(0);
+    final VM vm1 = Host.getHost(0).getVM(1);
+
+    createDefaultSetup(null);
+    vm1.invoke(new SerializableRunnable() {
+      public void run() {
+        // no need to close cache as it will be closed as part of teardown2
+        Cache cache = getCache();
+
+        RegionFactory<Integer, Integer> dataRegionFactory = cache.createRegionFactory(RegionShortcut.PARTITION);
+        Region region = dataRegionFactory.create("testRegion");
+        for (int i = 0; i < 10; i++) {
+          region.put("key" + (i + 200), "value" + (i + 200));
+        }
+      }
+    });
+  }
+
+  void setupForShutDown() {
+    final VM vm0 = Host.getHost(0).getVM(0);
+    final VM vm1 = Host.getHost(0).getVM(1);
+
+    System.setProperty(CliStrings.IGNORE_INTERCEPTORS, "true");
+    createDefaultSetup(null);
+    vm1.invoke(new SerializableRunnable() {
+      public void run() {
+        // no need to close cache as it will be closed as part of teardown2
+        Cache cache = getCache();
+
+        RegionFactory<Integer, Integer> dataRegionFactory = cache.createRegionFactory(RegionShortcut.PARTITION);
+        Region region = dataRegionFactory.create("testRegion");
+        for (int i = 0; i < 10; i++) {
+          region.put("key" + (i + 200), "value" + (i + 200));
+        }
+      }
+    });
+  }
+
+  void verifyShutDown() {
+    final VM vm0 = Host.getHost(0).getVM(0);
+    final VM vm1 = Host.getHost(0).getVM(1);
+
+    @SuppressWarnings("serial") final SerializableCallable connectedChecker = new SerializableCallable() {
+      @Override
+      public Object call() throws Exception {
+        boolean cacheExists = true;
+        try {
+          Cache cacheInstance = CacheFactory.getAnyInstance();
+          cacheExists = cacheInstance.getDistributedSystem().isConnected();
+        } catch (CacheClosedException e) {
+          cacheExists = false;
+        }
+        return cacheExists;
+      }
+    };
+
+    WaitCriterion waitCriterion = new WaitCriterion() {
+      @Override
+      public boolean done() {
+        return Boolean.FALSE.equals(vm0.invoke(connectedChecker)) && Boolean.FALSE.equals(vm1.invoke(connectedChecker));
+      }
+
+      @Override
+      public String description() {
+        return "Wait for gfsh to get disconnected from Manager.";
+      }
+    };
+    waitForCriterion(waitCriterion, 5000, 200, true);
+
+    assertTrue(Boolean.FALSE.equals(vm1.invoke(connectedChecker)));
+    assertTrue(Boolean.FALSE.equals(vm0.invoke(connectedChecker)));
+  }
+
+  public void testChangeLogLevelForMembers() {
+    final VM vm0 = Host.getHost(0).getVM(0);
+    final VM vm1 = Host.getHost(0).getVM(1);
+
+    setupForChangeLogLelvel();
+
+    String serverName1 = (String) vm0.invoke(new SerializableCallable() {
+      @Override
+      public Object call() throws Exception {
+        cachedLogLevel = System.getProperty("gemfire.log-level");
+        return GemFireCacheImpl.getInstance().getDistributedSystem().getDistributedMember().getId();
+      }
+    });
+
+    String serverName2 = (String) vm1.invoke(new SerializableCallable() {
+      @Override
+      public Object call() throws Exception {
+        cachedLogLevel = System.getProperty("gemfire.log-level");
+        return GemFireCacheImpl.getInstance().getDistributedSystem().getDistributedMember().getId();
+      }
+    });
+
+    String commandString = CliStrings.CHANGE_LOGLEVEL + " --" + CliStrings.CHANGE_LOGLEVEL__LOGLEVEL + "=finer" + " --" + CliStrings.CHANGE_LOGLEVEL__MEMBER + "=" + serverName1 + "," + serverName2;
+
+    CommandResult commandResult = executeCommand(commandString);
+    getLogWriter().info("testChangeLogLevel commandResult=" + commandResult);
+    assertTrue(Status.OK.equals(commandResult.getStatus()));
+    CompositeResultData resultData = (CompositeResultData) commandResult.getResultData();
+    SectionResultData section = resultData.retrieveSection("section");
+    assertNotNull(section);
+    TabularResultData tableRsultData = section.retrieveTable("ChangeLogLevel");
+    assertNotNull(tableRsultData);
+
+    List<String> columns = tableRsultData.retrieveAllValues(CliStrings.CHANGE_LOGLEVEL__COLUMN_MEMBER);
+    List<String> status = tableRsultData.retrieveAllValues(CliStrings.CHANGE_LOGLEVEL__COLUMN_STATUS);
+
+    assertEquals(columns.size(), 2);
+    assertEquals(status.size(), 2);
+
+    assertTrue(columns.contains(serverName1));
+    assertTrue(columns.contains(serverName2));
+    assertTrue(status.contains("true"));
+  }
+
+  public void testChangeLogLevelForGrps() {
+    Properties localProps = new Properties();
+    localProps.setProperty(DistributionConfig.NAME_NAME, "Manager");
+    localProps.setProperty(DistributionConfig.GROUPS_NAME, "Group0");
+
+    final VM vm1 = Host.getHost(0).getVM(1);
+    final VM vm2 = Host.getHost(0).getVM(2);
+    final String grp1 = "Group1";
+    final String grp2 = "Group2";
+
+    createDefaultSetup(localProps);
+
+    String vm1id = (String) vm1.invoke(new SerializableCallable() {
+      @Override
+      public Object call() throws Exception {
+        Properties localProps = new Properties();
+        localProps.setProperty(DistributionConfig.GROUPS_NAME, grp1);
+        getSystem(localProps);
+        Cache cache = getCache();
+        return cache.getDistributedSystem().getDistributedMember().getId();
+      }
+    });
+
+    String vm2id = (String) vm2.invoke(new SerializableCallable() {
+      @Override
+      public Object call() throws Exception {
+        Properties localProps = new Properties();
+        localProps.setProperty(DistributionConfig.GROUPS_NAME, grp2);
+        getSystem(localProps);
+        Cache cache = getCache();
+        return cache.getDistributedSystem().getDistributedMember().getId();
+      }
+    });
+
+    String commandString = CliStrings.CHANGE_LOGLEVEL + " --" + CliStrings.CHANGE_LOGLEVEL__LOGLEVEL + "=finer" + " --" + CliStrings.CHANGE_LOGLEVEL__GROUPS + "=" + grp1 + "," + grp2;
+
+    CommandResult commandResult = executeCommand(commandString);
+    getLogWriter().info("testChangeLogLevelForGrps commandResult=" + commandResult);
+
+    assertTrue(Status.OK.equals(commandResult.getStatus()));
+
+    CompositeResultData resultData = (CompositeResultData) commandResult.getResultData();
+    SectionResultData section = resultData.retrieveSection("section");
+    assertNotNull(section);
+    TabularResultData tableRsultData = section.retrieveTable("ChangeLogLevel");
+    assertNotNull(tableRsultData);
+
+    List<String> columns = tableRsultData.retrieveAllValues(CliStrings.CHANGE_LOGLEVEL__COLUMN_MEMBER);
+    List<String> status = tableRsultData.retrieveAllValues(CliStrings.CHANGE_LOGLEVEL__COLUMN_STATUS);
+
+    assertEquals(columns.size(), 2);
+    assertEquals(status.size(), 2);
+
+    assertTrue(columns.contains(vm1id));
+    assertTrue(columns.contains(vm2id));
+    assertTrue(status.contains("true"));
+  }
+}

http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/eddef322/gemfire-core/src/test/java/com/gemstone/gemfire/management/internal/cli/commands/MiscellaneousCommandsExportLogsPart1DUnitTest.java
----------------------------------------------------------------------
diff --git a/gemfire-core/src/test/java/com/gemstone/gemfire/management/internal/cli/commands/MiscellaneousCommandsExportLogsPart1DUnitTest.java b/gemfire-core/src/test/java/com/gemstone/gemfire/management/internal/cli/commands/MiscellaneousCommandsExportLogsPart1DUnitTest.java
new file mode 100644
index 0000000..6afa7ee
--- /dev/null
+++ b/gemfire-core/src/test/java/com/gemstone/gemfire/management/internal/cli/commands/MiscellaneousCommandsExportLogsPart1DUnitTest.java
@@ -0,0 +1,139 @@
+/*
+ * 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 com.gemstone.gemfire.management.internal.cli.commands;
+
+import com.gemstone.gemfire.cache.Cache;
+import com.gemstone.gemfire.cache.Region;
+import com.gemstone.gemfire.cache.RegionFactory;
+import com.gemstone.gemfire.cache.RegionShortcut;
+import com.gemstone.gemfire.internal.FileUtil;
+import com.gemstone.gemfire.internal.logging.LogWriterImpl;
+import com.gemstone.gemfire.management.cli.Result;
+import com.gemstone.gemfire.management.internal.cli.result.CommandResult;
+import dunit.Host;
+import dunit.SerializableRunnable;
+import dunit.VM;
+
+import java.io.File;
+import java.io.IOException;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+/**
+ * Dunit class for testing gemfire function commands : export logs
+ *
+ * @author apande
+ */
+
+public class MiscellaneousCommandsExportLogsPart1DUnitTest extends CliCommandTestBase {
+
+  private static final long serialVersionUID = 1L;
+
+  public MiscellaneousCommandsExportLogsPart1DUnitTest(String name) {
+    super(name);
+  }
+
+  public static String getMemberId() {
+    Cache cache = new GemfireDataCommandsDUnitTest("test").getCache();
+    return cache.getDistributedSystem().getDistributedMember().getId();
+  }
+
+  void setupForExportLogs() {
+    final VM vm1 = Host.getHost(0).getVM(1);
+    createDefaultSetup(null);
+
+    vm1.invoke(new SerializableRunnable() {
+      public void run() {
+        // no need to close cache as it will be closed as part of teardown2
+        Cache cache = getCache();
+
+        RegionFactory<Integer, Integer> dataRegionFactory = cache.createRegionFactory(RegionShortcut.PARTITION);
+        Region region = dataRegionFactory.create("testRegion");
+        for (int i = 0; i < 5; i++) {
+          region.put("key" + (i + 200), "value" + (i + 200));
+        }
+      }
+    });
+  }
+
+  String getCurrentTimeString() {
+    SimpleDateFormat sf = new SimpleDateFormat("yyyy_MM_dd_HH_mm_ss_SSS_z");
+    Date startDate = new Date(System.currentTimeMillis());
+    String formattedStartDate = sf.format(startDate);
+    return ("_" + formattedStartDate);
+  }
+
+  public void testExportLogs() throws IOException {
+    Date startDate = new Date(System.currentTimeMillis() - 2 * 60 * 1000);
+    SimpleDateFormat sf = new SimpleDateFormat("yyyy/MM/dd");
+    String start = sf.format(startDate);
+
+    Date enddate = new Date(System.currentTimeMillis() + 2 * 60 * 60 * 1000);
+    String end = sf.format(enddate);
+    String dir = getCurrentTimeString();
+
+    setupForExportLogs();
+    String logLevel = LogWriterImpl.levelToString(LogWriterImpl.INFO_LEVEL);
+
+    MiscellaneousCommands misc = new MiscellaneousCommands();
+    getCache();
+
+    Result cmdResult = misc.exportLogsPreprocessing("./testExportLogs" + dir, null, null, logLevel, false, false, start,
+        end, 1);
+
+    getLogWriter().info("testExportLogs command result =" + cmdResult);
+
+    if (cmdResult != null) {
+      String cmdStringRsult = commandResultToString((CommandResult) cmdResult);
+      getLogWriter().info("testExportLogs cmdStringRsult=" + cmdStringRsult);
+      assertEquals(Result.Status.OK, cmdResult.getStatus());
+    } else {
+      fail("testExportLogs failed as did not get CommandResult");
+    }
+    FileUtil.delete(new File("./testExportLogs" + dir));
+  }
+
+  public void testExportLogsForMerge() throws IOException {
+    setupForExportLogs();
+    Date startDate = new Date(System.currentTimeMillis() - 2 * 60 * 1000);
+    SimpleDateFormat sf = new SimpleDateFormat("yyyy/MM/dd");
+    String start = sf.format(startDate);
+
+    Date enddate = new Date(System.currentTimeMillis() + 2 * 60 * 60 * 1000);
+    String end = sf.format(enddate);
+    String dir = getCurrentTimeString();
+
+    String logLevel = LogWriterImpl.levelToString(LogWriterImpl.INFO_LEVEL);
+
+    MiscellaneousCommands misc = new MiscellaneousCommands();
+    getCache();
+
+    Result cmdResult = misc.exportLogsPreprocessing("./testExportLogsForMerge" + dir, null, null, logLevel, false, true,
+        start, end, 1);
+    getLogWriter().info("testExportLogsForMerge command=" + cmdResult);
+
+    if (cmdResult != null) {
+      String cmdStringRsult = commandResultToString((CommandResult) cmdResult);
+      getLogWriter().info("testExportLogsForMerge cmdStringRsult=" + cmdStringRsult);
+
+      assertEquals(Result.Status.OK, cmdResult.getStatus());
+    } else {
+      fail("testExportLogsForMerge failed as did not get CommandResult");
+    }
+    FileUtil.delete(new File("./testExportLogsForMerge" + dir));
+  }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/eddef322/gemfire-core/src/test/java/com/gemstone/gemfire/management/internal/cli/commands/MiscellaneousCommandsExportLogsPart2DUnitTest.java
----------------------------------------------------------------------
diff --git a/gemfire-core/src/test/java/com/gemstone/gemfire/management/internal/cli/commands/MiscellaneousCommandsExportLogsPart2DUnitTest.java b/gemfire-core/src/test/java/com/gemstone/gemfire/management/internal/cli/commands/MiscellaneousCommandsExportLogsPart2DUnitTest.java
new file mode 100644
index 0000000..6a1d86c
--- /dev/null
+++ b/gemfire-core/src/test/java/com/gemstone/gemfire/management/internal/cli/commands/MiscellaneousCommandsExportLogsPart2DUnitTest.java
@@ -0,0 +1,148 @@
+/*
+ * 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 com.gemstone.gemfire.management.internal.cli.commands;
+
+import com.gemstone.gemfire.cache.Cache;
+import com.gemstone.gemfire.cache.Region;
+import com.gemstone.gemfire.cache.RegionFactory;
+import com.gemstone.gemfire.cache.RegionShortcut;
+import com.gemstone.gemfire.internal.FileUtil;
+import com.gemstone.gemfire.internal.logging.LogWriterImpl;
+import com.gemstone.gemfire.management.cli.Result;
+import com.gemstone.gemfire.management.internal.cli.result.CommandResult;
+import dunit.Host;
+import dunit.SerializableRunnable;
+import dunit.VM;
+
+import java.io.File;
+import java.io.IOException;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+/**
+ * Dunit class for testing gemfire function commands : export logs
+ *
+ * @author apande
+ */
+
+public class MiscellaneousCommandsExportLogsPart2DUnitTest extends CliCommandTestBase {
+
+  private static final long serialVersionUID = 1L;
+
+  public MiscellaneousCommandsExportLogsPart2DUnitTest(String name) {
+    super(name);
+  }
+
+  public static String getMemberId() {
+    Cache cache = new GemfireDataCommandsDUnitTest("test").getCache();
+    return cache.getDistributedSystem().getDistributedMember().getId();
+  }
+
+  void setupForExportLogs() {
+    final VM vm1 = Host.getHost(0).getVM(1);
+    createDefaultSetup(null);
+
+    vm1.invoke(new SerializableRunnable() {
+      public void run() {
+        // no need to close cache as it will be closed as part of teardown2
+        Cache cache = getCache();
+
+        RegionFactory<Integer, Integer> dataRegionFactory = cache.createRegionFactory(RegionShortcut.PARTITION);
+        Region region = dataRegionFactory.create("testRegion");
+        for (int i = 0; i < 5; i++) {
+          region.put("key" + (i + 200), "value" + (i + 200));
+        }
+      }
+    });
+  }
+
+  String getCurrentTimeString() {
+    SimpleDateFormat sf = new SimpleDateFormat("yyyy_MM_dd_HH_mm_ss_SSS_z");
+    Date startDate = new Date(System.currentTimeMillis());
+    String formattedStartDate = sf.format(startDate);
+    return ("_" + formattedStartDate);
+  }
+
+  public void testExportLogsForLogLevel() throws IOException {
+    setupForExportLogs();
+
+    Date startDate = new Date(System.currentTimeMillis() - 60 * 1000);
+    SimpleDateFormat sf = new SimpleDateFormat("yyyy/MM/dd");
+    String start = sf.format(startDate);
+
+    Date enddate = new Date(System.currentTimeMillis() + 60 * 1000);
+    String end = sf.format(enddate);
+    String dir = getCurrentTimeString();
+
+    String logLevel = LogWriterImpl.levelToString(LogWriterImpl.CONFIG_LEVEL);
+
+    MiscellaneousCommands misc = new MiscellaneousCommands();
+    getCache();
+
+    Result cmdResult = misc.exportLogsPreprocessing("./testExportLogsForLogLevel" + dir, null, null, logLevel, false,
+        false, start, end, 1);
+
+    getLogWriter().info("testExportLogsForLogLevel command=" + cmdResult);
+
+    if (cmdResult != null) {
+      String cmdStringRsult = commandResultToString((CommandResult) cmdResult);
+      getLogWriter().info("testExportLogsForLogLevel cmdStringRsult=" + cmdStringRsult);
+      assertEquals(Result.Status.OK, cmdResult.getStatus());
+    } else {
+      fail("testExportLogsForLogLevel failed as did not get CommandResult");
+    }
+    FileUtil.delete(new File("testExportLogsForLogLevel" + dir));
+  }
+
+
+  public void testExportLogsForLogLevelWithUPTOLOGLEVEL() throws IOException {
+    setupForExportLogs();
+
+    Date startDate = new Date(System.currentTimeMillis() - 2 * 60 * 1000);
+    SimpleDateFormat sf = new SimpleDateFormat("yyyy/MM/dd");
+    String start = sf.format(startDate);
+
+    Date enddate = new Date(System.currentTimeMillis() + 2 * 60 * 60 * 1000);
+    String end = sf.format(enddate);
+    String dir = getCurrentTimeString();
+
+    String logLevel = LogWriterImpl.levelToString(LogWriterImpl.SEVERE_LEVEL);
+
+    MiscellaneousCommands misc = new MiscellaneousCommands();
+    getCache();
+
+    Result cmdResult = misc.exportLogsPreprocessing("./testExportLogsForLogLevelWithUPTOLOGLEVEL" + dir, null, null,
+        logLevel, true, false, start, end, 1);
+
+    getLogWriter().info("testExportLogsForLogLevelWithUPTOLOGLEVEL command=" + cmdResult);
+
+    if (cmdResult != null) {
+      String cmdStringRsult = commandResultToString((CommandResult) cmdResult);
+      getLogWriter().info("testExportLogsForLogLevelWithUPTOLOGLEVEL cmdStringRsult=" + cmdStringRsult);
+
+      assertEquals(Result.Status.OK, cmdResult.getStatus());
+    } else {
+      fail("testExportLogsForLogLevelWithUPTOLOGLEVEL failed as did not get CommandResult");
+    }
+    FileUtil.delete(new File("testExportLogsForLogLevelWithUPTOLOGLEVEL" + dir));
+  }
+
+  @Override
+  public void tearDown2() throws Exception {
+    super.tearDown2();
+  }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/eddef322/gemfire-core/src/test/java/com/gemstone/gemfire/management/internal/cli/commands/MiscellaneousCommandsExportLogsPart3DUnitTest.java
----------------------------------------------------------------------
diff --git a/gemfire-core/src/test/java/com/gemstone/gemfire/management/internal/cli/commands/MiscellaneousCommandsExportLogsPart3DUnitTest.java b/gemfire-core/src/test/java/com/gemstone/gemfire/management/internal/cli/commands/MiscellaneousCommandsExportLogsPart3DUnitTest.java
new file mode 100644
index 0000000..1c2933d
--- /dev/null
+++ b/gemfire-core/src/test/java/com/gemstone/gemfire/management/internal/cli/commands/MiscellaneousCommandsExportLogsPart3DUnitTest.java
@@ -0,0 +1,150 @@
+/*
+ * 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 com.gemstone.gemfire.management.internal.cli.commands;
+
+import com.gemstone.gemfire.cache.Cache;
+import com.gemstone.gemfire.cache.Region;
+import com.gemstone.gemfire.cache.RegionFactory;
+import com.gemstone.gemfire.cache.RegionShortcut;
+import com.gemstone.gemfire.distributed.internal.DistributionConfig;
+import com.gemstone.gemfire.internal.FileUtil;
+import com.gemstone.gemfire.internal.logging.LogWriterImpl;
+import com.gemstone.gemfire.management.cli.Result;
+import com.gemstone.gemfire.management.internal.cli.result.CommandResult;
+import dunit.Host;
+import dunit.SerializableRunnable;
+import dunit.VM;
+
+import java.io.File;
+import java.io.IOException;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.Properties;
+
+/**
+ * Dunit class for testing gemfire function commands : export logs
+ *
+ * @author apande
+ */
+
+public class MiscellaneousCommandsExportLogsPart3DUnitTest extends CliCommandTestBase {
+
+  private static final long serialVersionUID = 1L;
+
+  public MiscellaneousCommandsExportLogsPart3DUnitTest(String name) {
+    super(name);
+  }
+
+  public static String getMemberId() {
+    Cache cache = new GemfireDataCommandsDUnitTest("test").getCache();
+    return cache.getDistributedSystem().getDistributedMember().getId();
+  }
+
+  void setupForExportLogs() {
+    final VM vm1 = Host.getHost(0).getVM(1);
+    createDefaultSetup(null);
+
+    vm1.invoke(new SerializableRunnable() {
+      public void run() {
+        // no need to close cache as it will be closed as part of teardown2
+        Cache cache = getCache();
+
+        RegionFactory<Integer, Integer> dataRegionFactory = cache.createRegionFactory(RegionShortcut.PARTITION);
+        Region region = dataRegionFactory.create("testRegion");
+        for (int i = 0; i < 5; i++) {
+          region.put("key" + (i + 200), "value" + (i + 200));
+        }
+      }
+    });
+  }
+
+  String getCurrentTimeString() {
+    SimpleDateFormat sf = new SimpleDateFormat("yyyy_MM_dd_HH_mm_ss_SSS_z");
+    Date startDate = new Date(System.currentTimeMillis());
+    String formattedStartDate = sf.format(startDate);
+    return ("_" + formattedStartDate);
+  }
+
+  public void testExportLogsForGroup() throws IOException {
+    Properties localProps = new Properties();
+    localProps.setProperty(DistributionConfig.NAME_NAME, "Manager");
+    localProps.setProperty(DistributionConfig.GROUPS_NAME, "Group1");
+    createDefaultSetup(localProps);
+    String dir = getCurrentTimeString();
+
+    Date startDate = new Date(System.currentTimeMillis() - 2 * 60 * 1000);
+    SimpleDateFormat sf = new SimpleDateFormat("yyyy/MM/dd");
+    String start = sf.format(startDate);
+
+    Date enddate = new Date(System.currentTimeMillis() + 2 * 60 * 60 * 1000);
+    String end = sf.format(enddate);
+
+    String logLevel = LogWriterImpl.levelToString(LogWriterImpl.INFO_LEVEL);
+
+    MiscellaneousCommands misc = new MiscellaneousCommands();
+    getCache();
+    String[] groups = new String[1];
+    groups[0] = "Group1";
+
+    Result cmdResult = misc.exportLogsPreprocessing("./testExportLogsForGroup" + dir, groups, null, logLevel, false,
+        false, start, end, 1);
+
+    getLogWriter().info("testExportLogsForGroup command result =" + cmdResult);
+    if (cmdResult != null) {
+      String cmdStringRsult = commandResultToString((CommandResult) cmdResult);
+      getLogWriter().info("testExportLogsForGroup cmdStringRsult=" + cmdStringRsult);
+      assertEquals(Result.Status.OK, cmdResult.getStatus());
+    } else {
+      fail("testExportLogsForGroup failed as did not get CommandResult");
+    }
+    FileUtil.delete(new File("testExportLogsForGroup" + dir));
+  }
+
+  public void testExportLogsForMember() throws IOException {
+    createDefaultSetup(null);
+
+    Date startDate = new Date(System.currentTimeMillis() - 2 * 60 * 1000);
+    SimpleDateFormat sf = new SimpleDateFormat("yyyy/MM/dd");
+    String start = sf.format(startDate);
+
+    Date enddate = new Date(System.currentTimeMillis() + 2 * 60 * 60 * 1000);
+    String end = sf.format(enddate);
+
+    final VM vm1 = Host.getHost(0).getVM(1);
+    final String vm1MemberId = (String) vm1.invoke(MiscellaneousCommandsDUnitTest.class, "getMemberId");
+    String dir = getCurrentTimeString();
+
+    String logLevel = LogWriterImpl.levelToString(LogWriterImpl.INFO_LEVEL);
+
+    MiscellaneousCommands misc = new MiscellaneousCommands();
+    getCache();
+
+    Result cmdResult = misc.exportLogsPreprocessing("./testExportLogsForMember" + dir, null, vm1MemberId, logLevel,
+        false, false, start, end, 1);
+
+    getLogWriter().info("testExportLogsForMember command result =" + cmdResult);
+
+    if (cmdResult != null) {
+      String cmdStringRsult = commandResultToString((CommandResult) cmdResult);
+      getLogWriter().info("testExportLogsForMember cmdStringRsult=" + cmdStringRsult);
+      assertEquals(Result.Status.OK, cmdResult.getStatus());
+    } else {
+      fail("testExportLogsForMember failed as did not get CommandResult");
+    }
+    FileUtil.delete(new File("testExportLogsForMember" + dir));
+  }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/eddef322/gemfire-core/src/test/java/com/gemstone/gemfire/management/internal/cli/commands/MiscellaneousCommandsExportLogsPart4DUnitTest.java
----------------------------------------------------------------------
diff --git a/gemfire-core/src/test/java/com/gemstone/gemfire/management/internal/cli/commands/MiscellaneousCommandsExportLogsPart4DUnitTest.java b/gemfire-core/src/test/java/com/gemstone/gemfire/management/internal/cli/commands/MiscellaneousCommandsExportLogsPart4DUnitTest.java
new file mode 100644
index 0000000..da12c6e
--- /dev/null
+++ b/gemfire-core/src/test/java/com/gemstone/gemfire/management/internal/cli/commands/MiscellaneousCommandsExportLogsPart4DUnitTest.java
@@ -0,0 +1,141 @@
+/*
+ * 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 com.gemstone.gemfire.management.internal.cli.commands;
+
+import com.gemstone.gemfire.cache.Cache;
+import com.gemstone.gemfire.cache.Region;
+import com.gemstone.gemfire.cache.RegionFactory;
+import com.gemstone.gemfire.cache.RegionShortcut;
+import com.gemstone.gemfire.internal.FileUtil;
+import com.gemstone.gemfire.internal.logging.LogWriterImpl;
+import com.gemstone.gemfire.management.cli.Result;
+import com.gemstone.gemfire.management.internal.cli.result.CommandResult;
+import dunit.Host;
+import dunit.SerializableRunnable;
+import dunit.VM;
+
+import java.io.File;
+import java.io.IOException;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+/**
+ * Dunit class for testing gemfire function commands : export logs
+ *
+ * @author apande
+ */
+public class MiscellaneousCommandsExportLogsPart4DUnitTest extends CliCommandTestBase {
+
+  private static final long serialVersionUID = 1L;
+
+  public MiscellaneousCommandsExportLogsPart4DUnitTest(String name) {
+    super(name);
+  }
+
+  public static String getMemberId() {
+    Cache cache = new GemfireDataCommandsDUnitTest("test").getCache();
+    return cache.getDistributedSystem().getDistributedMember().getId();
+  }
+
+  @Override
+  public void tearDown2() throws Exception {
+    super.tearDown2();
+  }
+
+  void setupForExportLogs() {
+    final VM vm1 = Host.getHost(0).getVM(1);
+    createDefaultSetup(null);
+
+    vm1.invoke(new SerializableRunnable() {
+      public void run() {
+        // no need to close cache as it will be closed as part of teardown2
+        Cache cache = getCache();
+
+        RegionFactory<Integer, Integer> dataRegionFactory = cache.createRegionFactory(RegionShortcut.PARTITION);
+        Region region = dataRegionFactory.create("testRegion");
+        for (int i = 0; i < 5; i++) {
+          region.put("key" + (i + 200), "value" + (i + 200));
+        }
+      }
+    });
+  }
+
+  String getCurrentTimeString() {
+    SimpleDateFormat sf = new SimpleDateFormat("yyyy_MM_dd_HH_mm_ss_SSS_z");
+    Date startDate = new Date(System.currentTimeMillis());
+    String formattedStartDate = sf.format(startDate);
+    return ("_" + formattedStartDate);
+  }
+
+  public void testExportLogsForTimeRange1() throws IOException {
+    setupForExportLogs();
+    Date startDate = new Date(System.currentTimeMillis() - 1 * 60 * 1000);
+    SimpleDateFormat sf = new SimpleDateFormat("yyyy/MM/dd");
+    String start = sf.format(startDate);
+
+    Date enddate = new Date(System.currentTimeMillis() + 1 * 60 * 60 * 1000);
+    String end = sf.format(enddate);
+    String dir = getCurrentTimeString();
+
+    String logLevel = LogWriterImpl.levelToString(LogWriterImpl.INFO_LEVEL);
+
+    MiscellaneousCommands misc = new MiscellaneousCommands();
+    getCache();
+
+    Result cmdResult = misc.exportLogsPreprocessing("./testExportLogsForTimeRange1" + dir, null, null, logLevel, false,
+        false, start, end, 1);
+
+    getLogWriter().info("testExportLogsForTimeRange1 command result =" + cmdResult);
+
+    if (cmdResult != null) {
+      String cmdStringRsult = commandResultToString((CommandResult) cmdResult);
+      getLogWriter().info("testExportLogsForTimeRange1 cmdStringRsult=" + cmdStringRsult);
+      assertEquals(Result.Status.OK, cmdResult.getStatus());
+    } else {
+      fail("testExportLogsForTimeRange1 failed as did not get CommandResult");
+    }
+    FileUtil.delete(new File("testExportLogsForTimeRange1" + dir));
+  }
+
+  public void testExportLogsForTimeRangeForOnlyStartTime() throws IOException {
+    setupForExportLogs();
+    Date date = new Date();
+    date.setTime(System.currentTimeMillis() - 30 * 1000);
+    SimpleDateFormat sf = new SimpleDateFormat("yyyy/MM/dd/HH:mm");
+    String s = sf.format(date);
+    String dir = getCurrentTimeString();
+
+    String logLevel = LogWriterImpl.levelToString(LogWriterImpl.INFO_LEVEL);
+
+    MiscellaneousCommands misc = new MiscellaneousCommands();
+    getCache();
+
+    Result cmdResult = misc.exportLogsPreprocessing("./testExportLogsForTimeRangeForOnlyStartTime" + dir, null, null,
+        logLevel, false, false, s, null, 1);
+
+    getLogWriter().info("testExportLogsForTimeRangeForOnlyStartTime command result =" + cmdResult);
+
+    if (cmdResult != null) {
+      String cmdStringRsult = commandResultToString((CommandResult) cmdResult);
+      getLogWriter().info("testExportLogsForTimeRangeForOnlyStartTime cmdStringRsult=" + cmdStringRsult);
+      assertEquals(Result.Status.OK, cmdResult.getStatus());
+    } else {
+      fail("testExportLogsForTimeRangeForOnlyStartTime failed as did not get CommandResult");
+    }
+    FileUtil.delete(new File("testExportLogsForTimeRangeForOnlyStartTime" + dir));
+  }
+}
\ No newline at end of file