#!/usr/bin/env python

"""
Tests for talos.xrestop
"""

import os
import subprocess
import unittest
from talos.cmanager_linux import xrestop

here = os.path.dirname(os.path.abspath(__file__))
xrestop_output = os.path.join(here, 'xrestop_output.txt')


class TestXrestop(unittest.TestCase):

    def test_parsing(self):
        """test parsing xrestop output from xrestop_output.txt"""

        class MockPopen(object):
            """
            stub class for subprocess.Popen
            We mock this to return a local static copy of xrestop output
            This has the unfortunate nature of depending on implementation
            details.
            """
            def __init__(self, *args, **kwargs):
                self.returncode = 0

            def communicate(self):
                stdout = open(xrestop_output).read()
                return stdout, ''

        # monkey-patch subprocess.Popen
        Popen = subprocess.Popen
        subprocess.Popen = MockPopen

        # get the output
        output = xrestop()

        # ensure that the parsed output is equal to what is in
        # xrestop_output.txt
        self.assertEqual(len(output), 7)  # seven windows with PIDs

        # the first window is Thunderbird
        pid = 2035  # thundrbird's pid
        self.assertTrue(pid in output)
        thunderbird = output[pid]
        self.assertEqual(thunderbird['index'], 0)
        self.assertEqual(thunderbird['total bytes'], '~4728761')

        # PID=1668 is a Terminal
        pid = 1668
        self.assertTrue(pid in output)
        terminal = output[pid]
        self.assertEqual(terminal['pixmap bytes'], '1943716')

        # cleanup: set subprocess.Popen back
        subprocess.Popen = Popen


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