DRILL-7628: Fix Mongo tests broken after the fix for DRILL-7547

closes #2015
diff --git a/contrib/storage-mongo/pom.xml b/contrib/storage-mongo/pom.xml
index 6c4aa44..27f15c3 100644
--- a/contrib/storage-mongo/pom.xml
+++ b/contrib/storage-mongo/pom.xml
@@ -31,7 +31,7 @@
   <name>contrib/mongo-storage-plugin</name>
 
   <properties>
-     <mongo.TestSuite>**/MongoTestSuit.class</mongo.TestSuite>
+     <mongo.TestSuite>**/MongoTestSuite.class</mongo.TestSuite>
   </properties>
 
   <dependencies>
diff --git a/contrib/storage-mongo/src/main/java/org/apache/drill/exec/store/mongo/DrillMongoConstants.java b/contrib/storage-mongo/src/main/java/org/apache/drill/exec/store/mongo/DrillMongoConstants.java
index 5c6f68e..2ce8a2c 100644
--- a/contrib/storage-mongo/src/main/java/org/apache/drill/exec/store/mongo/DrillMongoConstants.java
+++ b/contrib/storage-mongo/src/main/java/org/apache/drill/exec/store/mongo/DrillMongoConstants.java
@@ -19,33 +19,39 @@
 
 public interface DrillMongoConstants {
 
-  public static final String SYS_STORE_PROVIDER_MONGO_URL = "drill.exec.sys.store.provider.mongo.url";
+  String SYS_STORE_PROVIDER_MONGO_URL = "drill.exec.sys.store.provider.mongo.url";
 
-  public static final String ID = "_id";
+  String ID = "_id";
 
-  public static final String SHARDS = "shards";
+  String SHARDS = "shards";
 
-  public static final String NS = "ns";
+  String NS = "ns";
 
-  public static final String SHARD = "shard";
+  String SHARD = "shard";
 
-  public static final String HOST = "host";
+  String HOST = "host";
 
-  public static final String CHUNKS = "chunks";
+  String CHUNKS = "chunks";
 
-  public static final String SIZE = "size";
+  String SIZE = "size";
 
-  public static final String COUNT = "count";
+  String COUNT = "count";
 
-  public static final String CONFIG = "config";
+  String CONFIG = "config";
 
-  public static final String MIN = "min";
+  String MIN = "min";
 
-  public static final String MAX = "max";
+  String MAX = "max";
 
-  public static final String PARTITIONED = "partitioned";
+  String PARTITIONED = "partitioned";
 
-  public static final String PRIMARY = "primary";
+  String PRIMARY = "primary";
 
-  public static final String DATABASES = "databases";
+  String DATABASES = "databases";
+
+  String STORE_CONFIG_PREFIX = "drill.exec.store.";
+
+  String USERNAME_CONFIG_SUFFIX = ".username";
+
+  String PASSWORD_CONFIG_SUFFIX = ".password";
 }
diff --git a/contrib/storage-mongo/src/main/java/org/apache/drill/exec/store/mongo/MongoStoragePlugin.java b/contrib/storage-mongo/src/main/java/org/apache/drill/exec/store/mongo/MongoStoragePlugin.java
index 2dfba8c..1ed2026 100644
--- a/contrib/storage-mongo/src/main/java/org/apache/drill/exec/store/mongo/MongoStoragePlugin.java
+++ b/contrib/storage-mongo/src/main/java/org/apache/drill/exec/store/mongo/MongoStoragePlugin.java
@@ -45,7 +45,6 @@
 
 import java.io.IOException;
 import java.net.URLEncoder;
-import java.util.Arrays;
 import java.util.Collections;
 import java.util.List;
 import java.util.Set;
@@ -60,9 +59,9 @@
   private final MongoClientURI clientURI;
 
   public MongoStoragePlugin(
-    MongoStoragePluginConfig mongoConfig,
-    DrillbitContext context,
-    String name) throws IOException, ExecutionSetupException {
+      MongoStoragePluginConfig mongoConfig,
+      DrillbitContext context,
+      String name) throws ExecutionSetupException {
     super(context, name);
     this.mongoConfig = mongoConfig;
     String connection = addCredentialsFromCredentialsProvider(this.mongoConfig.getConnection(), name);
@@ -73,20 +72,22 @@
     this.schemaFactory = new MongoSchemaFactory(this, name);
   }
 
-  private static final String addCredentialsFromCredentialsProvider(String connection, String name) {
+  private static String addCredentialsFromCredentialsProvider(String connection, String name) {
     MongoClientURI parsed = new MongoClientURI(connection);
     if (parsed.getCredentials() == null) {
       Configuration configuration = new Configuration();
       try {
         // The default connection has the name "mongo" but multiple connections can be added;
         // each will need their own credentials.
-        char[] usernameChars = configuration.getPassword("drill.exec.store." + name + ".username");
-        char[] passwordChars = configuration.getPassword("drill.exec.store." + name + ".password");
+        char[] usernameChars = configuration.getPassword(
+            DrillMongoConstants.STORE_CONFIG_PREFIX + name + DrillMongoConstants.USERNAME_CONFIG_SUFFIX);
+        char[] passwordChars = configuration.getPassword(
+            DrillMongoConstants.STORE_CONFIG_PREFIX + name + DrillMongoConstants.PASSWORD_CONFIG_SUFFIX);
         if (usernameChars != null && passwordChars != null) {
           String username = URLEncoder.encode(new String(usernameChars), "UTF-8");
           String password = URLEncoder.encode(new String(passwordChars), "UTF-8");
-          String updatedUrl = connection.replaceFirst("://", "://" + username + ":" + password + "@");
-          return updatedUrl.toString();
+          return connection.replaceFirst("://",
+              String.format("://%s:%s@", username, password));
         }
       } catch (IOException e) {
         logger.error("Error fetching mongodb username and password from configuration", e);
@@ -123,7 +124,7 @@
   }
 
 
-  private class AddressCloser implements
+  private static class AddressCloser implements
     RemovalListener<MongoCnxnKey, MongoClient> {
     @Override
     public synchronized void onRemoval(
@@ -155,8 +156,7 @@
     MongoClient client = addressClientMap.getIfPresent(key);
     if (client == null) {
       if (credential != null) {
-        List<MongoCredential> credentialList = Arrays.asList(credential);
-        client = new MongoClient(addresses, credentialList, clientURI.getOptions());
+        client = new MongoClient(addresses, credential, clientURI.getOptions());
       } else {
         client = new MongoClient(addresses, clientURI.getOptions());
       }
@@ -168,7 +168,7 @@
   }
 
   @Override
-  public void close() throws Exception {
+  public void close() {
     addressClientMap.invalidateAll();
   }
 
diff --git a/contrib/storage-mongo/src/test/java/org/apache/drill/exec/store/mongo/MongoTestConstants.java b/contrib/storage-mongo/src/test/java/org/apache/drill/exec/store/mongo/MongoTestConstants.java
index 6e69447..a6d9d2f 100644
--- a/contrib/storage-mongo/src/test/java/org/apache/drill/exec/store/mongo/MongoTestConstants.java
+++ b/contrib/storage-mongo/src/test/java/org/apache/drill/exec/store/mongo/MongoTestConstants.java
@@ -35,6 +35,7 @@
   int MONGOS_PORT = 27017;
 
   String EMPLOYEE_DB = "employee";
+  String AUTHENTICATION_DB = "admin";
   String DONUTS_DB = "donuts";
 
   String DONUTS_COLLECTION = "donuts";
diff --git a/contrib/storage-mongo/src/test/java/org/apache/drill/exec/store/mongo/MongoTestSuite.java b/contrib/storage-mongo/src/test/java/org/apache/drill/exec/store/mongo/MongoTestSuite.java
index 6f8b165..7797cdd 100644
--- a/contrib/storage-mongo/src/test/java/org/apache/drill/exec/store/mongo/MongoTestSuite.java
+++ b/contrib/storage-mongo/src/test/java/org/apache/drill/exec/store/mongo/MongoTestSuite.java
@@ -17,6 +17,7 @@
  */
 package org.apache.drill.exec.store.mongo;
 
+import com.mongodb.BasicDBObject;
 import com.mongodb.MongoClient;
 import com.mongodb.ServerAddress;
 import com.mongodb.client.MongoCollection;
@@ -44,6 +45,7 @@
 import org.apache.drill.categories.SlowTest;
 import org.apache.drill.shaded.guava.com.google.common.collect.Lists;
 import org.apache.drill.test.BaseTest;
+import org.apache.hadoop.conf.Configuration;
 import org.bson.Document;
 import org.bson.conversions.Bson;
 import org.junit.AfterClass;
@@ -56,23 +58,26 @@
 import org.slf4j.LoggerFactory;
 
 import java.io.IOException;
+import java.net.URLEncoder;
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.concurrent.atomic.AtomicInteger;
 
 @RunWith(Suite.class)
-@SuiteClasses({ TestMongoFilterPushDown.class, TestMongoProjectPushDown.class,
-    TestMongoQueries.class, TestMongoChunkAssignment.class })
+@SuiteClasses({TestMongoFilterPushDown.class, TestMongoProjectPushDown.class,
+    TestMongoQueries.class, TestMongoChunkAssignment.class,
+    TestMongoStoragePluginUsesCredentialsStore.class})
 @Category({SlowTest.class, MongoStorageTest.class})
 public class MongoTestSuite extends BaseTest implements MongoTestConstants {
 
   private static final Logger logger = LoggerFactory.getLogger(MongoTestSuite.class);
   protected static MongoClient mongoClient;
 
-  private static boolean distMode = Boolean.valueOf(System.getProperty("drill.mongo.tests.shardMode", "false"));
-  private static boolean authEnabled = Boolean.valueOf(System.getProperty("drill.mongo.tests.authEnabled", "false"));
+  private static boolean distMode = Boolean.parseBoolean(System.getProperty("drill.mongo.tests.shardMode", "false"));
+  private static boolean authEnabled = Boolean.parseBoolean(System.getProperty("drill.mongo.tests.authEnabled", "false"));
   private static volatile String connectionURL = null;
   private static volatile AtomicInteger initCount = new AtomicInteger(0);
 
@@ -138,13 +143,12 @@
 
       Storage replication = new Storage(null, CONFIG_REPLICA_SET, 0);
 
-      IMongodConfig mongodConfig = new MongodConfigBuilder()
+      return new MongodConfigBuilder()
           .version(Version.Main.V3_4)
           .net(new Net(LOCALHOST, configServerPort, Network.localhostIsIPv6()))
           .replication(replication)
           .shardServer(false)
           .configServer(true).cmdOptions(cmdOptions).build();
-      return mongodConfig;
     }
 
     private static IMongodConfig crateIMongodConfig(int mongodPort, boolean flag, String replicaName)
@@ -158,14 +162,13 @@
         .build();
 
       Storage replication = new Storage(null, replicaName, 0);
-      IMongodConfig mongodConfig = new MongodConfigBuilder()
+
+      return new MongodConfigBuilder()
           .version(Version.Main.V3_4)
-        .shardServer(true)
+          .shardServer(true)
           .net(new Net(LOCALHOST, mongodPort, Network.localhostIsIPv6()))
           .configServer(flag).replication(replication).cmdOptions(cmdOptions)
           .build();
-
-      return mongodConfig;
     }
 
     private static IMongosConfig createIMongosConfig() throws IOException {
@@ -177,13 +180,12 @@
         .verbose(false)
         .build();
 
-      IMongosConfig mongosConfig = new MongosConfigBuilder()
+      return new MongosConfigBuilder()
           .version(Version.Main.V3_4)
           .net(new Net(LOCALHOST, MONGOS_PORT, Network.localhostIsIPv6()))
           .replicaSet(CONFIG_REPLICA_SET)
           .configDB(LOCALHOST + ":" + CONFIG_SERVER_1_PORT)
           .cmdOptions(cmdOptions).build();
-      return mongosConfig;
     }
 
     private static void cleanup() {
@@ -220,6 +222,8 @@
           mongodConfig);
       mongod = mongodExecutable.start();
       mongoClient = new MongoClient(new ServerAddress(LOCALHOST, MONGOS_PORT));
+
+      createMongoUser();
       createDbAndCollections(EMPLOYEE_DB, EMPINFO_COLLECTION, "employee_id");
       createDbAndCollections(EMPLOYEE_DB, SCHEMA_CHANGE_COLLECTION, "field_2");
       createDbAndCollections(EMPLOYEE_DB, EMPTY_COLLECTION, "field_2");
@@ -278,8 +282,29 @@
     mongoCollection.createIndex(keys, indexOptions);
   }
 
+  private static void createMongoUser() throws IOException {
+    Configuration configuration = new Configuration();
+    String storeName = "mongo";
+    char[] usernameChars = configuration.getPassword(DrillMongoConstants.STORE_CONFIG_PREFIX + storeName + DrillMongoConstants.USERNAME_CONFIG_SUFFIX);
+    char[] passwordChars = configuration.getPassword(DrillMongoConstants.STORE_CONFIG_PREFIX + storeName + DrillMongoConstants.PASSWORD_CONFIG_SUFFIX);
+    if (usernameChars != null && passwordChars != null) {
+      String username = URLEncoder.encode(new String(usernameChars), "UTF-8");
+      String password = URLEncoder.encode(new String(passwordChars), "UTF-8");
+
+      BasicDBObject createUserCommand = new BasicDBObject("createUser", username)
+          .append("pwd", password)
+          .append("roles",
+              Collections.singletonList(
+                  new BasicDBObject("role", "readWrite")
+                      .append("db", AUTHENTICATION_DB)));
+
+      MongoDatabase db = mongoClient.getDatabase(AUTHENTICATION_DB);
+      db.runCommand(createUserCommand);
+    }
+  }
+
   @AfterClass
-  public static void tearDownCluster() throws Exception {
+  public static void tearDownCluster() {
     synchronized (MongoTestSuite.class) {
       if (initCount.decrementAndGet() == 0) {
         try {
diff --git a/contrib/storage-mongo/src/test/java/org/apache/drill/exec/store/mongo/TestMongoStoragePluginUsesCredentialsStore.java b/contrib/storage-mongo/src/test/java/org/apache/drill/exec/store/mongo/TestMongoStoragePluginUsesCredentialsStore.java
index 58d9bf2..f5da553 100644
--- a/contrib/storage-mongo/src/test/java/org/apache/drill/exec/store/mongo/TestMongoStoragePluginUsesCredentialsStore.java
+++ b/contrib/storage-mongo/src/test/java/org/apache/drill/exec/store/mongo/TestMongoStoragePluginUsesCredentialsStore.java
@@ -18,17 +18,20 @@
 package org.apache.drill.exec.store.mongo;
 
 import com.mongodb.MongoCredential;
+import org.apache.drill.categories.MongoStorageTest;
 import org.apache.drill.common.exceptions.ExecutionSetupException;
+import org.apache.drill.test.BaseTest;
 import org.junit.Test;
+import org.junit.experimental.categories.Category;
 
-import java.io.IOException;
 import java.util.List;
 
 import static org.junit.Assert.assertEquals;
 
-public class TestMongoStoragePluginUsesCredentialsStore {
+@Category({MongoStorageTest.class})
+public class TestMongoStoragePluginUsesCredentialsStore extends BaseTest {
 
-  private void test(String expectedUserName, String expectedPassword, String connection, String name) throws IOException, ExecutionSetupException {
+  private void test(String expectedUserName, String expectedPassword, String connection, String name) throws ExecutionSetupException {
     MongoStoragePlugin plugin = new MongoStoragePlugin(new MongoStoragePluginConfig(
       connection), null, name);
     List<MongoCredential> creds = plugin.getClient().getCredentialsList();