#!/usr/bin/env python
# Copyright 2016 The Chromium OS Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

"""Tests for toybox."""

import textwrap
import unittest

import mock

import factory_common  # pylint: disable=unused-import
from cros.factory.device import device_utils
from cros.factory.device import toybox


class ToyboxTest(unittest.TestCase):

  def setUp(self):
    self.dut = device_utils.CreateDUTInterface()

  def testBaseName(self):
    self.dut.CheckOutput = mock.MagicMock(return_value='abc\n')
    self.assertEquals(self.dut.toybox.basename('abc.def'), 'abc')
    self.dut.CheckOutput.assert_called_with(['toybox', 'basename', 'abc.def'])

  def testCat(self):
    self.dut.CheckOutput = mock.MagicMock(return_value='abc\n')
    self.assertEquals(self.dut.toybox.cat('/abc'), 'abc\n')
    self.dut.CheckOutput.assert_called_with(['toybox', 'cat', '/abc'])

    self.dut.CheckOutput = mock.MagicMock(return_value='abc\n')
    self.assertEquals(self.dut.toybox.cat('/abc', unbuffered=True), 'abc\n')
    self.dut.CheckOutput.assert_called_with(['toybox', 'cat', '-u', '/abc'])

    self.dut.CheckOutput = mock.MagicMock(return_value='abc\ndef\n')
    self.assertEquals(self.dut.toybox.cat(['/abc', '/def']), 'abc\ndef\n')
    self.dut.CheckOutput.assert_called_with(['toybox', 'cat', '/abc', '/def'])

  def testChvt(self):
    self.dut.CheckCall = mock.MagicMock(return_value=0)
    self.dut.toybox.chvt(3)
    self.dut.CheckCall.assert_called_with(['toybox', 'chvt', '3'])

  def testClear(self):
    self.dut.CheckCall = mock.MagicMock(return_value=0)
    self.dut.toybox.clear()
    self.dut.CheckCall.assert_called_with(['toybox', 'clear'])

  def testDd(self):
    self.dut.CheckOutput = mock.MagicMock(return_value=' ')
    self.assertEquals(self.dut.toybox.dd('/dev/null', bs=1, count=1), ' ')
    self.dut.CheckOutput.assert_called_with(['toybox', 'dd', 'if=/dev/null',
                                             'bs=1', 'count=1'])
    self.assertEquals(self.dut.toybox.dd('/dev/null', bs=1, count=1, conv=[]),
                      ' ')
    self.dut.CheckOutput.assert_called_with(['toybox', 'dd', 'if=/dev/null',
                                             'bs=1', 'count=1'])

  def testDf(self):
    output = textwrap.dedent("""
      Filesystem      1K-blocks       Used  Available Use% Mounted on
      udev             32924692         12   32924680   1% /dev
      """[1:])
    self.dut.CheckOutput = mock.MagicMock(return_value=output)
    self.assertEquals(self.dut.toybox.df('')[0].kblocks, 32924692)
    self.dut.CheckOutput.assert_called_with(['toybox', 'df'])

  def testDirname(self):
    self.dut.CheckOutput = mock.MagicMock(return_value='/abc\n')
    self.assertEquals(self.dut.toybox.dirname('/abc/def'), '/abc')
    self.dut.CheckOutput.assert_called_with(['toybox', 'dirname', '/abc/def'])

  def testFree(self):
    output = textwrap.dedent("""
                total        used        free      shared     buffers
      Mem:      67450236928 62023270400  5426966528           0  2090393600
      -/+ buffers/cache:    59932876800  7517360128
      Swap:     68618809344  2034167808 66584641536
      """[1:])
    self.dut.CheckOutput = mock.MagicMock(return_value=output)
    self.assertEquals(self.dut.toybox.free().mem_min_used, 59932876800)
    self.dut.CheckOutput.assert_called_with(['toybox', 'free', '-b'])

  def testFstype(self):
    self.dut.CheckOutput = mock.MagicMock(return_value='ext2\n')
    self.assertEquals(self.dut.toybox.fstype('/dev/sda'), ['ext2'])
    self.dut.CheckOutput.assert_called_with(['toybox', 'fstype', '/dev/sda'])

  def testHead(self):
    self.dut.CheckOutput = mock.MagicMock(return_value='123\n')
    self.assertEquals(self.dut.toybox.head('abc'), '123\n')
    self.dut.CheckOutput.assert_called_with(['toybox', 'head', 'abc'])

    self.dut.CheckOutput = mock.MagicMock(return_value='123\n')
    self.assertEquals(self.dut.toybox.head('abc', number=10), '123\n')
    self.dut.CheckOutput.assert_called_with(
        ['toybox', 'head', '-n', '10', 'abc'])

  def testHostname(self):
    self.dut.CheckOutput = mock.MagicMock(return_value='tpe\n')
    self.assertEquals(self.dut.toybox.hostname(), 'tpe')
    self.dut.CheckOutput.assert_called_with(['toybox', 'hostname'])

    self.dut.CheckCall = mock.MagicMock(return_value='new-tpe\n')
    self.assertEquals(self.dut.toybox.hostname('new-tpe'), 'new-tpe')
    self.dut.CheckCall.assert_called_with(['toybox', 'hostname', 'new-tpe'])

  def testLogname(self):
    self.dut.CheckOutput = mock.MagicMock(return_value='root\n')
    self.assertEquals(self.dut.toybox.logname(), 'root')
    self.dut.CheckOutput.assert_called_with(['toybox', 'logname'])

  def testMount(self):
    output = textwrap.dedent("""
      rootfs on / type rootfs (rw)
      """[1:])
    self.dut.CheckOutput = mock.MagicMock(return_value=output)
    results = self.dut.toybox.mount()[0]
    self.assertEquals(results.device, 'rootfs')
    self.assertEquals(results.path, '/')
    self.assertEquals(results.type, 'rootfs')
    self.assertEquals(results.options, 'rw')
    self.dut.CheckOutput.assert_called_with(['toybox', 'mount'])

  def testNohup(self):
    self.dut.CheckCall = mock.MagicMock(return_value=0)
    self.dut.toybox.nohup(['sleep', '10'])
    self.dut.CheckCall.assert_called_with(['toybox', 'nohup', 'sleep', '10'])

  def testPartprobe(self):
    self.dut.CheckCall = mock.MagicMock(return_value=0)
    self.dut.toybox.partprobe('/dev/sda')
    self.dut.CheckCall.assert_called_with(['toybox', 'partprobe', '/dev/sda'])

  def testPkill(self):
    self.dut.CheckCall = mock.MagicMock(return_value=0)
    self.dut.toybox.pkill('stressapptest', signal=9)
    self.dut.CheckCall.assert_called_with(['toybox', 'pkill', '-l', '9',
                                           'stressapptest'])

    self.dut.CheckCall = mock.MagicMock(return_value=0)
    self.dut.toybox.pkill('ls -al', exact=True, full=True, pgroup=0)
    self.dut.CheckCall.assert_called_with(['toybox', 'pkill', '-x', '-f',
                                           '-g', '0', '\'ls -al\''])

  def testPwd(self):
    self.dut.CheckOutput = mock.MagicMock(return_value='/\n')
    self.assertEquals(self.dut.toybox.pwd(), '/')
    self.dut.CheckOutput.assert_called_with(['toybox', 'pwd'])

  def testReset(self):
    self.dut.CheckCall = mock.MagicMock(return_value=0)
    self.dut.toybox.reset()
    self.dut.CheckCall.assert_called_with(['toybox', 'reset'])

  def testRmdir(self):
    self.dut.CheckCall = mock.MagicMock(return_value=0)
    self.dut.toybox.rmdir('/abc')
    self.dut.CheckCall.assert_called_with(['toybox', 'rmdir', '/abc'])
    self.dut.toybox.rmdir('/abc', parents=True)
    self.dut.CheckCall.assert_called_with(['toybox', 'rmdir', '-p', '/abc'])

  def testSync(self):
    self.dut.CheckCall = mock.MagicMock(return_value=0)
    self.dut.toybox.sync()
    self.dut.CheckCall.assert_called_with(['toybox', 'sync'])

  def testUnlink(self):
    self.dut.CheckCall = mock.MagicMock(return_value=0)
    self.dut.toybox.unlink('/abc')
    self.dut.CheckCall.assert_called_with(['toybox', 'unlink', '/abc'])

  def testUptime(self):
    output = textwrap.dedent("""
      07:02:03 up 45 days,  4:56,  2 users,  load average: 1.26, 1.37, 1.20
      """[1:])
    self.dut.CheckOutput = mock.MagicMock(return_value=output)
    self.assertEquals(self.dut.toybox.uptime().loadavg_1min, 1.26)
    self.dut.CheckOutput.assert_called_with(['toybox', 'uptime'])

  def testWc(self):
    output = textwrap.dedent("""
      74  309 2193 link.py
      """[1:])
    self.dut.CheckOutput = mock.MagicMock(return_value=output)
    results = self.dut.toybox.wc('link.py')[0]
    self.assertEquals(results.lines, 74)
    self.assertEquals(results.words, 309)
    self.assertEquals(results.bytes, 2193)
    self.assertEquals(results.filename, 'link.py')
    self.dut.CheckOutput.assert_called_with(
        ['toybox', 'wc', '-l', '-w', '-c', 'link.py'])

  def testWhich(self):
    self.dut.CheckOutput = mock.MagicMock(return_value='/bin/ls\n')
    self.assertEquals(self.dut.toybox.which('ls'), ['/bin/ls'])
    self.dut.CheckOutput.assert_called_with(['toybox', 'which', 'ls'])

  def testWhoami(self):
    self.dut.CheckOutput = mock.MagicMock(return_value='root\n')
    self.assertEquals(self.dut.toybox.whoami(), 'root')
    self.dut.CheckOutput.assert_called_with(['toybox', 'whoami'])

  def testOverrideProvider(self):
    # pylint: disable=protected-access
    # set default provider to toolbox
    _toybox = toybox.Toybox(self.dut, provider_map={'*': 'toolbox'})
    self.dut.CheckOutput = mock.MagicMock(return_value=None)
    _toybox.dd('/dev/null', bs=1, count=1)
    self.dut.CheckOutput.assert_called_with(['toolbox', 'dd', 'if=/dev/null',
                                             'bs=1', 'count=1'])

    # use dd provided by busybox
    _toybox = toybox.Toybox(self.dut, provider_map={'*': 'toolbox',
                                                    'dd': 'busybox'})
    _toybox.dd('/dev/null', bs=1, count=1)
    self.dut.CheckOutput.assert_called_with(['busybox', 'dd', 'if=/dev/null',
                                             'bs=1', 'count=1'])

    # use dd provided by system
    _toybox = toybox.Toybox(self.dut, provider_map={'*': 'toolbox',
                                                    'dd': None})
    _toybox.dd('/dev/null', bs=1, count=1)
    self.dut.CheckOutput.assert_called_with(['dd', 'if=/dev/null',
                                             'bs=1', 'count=1'])


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