From 87225941b71b1b551e4b5161124f286b2490bd5b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20G=C3=B3rny?= Date: Thu, 19 Aug 2021 15:13:39 +0200 Subject: [PATCH] Fix test mocks for big endian systems Fix the mocked inotify data to respect system endianness. Instead of harcoding the raw data, reconstruct it using struct.pack(), respecting host endianness. This should also benefit readability a bit. Closes #804 --- changelog.rst | 3 ++- tests/test_inotify_c.py | 28 ++++++++++++++++++++-------- 2 files changed, 22 insertions(+), 9 deletions(-) diff --git a/changelog.rst b/changelog.rst index 09578adc0..20d9456ea 100644 --- a/changelog.rst +++ b/changelog.rst @@ -13,7 +13,8 @@ Changelog - [mac] Convert absolute watch path in ``FSEeventsEmitter`` with ``os.path.realpath()``. (`#822 `_) - Fix a possible ``AttributeError`` in ``SkipRepeatsQueue._put()``. (`#818 `_) - Allow overriding or adding custom event handlers to event dispatch map. (`#814 `_) -- Thanks to our beloved contributors: @replabrobin, @BoboTiG, @SamSchott, @AndreiB97, @NiklasRosenstein, @ikokollari +- Fix tests on big endian platforms. (`#828 `_) +- Thanks to our beloved contributors: @replabrobin, @BoboTiG, @SamSchott, @AndreiB97, @NiklasRosenstein, @ikokollari, @mgorny 2.1.3 ~~~~~ diff --git a/tests/test_inotify_c.py b/tests/test_inotify_c.py index 81f6586ca..dc336a385 100644 --- a/tests/test_inotify_c.py +++ b/tests/test_inotify_c.py @@ -10,6 +10,7 @@ import errno import logging import os +import struct from functools import partial from queue import Queue @@ -52,6 +53,19 @@ def teardown_function(function): pass +def struct_inotify(wd, mask, cookie, length, name): + assert len(name) <= length + struct_format = ( + "=" # (native endianness, standard sizes) + "i" # int wd + "i" # uint32_t mask + "i" # uint32_t cookie + "i" # uint32_t len + "%ds" % (length,) # char[] name + ) + return struct.pack(struct_format, wd, mask, cookie, length, name) + + def test_late_double_deletion(monkeypatch): inotify_fd = type(str("FD"), (object,), {})() # Empty object inotify_fd.last = 0 @@ -60,20 +74,18 @@ def test_late_double_deletion(monkeypatch): # CREATE DELETE CREATE DELETE DELETE_SELF IGNORE DELETE_SELF IGNORE inotify_fd.buf = ( # IN_CREATE|IS_DIR (wd = 1, path = subdir1) - b"\x01\x00\x00\x00\x00\x01\x00\x40\x00\x00\x00\x00\x10\x00\x00\x00" - b"\x73\x75\x62\x64\x69\x72\x31\x00\x00\x00\x00\x00\x00\x00\x00\x00" + struct_inotify(1, 0x40000100, 0, 16, b"subdir1") + # IN_DELETE|IS_DIR (wd = 1, path = subdir1) - b"\x01\x00\x00\x00\x00\x02\x00\x40\x00\x00\x00\x00\x10\x00\x00\x00" - b"\x73\x75\x62\x64\x69\x72\x31\x00\x00\x00\x00\x00\x00\x00\x00\x00" + struct_inotify(1, 0x40000200, 0, 16, b"subdir1") ) * 2 + ( # IN_DELETE_SELF (wd = 2) - b"\x02\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + struct_inotify(2, 0x00000400, 0, 0, b"") + # IN_IGNORE (wd = 2) - b"\x02\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + struct_inotify(2, 0x00008000, 0, 0, b"") + # IN_DELETE_SELF (wd = 3) - b"\x03\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + struct_inotify(3, 0x00000400, 0, 0, b"") + # IN_IGNORE (wd = 3) - b"\x03\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + struct_inotify(3, 0x00008000, 0, 0, b"") ) os_read_bkp = os.read