#!/usr/bin/env python

# 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.

from unittest import TestCase, main as test_main
import mock
import sys
import os


class TestStormCli(TestCase):

    def setUp(self):
        self.mock_path_exists = mock.patch("os.path.exists").start()
        self.mock_popen = mock.patch("subprocess.Popen").start()
        self.mock_execvp = mock.patch("os.execvp").start()
        self.mock_path_exists.return_value = True
        self.mock_popen.return_value.returncode = 0
        self.mock_popen.return_value.communicate = \
            mock.MagicMock(return_value=("{}", ""))
        self.storm_dir = os.path.abspath(
            os.path.join(os.getcwd(), os.pardir, os.pardir, os.pardir)
        )
        from storm import main as cli_main
        self.cli_main = cli_main
        self.java_cmd = os.path.join(
            os.getenv('JAVA_HOME', None), 'bin', 'java'
        )

    def base_test(self, command_invocation, mock_shell_interface, expected_output):
        print(command_invocation)
        with mock.patch.object(sys, "argv", command_invocation):
            self.cli_main()
        if expected_output not in mock_shell_interface.call_args_list:
            print("Expected:" + str(expected_output))
            print("Got:" + str(mock_shell_interface.call_args_list[-1]))
        assert expected_output in mock_shell_interface.call_args_list

    def test_jar_command(self):
        self.base_test([
            'storm', 'jar',
            'example/storm-starter/storm-starter-topologies-*.jar',
            'org.apache.storm.starter.RollingTopWords', 'blobstore-remote2',
            'remote', '-c topology.blobstore.map=\'{"key1":{"localname":"blob_file", "uncompress":false},"key2":{}}\'', '--jars',
            './external/storm-redis/storm-redis-1.1.0.jar,./external/storm-kafka-client/storm-kafka-client-1.1.0.jar"', '--artifacts', '"redis.clients:jedis:2.9.0,org.apache.kafka:kafka-clients:1.0.0^org.slf4j:slf4j-api"', '--artifactRepositories', '"jboss-repository^http://repository.jboss.com/maven2,HDPRepo^http://repo.hortonworks.com/content/groups/public/'
        ], self.mock_execvp, mock.call(
            self.java_cmd, [
                self.java_cmd, '-client', '-Ddaemon.name=', '-Dstorm.options=+topology.blobstore.map%3D%27%7B%22key1%22%3A%7B%22localname%22%3A%22blob_file%22%2C+%22uncompress%22%3Afalse%7D%2C%22key2%22%3A%7B%7D%7D%27',
                '-Dstorm.home=' + self.storm_dir, '-Dstorm.log.dir=' + self.storm_dir + "/logs",
                '-Djava.library.path=', '-Dstorm.conf.file=', '-cp',
                self.storm_dir + '/*:' + self.storm_dir + '/lib:' + self.storm_dir
                + '/extlib:example/storm-starter/storm-starter-topologies-*.jar:' + self.storm_dir + '/conf:'
                + self.storm_dir + '/bin:./external/storm-redis/storm-redis-1.1.0.jar:./external/storm-kafka-client/storm-kafka-client-1.1.0.jar"', '-Dstorm.jar=example/storm-starter/storm-starter-topologies-*.jar', '-Dstorm.dependency.jars=./external/storm-redis/storm-redis-1.1.0.jar,./external/storm-kafka-client/storm-kafka-client-1.1.0.jar"', '-Dstorm.dependency.artifacts={}',
                'org.apache.storm.starter.RollingTopWords', 'blobstore-remote2', 'remote'
            ])
        )

        self.mock_execvp.reset_mock()

        self.base_test([
            'storm', 'jar', '/path/to/jar.jar', 'some.Topology.Class',
            '-name', 'run-topology', 'randomArgument', '-randomFlag', 'randomFlagValue', '-rotateSize', '0.0001',
            '--hdfsConf', 'someOtherHdfsConf', 'dfs.namenode.kerberos.principal.pattern=hdfs/*.EV..COM'
        ], self.mock_execvp, mock.call(
            self.java_cmd, [
                self.java_cmd, '-client', '-Ddaemon.name=', '-Dstorm.options=',
                '-Dstorm.home=' + self.storm_dir, '-Dstorm.log.dir=' + self.storm_dir + "/logs",
                '-Djava.library.path=', '-Dstorm.conf.file=', '-cp',
                self.storm_dir + '/*:' + self.storm_dir + '/lib:' + self.storm_dir
                + '/extlib:/path/to/jar.jar:' + self.storm_dir + '/conf:' + self.storm_dir + '/bin:',
                '-Dstorm.jar=/path/to/jar.jar', '-Dstorm.dependency.jars=', '-Dstorm.dependency.artifacts={}',
                'some.Topology.Class', '-name', 'run-topology', 'randomArgument', '-randomFlag', 'randomFlagValue',
                '-rotateSize', '0.0001', '--hdfsConf', 'someOtherHdfsConf',
                'dfs.namenode.kerberos.principal.pattern=hdfs/*.EV..COM'
            ])
        )

    def test_localconfvalue_command(self):
        self.base_test(
            ["storm", "localconfvalue", "conf_name"], self.mock_popen, mock.call([
             self.java_cmd, '-client', '-Dstorm.options=',
             '-Dstorm.conf.file=', '-cp',  self.storm_dir + '/*:' + self.storm_dir + '/lib:' + self.storm_dir +'/extlib:' + self.storm_dir + '/extlib-daemon:' + self.storm_dir + '/conf',
             'org.apache.storm.command.ConfigValue', 'conf_name'
             ], stdout=-1
            )
        )

    def test_remoteconfvalue_command(self):
        self.base_test(
            ["storm", "remoteconfvalue", "conf_name"], self.mock_popen, mock.call([
             self.java_cmd, '-client', '-Dstorm.options=',
             '-Dstorm.conf.file=', '-cp',  self.storm_dir + '/*:' + self.storm_dir + '/lib:' + self.storm_dir + '/extlib:' + self.storm_dir + '/extlib-daemon:' + self.storm_dir + '/conf',
             'org.apache.storm.command.ConfigValue', 'conf_name'
             ], stdout=-1
            )
        )

    def test_local_command(self):
        self.base_test([
            'storm', 'local',
            'example/storm-starter/storm-starter-topologies-*.jar',
            'org.apache.storm.starter.RollingTopWords', 'blobstore-remote2',
            'remote', '--jars',
            './external/storm-redis/storm-redis-1.1.0.jar,./external/storm-kafka-client/storm-kafka-client-1.1.0.jar"',
            '--artifacts', '"redis.clients:jedis:2.9.0,org.apache.kafka:kafka-clients:1.0.0^org.slf4j:slf4j-api"',
            '--artifactRepositories',
            '"jboss-repository^http://repository.jboss.com/maven2,HDPRepo^http://repo.hortonworks.com/content/groups/public/'
            ], self.mock_execvp, mock.call(
            self.java_cmd, [
                self.java_cmd, '-client','-Ddaemon.name=', '-Dstorm.options=',
                '-Dstorm.home=' + self.storm_dir, '-Dstorm.log.dir=' + self.storm_dir + "/logs",
                '-Djava.library.path=', '-Dstorm.conf.file=', '-cp',
                self.storm_dir + '/*:' + self.storm_dir + '/lib:' + self.storm_dir +
                '/extlib:example/storm-starter/storm-starter-topologies-*.jar:' + self.storm_dir +
                '/conf:' + self.storm_dir +
                '/bin:./external/storm-redis/storm-redis-1.1.0.jar:./external/storm-kafka-client/storm-kafka-client-1.1.0.jar"',
                '-Dstorm.local.sleeptime=20', '-Dstorm.jar=example/storm-starter/storm-starter-topologies-*.jar',
                '-Dstorm.dependency.jars=./external/storm-redis/storm-redis-1.1.0.jar,./external/storm-kafka-client/storm-kafka-client-1.1.0.jar"',
                '-Dstorm.dependency.artifacts={}', 'org.apache.storm.LocalCluster',
                'org.apache.storm.starter.RollingTopWords',
                'blobstore-remote2', 'remote'
            ])
        )

    def test_sql_command(self):
        self.base_test(
            ['storm', 'sql', 'apache_log_error_filtering.sql', 'apache_log_error_filtering', '--artifacts',
             '"org.apache.storm:storm-sql-kafka:2.0.0-SNAPSHOT,org.apache.storm:storm-kafka:2.0.0-SNAPSHOT,org.apache.kafka:kafka_2.10:0.8.2.2^org.slf4j:slf4j-log4j12,org.apache.kafka:kafka-clients:0.8.2.2"'
            ], self.mock_execvp, mock.call(
                self.java_cmd,
                [self.java_cmd, '-client', '-Ddaemon.name=', '-Dstorm.options=',
                 '-Dstorm.home=' + self.storm_dir, '-Dstorm.log.dir=' + self.storm_dir + "/logs",
                 '-Djava.library.path=', '-Dstorm.conf.file=', '-cp',
                 self.storm_dir + '/*:' + self.storm_dir + '/lib:' + self.storm_dir + '/extlib:' +
                 self.storm_dir +
                 '/conf:' + self.storm_dir + '/bin:' + self.storm_dir + '/lib-tools/sql/core',\
                 '-Dstorm.dependency.jars=', '-Dstorm.dependency.artifacts={}',
                 'org.apache.storm.sql.StormSqlRunner', '--file', 'apache_log_error_filtering.sql',
                 '--topology', 'apache_log_error_filtering']
            )
        )

    def test_kill_command(self):
        self.base_test([
            'storm', 'kill', 'doomed_topology'
        ], self.mock_execvp, mock.call(
            self.java_cmd, [
                self.java_cmd, '-client', '-Ddaemon.name=', '-Dstorm.options=',
                '-Dstorm.home=' + self.storm_dir, '-Dstorm.log.dir=' + self.storm_dir + "/logs",
                '-Djava.library.path=', '-Dstorm.conf.file=', '-cp',
                self.storm_dir + '/*:' + self.storm_dir + '/lib:' + self.storm_dir + '/extlib:' + self.storm_dir +
                '/extlib-daemon:' + self.storm_dir + '/conf:' + self.storm_dir + '/bin', 'org.apache.storm.command.KillTopology', 'doomed_topology'
            ])
        )

    def test_upload_credentials_command(self):
        self.base_test([
            'storm', 'upload-credentials', '--config', '/some/other/storm.yaml', '-c', 'test=test', 'my-topology-name', 'appids', 'role.name1,role.name2'
        ], self.mock_execvp, mock.call(
            self.java_cmd, [
                self.java_cmd,  '-client', '-Ddaemon.name=', '-Dstorm.options=test%3Dtest',
                '-Dstorm.home=' + self.storm_dir, '-Dstorm.log.dir=' + self.storm_dir + "/logs",
                '-Djava.library.path=', '-Dstorm.conf.file=/some/other/storm.yaml',
                '-cp', self.storm_dir + '/*:' + self.storm_dir + '/lib:' +
                                             self.storm_dir +
                                             '/extlib:' + self.storm_dir + '/extlib-daemon:' +
                                             self.storm_dir + '/conf:' + self.storm_dir +
                                             '/bin', 'org.apache.storm.command.UploadCredentials',
                'my-topology-name', 'appids', 'role.name1,role.name2'])
        )

    def test_blobstore_command(self):
        self.base_test([
            'storm', 'blobstore', 'create', 'mytopo:data.tgz', '-f', 'data.tgz', '-a', 'u:alice:rwa,u:bob:rw,o::r'
        ], self.mock_execvp, mock.call(
            self.java_cmd, [
                self.java_cmd, '-client', '-Ddaemon.name=', '-Dstorm.options=',
                '-Dstorm.home=' + self.storm_dir, '-Dstorm.log.dir=' + self.storm_dir + "/logs",
                '-Djava.library.path=', '-Dstorm.conf.file=', '-cp',
                self.storm_dir + '/*:' + self.storm_dir + '/lib:' + self.storm_dir +
                '/extlib:' + self.storm_dir + '/extlib-daemon:' + self.storm_dir + '/conf:' +
                self.storm_dir + '/bin', 'org.apache.storm.command.Blobstore', 'create',
                'mytopo:data.tgz', '-f', 'data.tgz', '-a', 'u:alice:rwa,u:bob:rw,o::r'])
        )
        self.mock_execvp.reset_mock()

        self.base_test([
            'storm', 'blobstore', 'list'
        ], self.mock_execvp, mock.call(
            self.java_cmd, [
                self.java_cmd, '-client', '-Ddaemon.name=', '-Dstorm.options=',
                '-Dstorm.home=' + self.storm_dir,
                '-Dstorm.log.dir=' + self.storm_dir + "/logs", '-Djava.library.path=',
                '-Dstorm.conf.file=', '-cp',
                self.storm_dir + '/*:' + self.storm_dir + '/lib:' + self.storm_dir +
                '/extlib:' + self.storm_dir + '/extlib-daemon:' + self.storm_dir + '/conf:' +
                self.storm_dir + '/bin', 'org.apache.storm.command.Blobstore', 'list'])
        )
        self.mock_execvp.reset_mock()

        self.base_test([
            'storm', 'blobstore', 'list', 'wordstotrack'
        ], self.mock_execvp, mock.call(
            self.java_cmd, [
                self.java_cmd, '-client', '-Ddaemon.name=', '-Dstorm.options=',
                '-Dstorm.home=' + self.storm_dir,
                '-Dstorm.log.dir=' + self.storm_dir + "/logs", '-Djava.library.path=',
                '-Dstorm.conf.file=', '-cp',
                self.storm_dir + '/*:' + self.storm_dir + '/lib:' + self.storm_dir +
                '/extlib:' + self.storm_dir + '/extlib-daemon:' + self.storm_dir + '/conf:' +
                self.storm_dir + '/bin', 'org.apache.storm.command.Blobstore', 'list', 'wordstotrack'])
        )
        self.mock_execvp.reset_mock()

        self.base_test([
            'storm', 'blobstore', 'update', '-f', '/wordsToTrack.list', 'wordstotrack'
        ], self.mock_execvp, mock.call(
            self.java_cmd, [
                self.java_cmd, '-client', '-Ddaemon.name=', '-Dstorm.options=',
                '-Dstorm.home=' + self.storm_dir, '-Dstorm.log.dir=' + self.storm_dir + "/logs",
                '-Djava.library.path=', '-Dstorm.conf.file=', '-cp',
                self.storm_dir + '/*:' + self.storm_dir + '/lib:' + self.storm_dir +
                '/extlib:' + self.storm_dir + '/extlib-daemon:' + self.storm_dir + '/conf:' +
                self.storm_dir + '/bin', 'org.apache.storm.command.Blobstore', 'update', '-f',
                '/wordsToTrack.list', 'wordstotrack'])
        )
        self.mock_execvp.reset_mock()

        self.base_test([
            'storm', 'blobstore', 'cat', 'wordstotrack'
        ], self.mock_execvp, mock.call(
            self.java_cmd, [
                self.java_cmd, '-client', '-Ddaemon.name=', '-Dstorm.options=',
                '-Dstorm.home=' + self.storm_dir, '-Dstorm.log.dir=' + self.storm_dir + "/logs",
                '-Djava.library.path=', '-Dstorm.conf.file=', '-cp',
                self.storm_dir + '/*:' + self.storm_dir + '/lib:' + self.storm_dir +
                '/extlib:' + self.storm_dir + '/extlib-daemon:' + self.storm_dir + '/conf:' +
                self.storm_dir + '/bin', 'org.apache.storm.command.Blobstore', 'cat', 'wordstotrack'])
        )

    def test_activate_command(self):
        self.base_test([
            'storm', 'activate', 'doomed_topology'
        ], self.mock_execvp, mock.call(
            self.java_cmd, [
                self.java_cmd, '-client', '-Ddaemon.name=', '-Dstorm.options=',
                '-Dstorm.home=' + self.storm_dir, '-Dstorm.log.dir=' + self.storm_dir + "/logs",
                '-Djava.library.path=', '-Dstorm.conf.file=', '-cp',
                self.storm_dir + '/*:' + self.storm_dir + '/lib:' + self.storm_dir + '/extlib:' + self.storm_dir +
                '/extlib-daemon:' + self.storm_dir + '/conf:' + self.storm_dir + '/bin',
                'org.apache.storm.command.Activate', 'doomed_topology'
            ])
        )

    def test_deactivate_command(self):
        self.base_test([
            'storm', 'deactivate', 'doomed_topology'
        ], self.mock_execvp, mock.call(
            self.java_cmd, [
                self.java_cmd, '-client', '-Ddaemon.name=', '-Dstorm.options=',
                '-Dstorm.home=' + self.storm_dir, '-Dstorm.log.dir=' + self.storm_dir + "/logs",
                '-Djava.library.path=', '-Dstorm.conf.file=', '-cp',
                self.storm_dir + '/*:' + self.storm_dir + '/lib:' + self.storm_dir + '/extlib:' + self.storm_dir +
                '/extlib-daemon:' + self.storm_dir + '/conf:' + self.storm_dir +
                '/bin', 'org.apache.storm.command.Deactivate', 'doomed_topology'
            ])
        )

    def test_rebalance_command(self):
        self.base_test([
            'storm', 'rebalance', 'doomed_topology'
        ], self.mock_execvp, mock.call(
            self.java_cmd, [
                self.java_cmd, '-client', '-Ddaemon.name=', '-Dstorm.options=',
                '-Dstorm.home=' + self.storm_dir, '-Dstorm.log.dir=' + self.storm_dir + "/logs",
                '-Djava.library.path=', '-Dstorm.conf.file=', '-cp',
                self.storm_dir + '/*:' + self.storm_dir + '/lib:' + self.storm_dir + '/extlib:' + self.storm_dir +
                '/extlib-daemon:' + self.storm_dir + '/conf:' + self.storm_dir +
                '/bin', 'org.apache.storm.command.Rebalance', 'doomed_topology'
            ])
        )

    def test_list_command(self):
        self.base_test([
            'storm', 'list'
        ], self.mock_execvp, mock.call(
            self.java_cmd, [
                self.java_cmd, '-client', '-Ddaemon.name=', '-Dstorm.options=',
                '-Dstorm.home=' + self.storm_dir, '-Dstorm.log.dir=' + self.storm_dir + "/logs",
                '-Djava.library.path=', '-Dstorm.conf.file=', '-cp',
                self.storm_dir + '/*:' + self.storm_dir + '/lib:' + self.storm_dir + '/extlib:' + self.storm_dir +
                '/extlib-daemon:' + self.storm_dir + '/conf:' + self.storm_dir +
                '/bin', 'org.apache.storm.command.ListTopologies'
            ])
        )

    def test_nimbus_command(self):
        self.base_test([
            'storm', 'nimbus'
        ], self.mock_execvp, mock.call(
            self.java_cmd, [
                self.java_cmd, '-server', '-Ddaemon.name=nimbus', '-Dstorm.options=',
                '-Dstorm.home=' + self.storm_dir, '-Dstorm.log.dir=' + self.storm_dir + "/logs",
                '-Djava.library.path=', '-Dstorm.conf.file=', '-cp',
                self.storm_dir + '/*:' + self.storm_dir + '/lib:' + self.storm_dir +
                '/extlib:' + self.storm_dir + '/extlib-daemon:' + self.storm_dir + '/conf',
                '-Djava.deserialization.disabled=true', '-Dlogfile.name=nimbus.log',
                '-Dlog4j.configurationFile=' + self.storm_dir + '/log4j2/cluster.xml',
                'org.apache.storm.daemon.nimbus.Nimbus'
            ])
        )

    def test_supervisor_command(self):
        self.base_test([
            'storm', 'supervisor'
        ], self.mock_execvp, mock.call(
            self.java_cmd, [
                self.java_cmd, '-server', '-Ddaemon.name=supervisor', '-Dstorm.options=',
                '-Dstorm.home=' + self.storm_dir, '-Dstorm.log.dir=' + self.storm_dir + "/logs",
                '-Djava.library.path=', '-Dstorm.conf.file=', '-cp',
                self.storm_dir + '/*:' + self.storm_dir + '/lib:' + self.storm_dir +
                '/extlib:' + self.storm_dir + '/extlib-daemon:' + self.storm_dir + '/conf',
                '-Djava.deserialization.disabled=true', '-Dlogfile.name=supervisor.log',
                '-Dlog4j.configurationFile=' + self.storm_dir + '/log4j2/cluster.xml',
                'org.apache.storm.daemon.supervisor.Supervisor'
            ])
        )

    def test_pacemaker_command(self):
        self.base_test([
            'storm', 'pacemaker'
        ], self.mock_execvp, mock.call(
            self.java_cmd, [
                self.java_cmd, '-server', '-Ddaemon.name=pacemaker', '-Dstorm.options=',
                '-Dstorm.home=' + self.storm_dir, '-Dstorm.log.dir=' + self.storm_dir + "/logs",
                '-Djava.library.path=', '-Dstorm.conf.file=', '-cp',
                self.storm_dir + '/*:' + self.storm_dir + '/lib:' + self.storm_dir +
                '/extlib:' + self.storm_dir + '/extlib-daemon:' + self.storm_dir + '/conf',
                '-Djava.deserialization.disabled=true', '-Dlogfile.name=pacemaker.log',
                '-Dlog4j.configurationFile=' + self.storm_dir + '/log4j2/cluster.xml',
                'org.apache.storm.pacemaker.Pacemaker'
            ])
        )

    def test_ui_command(self):
        self.base_test([
            'storm', 'ui'
        ], self.mock_execvp, mock.call(
            self.java_cmd, [
                self.java_cmd, '-server', '-Ddaemon.name=ui', '-Dstorm.options=',
                '-Dstorm.home=' + self.storm_dir, '-Dstorm.log.dir=' + self.storm_dir + "/logs",
                '-Djava.library.path=', '-Dstorm.conf.file=', '-cp',
                self.storm_dir + '/*:' + self.storm_dir + '/lib:' + self.storm_dir +
                '/extlib:' + self.storm_dir + '/extlib-daemon:' + self.storm_dir +
                '/lib-webapp:' + self.storm_dir + '/conf',
                '-Djava.deserialization.disabled=true', '-Dlogfile.name=ui.log',
                '-Dlog4j.configurationFile=' + self.storm_dir + '/log4j2/cluster.xml',
                'org.apache.storm.daemon.ui.UIServer'
            ])
        )

    def test_logviewer_command(self):
        self.base_test([
            'storm', 'logviewer'
        ], self.mock_execvp, mock.call(
            self.java_cmd, [
                self.java_cmd, '-server', '-Ddaemon.name=logviewer', '-Dstorm.options=',
                '-Dstorm.home=' + self.storm_dir, '-Dstorm.log.dir=' + self.storm_dir + "/logs",
                '-Djava.library.path=', '-Dstorm.conf.file=', '-cp',
                self.storm_dir + '/*:' + self.storm_dir + '/lib:' + self.storm_dir +
                '/extlib:' + self.storm_dir + '/extlib-daemon:' + self.storm_dir +
                '/lib-webapp:' + self.storm_dir + '/conf',
                '-Djava.deserialization.disabled=true', '-Dlogfile.name=logviewer.log',
                '-Dlog4j.configurationFile=' + self.storm_dir + '/log4j2/cluster.xml',
                'org.apache.storm.daemon.logviewer.LogviewerServer'
            ])
        )

    def test_drpc_command(self):
        self.base_test([
            'storm', 'drpc'
        ], self.mock_execvp, mock.call(
            self.java_cmd, [
                self.java_cmd, '-server', '-Ddaemon.name=drpc', '-Dstorm.options=',
                '-Dstorm.home=' + self.storm_dir, '-Dstorm.log.dir=' + self.storm_dir + "/logs",
                '-Djava.library.path=', '-Dstorm.conf.file=', '-cp',
                self.storm_dir + '/*:' + self.storm_dir + '/lib:' + self.storm_dir +
                '/extlib:' + self.storm_dir + '/extlib-daemon:' + self.storm_dir +
                '/lib-webapp:' + self.storm_dir + '/conf',
                '-Djava.deserialization.disabled=true', '-Dlogfile.name=drpc.log',
                '-Dlog4j.configurationFile=' + self.storm_dir + '/log4j2/cluster.xml',
                'org.apache.storm.daemon.drpc.DRPCServer'
            ])
        )

    def test_drpc_client_command(self):
        self.base_test([
            'storm', 'drpc-client', 'exclaim', 'a', 'exclaim', 'b', 'test', 'bar'
        ], self.mock_execvp, mock.call(
            self.java_cmd, [
                self.java_cmd, '-client', '-Ddaemon.name=', '-Dstorm.options=',
                '-Dstorm.home=' + self.storm_dir, '-Dstorm.log.dir=' + self.storm_dir + "/logs",
                '-Djava.library.path=', '-Dstorm.conf.file=', '-cp',
                self.storm_dir + '/*:' + self.storm_dir + '/lib:' + self.storm_dir + '/extlib:' + self.storm_dir +
                '/extlib-daemon:' + self.storm_dir + '/conf:' + self.storm_dir +
                '/bin', 'org.apache.storm.command.BasicDrpcClient', 'exclaim', 'a', 'exclaim', 'b', 'test', 'bar'
            ])
        )
        self.base_test([
            'storm', 'drpc-client', '-f', 'exclaim', 'a', 'b'
        ], self.mock_execvp, mock.call(
            self.java_cmd, [
                self.java_cmd, '-client', '-Ddaemon.name=', '-Dstorm.options=',
                '-Dstorm.home=' + self.storm_dir, '-Dstorm.log.dir=' + self.storm_dir + "/logs",
                '-Djava.library.path=', '-Dstorm.conf.file=', '-cp',
                self.storm_dir + '/*:' + self.storm_dir + '/lib:' + self.storm_dir + '/extlib:' + self.storm_dir +
                '/extlib-daemon:' + self.storm_dir + '/conf:' + self.storm_dir +
                '/bin', 'org.apache.storm.command.BasicDrpcClient', '-f', 'exclaim', 'a', 'b'
            ])
        )

    def test_healthcheck_command(self):
        self.base_test([
            'storm', 'node-health-check'
        ], self.mock_execvp, mock.call(
            self.java_cmd, [
                self.java_cmd, '-client', '-Ddaemon.name=', '-Dstorm.options=',
                '-Dstorm.home=' + self.storm_dir, '-Dstorm.log.dir=' + self.storm_dir + "/logs", '-Djava.library.path=',
                '-Dstorm.conf.file=', '-cp', self.storm_dir + '/*:' + self.storm_dir + '/lib:' +
                self.storm_dir + '/extlib:' + self.storm_dir + '/extlib-daemon:' + self.storm_dir + '/conf:' +
                self.storm_dir + '/bin', 'org.apache.storm.command.HealthCheck'
            ])
        )



    def tearDown(self):
        self.mock_popen.stop()
        self.mock_path_exists.stop()


if __name__ == '__main__':
    test_main()