From e6a6f69f37d85e9b0b5b211c57c314362482068a 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 ++- setup.cfg | 2 -- tests/test_inotify_c.py | 28 ++++++++++++++++++++-------- 3 files changed, 22 insertions(+), 11 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/setup.cfg b/setup.cfg index e3cfc2f4b..9c6236a09 100644 --- a/setup.cfg +++ b/setup.cfg @@ -19,5 +19,3 @@ upload-dir = docs/build/html addopts = --showlocals -v - --cov=watchdog - --cov-report=term-missing 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