# -*- coding: utf-8 -*-
# Copyright 2018 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.

"""Unittests for parsing bits in issuetracker."""

from __future__ import print_function
import unittest

import issuetracker


class CleanSTTest(unittest.TestCase):
    """Tests for issuetracker.clean_st."""
    def test_empty(self):
        """Test empty list returns sane values."""
        self.assertEqual([], issuetracker.clean_st([]))

    def test_two_sets(self):
        """Test sanity with more than 1 stacktrace."""
        inp = [
            set([' worker_thread+0x224/0x1900 kernel/workqueue.c:2248']),
            set([' ret_from_fork+0x3a/0x50 arch/x86/entry/entry_64.S:402'])
        ]
        expected = [set(['worker_thread']), set(['ret_from_fork'])]
        self.assertEqual(expected, issuetracker.clean_st(inp))

    def test_not_useful(self):
        """Test sanity with stacktrace data that is not useful."""
        inp = [set([' <IRQ>'])]
        expected = [set([])]
        self.assertEqual(expected, issuetracker.clean_st(inp))

    def test_expected1(self):
        """Test sanity against expected format."""
        inp = [set([' worker_thread+0x224/0x1900 kernel/workqueue.c:2248',
                    ' ret_from_fork+0x3a/0x50 arch/x86/entry/entry_64.S:402',
                    ' kthread+0x359/0x430 kernel/kthread.c:232'])]
        expected = [set(['kthread', 'worker_thread', 'ret_from_fork'])]
        self.assertEqual(expected, issuetracker.clean_st(inp))

    def test_expected2(self):
        """Test sanity against expected format."""
        inp = [set([
            ' [<ffffffff81c635e6>] __blkdev_driver_ioctl block/ioctl.c:288',
            (' [<ffffffff81c635e6>] blkdev_ioctl+0x7a6/0x1a30 '
             'block/ioctl.c:584')
        ])]
        expected = [set(['__blkdev_driver_ioctl', 'blkdev_ioctl'])]
        self.assertEqual(expected, issuetracker.clean_st(inp))

    def test_expected3(self):
        """Test sanity against expected format."""
        inp = [set([
            ' <EOI>  [<ffffffff81210b51>] ? a+0x1a1/0x440 b/c/d.c:3595'
        ])]
        expected = [set(['a'])]
        self.assertEqual(expected, issuetracker.clean_st(inp))


class GetStacktraceTest(unittest.TestCase):
    """Tests for issuetracker.get_stacktrace."""
    def test_empty(self):
        """Test empty list returns sane values."""
        self.assertEqual([], issuetracker.get_stacktrace(0, []))

    def test_expected1(self):
        """Test sanity against expected format."""
        inp = """
> Call Trace:
>  worker_thread+0x224/0x1900 kernel/workqueue.c:2248
>  ret_from_fork+0x3a/0x50 arch/x86/entry/entry_64.S:402
> <random_stuff>
> Call Trace:
>  [<ffffffff81c635e6>] __blkdev_driver_ioctl block/ioctl.c:288 [inline]
>  [<ffffffff81c635e6>] blkdev_ioctl+0x7a6/0x1a30 block/ioctl.c:584
""".splitlines()
        expected = [set(['worker_thread', 'ret_from_fork']),
                    set(['__blkdev_driver_ioctl', 'blkdev_ioctl'])]
        self.assertEqual(expected, issuetracker.get_stacktrace(0, inp))

    def test_expected2(self):
        """Test sanity against expected format."""
        inp = """
> something
> truly
> random
> Call Trace:
>  worker_thread+0x224/0x1900 kernel/workqueue.c:2248
>  ret_from_fork+0x3a/0x50 arch/x86/entry/entry_64.S:402
> <random_stuff>
> Call Trace:
>  [<ffffffff81c635e6>] __blkdev_driver_ioctl block/ioctl.c:288 [inline]
>  [<ffffffff81c635e6>] blkdev_ioctl+0x7a6/0x1a30 block/ioctl.c:584
""".splitlines()
        expected = [set(['worker_thread', 'ret_from_fork']),
                    set(['__blkdev_driver_ioctl', 'blkdev_ioctl'])]
        self.assertEqual(expected, issuetracker.get_stacktrace(3, inp))


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