package brooklyn.cli;

import static org.testng.Assert.assertTrue;
import java.io.InputStream;
import java.util.NoSuchElementException;
import java.util.Scanner;

import org.testng.annotations.Test;

import brooklyn.entity.basic.AbstractApplication;

// TODO finish up the tests and enable them
public class CliIntegrationTest {
    
    // FIXME: this should not be hardcoded
    String brooklynBinPath = "../dist/target/brooklyn-0.4.0-SNAPSHOT-dist/brooklyn/bin/";
    
    // Helper function used in testing
    private String convertStreamToString(InputStream is) {
        try {
            return new Scanner(is).useDelimiter("\\A").next();
        } catch (NoSuchElementException e) {
            return "";
        }
    }
    
    // An empty app to be used for testing
    @SuppressWarnings("serial")
    public static class ExampleApp extends AbstractApplication { }
    
    /**
     * Checks if running "brooklyn help" produces the expected output.
     * @throws Exception
     */
    @Test(enabled = true, groups = "Integration")
    public void testLaunchCliHelp() throws Exception {
        // Invoke the brooklyn script with the "help" argument
        ProcessBuilder pb = new ProcessBuilder();
        pb.command(brooklynBinPath+"brooklyn", "help");;
        Process brooklyn = pb.start();
        // Get the console output of running that command
        String consoleOutput = convertStreamToString(brooklyn.getInputStream());
        // Check if the output looks as expected for the help command
        boolean usagePresent = consoleOutput.contains("usage: brooklyn");
        assertTrue(usagePresent, "Usage info present");
        boolean commonCommands = consoleOutput.contains("The most commonly used brooklyn commands are:");
        assertTrue(commonCommands, "List of common commands present");
        boolean specificCommandHelp = consoleOutput.contains("See 'brooklyn help <command>' for more information on a specific command.");
        assertTrue(specificCommandHelp, "Show how to get help for specific commands");
        // Check error code from process is 0
        assertTrue(brooklyn.exitValue()==0,"Command terminates succesfully");
    }

    /**
     * TODO: Finish up this test
     * Checks if launching a brooklyn app produces the expected output.
     * @throws Exception
     */
    @Test(enabled = false, groups = "Integration")
    public void testLaunchCliApp() throws Exception {
        // Invoke the brooklyn script with the launch command
        ProcessBuilder pb = new ProcessBuilder();
        pb.command(brooklynBinPath+"brooklyn", "--verbose", "launch", "--app", "brooklyn.cli.CliTest.ExampleApp", "--location", "localhost", "--noConsole");
        Process brooklyn = pb.start();
        // Get the console output of running that command
        String consoleOutput = convertStreamToString(brooklyn.getInputStream());
        //TODO: need to kill brooklyn after the app gets started, perhaps set a timeout . . .
    }

    /**
     * Checks if a correct error + help message is given if using incorrect params.
     * @throws Exception
     */
    @Test(enabled = true, groups = "Integration")
    public void testLaunchCliAppError() throws Exception {
        // Invoke the brooklyn script with incorrect arguments
        ProcessBuilder pb = new ProcessBuilder();
        pb.command(brooklynBinPath+"brooklyn", "launch", "--doesNotExist", "nothing");
        Process brooklyn = pb.start();
        // Get the console output of running that command
        String consoleOutput = convertStreamToString(brooklyn.getErrorStream());
        // Check if the output looks as expected
        boolean parseError = consoleOutput.contains("Parse error:");
        assertTrue(parseError, "Parse error detected");
        boolean showUsage = consoleOutput.contains("NAME")
                && consoleOutput.contains("SYNOPSIS")
                && consoleOutput.contains("OPTIONS")
                && consoleOutput.contains("COMMANDS");
        assertTrue(showUsage, "Show usage info");
        // Check error code from process is 0
        assertTrue(brooklyn.exitValue()!=0,"Command terminates with error");
    }
    
}
