#!/usr/bin/env python3
import unittest
import subprocess
import sys
import os

import aptdaemon.test

class TestBluezResponse(unittest.TestCase):

  devices = {}

  def setUp(self):
    # start a local fake system D-BUS
    dbus = subprocess.Popen(['dbus-daemon', '--nofork', '--print-address',
                            '--config-file',
                            os.path.join(aptdaemon.test.get_tests_dir(), 'dbus.conf')],
                            stdout=subprocess.PIPE, universal_newlines=True)
    dbus_address = dbus.stdout.readline().strip()
    os.environ['DBUS_SYSTEM_BUS_ADDRESS'] = dbus_address

    subprocess.call(['bluetoothd'])
    p1 = subprocess.Popen(['hciconfig'],
                          stdout=subprocess.PIPE,
                          universal_newlines=True)
    p2 = subprocess.Popen(['grep', '\(^hci\|BD\ Address\)'],
                          stdin=p1.stdout, stdout=subprocess.PIPE,
                          universal_newlines=True)
    p1.stdout.close()
    hciconf_output = p2.communicate()[0].replace('\t', ' ').split('\n')

    device_id = ""
    for line in hciconf_output:
      if "hci" in line:
        device_id = line.split(':')[0]
      elif "BD Address" in line:
        self.devices[device_id] = line.split()[2]

    if len(self.devices) < 1:
      self.skipTest("No bluetooth devices available for testing")

  def testDevice(self):
    for dev in self.devices:
      ret = subprocess.call(['bluez-test-device', '-i', dev, 'list'])
      self.assertEqual(ret, 0)

  def testAdapter(self):
    for dev in self.devices:
      output = subprocess.check_output(['bluez-test-adapter', '-i', dev, 'address'],
                                       universal_newlines=True)
      self.assertIn(self.devices[dev], output)

unittest.main(testRunner=unittest.TextTestRunner(stream=sys.stdout, verbosity=2))
