#!/usr/bin/python
# Copyright 2015 Google Inc. All Rights Reserved.
#
# Licensed 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.

"""Tests for wifiblaster."""

__author__ = 'mikemu@google.com (Mike Mu)'

import unittest
import wifiblaster


class IwTest(unittest.TestCase):

  def DevStationGet(self, client):
    if client == '11:11:11:11:11:11':
      return ('Station 11:11:11:11:11:11 (on wlan0)\n'
              '\tinactive time:\t100 ms\n'
              '\trx bytes:\tx\n'
              '\trx packets:\tx\n'
              '\ttx bytes:\tx\n'
              '\ttx packets:\tx\n'
              '\ttx retries:\tx\n'
              '\ttx failed:\tx\n'
              '\tsignal:\t-38 [-48, -56, -39] dBm\n'
              '\tsignal avg:\tx\n'
              '\ttx bitrate:\tx\n'
              '\tauthorized:\tx\n'
              '\tauthenticated:\tx\n'
              '\tpreamble:\tx\n'
              '\tWMM/WME:\tx\n'
              '\tMFP:\tx\n'
              '\tTDLS peer:\tx\n')
    raise wifiblaster.NotAssociatedError

  def setUp(self):
    self.iw = wifiblaster.Iw('wlan0')
    self.iw._DevInfo = lambda: (  # pylint: disable=g-long-lambda
        'Interface wlan0\n'
        '\tifindex 5\n'
        '\twdev 0x1\n'
        '\taddr 11:11:11:11:11:11\n'
        '\tssid TestWifi\n'
        '\ttype AP\n'
        '\twiphy 0\n'
        '\tchannel 1 (2412 MHz), width: 20 MHz, center1: 2412 MHz\n')
    self.iw._DevStationDump = lambda: (  # pylint: disable=g-long-lambda
        'Station 11:11:11:11:11:11 (on wlan0)\n'
        '\tinactive time:\t100 ms\n'
        '\trx bytes:\tx\n'
        '\trx packets:\tx\n'
        '\ttx bytes:\tx\n'
        '\ttx packets:\tx\n'
        '\ttx retries:\tx\n'
        '\ttx failed:\tx\n'
        '\tsignal:\t-38 [-48, -56, -39] dBm\n'
        '\tsignal avg:\tx\n'
        '\ttx bitrate:\tx\n'
        '\tauthorized:\tx\n'
        '\tauthenticated:\tx\n'
        '\tpreamble:\tx\n'
        '\tWMM/WME:\tx\n'
        '\tMFP:\tx\n'
        '\tTDLS peer:\tx\n'
        'Station 22:22:22:22:22:22 (on wlan0)\n'
        '\tinactive time:\tx\n'
        '\trx bytes:\tx\n'
        '\trx packets:\tx\n'
        '\ttx bytes:\tx\n'
        '\ttx packets:\tx\n'
        '\ttx retries:\tx\n'
        '\ttx failed:\tx\n'
        '\tsignal:\tx\n'
        '\tsignal avg:\tx\n'
        '\ttx bitrate:\tx\n'
        '\tauthorized:\tx\n'
        '\tauthenticated:\tx\n'
        '\tpreamble:\tx\n'
        '\tWMM/WME:\tx\n'
        '\tMFP:\tx\n'
        '\tTDLS peer:\tx\n')
    self.iw._DevStationGet = self.DevStationGet

  def testGetFrequency(self):
    self.assertEquals(self.iw.GetFrequency(), 2412)

  def testGetPhy(self):
    self.assertEquals(self.iw.GetPhy(), 'phy0')

  def testGetClients(self):
    self.assertEquals(self.iw.GetClients(),
                      {'11:11:11:11:11:11', '22:22:22:22:22:22'})

  def testGetInactiveTime(self):
    self.assertEquals(self.iw.GetInactiveTime('11:11:11:11:11:11'), .1)

  def testGetRssi(self):
    self.assertEquals(self.iw.GetRssi('11:11:11:11:11:11'), -38)

  def testGetRssiNotAssociated(self):
    self.assertRaises(wifiblaster.NotAssociatedError,
                      self.iw.GetRssi, '33:33:33:33:33:33')


class Mac80211StatsTest(unittest.TestCase):

  def setUp(self):
    self.mac80211stats = wifiblaster.Mac80211Stats('phy0')
    self.counters = {}
    self.mac80211stats._ReadCounter = lambda counter: self.counters[counter]

  def testGetTransmittedFrameCount(self):
    self.counters['dot11TransmittedFrameCount'] = 123
    self.assertEquals(self.mac80211stats.GetTransmittedFrameCount(), 123)


if __name__ == '__main__':
  unittest.main()
