|
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])))
|