diff --git a/src/main/java/org/opensearch/security/tools/democonfig/Installer.java b/src/main/java/org/opensearch/security/tools/democonfig/Installer.java index a172005284..68bc4d7cbf 100644 --- a/src/main/java/org/opensearch/security/tools/democonfig/Installer.java +++ b/src/main/java/org/opensearch/security/tools/democonfig/Installer.java @@ -186,7 +186,7 @@ void readOptions(String[] args) { * Prints the help menu when -h option is passed */ void showHelp() { - formatter.printHelp("install_demo_configuration.sh", options, true); + formatter.printHelp("install_demo_configuration" + FILE_EXTENSION, options, true); System.exit(0); } diff --git a/src/test/java/org/opensearch/security/tools/democonfig/InstallerTests.java b/src/test/java/org/opensearch/security/tools/democonfig/InstallerTests.java index a4c82b5831..4e64fdea72 100644 --- a/src/test/java/org/opensearch/security/tools/democonfig/InstallerTests.java +++ b/src/test/java/org/opensearch/security/tools/democonfig/InstallerTests.java @@ -41,7 +41,6 @@ import static org.opensearch.security.tools.democonfig.util.DemoConfigHelperUtil.createDirectory; import static org.opensearch.security.tools.democonfig.util.DemoConfigHelperUtil.createFile; import static org.opensearch.security.tools.democonfig.util.DemoConfigHelperUtil.deleteDirectoryRecursive; -import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertThrows; import static org.junit.Assert.fail; @@ -74,7 +73,7 @@ public void testPrintScriptHeaders() { + System.lineSeparator() + "### ** Warning: Do not use on production or public reachable systems **" + System.lineSeparator(); - assertThat(expectedOutput, equalTo(outContent.toString())); + assertThat(outContent.toString(), equalTo(expectedOutput)); } @Test @@ -83,35 +82,28 @@ public void testReadOptions_withoutHelpOption() { String[] validOptions = { "/scriptDir", "-y", "-i", "-c", "-s", "-t" }; installer.readOptions(validOptions); - assertEquals("/scriptDir", installer.SCRIPT_DIR); + assertThat(installer.SCRIPT_DIR, equalTo("/scriptDir")); assertThat(installer.assumeyes, is(true)); assertThat(installer.initsecurity, is(true)); assertThat(installer.cluster_mode, is(true)); - assertEquals(0, installer.skip_updates); - assertEquals(ExecutionEnvironment.TEST, installer.environment); + assertThat(installer.skip_updates, equalTo(0)); + assertThat(installer.environment, equalTo(ExecutionEnvironment.TEST)); } @Test public void testReadOptions_help() { try { System.setSecurityManager(new NoExitSecurityManager()); - String[] helpOption = { "/scriptDir", "-h" }; installer.readOptions(helpOption); - - assertThat(outContent.toString(), containsString("install_demo_configuration.sh [-y] [-i] [-c]")); - assertThat(outContent.toString(), containsString("-h show help")); - assertThat(outContent.toString(), containsString("-y confirm all installation dialogues automatically")); - assertThat(outContent.toString(), containsString("-i initialize Security plugin with default configuration")); - assertThat(outContent.toString(), containsString("-c enable cluster mode by binding to all network interfaces")); - assertThat(outContent.toString(), containsString("-s skip updates if config is already applied to opensearch.yml")); - assertThat(outContent.toString(), containsString("-t set the execution environment to `test` to skip password validation")); - assertThat(outContent.toString(), containsString("Should be used only for testing. (default is set to `demo`)")); } catch (SecurityException e) { + // if help text printed correctly then exit code 0 is expected assertThat(e.getMessage(), equalTo("System.exit(0) blocked to allow print statement testing.")); } finally { System.setSecurityManager(null); } + + verifyStdOutContainsString("usage: install_demo_configuration" + installer.FILE_EXTENSION + " [-c] [-h] [-i] [-s] [-t] [-y]"); } @Test @@ -128,11 +120,11 @@ public void testGatherUserInputs_withoutAssumeYes() { // y installer.gatherUserInputs(); - assertThat(outContent.toString(), containsString("Install demo certificates?")); - assertThat(outContent.toString(), containsString("Initialize Security Modules?")); - assertThat(outContent.toString(), containsString("Cluster mode requires additional setup of:")); - assertThat(outContent.toString(), containsString(" - Virtual memory (vm.max_map_count)" + System.lineSeparator())); - assertThat(outContent.toString(), containsString("Enable cluster mode?")); + verifyStdOutContainsString("Install demo certificates?"); + verifyStdOutContainsString("Initialize Security Modules?"); + verifyStdOutContainsString("Cluster mode requires additional setup of:"); + verifyStdOutContainsString(" - Virtual memory (vm.max_map_count)" + System.lineSeparator()); + verifyStdOutContainsString("Enable cluster mode?"); assertThat(installer.initsecurity, is(false)); assertThat(installer.cluster_mode, is(false)); @@ -144,11 +136,11 @@ public void testGatherUserInputs_withoutAssumeYes() { // y installer.gatherUserInputs(); - assertThat(outContent.toString(), containsString("Install demo certificates?")); - assertThat(outContent.toString(), containsString("Initialize Security Modules?")); - assertThat(outContent.toString(), containsString("Cluster mode requires additional setup of:")); - assertThat(outContent.toString(), containsString(" - Virtual memory (vm.max_map_count)" + System.lineSeparator())); - assertThat(outContent.toString(), containsString("Enable cluster mode?")); + verifyStdOutContainsString("Install demo certificates?"); + verifyStdOutContainsString("Initialize Security Modules?"); + verifyStdOutContainsString("Cluster mode requires additional setup of:"); + verifyStdOutContainsString(" - Virtual memory (vm.max_map_count)" + System.lineSeparator()); + verifyStdOutContainsString("Enable cluster mode?"); assertThat(installer.initsecurity, is(true)); assertThat(installer.cluster_mode, is(true)); @@ -161,17 +153,16 @@ public void testGatherUserInputs_withoutAssumeYes() { readInputStream("n" + System.lineSeparator() + "n" + System.lineSeparator() + "n" + System.lineSeparator()); installer.gatherUserInputs(); - - assertThat(outContent.toString(), containsString("Install demo certificates?")); - assertThat(outContent.toString(), not(containsString("Initialize Security Modules?"))); - assertThat(outContent.toString(), not(containsString("Cluster mode requires additional setup of:"))); - assertThat(outContent.toString(), not(containsString(" - Virtual memory (vm.max_map_count)" + System.lineSeparator()))); - assertThat(outContent.toString(), not(containsString("Enable cluster mode?"))); } catch (SecurityException e) { assertThat(e.getMessage(), equalTo("System.exit(0) blocked to allow print statement testing.")); } finally { System.setSecurityManager(null); } + verifyStdOutContainsString("Install demo certificates?"); + verifyStdOutDoesNotContainString("Initialize Security Modules?"); + verifyStdOutDoesNotContainString("Cluster mode requires additional setup of:"); + verifyStdOutDoesNotContainString(" - Virtual memory (vm.max_map_count)" + System.lineSeparator()); + verifyStdOutDoesNotContainString("Enable cluster mode?"); outContent.reset(); @@ -186,9 +177,9 @@ public void testGatherUserInputs_withoutAssumeYes() { // y installer.gatherUserInputs(); - assertThat(outContent.toString(), containsString("Install demo certificates?")); - assertThat(outContent.toString(), not(containsString("Initialize Security Modules?"))); - assertThat(outContent.toString(), not(containsString("Enable cluster mode?"))); + verifyStdOutContainsString("Install demo certificates?"); + verifyStdOutDoesNotContainString("Initialize Security Modules?"); + verifyStdOutDoesNotContainString("Enable cluster mode?"); assertThat(installer.initsecurity, is(true)); assertThat(installer.cluster_mode, is(true)); @@ -218,14 +209,14 @@ public void testInitializeVariables_setBaseDir_invalidPath() { try { System.setSecurityManager(new NoExitSecurityManager()); - installer.initializeVariables(); - assertThat(outContent.toString(), containsString("DEBUG: basedir does not exist")); } catch (SecurityException e) { assertThat(e.getMessage(), equalTo("System.exit(-1) blocked to allow print statement testing.")); } finally { System.setSecurityManager(null); } + + verifyStdOutContainsString("DEBUG: basedir does not exist"); } @Test @@ -251,20 +242,18 @@ public void testSetOpenSearchVariables_invalidPath() { try { System.setSecurityManager(new NoExitSecurityManager()); - installer.setBaseDir(); installer.setOpenSearchVariables(); - - assertThat(outContent.toString(), containsString("Unable to determine OpenSearch config file. Quit.")); - assertThat(outContent.toString(), containsString("Unable to determine OpenSearch bin directory. Quit.")); - assertThat(outContent.toString(), containsString("Unable to determine OpenSearch plugins directory. Quit.")); - assertThat(outContent.toString(), containsString("Unable to determine OpenSearch lib directory. Quit.")); - } catch (SecurityException e) { assertThat(e.getMessage(), equalTo("System.exit(-1) blocked to allow print statement testing.")); } finally { System.setSecurityManager(null); + } + verifyStdOutContainsString("Unable to determine OpenSearch config file. Quit."); + verifyStdOutContainsString("Unable to determine OpenSearch bin directory. Quit."); + verifyStdOutContainsString("Unable to determine OpenSearch plugins directory. Quit."); + verifyStdOutContainsString("Unable to determine OpenSearch lib directory. Quit."); String expectedBaseDirValue = new File(currentDir).getParentFile().getParentFile().getParentFile().getAbsolutePath() + File.separator; @@ -288,7 +277,7 @@ public void testDetermineInstallType_windows() { String installType = installer.determineInstallType(); - assertEquals(".zip", installType); + assertThat(installType, equalTo(".zip")); } @Test @@ -300,7 +289,7 @@ public void testDetermineInstallType_rpm_deb() { String installType = installer.determineInstallType(); - assertEquals("rpm/deb", installType); + assertThat(installType, equalTo("rpm/deb")); } @Test @@ -309,7 +298,7 @@ public void testDetermineInstallType_default() { installer.BASE_DIR = "/random-dir"; String installType = installer.determineInstallType(); - assertEquals(".tar.gz", installType); + assertThat(installType, equalTo(".tar.gz")); } @Test @@ -367,7 +356,7 @@ public void testPrintVariables() { + "Detected OpenSearch Security Version: version" + System.lineSeparator(); - assertEquals(expectedOutput, outContent.toString()); + assertThat(outContent.toString(), equalTo(expectedOutput)); } @Test @@ -412,7 +401,7 @@ public void testFinishScriptExecution() { + "### (Ignore the SSL certificate warning because we installed self-signed demo certificates)" + System.lineSeparator(); - assertEquals(expectedOutput, outContent.toString()); + assertThat(outContent.toString(), equalTo(expectedOutput)); tearDownSecurityDirectories(); } @@ -472,7 +461,7 @@ public void testFinishScriptExecution_withInitSecurityEnabled() { + "### (Ignore the SSL certificate warning because we installed self-signed demo certificates)" + System.lineSeparator(); - assertEquals(expectedOutput, outContent.toString()); + assertThat(outContent.toString(), equalTo(expectedOutput)); tearDownSecurityDirectories(); } @@ -519,4 +508,12 @@ static void setWritePermissions(String filePath) { } } } + + private void verifyStdOutContainsString(String s) { + assertThat(outContent.toString(), containsString(s)); + } + + private void verifyStdOutDoesNotContainString(String s) { + assertThat(outContent.toString(), not(containsString(s))); + } } diff --git a/src/test/java/org/opensearch/security/tools/democonfig/SecuritySettingsConfigurerTests.java b/src/test/java/org/opensearch/security/tools/democonfig/SecuritySettingsConfigurerTests.java index 81a8cf10b3..caba8b44d0 100644 --- a/src/test/java/org/opensearch/security/tools/democonfig/SecuritySettingsConfigurerTests.java +++ b/src/test/java/org/opensearch/security/tools/democonfig/SecuritySettingsConfigurerTests.java @@ -52,6 +52,7 @@ public class SecuritySettingsConfigurerTests { private final ByteArrayOutputStream outContent = new ByteArrayOutputStream(); private final PrintStream originalOut = System.out; + private final PrintStream originalErr = System.err; private final InputStream originalIn = System.in; private final String adminPasswordKey = "initialAdminPassword"; @@ -63,6 +64,7 @@ public class SecuritySettingsConfigurerTests { @Before public void setUp() { System.setOut(new PrintStream(outContent)); + System.setErr(new PrintStream(outContent)); installer = Installer.getInstance(); installer.buildOptions(); securitySettingsConfigurer = new SecuritySettingsConfigurer(installer); @@ -71,7 +73,9 @@ public void setUp() { @After public void tearDown() throws NoSuchFieldException, IllegalAccessException { + outContent.reset(); System.setOut(originalOut); + System.setErr(originalErr); System.setIn(originalIn); deleteDirectoryRecursive(installer.OPENSEARCH_CONF_DIR); unsetEnv(adminPasswordKey); @@ -87,7 +91,7 @@ public void testUpdateAdminPasswordWithCustomPassword() throws NoSuchFieldExcept assertThat(customPassword, is(equalTo(SecuritySettingsConfigurer.ADMIN_PASSWORD))); - assertThat(outContent.toString(), containsString("ADMIN PASSWORD SET TO: " + customPassword)); + verifyStdOutContainsString("ADMIN PASSWORD SET TO: " + customPassword); } @Test @@ -105,22 +109,21 @@ public void testUpdateAdminPasswordWithFilePassword() throws IOException { securitySettingsConfigurer.updateAdminPassword(); assertEquals(customPassword, SecuritySettingsConfigurer.ADMIN_PASSWORD); - assertThat(outContent.toString(), containsString("ADMIN PASSWORD SET TO: " + customPassword)); + verifyStdOutContainsString("ADMIN PASSWORD SET TO: " + customPassword); } @Test public void testUpdateAdminPassword_noPasswordSupplied() { - deleteDirectoryRecursive(installer.OPENSEARCH_CONF_DIR); // to ensure no flakiness try { System.setSecurityManager(new NoExitSecurityManager()); - securitySettingsConfigurer.updateAdminPassword(); - assertThat(outContent.toString(), containsString("No custom admin password found. Please provide a password.")); } catch (SecurityException e) { assertThat(e.getMessage(), equalTo("System.exit(-1) blocked to allow print statement testing.")); } finally { System.setSecurityManager(null); } + + verifyStdOutContainsString("No custom admin password found. Please provide a password."); } @Test @@ -129,16 +132,14 @@ public void testUpdateAdminPasswordWithWeakPassword() throws NoSuchFieldExceptio setEnv(adminPasswordKey, "weakpassword"); try { System.setSecurityManager(new NoExitSecurityManager()); - securitySettingsConfigurer.updateAdminPassword(); - - assertThat(outContent.toString(), containsString("Password weakpassword is weak. Please re-try with a stronger password.")); - } catch (SecurityException e) { assertThat(e.getMessage(), equalTo("System.exit(-1) blocked to allow print statement testing.")); } finally { System.setSecurityManager(null); } + + verifyStdOutContainsString("Password weakpassword is weak. Please re-try with a stronger password."); } @Test @@ -148,23 +149,22 @@ public void testUpdateAdminPasswordWithWeakPassword_skipPasswordValidation() thr securitySettingsConfigurer.updateAdminPassword(); assertThat("weakpassword", is(equalTo(SecuritySettingsConfigurer.ADMIN_PASSWORD))); - assertThat(outContent.toString(), containsString("ADMIN PASSWORD SET TO: weakpassword")); + verifyStdOutContainsString("ADMIN PASSWORD SET TO: weakpassword"); } @Test public void testSecurityPluginAlreadyConfigured() { securitySettingsConfigurer.writeSecurityConfigToOpenSearchYML(); + String expectedMessage = installer.OPENSEARCH_CONF_FILE + " seems to be already configured for Security. Quit."; try { System.setSecurityManager(new NoExitSecurityManager()); - String expectedMessage = installer.OPENSEARCH_CONF_FILE + " seems to be already configured for Security. Quit."; - securitySettingsConfigurer.checkIfSecurityPluginIsAlreadyConfigured(); - assertThat(outContent.toString(), containsString(expectedMessage)); } catch (SecurityException e) { assertThat(e.getMessage(), equalTo("System.exit(-1) blocked to allow print statement testing.")); } finally { System.setSecurityManager(null); } + verifyStdOutContainsString(expectedMessage); } @Test @@ -179,17 +179,18 @@ public void testSecurityPluginNotConfigured() { @Test public void testConfigFileDoesNotExist() { installer.OPENSEARCH_CONF_FILE = "path/to/nonexistentfile"; + String expectedMessage = "OpenSearch configuration file does not exist. Quit."; try { System.setSecurityManager(new NoExitSecurityManager()); - String expectedMessage = "OpenSearch configuration file does not exist. Quit."; - securitySettingsConfigurer.checkIfSecurityPluginIsAlreadyConfigured(); - assertThat(outContent.toString(), containsString(expectedMessage)); } catch (SecurityException e) { assertThat(e.getMessage(), equalTo("System.exit(-1) blocked to allow print statement testing.")); } finally { System.setSecurityManager(null); } + + verifyStdOutContainsString(expectedMessage); + // reset the file pointer installer.OPENSEARCH_CONF_FILE = installer.OPENSEARCH_CONF_DIR + "opensearch.yml"; } @@ -318,4 +319,8 @@ void setUpConf() { createFile(securityConfDir + "internal_users.yml"); createFile(installer.OPENSEARCH_CONF_FILE); } + + private void verifyStdOutContainsString(String s) { + assertThat(outContent.toString(), containsString(s)); + } }