/* * 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.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.toDataProviderArray; import static org.fest.assertions.Assertions.assertThat; import java.io.BufferedReader; import java.io.FileReader; import java.nio.file.Paths; import java.util.ArrayList; import java.util.List; import org.forgerock.i18n.LocalizableMessage; import org.forgerock.opendj.ldap.Attribute; import org.forgerock.opendj.ldap.Entry; import org.forgerock.opendj.ldap.ResultCode; import org.forgerock.opendj.ldap.TestCaseUtils; import org.forgerock.opendj.ldif.LDIFEntryReader; import org.testng.annotations.BeforeClass; import org.testng.annotations.DataProvider; import org.testng.annotations.Test; /** LDIFSearch test cases. */ @SuppressWarnings("javadoc") @Test public class LDIFSearchTestCase extends ToolsTestCase { private String ldifSearchSourceFilePath; private String ldifSearchOutputFilePath; @BeforeClass private void setUp() throws Exception { ldifSearchSourceFilePath = Paths.get("src", "test", "resources", "ldifsearch.ldif").toAbsolutePath().toString(); ldifSearchOutputFilePath = TestCaseUtils.createTempFile(); } /** * 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(name = "invalidArgs") public Object[][] getInvalidArgumentLists() { final List> argLists = new ArrayList<>(); final List reasonList = new ArrayList<>(); argLists.add(args()); reasonList.add(ERR_ARGPARSER_TOO_FEW_TRAILING_ARGUMENTS.get(2)); addValueNeededShortArgs(argLists, reasonList, "b", "l", "s", "z"); addValueNeededLongArgs(argLists, reasonList, "baseDN", "timeLimit", "outputLDIF", "searchScope", "sizeLimit"); return toDataProviderArray(argLists, reasonList); } @Test public void testLDIFSearchStarOps() throws Exception { final int res = runTool("-b", "ou=ldifsearch,o=unit tests,dc=example,dc=com", "-o", ldifSearchOutputFilePath, ldifSearchSourceFilePath, "(objectclass=*)", "*", "+"); assertThat(res).isEqualTo(ResultCode.SUCCESS.intValue()); try (final LDIFEntryReader reader = new LDIFEntryReader(new FileReader(ldifSearchOutputFilePath))) { while (reader.hasNext()) { assertThat(reader.readEntry().getAllAttributes("objectclass")).isNotEmpty(); } } } @Test public void testLDIFSearchOperationalAttributesOnly() throws Exception { final int res = runTool("-b", "ou=ldifsearch,o=unit tests,dc=example,dc=com", "-o", ldifSearchOutputFilePath, "-s", "sub", ldifSearchSourceFilePath, "(objectclass=*)", "+"); assertThat(res).isEqualTo(ResultCode.SUCCESS.intValue()); try (final LDIFEntryReader reader = new LDIFEntryReader(new FileReader(ldifSearchOutputFilePath))) { while (reader.hasNext()) { assertThat(reader.readEntry().getAllAttributes("objectclass")).isEmpty(); } } } @Test public void testLDIFSearchUserAndOperationalAttributes() throws Exception { final int res = runTool("-b", "ou=ldifsearch,o=unit tests,dc=example,dc=com", "-o", ldifSearchOutputFilePath, "-s", "subordinates", ldifSearchSourceFilePath, "(objectclass=*)", "+", "mail", "uid"); assertThat(res).isEqualTo(ResultCode.SUCCESS.intValue()); try (final LDIFEntryReader reader = new LDIFEntryReader(new FileReader(ldifSearchOutputFilePath))) { while (reader.hasNext()) { final Entry e = reader.readEntry(); assertThat(e.getAllAttributes("objectclass")).isEmpty(); assertThat(e.getAllAttributes("mail")).isNotEmpty(); assertThat(e.getAllAttributes("uid")).isNotEmpty(); } } } @Test public void testLDIFSearchAttrsOnly() throws Exception { final int res = runTool("-b", "ou=ldifsearch,o=unit tests,dc=example,dc=com", "-o", ldifSearchOutputFilePath, "-s", "subordinates", "-A", ldifSearchSourceFilePath, "(objectclass=*)", "mail"); assertThat(res).isEqualTo(ResultCode.SUCCESS.intValue()); try (final LDIFEntryReader reader = new LDIFEntryReader(new FileReader(ldifSearchOutputFilePath))) { while (reader.hasNext()) { final Entry e = reader.readEntry(); assertThat(e.getAllAttributes("objectclass")).isEmpty(); final Iterable mails = e.getAllAttributes("mail"); assertThat(mails).isNotEmpty(); for (final Attribute mail : mails) { assertThat(mail.firstValueAsString()).isEmpty(); } } } } @Test public void testLDIFSearchSizeLimit() throws Exception { final int res = runTool("-b", "ou=ldifsearch,o=unit tests,dc=example,dc=com", "-o", ldifSearchOutputFilePath, "-s", "subordinates", "-z", "10", ldifSearchSourceFilePath, "(objectclass=*)", "mail", "uid", "initials"); assertThat(res).isEqualTo(ResultCode.SIZE_LIMIT_EXCEEDED.intValue()); int nbEntriesRead = 0; try (final LDIFEntryReader reader = new LDIFEntryReader(new FileReader(ldifSearchOutputFilePath))) { while (reader.hasNext()) { nbEntriesRead++; final Entry e = reader.readEntry(); assertThat(e.getAllAttributes("mail")).isNotEmpty(); assertThat(e.getAllAttributes("initials")).isNotEmpty(); assertThat(e.getAllAttributes("cn")).isEmpty(); } } assertThat(nbEntriesRead).isEqualTo(10); } @Test public void testLDIFSearchWrapping() throws Exception { final int res = runTool("-b", "ou=ldifsearch,o=unit tests,dc=example,dc=com", "-o", ldifSearchOutputFilePath, "-t", "80", ldifSearchSourceFilePath, "(uid=user.1)", "mail", "uid", "description"); assertThat(res).isEqualTo(ResultCode.SUCCESS.intValue()); assertThatUser1DescriptionIsReadable(); assertThat(countLdifSearchOutputFileLines()).isEqualTo(7); } @Test public void testLDIFSearchNoWrapping() throws Exception { final int res = runTool("-b", "ou=ldifsearch,o=unit tests,dc=example,dc=com", "-o", ldifSearchOutputFilePath, ldifSearchSourceFilePath, "(uid=user.1)", "mail", "uid", "description"); assertThat(res).isEqualTo(ResultCode.SUCCESS.intValue()); assertThatUser1DescriptionIsReadable(); assertThat(countLdifSearchOutputFileLines()).isEqualTo(5); } private int countLdifSearchOutputFileLines() throws Exception { try (final BufferedReader reader = new BufferedReader(new FileReader(ldifSearchOutputFilePath))) { int nbLines = 0; while (reader.readLine() != null) { nbLines++; } return nbLines; } } private void assertThatUser1DescriptionIsReadable() throws Exception { try (final LDIFEntryReader reader = new LDIFEntryReader(new FileReader(ldifSearchOutputFilePath))) { final Entry e = reader.readEntry(); assertThat(e.getAllAttributes("mail")).isNotEmpty(); assertThat(e.getAllAttributes("uid")).isNotEmpty(); final Iterable descriptions = e.getAllAttributes("description"); assertThat(descriptions).isNotEmpty(); for (final Attribute desc : descriptions) { assertThat(desc.firstValueAsString()).endsWith("to not wrap is specified."); } assertThat(reader.hasNext()).isFalse(); } } @Override ToolConsoleApplication createInstance() { return new LDIFSearch(outStream, errStream); } }