#!/usr/bin/env python3

import unittest
import subprocess
import sys
import os

import aptdaemon.test 

from gi.repository import NetworkManager, NMClient

class TestNM(unittest.TestCase):

  client = ()
  devices = {}
  nm_pid = 0

  @classmethod
  def setUpClass(self):
    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

    # in tests we need to make sure there are devices not defined in /e/n/i;
    # to ensure that, run the same script we run at install to migrate (comment out)
    # the entries from /e/n/i so NM can manage the devices.
    subprocess.call(['/usr/lib/NetworkManager/ifblacklist_migrate.sh'])

    subprocess.Popen(['console-kit-daemon'])
    subprocess.Popen(['/usr/lib/policykit-1/polkitd', '2>&1'], stderr=subprocess.STDOUT)
    self.nm_pid = subprocess.call(['NetworkManager'])

    self.client = NMClient.Client()

    ip_link_output = subprocess.check_output(['ip', 'link'],
                                             universal_newlines=True)
    for line in ip_link_output.splitlines():
      if 'mtu' in line:
        l = line.split(': ')
        devname = l[1]
        self.devices[devname] = {}
        self.devices[devname]['index'] = l[0]
      elif 'link' in line:
        l = line.split(' ')
        if devname in self.devices:
          self.devices[devname]['type'] = l[4].strip('link/')
          self.devices[devname]['mac'] = l[5]

  @classmethod
  def tearDownClass(self):
    if self.nm_pid > 0:
      os.kill(self.nm_pid)

  def testDevicesMACAddressMatch(self):
    nm_devices = self.client.get_devices()

    print()
    for dev in nm_devices:
      if dev.get_driver() != 'bluez':
        devname = dev.get_iface()
        print("Checking " + devname)
        self.assertIn(devname, self.devices)
        self.assertEqual(dev.get_hw_address().upper(), self.devices[devname]['mac'].upper())

  def testNMVersion(self):
    version = self.client.get_version()
    print("NetworkManager version is " + version)
    self.assertIsInstance(version, str)

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

