Blame tests/test_util.py

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