From 84e187d76943fe5bb6f9537968e351d36add94d8 Mon Sep 17 00:00:00 2001
From: Gaetan Boismal <gaetan.boismal@forgerock.com>
Date: Fri, 04 Jul 2014 08:18:20 +0000
Subject: [PATCH] OPENDJ-1505 (CR-3946) OpenDJ SDK tools prompt for user credentials even when none are needed * ConnectionFactoryProvider.java DSConfig.java ** Refactoring code by removing unused constructor and fields ** Perform anonymous connection by default * src/main[..]/ldap/tools/*.java ** Making tools not interactive * src/test[..]/ldap/tools/*.java ** Adding some basic integration tests cases to ensure that general tools behavior is ok * pom.xml ** Update and clean dependencies

---
 opendj-config/src/main/java/org/forgerock/opendj/config/dsconfig/DSConfig.java            |    2 
 opendj-ldap-toolkit/src/main/java/com/forgerock/opendj/ldap/tools/AuthRate.java           |   15 +
 opendj-ldap-toolkit/src/test/java/com/forgerock/opendj/ldap/tools/AuthRateITCase.java     |   84 +++++++++
 opendj-ldap-toolkit/src/test/java/com/forgerock/opendj/ldap/tools/LDAPSearchITCase.java   |  100 +++++++++++
 opendj-cli/src/main/java/com/forgerock/opendj/cli/ConnectionFactoryProvider.java          |   30 --
 opendj-ldap-toolkit/src/test/java/com/forgerock/opendj/ldap/tools/ToolsITCase.java        |   95 ++++++++++
 opendj-ldap-toolkit/src/main/java/com/forgerock/opendj/ldap/tools/SearchRate.java         |    8 
 opendj-ldap-toolkit/pom.xml                                                               |   29 ++
 opendj-ldap-toolkit/src/main/java/com/forgerock/opendj/ldap/tools/LDAPCompare.java        |   33 ++-
 opendj-ldap-toolkit/src/main/java/com/forgerock/opendj/ldap/tools/LDAPSearch.java         |   14 +
 opendj-ldap-toolkit/src/test/java/com/forgerock/opendj/ldap/tools/LDAPCompareITCase.java  |  103 +++++++++++
 opendj-ldap-toolkit/src/main/java/com/forgerock/opendj/ldap/tools/LDAPPasswordModify.java |    8 
 opendj-ldap-toolkit/src/main/java/com/forgerock/opendj/ldap/tools/LDAPModify.java         |   10 +
 13 files changed, 487 insertions(+), 44 deletions(-)

diff --git a/opendj-cli/src/main/java/com/forgerock/opendj/cli/ConnectionFactoryProvider.java b/opendj-cli/src/main/java/com/forgerock/opendj/cli/ConnectionFactoryProvider.java
index dcabc64..f7eae61 100644
--- a/opendj-cli/src/main/java/com/forgerock/opendj/cli/ConnectionFactoryProvider.java
+++ b/opendj-cli/src/main/java/com/forgerock/opendj/cli/ConnectionFactoryProvider.java
@@ -155,9 +155,6 @@
     /** The console application linked to this connection in interactive mode. */
     private final ConsoleApplication app;
 
-    /** The LDAP options for this connection. */
-    private LDAPOptions options;
-
     /** If this connection should be an admin connection. */
     private boolean isAdminConnection = false;
 
@@ -174,25 +171,7 @@
      */
     public ConnectionFactoryProvider(final ArgumentParser argumentParser,
             final ConsoleApplication app) throws ArgumentException {
-        this(argumentParser, app, CliConstants.DEFAULT_ROOT_USER_DN, DEFAULT_LDAP_PORT, false, null);
-    }
-
-    /**
-     * Default constructor to create a connection factory designed for use with command line tools,
-     * adding basic LDAP connection arguments to the specified parser (e.g: hostname, bindname...etc).
-     *
-     * @param argumentParser
-     *            The argument parser.
-     * @param app
-     *            The console application linked to this connection factory.
-     * @param options
-     *            The common options for this LDAP client connection.
-     * @throws ArgumentException
-     *             If an error occurs during parsing the arguments.
-     */
-    public ConnectionFactoryProvider(final ArgumentParser argumentParser, final ConsoleApplication app,
-            final LDAPOptions options) throws ArgumentException {
-        this(argumentParser, app, CliConstants.DEFAULT_ROOT_USER_DN, DEFAULT_LDAP_PORT, false, options);
+        this(argumentParser, app, "", DEFAULT_LDAP_PORT, false);
     }
 
     /**
@@ -209,16 +188,13 @@
      *            The LDAP port default's value.
      * @param alwaysSSL
      *            {@code true} if this connection should be used with SSL.
-     * @param options
-     *            The LDAP options of this connection factory.
      * @throws ArgumentException
      *             If an error occurs during parsing the elements.
      */
     public ConnectionFactoryProvider(final ArgumentParser argumentParser,
             final ConsoleApplication app, final String defaultBindDN, final int defaultPort,
-            final boolean alwaysSSL, final LDAPOptions options) throws ArgumentException {
+            final boolean alwaysSSL) throws ArgumentException {
         this.app = app;
-        this.options = options == null ? new LDAPOptions() : options;
         useSSLArg = CommonArguments.getUseSSL();
 
         if (!alwaysSSL) {
@@ -450,6 +426,8 @@
                         e);
             }
 
+            LDAPOptions options = new LDAPOptions();
+
             if (sslContext != null) {
                 options.setSSLContext(sslContext).setUseStartTLS(useStartTLSArg.isPresent());
             }
diff --git a/opendj-config/src/main/java/org/forgerock/opendj/config/dsconfig/DSConfig.java b/opendj-config/src/main/java/org/forgerock/opendj/config/dsconfig/DSConfig.java
index 5622681..0f32167 100644
--- a/opendj-config/src/main/java/org/forgerock/opendj/config/dsconfig/DSConfig.java
+++ b/opendj-config/src/main/java/org/forgerock/opendj/config/dsconfig/DSConfig.java
@@ -567,7 +567,7 @@
         ConnectionFactoryProvider cfp = null;
         try {
             cfp = new ConnectionFactoryProvider(parser, this, CliConstants.DEFAULT_ROOT_USER_DN,
-                    CliConstants.DEFAULT_ADMINISTRATION_CONNECTOR_PORT, true, null);
+                    CliConstants.DEFAULT_ADMINISTRATION_CONNECTOR_PORT, true);
             cfp.setIsAnAdminConnection();
 
             // Parse the command-line arguments provided to this program.
diff --git a/opendj-ldap-toolkit/pom.xml b/opendj-ldap-toolkit/pom.xml
index c1bbb87..133bad6 100644
--- a/opendj-ldap-toolkit/pom.xml
+++ b/opendj-ldap-toolkit/pom.xml
@@ -40,9 +40,13 @@
   <dependencies>
     <dependency>
       <groupId>org.forgerock.opendj</groupId>
-      <artifactId>opendj-ldap-sdk</artifactId>
+      <artifactId>opendj-core</artifactId>
       <version>${project.version}</version>
-      <type>pom</type>
+    </dependency>
+    <dependency>
+      <groupId>org.forgerock.opendj</groupId>
+      <artifactId>opendj-grizzly</artifactId>
+      <version>${project.version}</version>
     </dependency>
     <dependency>
       <groupId>org.slf4j</groupId>
@@ -62,7 +66,14 @@
       <version>${project.version}</version>
     </dependency>
     <dependency>
-      <groupId>org.forgerock</groupId>
+      <groupId>org.forgerock.opendj</groupId>
+      <artifactId>opendj-core</artifactId>
+      <version>${project.version}</version>
+      <type>test-jar</type>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+   	  <groupId>org.forgerock</groupId>
       <artifactId>forgerock-build-tools</artifactId>
       <version>${forgerockBuildToolsVersion}</version>
       <scope>test</scope>
@@ -121,6 +132,18 @@
           </execution>
         </executions>
       </plugin>
+      <plugin>
+          <groupId>org.apache.maven.plugins</groupId>
+          <artifactId>maven-failsafe-plugin</artifactId>
+          <executions>
+	          <execution>
+	          	<goals>
+	          		<goal>integration-test</goal>
+	          		<goal>verify</goal>
+	          	</goals>
+	          </execution>
+          </executions>
+     </plugin>
     </plugins>
   </build>
 </project>
diff --git a/opendj-ldap-toolkit/src/main/java/com/forgerock/opendj/ldap/tools/AuthRate.java b/opendj-ldap-toolkit/src/main/java/com/forgerock/opendj/ldap/tools/AuthRate.java
index 54bd9a6..3e81eec 100644
--- a/opendj-ldap-toolkit/src/main/java/com/forgerock/opendj/ldap/tools/AuthRate.java
+++ b/opendj-ldap-toolkit/src/main/java/com/forgerock/opendj/ldap/tools/AuthRate.java
@@ -31,6 +31,7 @@
 import static com.forgerock.opendj.ldap.tools.Utils.setDefaultPerfToolProperties;
 import static com.forgerock.opendj.cli.Utils.filterExitCode;
 
+import java.io.PrintStream;
 import java.util.ArrayList;
 import java.util.LinkedList;
 import java.util.List;
@@ -356,6 +357,18 @@
         // Nothing to do.
     }
 
+    /**
+     * Constructor to allow tests.
+     *
+     * @param out
+     *            output stream of console application
+     * @param err
+     *            error stream of console application
+     */
+    AuthRate(PrintStream out, PrintStream err) {
+        super(out, err);
+    }
+
     /** {@inheritDoc} */
     @Override
     public boolean isInteractive() {
@@ -374,7 +387,7 @@
         return verbose.isPresent();
     }
 
-    private int run(final String[] args) {
+    int run(final String[] args) {
         // Create the command-line argument parser for use with this program.
         final LocalizableMessage toolDescription = INFO_AUTHRATE_TOOL_DESCRIPTION.get();
         final ArgumentParser argParser =
diff --git a/opendj-ldap-toolkit/src/main/java/com/forgerock/opendj/ldap/tools/LDAPCompare.java b/opendj-ldap-toolkit/src/main/java/com/forgerock/opendj/ldap/tools/LDAPCompare.java
index 0b24fa3..e83ea77 100644
--- a/opendj-ldap-toolkit/src/main/java/com/forgerock/opendj/ldap/tools/LDAPCompare.java
+++ b/opendj-ldap-toolkit/src/main/java/com/forgerock/opendj/ldap/tools/LDAPCompare.java
@@ -30,12 +30,14 @@
 import static com.forgerock.opendj.ldap.tools.ToolsMessages.*;
 import static com.forgerock.opendj.cli.Utils.filterExitCode;
 import static com.forgerock.opendj.cli.Utils.readBytesFromFile;
+import static org.forgerock.util.Utils.closeSilently;
 
 import java.io.BufferedReader;
 import java.io.FileNotFoundException;
 import java.io.FileReader;
 import java.io.IOException;
 import java.io.InputStreamReader;
+import java.io.PrintStream;
 import java.util.ArrayList;
 
 import org.forgerock.i18n.LocalizableMessage;
@@ -86,6 +88,24 @@
     }
 
     /**
+     * Constructor to allow tests.
+     *
+     * @param out output stream of console application
+     * @param err error stream of console application
+     */
+    LDAPCompare(PrintStream out, PrintStream err) {
+      super(out, err);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public boolean isInteractive() {
+        return false;
+    }
+
+    /**
      * {@inheritDoc}
      */
     @Override
@@ -123,7 +143,7 @@
         return ResultCode.SUCCESS.intValue();
     }
 
-    private int run(final String[] args) {
+    int run(final String[] args) {
         // Create the command-line argument parser for use with this
         // program.
         final LocalizableMessage toolDescription = INFO_LDAPCOMPARE_TOOL_DESCRIPTION.get();
@@ -382,16 +402,7 @@
                 }
             }
         } finally {
-            if (connection != null) {
-                connection.close();
-            }
-            if (rdr != null) {
-                try {
-                    rdr.close();
-                } catch (final IOException ioe) {
-                    // Just ignore
-                }
-            }
+            closeSilently(connection, rdr);
         }
 
         return 0;
diff --git a/opendj-ldap-toolkit/src/main/java/com/forgerock/opendj/ldap/tools/LDAPModify.java b/opendj-ldap-toolkit/src/main/java/com/forgerock/opendj/ldap/tools/LDAPModify.java
index 0b4d9d7..8a02a6f 100644
--- a/opendj-ldap-toolkit/src/main/java/com/forgerock/opendj/ldap/tools/LDAPModify.java
+++ b/opendj-ldap-toolkit/src/main/java/com/forgerock/opendj/ldap/tools/LDAPModify.java
@@ -237,11 +237,19 @@
      * {@inheritDoc}
      */
     @Override
+    public boolean isInteractive() {
+        return false;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
     public boolean isVerbose() {
         return verbose.isPresent();
     }
 
-    private int run(final String[] args) {
+    int run(final String[] args) {
         // Create the command-line argument parser for use with this program.
         final LocalizableMessage toolDescription = INFO_LDAPMODIFY_TOOL_DESCRIPTION.get();
         final ArgumentParser argParser =
diff --git a/opendj-ldap-toolkit/src/main/java/com/forgerock/opendj/ldap/tools/LDAPPasswordModify.java b/opendj-ldap-toolkit/src/main/java/com/forgerock/opendj/ldap/tools/LDAPPasswordModify.java
index cec3939..128b0a1 100644
--- a/opendj-ldap-toolkit/src/main/java/com/forgerock/opendj/ldap/tools/LDAPPasswordModify.java
+++ b/opendj-ldap-toolkit/src/main/java/com/forgerock/opendj/ldap/tools/LDAPPasswordModify.java
@@ -87,6 +87,14 @@
      * {@inheritDoc}
      */
     @Override
+    public boolean isInteractive() {
+        return false;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
     public boolean isVerbose() {
         return verbose.isPresent();
     }
diff --git a/opendj-ldap-toolkit/src/main/java/com/forgerock/opendj/ldap/tools/LDAPSearch.java b/opendj-ldap-toolkit/src/main/java/com/forgerock/opendj/ldap/tools/LDAPSearch.java
index 9a5a2d1..5d39099 100644
--- a/opendj-ldap-toolkit/src/main/java/com/forgerock/opendj/ldap/tools/LDAPSearch.java
+++ b/opendj-ldap-toolkit/src/main/java/com/forgerock/opendj/ldap/tools/LDAPSearch.java
@@ -35,6 +35,7 @@
 import java.io.BufferedReader;
 import java.io.FileReader;
 import java.io.IOException;
+import java.io.PrintStream;
 import java.util.ArrayList;
 import java.util.Iterator;
 import java.util.LinkedList;
@@ -214,6 +215,16 @@
         // Nothing to do.
     }
 
+    /**
+     * Constructor to allow tests.
+     *
+     * @param out output stream of console application
+     * @param err error stream of console application
+     */
+    LDAPSearch(PrintStream out, PrintStream err) {
+      super(out, err);
+    }
+
     /** {@inheritDoc} */
     public boolean isInteractive() {
         return false;
@@ -225,7 +236,8 @@
         return verbose.isPresent();
     }
 
-    private int run(final String[] args, final boolean returnMatchingEntries) {
+    /** Run ldapsearch with provided command-line arguments. **/
+    int run(final String[] args, final boolean returnMatchingEntries) {
         /* Create the command-line argument parser for use with this
          program.*/
         final LocalizableMessage toolDescription = INFO_LDAPSEARCH_TOOL_DESCRIPTION.get();
diff --git a/opendj-ldap-toolkit/src/main/java/com/forgerock/opendj/ldap/tools/SearchRate.java b/opendj-ldap-toolkit/src/main/java/com/forgerock/opendj/ldap/tools/SearchRate.java
index 4aaba6e..66a312b 100644
--- a/opendj-ldap-toolkit/src/main/java/com/forgerock/opendj/ldap/tools/SearchRate.java
+++ b/opendj-ldap-toolkit/src/main/java/com/forgerock/opendj/ldap/tools/SearchRate.java
@@ -182,6 +182,14 @@
      * {@inheritDoc}
      */
     @Override
+    public boolean isInteractive() {
+        return false;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
     public boolean isScriptFriendly() {
         return scriptFriendly.isPresent();
     }
diff --git a/opendj-ldap-toolkit/src/test/java/com/forgerock/opendj/ldap/tools/AuthRateITCase.java b/opendj-ldap-toolkit/src/test/java/com/forgerock/opendj/ldap/tools/AuthRateITCase.java
new file mode 100644
index 0000000..af2cf50
--- /dev/null
+++ b/opendj-ldap-toolkit/src/test/java/com/forgerock/opendj/ldap/tools/AuthRateITCase.java
@@ -0,0 +1,84 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License").  You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at legal-notices/CDDLv1_0.txt
+ * or http://forgerock.org/license/CDDLv1.0.html.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at legal-notices/CDDLv1_0.txt.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information:
+ *      Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ *
+ *
+ *      Copyright 2014 ForgeRock AS.
+ */
+package com.forgerock.opendj.ldap.tools;
+
+import static com.forgerock.opendj.ldap.tools.ToolsMessages.ERR_ERROR_PARSING_ARGS;
+import static org.fest.assertions.Assertions.assertThat;
+import static org.forgerock.util.Utils.closeSilently;
+
+import java.io.PrintStream;
+
+import org.forgerock.opendj.ldap.ByteStringBuilder;
+import org.forgerock.opendj.ldap.TestCaseUtils;
+import org.testng.annotations.DataProvider;
+import org.testng.annotations.Test;
+
+public class AuthRateITCase extends ToolsITCase {
+
+    private static final String THROUGHPUT_TEXT = "Recent throughput (ops/second)";
+
+    @DataProvider
+    public Object[][] authRateArgs() throws Exception {
+        return new Object[][] {
+            { args(""), "", ERR_ERROR_PARSING_ARGS.get("") },
+            // Simple test
+            {
+                args("-h", TestCaseUtils.getServerSocketAddress().getHostName(), "-p",
+                    Integer.toString(TestCaseUtils.getServerSocketAddress().getPort()), "-g", "rand(0,1000)", "-D",
+                    "uid=%d,ou=people,o=test", "-w", "password", "-i", "1", "-c", "1", "-m", "10", "-f", "-S"),
+                THROUGHPUT_TEXT, "" }, };
+    }
+
+    @Test(dataProvider = "authRateArgs")
+    public void testITAuthRate(String[] arguments, Object expectedOut, Object expectedErr) throws Exception {
+        ByteStringBuilder out = new ByteStringBuilder();
+        ByteStringBuilder err = new ByteStringBuilder();
+
+        PrintStream outStream = new PrintStream(out.asOutputStream());
+        PrintStream errStream = new PrintStream(err.asOutputStream());
+
+        try {
+            AuthRate authRate = new AuthRate(outStream, errStream);
+
+            authRate.run(arguments);
+            checkOuputStreams(out, err, expectedOut, expectedErr);
+            String outContent = out.toString();
+
+            if (outContent.contains(THROUGHPUT_TEXT)) {
+                // Check that there was no error in search
+                String[] authRateResLines = outContent.split(System.getProperty("line.separator"));
+                //Skip header line
+                for (int i = 1; i < authRateResLines.length; i++) {
+                    String[] authRateLineData = authRateResLines[i].split(",");
+                    assertThat(authRateLineData[authRateLineData.length - 1].trim()).isEqualTo("0.0");
+                }
+
+            }
+        } finally {
+            closeSilently(outStream, errStream);
+        }
+    }
+}
diff --git a/opendj-ldap-toolkit/src/test/java/com/forgerock/opendj/ldap/tools/LDAPCompareITCase.java b/opendj-ldap-toolkit/src/test/java/com/forgerock/opendj/ldap/tools/LDAPCompareITCase.java
new file mode 100644
index 0000000..e3e91e5
--- /dev/null
+++ b/opendj-ldap-toolkit/src/test/java/com/forgerock/opendj/ldap/tools/LDAPCompareITCase.java
@@ -0,0 +1,103 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License").  You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at legal-notices/CDDLv1_0.txt
+ * or http://forgerock.org/license/CDDLv1.0.html.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at legal-notices/CDDLv1_0.txt.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information:
+ *      Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ *
+ *
+ *      Copyright 2014 ForgeRock AS.
+ */
+package com.forgerock.opendj.ldap.tools;
+
+import static com.forgerock.opendj.ldap.tools.ToolsMessages.INFO_COMPARE_OPERATION_RESULT_FALSE;
+import static com.forgerock.opendj.ldap.tools.ToolsMessages.INFO_COMPARE_OPERATION_RESULT_TRUE;
+import static com.forgerock.opendj.ldap.tools.ToolsMessages.INFO_LDAPCOMPARE_TOOL_DESCRIPTION;
+import static org.forgerock.util.Utils.closeSilently;
+
+import java.io.PrintStream;
+import java.util.Random;
+
+import org.forgerock.i18n.LocalizableMessage;
+import org.forgerock.opendj.ldap.ByteStringBuilder;
+import org.forgerock.opendj.ldap.TestCaseUtils;
+import org.testng.annotations.DataProvider;
+import org.testng.annotations.Test;
+
+public class LDAPCompareITCase extends ToolsITCase {
+
+    private static final int NB_RAND_SIMPLE_COMPARE = 10;
+    private static final int NB_OTHER_SIMPLE_SEARCH = 1;
+
+    @DataProvider
+    public Object[][] ldapCompareArgs() throws Exception {
+        Object[][] data = new Object[NB_RAND_SIMPLE_COMPARE + NB_OTHER_SIMPLE_SEARCH][];
+        Random rand = new Random();
+        long[] randUIDs = new long[NB_RAND_SIMPLE_COMPARE];
+
+        // Check if the help message is correctly prompted
+        data[0] = new Object[] { args("--help"), INFO_LDAPCOMPARE_TOOL_DESCRIPTION.get(), "" };
+
+        // Perform some basic comparison on random user from the test server
+        for (int i = 0; i < NB_RAND_SIMPLE_COMPARE; i++) {
+            randUIDs[i] = Math.round(rand.nextInt(1000));
+        }
+
+        for (int i = 0; i < NB_RAND_SIMPLE_COMPARE; i++) {
+            long firstUID = randUIDs[i];
+            // For first test, ensure that both uids are equals
+            long secondUID = i == 0 ? firstUID : randUIDs[rand.nextInt(randUIDs.length)];
+
+            data[i + NB_OTHER_SIMPLE_SEARCH] = produceLDAPCompareBasicTest(firstUID, secondUID);
+        }
+
+        return data;
+    }
+
+    private Object[] produceLDAPCompareBasicTest(long firstUID, long secondUID) {
+        String uid = String.format("uid:user.%d", firstUID);
+        String dn = String.format("uid=user.%d,ou=people,o=test", secondUID);
+        LocalizableMessage messageToCheck = INFO_COMPARE_OPERATION_RESULT_FALSE.get(dn);
+
+        if (firstUID == secondUID) {
+            messageToCheck = INFO_COMPARE_OPERATION_RESULT_TRUE.get(dn);
+        }
+
+        return new Object[] {
+            args("-h", TestCaseUtils.getServerSocketAddress().getHostName(), "-p",
+                Integer.toString(TestCaseUtils.getServerSocketAddress().getPort()), uid, dn), messageToCheck, "" };
+    }
+
+    @Test(dataProvider = "ldapCompareArgs")
+    public void testITLDAPSearch(String[] arguments, Object expectedOut, Object expectedErr) throws Exception {
+        ByteStringBuilder out = new ByteStringBuilder();
+        ByteStringBuilder err = new ByteStringBuilder();
+
+        PrintStream outStream = new PrintStream(out.asOutputStream());
+        PrintStream errStream = new PrintStream(err.asOutputStream());
+
+        try {
+            LDAPCompare ldapCompare = new LDAPCompare(outStream, errStream);
+
+            ldapCompare.run(arguments);
+            checkOuputStreams(out, err, expectedOut, expectedErr);
+        } finally {
+            closeSilently(outStream, errStream);
+        }
+    }
+}
diff --git a/opendj-ldap-toolkit/src/test/java/com/forgerock/opendj/ldap/tools/LDAPSearchITCase.java b/opendj-ldap-toolkit/src/test/java/com/forgerock/opendj/ldap/tools/LDAPSearchITCase.java
new file mode 100644
index 0000000..3a26592
--- /dev/null
+++ b/opendj-ldap-toolkit/src/test/java/com/forgerock/opendj/ldap/tools/LDAPSearchITCase.java
@@ -0,0 +1,100 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License").  You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at legal-notices/CDDLv1_0.txt
+ * or http://forgerock.org/license/CDDLv1.0.html.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at legal-notices/CDDLv1_0.txt.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information:
+ *      Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ *
+ *
+ *      Copyright 2014 ForgeRock AS.
+ */
+package com.forgerock.opendj.ldap.tools;
+
+import static com.forgerock.opendj.ldap.tools.ToolsMessages.ERR_ERROR_PARSING_ARGS;
+import static com.forgerock.opendj.ldap.tools.ToolsMessages.ERR_TOOL_RESULT_CODE;
+import static com.forgerock.opendj.ldap.tools.ToolsMessages.INFO_LDAPSEARCH_MATCHING_ENTRY_COUNT;
+import static com.forgerock.opendj.ldap.tools.ToolsMessages.INFO_LDAPSEARCH_TOOL_DESCRIPTION;
+import static org.forgerock.util.Utils.closeSilently;
+
+import java.io.PrintStream;
+import java.util.Random;
+
+import org.forgerock.i18n.LocalizableMessage;
+import org.forgerock.opendj.ldap.ByteStringBuilder;
+import org.forgerock.opendj.ldap.ResultCode;
+import org.forgerock.opendj.ldap.TestCaseUtils;
+import org.testng.annotations.DataProvider;
+import org.testng.annotations.Test;
+
+/**
+ * Simple integration tests to check the ldapsearch command
+ */
+@SuppressWarnings("javadoc")
+public class LDAPSearchITCase extends ToolsITCase {
+    private static final int NB_RAND_SIMPLE_SEARCH = 10;
+    private static final int NB_OTHER_SIMPLE_SEARCH = 2;
+
+    @DataProvider
+    public Object[][] ldapSearchArgs() throws Exception {
+        Object[][] data = new Object[NB_RAND_SIMPLE_SEARCH + NB_OTHER_SIMPLE_SEARCH][];
+
+        // Check if the help message is correctly prompted
+        data[0] = new Object[] { args("--help"), INFO_LDAPSEARCH_TOOL_DESCRIPTION.get(), "" };
+
+        // Check that there is a error message if no arguments were given to the
+        // ldapsearch command
+        data[1] = new Object[] { args(""), "", ERR_ERROR_PARSING_ARGS.get("") };
+
+        // Perform some basic ldapsearch for random user in the test server
+        for (int i = 0; i < NB_RAND_SIMPLE_SEARCH; i++) {
+            long userID = new Random().nextInt(1000);
+            data[i + NB_OTHER_SIMPLE_SEARCH] = produceLDAPSearchBasicTestCase(userID);
+        }
+
+        return data;
+    }
+
+    private Object[] produceLDAPSearchBasicTestCase(long userID) {
+        String dn = String.format("uid=user.%d,ou=people,o=test", userID);
+        LocalizableMessage matchEntryCnt = INFO_LDAPSEARCH_MATCHING_ENTRY_COUNT.get(1);
+        LocalizableMessage resultSuccess =
+            ERR_TOOL_RESULT_CODE.get(ResultCode.SUCCESS.intValue(), ResultCode.SUCCESS.getName().toString());
+        return new Object[] {
+            args("--countEntries", "-h", TestCaseUtils.getServerSocketAddress().getHostName(), "-p",
+                Integer.toString(TestCaseUtils.getServerSocketAddress().getPort()), "-b", dn, "(uid=user.%d)", "uid"),
+            matchEntryCnt, resultSuccess };
+    }
+
+    @Test(dataProvider = "ldapSearchArgs")
+    public void testITLDAPSearch(String[] arguments, Object expectedOut, Object expectedErr) throws Exception {
+        ByteStringBuilder out = new ByteStringBuilder();
+        ByteStringBuilder err = new ByteStringBuilder();
+
+        PrintStream outStream = new PrintStream(out.asOutputStream());
+        PrintStream errStream = new PrintStream(err.asOutputStream());
+        try {
+            LDAPSearch ldapSearch = new LDAPSearch(outStream, errStream);
+
+            ldapSearch.run(arguments, false);
+            checkOuputStreams(out, err, expectedOut, expectedErr);
+        } finally {
+            closeSilently(outStream, errStream);
+        }
+    }
+
+}
diff --git a/opendj-ldap-toolkit/src/test/java/com/forgerock/opendj/ldap/tools/ToolsITCase.java b/opendj-ldap-toolkit/src/test/java/com/forgerock/opendj/ldap/tools/ToolsITCase.java
new file mode 100644
index 0000000..3297650
--- /dev/null
+++ b/opendj-ldap-toolkit/src/test/java/com/forgerock/opendj/ldap/tools/ToolsITCase.java
@@ -0,0 +1,95 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License").  You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at legal-notices/CDDLv1_0.txt
+ * or http://forgerock.org/license/CDDLv1.0.html.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at legal-notices/CDDLv1_0.txt.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information:
+ *      Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ *
+ *
+ *      Copyright 2014 ForgeRock AS.
+ */
+package com.forgerock.opendj.ldap.tools;
+
+import static com.forgerock.opendj.cli.Utils.MAX_LINE_WIDTH;
+import static com.forgerock.opendj.cli.Utils.wrapText;
+import static org.fest.assertions.Assertions.assertThat;
+
+import java.io.UnsupportedEncodingException;
+
+import org.forgerock.i18n.LocalizableMessage;
+import org.forgerock.opendj.ldap.ByteStringBuilder;
+import org.forgerock.opendj.ldap.TestCaseUtils;
+import org.forgerock.testng.ForgeRockTestCase;
+import org.testng.annotations.AfterClass;
+import org.testng.annotations.BeforeClass;
+
+/**
+ * Class used for the toolkit integration tests
+ */
+public abstract class ToolsITCase extends ForgeRockTestCase {
+
+    @BeforeClass
+    void setUp() throws Exception {
+        TestCaseUtils.startServer();
+    }
+
+    @AfterClass
+    void tearDown() throws Exception {
+        TestCaseUtils.stopServer();
+    }
+
+    /**
+     * Check both out and err outputs streams
+     *
+     * @param out
+     *            output stream from the toolkit application
+     * @param err
+     *            error stream from the toolkit application
+     * @param expectedOutput
+     *            String or LocalizedMessage expected on output
+     * @param expectedError
+     *            String or LocalizedMessage expected on error output
+     * @throws UnsupportedEncodingException
+     */
+    protected void checkOuputStreams(ByteStringBuilder out, ByteStringBuilder err, Object expectedOutput,
+        Object expectedError) throws Exception {
+        // Check error output
+        checkOutputStream(out, expectedOutput);
+        checkOutputStream(err, expectedError);
+    }
+
+    private void checkOutputStream(ByteStringBuilder out, Object expectedOutput) {
+        String toCompare = expectedOutput.toString();
+
+        if (expectedOutput instanceof LocalizableMessage) {
+            toCompare = wrapText((LocalizableMessage) expectedOutput, MAX_LINE_WIDTH);
+        }
+
+        if (toCompare.isEmpty()) {
+            assertThat(out.toString().length()).isEqualTo(0);
+        } else {
+            assertThat(out.toString()).contains(toCompare);
+        }
+
+    }
+
+    /** Arguments passed to the command */
+    protected String[] args(String... arguments) {
+        return arguments;
+    }
+}

--
Gitblit v1.10.0