mirror of https://github.com/OpenIdentityPlatform/OpenDJ.git

Violette Roche-Montane
18.36.2013 8312e8e46d34547a69090a971db426d8df058e9f
opends/tests/unit-tests-testng/src/server/org/opends/server/tools/UpgradeTestCase.java
@@ -26,15 +26,24 @@
 */
package org.opends.server.tools;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.io.PrintStream;
import java.util.LinkedList;
import java.util.List;
import org.opends.messages.Message;
import org.opends.server.TestCaseUtils;
import org.opends.server.config.ConfigException;
import org.opends.server.core.DirectoryServer;
import org.opends.server.tools.upgrade.UpgradeCli;
import org.opends.server.types.DirectoryException;
import org.opends.server.types.InitializationException;
import org.testng.annotations.Test;
import static org.opends.messages.ToolMessages.*;
import static org.opends.server.tools.ToolConstants.OPTION_LONG_FORCE_UPGRADE;
import static org.testng.Assert.*;
/**
@@ -42,68 +51,231 @@
 */
public class UpgradeTestCase extends ToolsTestCase
{
  private final static String configFilePath = DirectoryServer
      .getInstanceRoot()
      + File.separator + "config" + File.separator + "config.ldif";
  /**
   * Tests the Upgrade tool with an argument that will simply cause it to
   * display usage information.
   * Sets the args for the upgrade tools. The configFile parameter is
   * configured by default.<pre>
   * usage : {@code}setArgs("--force", "--no-prompt") {@code}
   * corresponds to command line : ./upgrade --force -n</pre>
   *
   * @param args
   *          The argument you want for testing.
   * @return An array of string containing the args.
   */
  @Test()
  public void testUpgradeToolHelpUsage()
  private String[] setArgs(String... args)
  {
    String[] args = { "--help" };
    assertEquals(UpgradeCli.main(args, true, System.out, System.err), 0);
    final List<String> argsList = new LinkedList<String>();
    argsList.add("--configFile");
    argsList.add(configFilePath);
    if (args != null)
    {
      for (final String argument : args)
      {
        argsList.add(argument);
      }
    }
    final String[] mainArgs = new String[argsList.size()];
    argsList.toArray(mainArgs);
    args = new String[] { "-H" };
    assertEquals(LDIFDiff.mainDiff(args, true, System.out, System.err), 0);
    args = new String[] { "-?" };
    assertEquals(LDIFDiff.mainDiff(args, true, System.out, System.err), 0);
    return mainArgs;
  }
  /**
   * Tests the Upgrade tool with wrong sub-command.
   * Returns {@code true} if the output contain the expected message.
   *
   * @param output
   *          The upgrade's output.
   * @param expectedMessage
   *          The expected message.
   * @return {@code true} if the output contains the expected message.
   */
  @Test()
  public void testUpgradeToolWrongSubcommand()
  private boolean isOutputContainsExpectedMessage(final String output,
      final Message expectedMessage)
  {
    String[] args = { "-- wrong" };
    assertEquals(UpgradeCli.main(args, true, System.out, System.err), 1);
    args = new String[]{ "--wrong" };
    assertEquals(UpgradeCli.main(args, true, System.out, System.err), 1);
    return (output.replaceAll("\n", " ").replaceAll("%s", " ").indexOf(
        expectedMessage.toString().replaceAll("\n", " ")
        .replaceAll("%s", " ")) != -1);
  }
  /**
   * Tests the Upgrade tool with unauthorized usage.
   * Tests display help information.
   */
  @Test()
  public void testUpgradeToolUnauthorizedUsage()
  public void testUpgradeToolDisplaysHelpUsage()
  {
    // Interactive mode is not compatible with forceUpgrade mode.
    String[] args = { "--forceUpgrade" };
    assertEquals(UpgradeCli.main(args, true, System.out, System.err), 1);
    final ByteArrayOutputStream baos = new ByteArrayOutputStream();
    final PrintStream ps = new PrintStream(baos);
    try
    {
      // The 'main' should exit with success code.
      assertEquals(UpgradeCli.main(setArgs("--help"), true, ps, ps), 0);
      assertTrue(isOutputContainsExpectedMessage(baos.toString(),
          INFO_UPGRADE_DESCRIPTION_CLI.get()));
    }
    finally
    {
      ps.close();
    }
  }
  /**
   * Tests the Upgrade tool with a running server throws an error.
   * Tests display help information.
   */
  @Test()
  public void testUpgradeRequiresServerOffline() throws InitializationException,
      ConfigException, DirectoryException, IOException
  public void testUpgradeToolDisplaysHelpUsage2()
  {
    final ByteArrayOutputStream baos = new ByteArrayOutputStream();
    final PrintStream ps = new PrintStream(baos);
    try
    {
      // The 'main' should exit with success code.
      assertEquals(UpgradeCli.main(setArgs("-H"), true, ps, ps), 0);
      assertTrue(isOutputContainsExpectedMessage(baos.toString(),
          INFO_UPGRADE_DESCRIPTION_CLI.get()));
    }
    finally
    {
      ps.close();
    }
  }
  /**
   * Tests display help information.
   */
  @Test()
  public void testUpgradeToolDisplaysHelpUsage3()
  {
    final ByteArrayOutputStream baos = new ByteArrayOutputStream();
    final PrintStream ps = new PrintStream(baos);
    try
    {
      // The 'main' should exit with success code.
      assertEquals(UpgradeCli.main(setArgs("-?"), true, ps, ps), 0);
      assertTrue(isOutputContainsExpectedMessage(baos.toString(),
          INFO_UPGRADE_DESCRIPTION_CLI.get()));
    }
    finally
    {
      ps.close();
    }
  }
  /**
   * Tests the upgrade tool with an invalid sub-command.
   */
  @Test()
  public void testUpgradeToolDoesntAllowWrongSubcommand()
  {
    final ByteArrayOutputStream baos = new ByteArrayOutputStream();
    final PrintStream ps = new PrintStream(baos);
    try
    {
      // The 'main' should exit with an error code.
      assertEquals(UpgradeCli.main(setArgs("-- wrong"), true, ps, ps), 1);
      assertTrue(isOutputContainsExpectedMessage(baos.toString(),
          ERR_ERROR_PARSING_ARGS.get("")));
    }
    finally
    {
      ps.close();
    }
  }
  /**
   * Tests the upgrade tool with an invalid sub-command.
   */
  @Test()
  public void testUpgradeToolDoesntAllowWrongSubcommand2()
  {
    final ByteArrayOutputStream baos = new ByteArrayOutputStream();
    final PrintStream ps = new PrintStream(baos);
    try
    {
      // The 'main' should exit with an error code.
      assertEquals(UpgradeCli.main(setArgs("--wrong"), true, ps, ps), 1);
      assertTrue(isOutputContainsExpectedMessage(baos.toString(),
          ERR_ERROR_PARSING_ARGS.get("")));
    }
    finally
    {
      ps.close();
    }
  }
  /**
   * The upgrade tool disallows the force sub-command used with 'interactive
   * mode'.
   */
  @Test()
  public void testUpgradeToolDoesntAllowInteractiveAndForce()
  {
    final ByteArrayOutputStream baos = new ByteArrayOutputStream();
    final PrintStream ps = new PrintStream(baos);
    try
    {
      // The 'main' should exit with an error code.
      assertEquals(UpgradeCli.main(setArgs("--force"), true, ps, ps), 1);
      // Because interactive mode is not compatible with force upgrade mode.
      final Message message =
          ERR_UPGRADE_INCOMPATIBLE_ARGS.get(OPTION_LONG_FORCE_UPGRADE,
              "interactive mode");
      assertTrue(isOutputContainsExpectedMessage(baos.toString(), message));
    }
    finally
    {
      ps.close();
    }
  }
  /**
   * Upgrade tool allows use of force and no-prompt sub-commands.
   *
   * @throws IOException
   * @throws DirectoryException
   * @throws ConfigException
   * @throws InitializationException
   */
  @Test()
  public void testUpgradeToolAllowsNonInteractiveAndForce()
      throws InitializationException, ConfigException, DirectoryException,
      IOException
  {
    TestCaseUtils.startServer();
    String[] args = { "" };
    assertEquals(UpgradeCli.main(args, true, System.out, System.err), 1);
    TestCaseUtils.shutdownServer("End of upgrade test.");
  }
  /**
   * Tests the upgrade with an offline server and empty args fails.
   */
  @Test()
  public void testUpgradeServerOfflineEmptyArgs() throws InitializationException,
      ConfigException, DirectoryException, IOException
  {
    String[] args = { "" };
    assertEquals(UpgradeCli.main(args, true, System.out, System.err), 1);
    final ByteArrayOutputStream baos = new ByteArrayOutputStream();
    final PrintStream ps = new PrintStream(baos);
    try
    {
      // The 'main' should exit with success code.
      assertEquals(UpgradeCli.main(setArgs("--force", "--no-prompt"), true, ps,
          ps), 0);
      // The sub-commands have been checked ok but upgrade must exist on
      // version's verification.
      assertTrue(isOutputContainsExpectedMessage(baos.toString(),
          ERR_UPGRADE_VERSION_UP_TO_DATE.get("")));
    }
    finally
    {
      ps.close();
      TestCaseUtils
          .shutdownServer("testUpgradeToolAllowsNonInteractiveAndForce");
    }
  }
}