#!/usr/bin/env python
import os
import subprocess
from vpp_papi_provider import VppPapiProvider
from threading import Timer

from framework import VppTestCase

# Api files path
API_FILES_PATH = "vpp/vpp-api/java"

# Registry jar file name prefix
REGISTRY_JAR_PREFIX = "jvpp-registry"


class TestJVppConnection(VppTestCase):

    def full_jar_name(self, install_dir, jar_name, version):
        return os.path.join(install_dir, API_FILES_PATH,
                            "{0}-{1}.jar".format(jar_name, version))

    def jvpp_connection_test(self, api_jar_name, test_class_name, timeout):
        install_dir = os.getenv('VPP_TEST_BUILD_DIR')
        print("Install directory : {0}".format(install_dir))

        version_reply = self.vapi.show_version()
        version = version_reply.version.split("-")[0]
        registry_jar_path = self.full_jar_name(install_dir,
                                               REGISTRY_JAR_PREFIX, version)
        print("JVpp Registry jar path : {0}".format(registry_jar_path))

        api_jar_path = self.full_jar_name(install_dir, api_jar_name, version)
        print("Api jar path : {0}".format(api_jar_path))

        # passes shm prefix as parameter to create connection with same value
        command = ["java", "-cp",
                   "{0}:{1}".format(registry_jar_path, api_jar_path),
                   test_class_name, "/{0}-vpe-api".format(self.shm_prefix)]
        print("Test Command : {0}, Timeout : {1}".format(command, timeout))

        self.process = subprocess.Popen(command, shell=False,
                                        stdout=subprocess.PIPE,
                                        stderr=subprocess.PIPE, bufsize=1,
                                        universal_newlines=True)

        out, err = self.process.communicate()
        print("Process output : {0}{1}".format(os.linesep, out))
        print("Process error output : {0}{1}".format(os.linesep, err))
        self.assert_equal(self.process.returncode, 0, "process return code")

    def tearDown(self):
        print("Tearing down jvpp test")
        if self.process.poll() is None:
            self.process.kill()