#!/usr/bin/env python

"""
This script launches a dbus session, sets the DBUS_SESSION_BUS_ADDRESS
and DBUS_STARTER_BUS_TYPE Eenvironment variables and puts the generated files
in the dbus dir location passed as a parameter. It then runs the unit test
script, and then cleans up the generated dbus files.
"""

from subprocess import check_call, check_output
import os
import sys
import argparse
import re
import tempfile

def launch_session_dbus(dbus_dir, dbus_config_file):
    """
    Launches a session debus using a modified config file and
    sets the DBUS_SESSION_BUS_ADDRESS environment variable

    Parameter descriptions:
    dbus_dir            Directory location for generated files
    dbus_config_file    File location of dbus sys config file
    """
    dbus_pid = os.path.join(dbus_dir,'pid')
    dbus_socket = os.path.join(dbus_dir,'system_bus_socket')
    dbus_local_conf = os.path.join(dbus_dir,'system-local.conf')
    if os.path.isfile(dbus_pid):
        os.remove(dbus_pid)
    with open(dbus_config_file) as infile, \
         open(dbus_local_conf, 'w') as outfile:
        for line in infile:
            line = re.sub('<type>.*</type>','<type>session</type>', \
                          line, flags=re.DOTALL)
            line = re.sub('<pidfile>.*</pidfile>', \
                          '<pidfile>%s</pidfile>' % dbus_pid, \
                          line, flags=re.DOTALL)
            line = re.sub('<listen>.*</listen>', \
                          '<listen>unix:path=%s</listen>' % dbus_socket, \
                          line, flags=re.DOTALL)
            line = re.sub('<deny','<allow', line)
            outfile.write(line)
    infile.close()
    outfile.close()
    command = ['dbus-daemon', '--config-file=%s' % dbus_local_conf, \
               '--print-address']
    out = check_output(command).splitlines()
    os.environ['DBUS_SESSION_BUS_ADDRESS'] = out[0]
    os.environ['DBUS_STARTER_BUS_TYPE'] = 'session'

def dbus_cleanup(dbus_dir):
    """
    Kills the dbus session started by launch_session_dbus
    and removes the generated files.

    Parameter descriptions:
    dbus_dir            Directory location of generated files
    """

    dbus_pid = os.path.join(dbus_dir,'pid')
    dbus_socket = os.path.join(dbus_dir,'system_bus_socket')
    dbus_local_conf = os.path.join(dbus_dir,'system-local.conf')
    if os.path.isfile(dbus_pid):
        dbus_pid = open(dbus_pid,'r').read().replace('\n','')
        check_call(['kill', dbus_pid])
    if os.path.isfile(dbus_local_conf):
        os.remove(dbus_local_conf)
    if os.path.exists(dbus_socket):
        os.remove(dbus_socket)


if __name__ == '__main__':

    # Set command line arguments
    parser = argparse.ArgumentParser()

    parser.add_argument("-f", "--dbussysconfigfile",
                        dest="DBUS_SYS_CONFIG_FILE",
                        required=True, help="Dbus sys config file location")
    parser.add_argument("-u", "--unittestandparams",
                        dest="UNIT_TEST",
                        required=True, help="Unit test script and params \
                        as comma delimited string")
    args = parser.parse_args(sys.argv[1:])
    DBUS_DIR = tempfile.mkdtemp()
    DBUS_SYS_CONFIG_FILE = args.DBUS_SYS_CONFIG_FILE
    UNIT_TEST = args.UNIT_TEST

    launch_session_dbus(DBUS_DIR, DBUS_SYS_CONFIG_FILE)
    check_call(UNIT_TEST.split(','), env=os.environ)
    dbus_cleanup(DBUS_DIR)

@@ -14,16 +14,17 @@
 v python
+3
 %0A%0A%22%22%22%0ATh
@@ -1892,16 +1892,32 @@
 = out%5B0%5D
+.decode(%22utf-8%22)
 %0A    os.

convert dbus-unit-test.py