/* * 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 2026 3A Systems, LLC. */ package com.forgerock.opendj.cli; import static org.fest.assertions.Assertions.assertThat; import org.testng.annotations.DataProvider; import org.testng.annotations.Test; /** Quoting of the values in the equivalent command lines that the tools print. */ @SuppressWarnings("javadoc") public final class CommandBuilderTestCase extends CliTestCase { /** * Values and their Windows form. A Windows program splits its command line by the rules of * the Microsoft C runtime: backslashes are literal unless they precede a double quote, where * each pair gives one backslash and an odd one escapes the quote. */ @DataProvider public Object[][] windowsValues() { return new Object[][] { { "cn=a\\,b,dc=x", "\"cn=a\\,b,dc=x\"" }, { "o=My Company", "\"o=My Company\"" }, { "(targetattr=\"cn\")(version 3.0; acl \"x\"; allow (read) userdn=\"ldap:///self\";)", "\"(targetattr=\\\"cn\\\")(version 3.0; acl \\\"x\\\"; allow (read) userdn=\\\"ldap:///self\\\";)\"" }, { "abc\\", "\"abc\\\\\"" }, { "a\\\"b", "\"a\\\\\\\"b\"" }, { "", "\"\"" }, }; } @Test(dataProvider = "windowsValues") public void testWindowsValueIsQuotedForTheCRuntime(String value, String expected) { assertThat(CommandBuilder.escapeValue(value, false)).isEqualTo(expected); } @Test public void testUnixValueIsBackslashEscaped() { assertThat(CommandBuilder.escapeValue("cn=a\\,b \"x\"", true)).isEqualTo("cn=a\\\\,b\\ \\\"x\\\""); } /** A dsconfig batch line takes an unescaped single quote as an opening quote. */ @Test public void testUnixApostropheIsEscaped() { assertThat(CommandBuilder.escapeValue("description:O'Brien", true)).isEqualTo("description:O\\'Brien"); } }