Blame tests/test_util.py

Packit 6f3914
# -*- coding: utf-8 -*-
Packit 6f3914
Packit 6f3914
# Copyright (C) 2012-2018 Red Hat, Inc.
Packit 6f3914
#
Packit 6f3914
# This copyrighted material is made available to anyone wishing to use,
Packit 6f3914
# modify, copy, or redistribute it subject to the terms and conditions of
Packit 6f3914
# the GNU General Public License v.2, or (at your option) any later version.
Packit 6f3914
# This program is distributed in the hope that it will be useful, but WITHOUT
Packit 6f3914
# ANY WARRANTY expressed or implied, including the implied warranties of
Packit 6f3914
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General
Packit 6f3914
# Public License for more details.  You should have received a copy of the
Packit 6f3914
# GNU General Public License along with this program; if not, write to the
Packit 6f3914
# Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
Packit 6f3914
# 02110-1301, USA.  Any Red Hat trademarks that are incorporated in the
Packit 6f3914
# source code or documentation are not subject to the GNU General Public
Packit 6f3914
# License and may only be used or replicated with the express permission of
Packit 6f3914
# Red Hat, Inc.
Packit 6f3914
#
Packit 6f3914
Packit 6f3914
from __future__ import absolute_import
Packit 6f3914
from __future__ import unicode_literals
Packit 6f3914
Packit 6f3914
import operator
Packit 6f3914
Packit 6f3914
import dnf.util
Packit 6f3914
Packit 6f3914
import tests.support
Packit 6f3914
from tests.support import mock
Packit 6f3914
Packit 6f3914
Packit 6f3914
class Slow(object):
Packit 6f3914
    def __init__(self, val):
Packit 6f3914
        self._val = val
Packit 6f3914
        self.computed = 0
Packit 6f3914
Packit 6f3914
    def new_val(self, val):
Packit 6f3914
        self._val = val
Packit 6f3914
        del self._square1
Packit 6f3914
        del self._square2
Packit 6f3914
Packit 6f3914
    @dnf.util.lazyattr("_square1")
Packit 6f3914
    def square1(self):
Packit 6f3914
        self.computed += 1
Packit 6f3914
        return self._val * self._val
Packit 6f3914
Packit 6f3914
    @property
Packit 6f3914
    @dnf.util.lazyattr("_square2")
Packit 6f3914
    def square2(self):
Packit 6f3914
        self.computed += 1
Packit 6f3914
        return self._val * self._val
Packit 6f3914
Packit 6f3914
Packit 6f3914
class Util(tests.support.TestCase):
Packit 6f3914
    def test_am_i_root(self):
Packit 6f3914
        with mock.patch('os.geteuid', return_value=1001):
Packit 6f3914
            self.assertFalse(dnf.util.am_i_root())
Packit 6f3914
        with mock.patch('os.geteuid', return_value=0):
Packit 6f3914
            assert(dnf.util.am_i_root())
Packit 6f3914
Packit 6f3914
    def test_bunch(self):
Packit 6f3914
        b = dnf.util.Bunch()
Packit 6f3914
        self.assertRaises(AttributeError, lambda: b.more)
Packit 6f3914
        b.garden = 'weeds'
Packit 6f3914
        self.assertEqual(b['garden'], 'weeds')
Packit 6f3914
        b['digging'] = 4
Packit 6f3914
        self.assertEqual(b.digging, 4)
Packit 6f3914
Packit 6f3914
    def test_empty(self):
Packit 6f3914
        self.assertTrue(dnf.util.empty(()))
Packit 6f3914
        self.assertFalse(dnf.util.empty([1, 2, 3]))
Packit 6f3914
        self.assertTrue(dnf.util.empty((x for x in [])))
Packit 6f3914
        self.assertTrue(dnf.util.empty(iter([])))
Packit 6f3914
        self.assertFalse(dnf.util.empty((x for x in [2, 3])))
Packit 6f3914
Packit 6f3914
    def test_file_timestamp(self):
Packit 6f3914
        stat = mock.Mock()
Packit 6f3914
        stat.st_mtime = 123
Packit 6f3914
        with mock.patch('os.stat', return_value=stat):
Packit 6f3914
            self.assertEqual(dnf.util.file_timestamp("/yeah"), 123)
Packit 6f3914
        self.assertRaises(OSError, dnf.util.file_timestamp, "/does/not/ex1st")
Packit 6f3914
Packit 6f3914
    def test_first(self):
Packit 6f3914
        self.assertEqual(dnf.util.first([5, 4, 3]), 5)
Packit 6f3914
        ge = (x for x in range(5, 8))
Packit 6f3914
        self.assertEqual(dnf.util.first(ge), 5)
Packit 6f3914
        self.assertEqual(dnf.util.first([]), None)
Packit 6f3914
Packit 6f3914
        def generator():
Packit 6f3914
            if False:
Packit 6f3914
                yield 10
Packit 6f3914
        self.assertEqual(dnf.util.first(generator()), None)
Packit 6f3914
Packit 6f3914
    def test_get_in(self):
Packit 6f3914
        dct = {1: {2: 3},
Packit 6f3914
               5: {8: {9: 10}}}
Packit 6f3914
Packit 6f3914
        self.assertEqual(dnf.util.get_in(dct, (5, 8, 9), -3), 10)
Packit 6f3914
        self.assertEqual(dnf.util.get_in(dct, (5, 8, 8), -3), -3)
Packit 6f3914
        self.assertEqual(dnf.util.get_in(dct, (0, 8, 8), -3), -3)
Packit 6f3914
Packit 6f3914
    def test_group_by_filter(self):
Packit 6f3914
        self.assertEqual(dnf.util.group_by_filter(lambda x: x % 2, range(5)),
Packit 6f3914
                         ([1, 3], [0, 2, 4]))
Packit 6f3914
        self.assertEqual(dnf.util.group_by_filter(lambda x: x, range(5)),
Packit 6f3914
                         ([1, 2, 3, 4], [0]))
Packit 6f3914
Packit 6f3914
    def test_insert_if(self):
Packit 6f3914
        """Test insert_if with sometimes fulfilled condition."""
Packit 6f3914
        item = object()
Packit 6f3914
        iterable = range(4)
Packit 6f3914
Packit 6f3914
        def condition(item):
Packit 6f3914
            return item % 2 == 0
Packit 6f3914
Packit 6f3914
        iterator = dnf.util.insert_if(item, iterable, condition)
Packit 6f3914
Packit 6f3914
        self.assertEqual(next(iterator), item)
Packit 6f3914
        self.assertEqual(next(iterator), 0)
Packit 6f3914
        self.assertEqual(next(iterator), 1)
Packit 6f3914
        self.assertEqual(next(iterator), item)
Packit 6f3914
        self.assertEqual(next(iterator), 2)
Packit 6f3914
        self.assertEqual(next(iterator), 3)
Packit 6f3914
        self.assertRaises(StopIteration, next, iterator)
Packit 6f3914
Packit 6f3914
    def test_is_exhausted_true(self):
Packit 6f3914
        """Test is_exhausted with an iterator which is exhausted."""
Packit 6f3914
        iterator = iter(())
Packit 6f3914
Packit 6f3914
        result = dnf.util.is_exhausted(iterator)
Packit 6f3914
Packit 6f3914
        self.assertTrue(result)
Packit 6f3914
Packit 6f3914
    def test_is_exhausted_false(self):
Packit 6f3914
        """Test is_exhausted with an iterator which is not exhausted."""
Packit 6f3914
        iterator = iter((1,))
Packit 6f3914
Packit 6f3914
        result = dnf.util.is_exhausted(iterator)
Packit 6f3914
Packit 6f3914
        self.assertFalse(result)
Packit 6f3914
Packit 6f3914
    def test_is_glob_pattern(self):
Packit 6f3914
        assert(dnf.util.is_glob_pattern("all*.ext"))
Packit 6f3914
        assert(dnf.util.is_glob_pattern("all?.ext"))
Packit 6f3914
        assert(not dnf.util.is_glob_pattern("not.ext"))
Packit 6f3914
Packit 6f3914
    def test_lazyattr(self):
Packit 6f3914
        slow = Slow(12)
Packit 6f3914
Packit 6f3914
        self.assertEqual(slow.computed, 0)
Packit 6f3914
        self.assertEqual(slow.square1(), 144)
Packit 6f3914
        self.assertEqual(slow.computed, 1)
Packit 6f3914
        self.assertEqual(slow.square1(), 144)
Packit 6f3914
        self.assertEqual(slow.square1(), 144)
Packit 6f3914
        self.assertEqual(slow.computed, 1)
Packit 6f3914
Packit 6f3914
        self.assertEqual(slow.square2, 144)
Packit 6f3914
        self.assertEqual(slow.computed, 2)
Packit 6f3914
        self.assertEqual(slow.square2, 144)
Packit 6f3914
        self.assertEqual(slow.computed, 2)
Packit 6f3914
Packit 6f3914
        slow.new_val(13)
Packit 6f3914
        self.assertEqual(slow.square1(), 169)
Packit 6f3914
        self.assertEqual(slow.square2, 169)
Packit 6f3914
        self.assertEqual(slow.computed, 4)
Packit 6f3914
Packit 6f3914
    def test_mapall(self):
Packit 6f3914
        l = [1, 2, 3]
Packit 6f3914
        out = dnf.util.mapall(lambda n: 2 * n, l)
Packit 6f3914
        self.assertIsInstance(out, list)
Packit 6f3914
        self.assertEqual(out, [2, 4, 6])
Packit 6f3914
Packit 6f3914
    def test_partition(self):
Packit 6f3914
        l = list(range(6))
Packit 6f3914
        smaller, larger = dnf.util.partition(lambda i: i > 4, l)
Packit 6f3914
        self.assertCountEqual(smaller, (0, 1, 2, 3, 4))
Packit 6f3914
        self.assertCountEqual(larger, (5,))
Packit 6f3914
Packit 6f3914
    def test_split_by(self):
Packit 6f3914
        """Test split_by with sometimes fulfilled condition."""
Packit 6f3914
        iterable = range(7)
Packit 6f3914
Packit 6f3914
        def condition(item):
Packit 6f3914
            return item % 3 == 0
Packit 6f3914
Packit 6f3914
        iterator = dnf.util.split_by(iterable, condition)
Packit 6f3914
Packit 6f3914
        self.assertEqual(next(iterator), ())
Packit 6f3914
        self.assertEqual(next(iterator), (0, 1, 2))
Packit 6f3914
        self.assertEqual(next(iterator), (3, 4, 5))
Packit 6f3914
        self.assertEqual(next(iterator), (6,))
Packit 6f3914
        self.assertRaises(StopIteration, next, iterator)
Packit 6f3914
Packit 6f3914
    def test_split_by_empty(self):
Packit 6f3914
        """Test split with empty iterable."""
Packit 6f3914
        iterable = []
Packit 6f3914
Packit 6f3914
        def condition(item):
Packit 6f3914
            return item % 3 == 0
Packit 6f3914
Packit 6f3914
        iterator = dnf.util.split_by(iterable, condition)
Packit 6f3914
Packit 6f3914
        self.assertEqual(next(iterator), ())
Packit 6f3914
        self.assertRaises(StopIteration, next, iterator)
Packit 6f3914
Packit 6f3914
    def test_strip_prefix(self):
Packit 6f3914
        self.assertIsNone(dnf.util.strip_prefix("razorblade", "blade"))
Packit 6f3914
        self.assertEqual(dnf.util.strip_prefix("razorblade", "razor"), "blade")
Packit 6f3914
Packit 6f3914
    def test_touch(self):
Packit 6f3914
        self.assertRaises(OSError, dnf.util.touch,
Packit 6f3914
                          tests.support.NONEXISTENT_FILE, no_create=True)
Packit 6f3914
Packit 6f3914
Packit 6f3914
class TestMultiCall(tests.support.TestCase):
Packit 6f3914
    def test_multi_call(self):
Packit 6f3914
        l = dnf.util.MultiCallList(["one", "two", "three"])
Packit 6f3914
        self.assertEqual(l.upper(), ["ONE", "TWO", "THREE"])
Packit 6f3914
        self.assertEqual(l.pop(), "three")
Packit 6f3914
Packit 6f3914
    def test_assignment(self):
Packit 6f3914
        o1 = mock.Mock(x=3)
Packit 6f3914
        o2 = mock.Mock(x=5)
Packit 6f3914
        l = dnf.util.MultiCallList([o1, o2])
Packit 6f3914
        l.x = 5
Packit 6f3914
        self.assertEqual([5, 5], list(map(operator.attrgetter('x'), [o1, o2])))