/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ package org.apache.brooklyn.cli; import org.testng.annotations.Test; /** * Test the command line interface operation. */ public class CliIntegrationTest extends BaseCliIntegrationTest { /** * Checks if running {@code brooklyn help} produces the expected output. */ @Test(groups = {"Integration","Broken"}) public void testLaunchCliHelp() throws Throwable { final Process brooklyn = startBrooklyn("help"); BrooklynCliTest test = new BrooklynCliTest(brooklyn) { @Override public void checkConsole() { assertConsoleOutput("usage: brooklyn"); // Usage info not present assertConsoleOutput("The most commonly used brooklyn commands are:"); assertConsoleOutput("help Display help for available commands", "info Display information about brooklyn", "launch Starts a brooklyn application"); // List of common commands not present assertConsoleOutput("See 'brooklyn help <command>' for more information on a specific command."); assertConsoleErrorEmpty(); } }; testBrooklyn(brooklyn, test, 0); } /* Exception java.io.IOException Message: Cannot run program "./target/brooklyn-dist/bin/brooklyn": error=2, No such file or directory Stacktrace: at java.lang.ProcessBuilder.start(ProcessBuilder.java:1047) at org.apache.brooklyn.cli.BaseCliIntegrationTest.startBrooklyn(BaseCliIntegrationTest.java:75) at org.apache.brooklyn.cli.CliIntegrationTest.testLaunchCliApp(CliIntegrationTest.java:56) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:606) at org.testng.internal.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:84) at org.testng.internal.Invoker.invokeMethod(Invoker.java:714) at org.testng.internal.Invoker.invokeTestMethod(Invoker.java:901) at org.testng.internal.Invoker.invokeTestMethods(Invoker.java:1231) at org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:127) at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:111) at org.testng.TestRunner.privateRun(TestRunner.java:767) at org.testng.TestRunner.run(TestRunner.java:617) at org.testng.SuiteRunner.runTest(SuiteRunner.java:348) at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:343) at org.testng.SuiteRunner.privateRun(SuiteRunner.java:305) at org.testng.SuiteRunner.run(SuiteRunner.java:254) at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52) at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:86) at org.testng.TestNG.runSuitesSequentially(TestNG.java:1224) at org.testng.TestNG.runSuitesLocally(TestNG.java:1149) at org.testng.TestNG.run(TestNG.java:1057) at org.apache.maven.surefire.testng.TestNGExecutor.run(TestNGExecutor.java:115) at org.apache.maven.surefire.testng.TestNGDirectoryTestSuite.executeMulti(TestNGDirectoryTestSuite.java:205) at org.apache.maven.surefire.testng.TestNGDirectoryTestSuite.execute(TestNGDirectoryTestSuite.java:108) at org.apache.maven.surefire.testng.TestNGProvider.invoke(TestNGProvider.java:111) at org.apache.maven.surefire.booter.ForkedBooter.invokeProviderInSameClassLoader(ForkedBooter.java:203) at org.apache.maven.surefire.booter.ForkedBooter.runSuitesInProcess(ForkedBooter.java:155) at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:103) Caused by: java.io.IOException: error=2, No such file or directory at java.lang.UNIXProcess.forkAndExec(Native Method) at java.lang.UNIXProcess.<init>(UNIXProcess.java:186) at java.lang.ProcessImpl.start(ProcessImpl.java:130) at java.lang.ProcessBuilder.start(ProcessBuilder.java:1028) ... 30 more */ /** * Checks if launching an application using {@code brooklyn launch} produces the expected output. */ @Test(groups = {"Integration","Broken"}) public void testLaunchCliApp() throws Throwable { final Process brooklyn = startBrooklyn("--verbose", "launch", "--stopOnKeyPress", "--app", "org.apache.brooklyn.cli.BaseCliIntegrationTest$TestApplication", "--location", "localhost", "--noConsole"); BrooklynCliTest test = new BrooklynCliTest(brooklyn) { @Override public void checkConsole() { assertConsoleOutput("Launching brooklyn app:"); // Launch message not output assertNoConsoleOutput("Initiating Jersey application"); // Web console started assertConsoleOutput("Started application BasicApplicationImpl"); // Application not started assertConsoleOutput("Server started. Press return to stop."); // Server started message not output assertConsoleErrorEmpty(); } }; testBrooklyn(brooklyn, test, 0, true); } /** * Checks if a correct error and help message is given if using incorrect param. */ @Test(groups = {"Integration","Broken"}) public void testLaunchCliAppParamError() throws Throwable { final Process brooklyn = startBrooklyn("launch", "nothing", "--app"); BrooklynCliTest test = new BrooklynCliTest(brooklyn) { @Override public void checkConsole() { assertConsoleError("Parse error: Required values for option 'application class or file' not provided"); assertConsoleError("NAME", "SYNOPSIS", "OPTIONS", "COMMANDS"); assertConsoleOutputEmpty(); } }; testBrooklyn(brooklyn, test, 1); } /* Exception java.io.IOException Message: Cannot run program "./target/brooklyn-dist/bin/brooklyn": error=2, No such file or directory Stacktrace: at java.lang.ProcessBuilder.start(ProcessBuilder.java:1047) at org.apache.brooklyn.cli.BaseCliIntegrationTest.startBrooklyn(BaseCliIntegrationTest.java:75) at org.apache.brooklyn.cli.CliIntegrationTest.testLaunchCliAppCommandError(CliIntegrationTest.java:96) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:606) at org.testng.internal.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:84) at org.testng.internal.Invoker.invokeMethod(Invoker.java:714) at org.testng.internal.Invoker.invokeTestMethod(Invoker.java:901) at org.testng.internal.Invoker.invokeTestMethods(Invoker.java:1231) at org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:127) at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:111) at org.testng.TestRunner.privateRun(TestRunner.java:767) at org.testng.TestRunner.run(TestRunner.java:617) at org.testng.SuiteRunner.runTest(SuiteRunner.java:348) at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:343) at org.testng.SuiteRunner.privateRun(SuiteRunner.java:305) at org.testng.SuiteRunner.run(SuiteRunner.java:254) at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52) at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:86) at org.testng.TestNG.runSuitesSequentially(TestNG.java:1224) at org.testng.TestNG.runSuitesLocally(TestNG.java:1149) at org.testng.TestNG.run(TestNG.java:1057) at org.apache.maven.surefire.testng.TestNGExecutor.run(TestNGExecutor.java:115) at org.apache.maven.surefire.testng.TestNGDirectoryTestSuite.executeMulti(TestNGDirectoryTestSuite.java:205) at org.apache.maven.surefire.testng.TestNGDirectoryTestSuite.execute(TestNGDirectoryTestSuite.java:108) at org.apache.maven.surefire.testng.TestNGProvider.invoke(TestNGProvider.java:111) at org.apache.maven.surefire.booter.ForkedBooter.invokeProviderInSameClassLoader(ForkedBooter.java:203) at org.apache.maven.surefire.booter.ForkedBooter.runSuitesInProcess(ForkedBooter.java:155) at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:103) Caused by: java.io.IOException: error=2, No such file or directory at java.lang.UNIXProcess.forkAndExec(Native Method) at java.lang.UNIXProcess.<init>(UNIXProcess.java:186) at java.lang.ProcessImpl.start(ProcessImpl.java:130) at java.lang.ProcessBuilder.start(ProcessBuilder.java:1028) ... 30 more */ /** * Checks if a correct error and help message is given if using incorrect command. */ @Test(groups = "Integration") public void testLaunchCliAppCommandError() throws Throwable { final Process brooklyn = startBrooklyn("biscuit"); BrooklynCliTest test = new BrooklynCliTest(brooklyn) { @Override public void checkConsole() { assertConsoleError("Parse error: No command specified"); assertConsoleError("NAME", "SYNOPSIS", "OPTIONS", "COMMANDS"); assertConsoleOutputEmpty(); } }; testBrooklyn(brooklyn, test, 1); } /** * Checks if a correct error and help message is given if using incorrect application. */ @Test(groups = {"Integration","Broken"}) public void testLaunchCliAppLaunchError() throws Throwable { final String app = "org.eample.DoesNotExist"; final Process brooklyn = startBrooklyn("launch", "--app", app, "--location", "nowhere"); BrooklynCliTest test = new BrooklynCliTest(brooklyn) { @Override public void checkConsole() { assertConsoleOutput(app, "not found"); assertConsoleError("ERROR", "Fatal", "getting resource", app); } }; testBrooklyn(brooklyn, test, 2); } }