/* * The contents of this file are subject to the terms of the Common Development and * Distribution License (the License). You may not use this file except in compliance with the * License. * * You can obtain a copy of the License at legal/CDDLv1.0.txt. See the License for the * specific language governing permission and limitations under the License. * * When distributing Covered Software, include this CDDL Header Notice in each file and include * the License file at legal/CDDLv1.0.txt. If applicable, add the following below the CDDL * Header, with the fields enclosed by brackets [] replaced by your own identifying * information: "Portions Copyright [year] [name of copyright owner]". * * Copyright 2016 ForgeRock AS. */ package com.forgerock.opendj.ldap.tools; import static com.forgerock.opendj.cli.CliMessages.ERR_ARGPARSER_TOO_FEW_TRAILING_ARGUMENTS; import static com.forgerock.opendj.ldap.CoreMessages.ERR_LDIF_NO_DN; import static com.forgerock.opendj.ldap.tools.ToolsMessages.ERR_LDIFMODIFY_MULTIPLE_USES_OF_STDIN; import static com.forgerock.opendj.ldap.tools.ToolsTestUtils.addValueNeededLongArgs; import static com.forgerock.opendj.ldap.tools.ToolsTestUtils.addValueNeededShortArgs; import static com.forgerock.opendj.ldap.tools.ToolsTestUtils.args; import static com.forgerock.opendj.ldap.tools.ToolsTestUtils.buildArgs; import static com.forgerock.opendj.ldap.tools.ToolsTestUtils.calcChecksum; import static com.forgerock.opendj.ldap.tools.ToolsTestUtils.toDataProviderArray; import static org.fest.assertions.Assertions.assertThat; import java.io.File; import java.nio.file.Paths; import java.util.ArrayList; import java.util.List; import org.forgerock.i18n.LocalizableMessage; import org.forgerock.opendj.ldap.ResultCode; import org.testng.annotations.DataProvider; import org.testng.annotations.Test; @SuppressWarnings("javadoc") @Test public class LDIFModifyTestCase extends ToolsTestCase { private static final String LDIF_RESOURCES_PATH = Paths.get("src", "test", "resources", "ldifmodify").toAbsolutePath().toString(); /** * Retrieves sets of invalid arguments that may not be used to initialize the LDAPSearch tool. * * @return Sets of invalid arguments that may not be used to initialize the LDAPSearch tool. */ @DataProvider public Object[][] invalidArgs() { final List> argLists = new ArrayList<>(); final List reasonList = new ArrayList<>(); argLists.add(args()); reasonList.add(ERR_ARGPARSER_TOO_FEW_TRAILING_ARGUMENTS.get(1)); addValueNeededShortArgs(argLists, reasonList, "o"); addValueNeededLongArgs(argLists, reasonList, "outputLdif"); return toDataProviderArray(argLists, reasonList); } @Test public void testSimpleLdifModifyWithMultipleChangeFiles() throws Exception { final String ldifModifyOutputFilePath = ToolsTestUtils.createTempFile(); final int res = runTool(buildArgs().add("-o", ldifModifyOutputFilePath) .add(absolutePath("source.ldif")) .add(absolutePath("modifications_part_1.ldif")) .add(absolutePath("modifications_part_2.ldif")) .add(absolutePath("modifications_part_3.ldif")) .toArray()); assertThat(res).isEqualTo(ResultCode.SUCCESS.intValue()); assertThat(calcChecksum(absolutePath("expected-no-wrapping.ldif"))).isEqualTo( calcChecksum(ldifModifyOutputFilePath)); } @Test public void testSimpleLdifModifyWithWrapping() throws Exception { testSimpleLdifModify(ResultCode.SUCCESS, "modifications.ldif", "expected.ldif", "-t", "80"); } @Test public void testLdifModifyWithBothSourceAndChangesOnStdin() throws Exception { final String ldifDiffOutputFilePath = ToolsTestUtils.createTempFile(); final int res = runTool("-o", ldifDiffOutputFilePath, "--", "-", "-"); assertThat(res).isEqualTo(ResultCode.CLIENT_SIDE_PARAM_ERROR.intValue()); assertThat(errOnSingleLine()).contains(ERR_LDIFMODIFY_MULTIPLE_USES_OF_STDIN.get().toString()); } @Test public void testSimpleLdifModifyWithoutWrapping() throws Exception { testSimpleLdifModify(ResultCode.SUCCESS, "modifications.ldif", "expected-no-wrapping.ldif", "-t", "0"); } @Test public void testSimpleLdifModifyWithErrorInModifications() throws Exception { testSimpleLdifModify(ResultCode.CLIENT_SIDE_LOCAL_ERROR, "modifications-with-error.ldif", "Not Applicable"); } @Test public void testSimpleLdifModifyWithContinueOnError() throws Exception { testSimpleLdifModify(ResultCode.SUCCESS, "modifications-with-error.ldif", "expected-continue-on-error.ldif", "-c"); } @Test public void testSimpleLdifModifyWithIncorrectLdifModifications() throws Exception { testSimpleLdifModify(ResultCode.CLIENT_SIDE_LOCAL_ERROR, "modifications-invalid.ldif", "Not Applicable"); assertThat(errOnSingleLine()).contains(ERR_LDIF_NO_DN.get(1, "changetype: modify").toString()); assertThat(out.toString()).isEmpty(); } private void testSimpleLdifModify(final ResultCode expectedRC, final String modificationsFileName, final String expectedOutputFileName, final String... additionalArgs) throws Exception { final String ldifModifyOutputFilePath = ToolsTestUtils.createTempFile(); final int res = runTool(buildArgs().add("-o", ldifModifyOutputFilePath) .addAll(additionalArgs) .add(absolutePath("source.ldif")) .add(absolutePath(modificationsFileName)) .toArray()); assertThat(res).isEqualTo(expectedRC.intValue()); if (expectedRC == ResultCode.SUCCESS) { assertThat(calcChecksum(absolutePath(expectedOutputFileName))).isEqualTo( calcChecksum(ldifModifyOutputFilePath)); } } private String absolutePath(final String fileName) { return LDIF_RESOURCES_PATH + File.separator + fileName; } @Override ToolConsoleApplication createInstance() { return new LDIFModify(outStream, errStream); } }