From f6a8f20d5b7bde75f8e7c1a2e8c97d9f188d3d76 Mon Sep 17 00:00:00 2001 From: Vinicius Moreira Date: Sun, 10 Apr 2022 14:00:32 -0300 Subject: [PATCH] [commons.util] fix: not properly converting bibyte and byte based sizes to bytes (size_to_byte) --- CHANGELOG.md | 2 +- bauh/commons/util.py | 21 +++++---- tests/common/test_util.py | 68 ++++++++++++++++-------------- tests/gems/debian/test_aptitude.py | 4 +- tests/gems/flatpak/test_flatpak.py | 2 +- 5 files changed, 52 insertions(+), 45 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e6297526..ce2556b6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -30,7 +30,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). ### Fixes - General - - not properly converting bit based sizes (KiB, MiB, etc...) to byte based + - not properly converting bibyte (KiB, MiB, ...) and byte (KB, MB, ...) based sizes to bytes - uninstall and downgrade logs are not available [#255](https://github.com/vinifmor/bauh/issues/255) - Debian diff --git a/bauh/commons/util.py b/bauh/commons/util.py index f2d04f95..76beacfe 100644 --- a/bauh/commons/util.py +++ b/bauh/commons/util.py @@ -41,21 +41,24 @@ def size_to_byte(size: Union[float, int, str], unit: str, logger: Optional[Logge else: final_size = float(size) - if unit == 'b' or len(lower_unit) > 1 and lower_unit.endswith('ib'): - final_size /= 8 + if unit == 'b': + return final_size / 8 - if lower_unit[0] == 'b': + if unit == 'B': return final_size - elif lower_unit[0] == 'k': - return final_size * 1024 + + base = 1024 if lower_unit.endswith('ib') else 1000 + + if lower_unit[0] == 'k': + return final_size * base elif lower_unit[0] == 'm': - return final_size * (1024 ** 2) + return final_size * (base ** 2) elif lower_unit[0] == 'g': - return final_size * (1024 ** 3) + return final_size * (base ** 3) elif lower_unit[0] == 't': - return final_size * (1024 ** 4) + return final_size * (base ** 4) else: - return final_size * (1024 ** 5) + return final_size * (base ** 5) def datetime_as_milis(date: datetime = datetime.utcnow()) -> int: diff --git a/tests/common/test_util.py b/tests/common/test_util.py index ea9c8267..3e9ecd0f 100644 --- a/tests/common/test_util.py +++ b/tests/common/test_util.py @@ -5,40 +5,44 @@ from bauh.commons.util import size_to_byte class SizeToByteTest(TestCase): - def test_must_return_right_number_of_bytes(self): - self.assertEqual(1.0, size_to_byte(1, 'B')) - self.assertEqual(1024, size_to_byte(1, 'K')) - self.assertEqual(58675.2, size_to_byte(57.3, 'K')) - self.assertEqual(1048576, size_to_byte(1, 'M')) - self.assertEqual(60083404.8, size_to_byte(57.3, 'M')) - self.assertEqual(1073741824, size_to_byte(1, 'G')) - self.assertEqual(61525406515.2, size_to_byte(57.3, 'G')) - self.assertEqual(1099511627776, size_to_byte(1, 'T')) - self.assertEqual(63002016271564.8, size_to_byte(57.3, 'T')) - self.assertEqual(1125899906842624, size_to_byte(1, 'P')) - self.assertEqual(6383852471797678, size_to_byte(5.67, 'P')) + def test_must_return_right_number_of_bytes_for_bit_size(self): + self.assertEqual(0.125, size_to_byte(1, 'b')) + self.assertEqual(0.250, size_to_byte(2, 'b')) + self.assertEqual(0.40625, size_to_byte(3.25, 'b')) - def test_must_return_right_number_of_bytes_for_bit_units(self): - self.assertEqual(1, size_to_byte(8, 'b')) - self.assertEqual(2, size_to_byte(16, 'b')) - self.assertEqual(128, size_to_byte(1, 'KiB')) - self.assertEqual(197460.48, size_to_byte(1542.66, 'KiB')) - self.assertEqual(131072, size_to_byte(1, 'MiB')) - self.assertEqual(546570.24, size_to_byte(4.17, 'MiB')) - self.assertEqual(134217728, size_to_byte(1, 'GiB')) - self.assertEqual(2691065446.4, size_to_byte(20.05, 'GiB')) - self.assertEqual(137438953472, size_to_byte(1, 'TiB')) - self.assertEqual(6926923254988.8, size_to_byte(50.4, 'TiB')) - self.assertEqual(140737488355328, size_to_byte(1, 'PiB')) - self.assertEqual(330733097635020.8, size_to_byte(2.35, 'PiB')) + def test_must_return_right_number_of_bytes_for_byte_based_units(self): + self.assertEqual(1.0, size_to_byte(1, 'B')) + self.assertEqual(587, size_to_byte(587, 'B')) + self.assertEqual(1000, size_to_byte(1, 'K')) + self.assertEqual(57300, size_to_byte(57.3, 'K')) + self.assertEqual(1000000, size_to_byte(1, 'M')) + self.assertEqual(57300000, size_to_byte(57.3, 'M')) + self.assertEqual(1000000000, size_to_byte(1, 'G')) + self.assertEqual(57300000000, size_to_byte(57.3, 'G')) + self.assertEqual(1000000000000, size_to_byte(1, 'T')) + self.assertEqual(57300000000000, size_to_byte(57.3, 'T')) + self.assertEqual(1000000000000000, size_to_byte(1, 'P')) + self.assertEqual(5670000000000000, size_to_byte(5.67, 'P')) + + def test_must_return_right_number_of_bytes_for_bibyte_units(self): + self.assertEqual(1024.0, size_to_byte(1, 'KiB')) + self.assertEqual(1579683.84, size_to_byte(1542.66, 'KiB')) + self.assertEqual(1048576, size_to_byte(1, 'MiB')) + self.assertEqual(4372561.92, size_to_byte(4.17, 'MiB')) + self.assertEqual(1073741824, size_to_byte(1, 'GiB')) + self.assertEqual(2168958484.48, size_to_byte(2.02, 'GiB')) + self.assertEqual(1099511627776, size_to_byte(1, 'TiB')) + self.assertEqual(3375500697272.32, size_to_byte(3.07, 'TiB')) + self.assertEqual(1125899906842624, size_to_byte(1, 'PiB')) + self.assertEqual(1294784892869017.5, size_to_byte(1.15, 'PiB')) def test_must_return_converted_string_sizes(self): - self.assertEqual(1024, size_to_byte('1', 'K')) - self.assertEqual(58675.2, size_to_byte('57.3', 'K')) - self.assertEqual(60083404.8, size_to_byte('57.3', 'M')) - self.assertEqual(61525406515.2, size_to_byte('57.3', 'G')) - self.assertEqual(63002016271564.8, size_to_byte('57.3', 'T')) - self.assertEqual(6383852471797678, size_to_byte('5.67', 'P')) + self.assertEqual(1000, size_to_byte('1', 'K')) + self.assertEqual(57300, size_to_byte('57.3', 'K')) + self.assertEqual(57300000, size_to_byte('57.3', 'M')) + self.assertEqual(57300000000, size_to_byte('57.3', 'G')) + self.assertEqual(57300000000000, size_to_byte('57.3', 'T')) + self.assertEqual(5670000000000000, size_to_byte('5.67', 'P')) def test_must_treat_string_sizes_before_converting(self): - self.assertEqual(58675.2, size_to_byte(' 57 , 3 ', ' K ')) + self.assertEqual(57300, size_to_byte(' 57 , 3 ', ' K ')) diff --git a/tests/gems/debian/test_aptitude.py b/tests/gems/debian/test_aptitude.py index 20ff9410..8015c4cb 100644 --- a/tests/gems/debian/test_aptitude.py +++ b/tests/gems/debian/test_aptitude.py @@ -109,7 +109,7 @@ Description: GNU C compiler 'section': 'web', 'maintainer': 'Distro Dev ', 'architecture': 'amd64', - 'uncompressed size': 247463936.0, + 'uncompressed size': 236000000, 'predepends': ('distro-system-adjustments (>= 2021.12.16)', ), 'breaks': ('firefox-dbg (< 95.0.1+distro1+una)', 'firefox-dev (< 95.0.1+distro1+una)', 'firefox-geckodriver (< 95.0.1+distro1+una)', 'firefox-mozsymbols (< 95.0.1+distro1+una)'), @@ -126,7 +126,7 @@ Description: GNU C compiler 'section': 'devel', 'maintainer': 'Distro Developers ', 'architecture': 'amd64', - 'uncompressed size': 52428.8, + 'uncompressed size': 51200, 'depends': ('cpp (= 4:9.3.0-1distro2)', 'gcc-9 (>= 9.3.0-3~)'), 'recommends': ('libc6-dev | libc-dev', ), 'suggests': ('gcc-multilib', 'make', 'manpages-dev', 'autoconf', 'automake', diff --git a/tests/gems/flatpak/test_flatpak.py b/tests/gems/flatpak/test_flatpak.py index 10ab3600..a65b16bd 100644 --- a/tests/gems/flatpak/test_flatpak.py +++ b/tests/gems/flatpak/test_flatpak.py @@ -20,4 +20,4 @@ class FlatpakTest(TestCase): SimpleProcess.assert_called_once() handle_simple.assert_called_once() - self.assertEqual({'org.xpto.Xnote': 4508876.8}, download_size) + self.assertEqual({'org.xpto.Xnote': 4300000}, download_size)