]> jfr.im git - yt-dlp.git/commitdiff
[test] Add `test_locked_file`
authorpukkandan <redacted>
Thu, 7 Apr 2022 06:00:46 +0000 (11:30 +0530)
committerpukkandan <redacted>
Thu, 7 Apr 2022 06:35:44 +0000 (12:05 +0530)
test/test_utils.py
yt_dlp/utils.py

index 31f16899894ead0ec24dbc6f6f0445758868f276..1f826c2f222d3ddd87add3e6a9d894b2f1518499 100644 (file)
@@ -56,6 +56,7 @@
     is_html,
     js_to_json,
     limit_length,
+    locked_file,
     merge_dicts,
     mimetype2ext,
     month_by_name,
@@ -1795,6 +1796,36 @@ def test_hide_login_info(self):
         self.assertEqual(Config.hide_login_info(['--username=foo']),
                          ['--username=PRIVATE'])
 
+    def test_locked_file(self):
+        TEXT = 'test_locked_file\n'
+        FILE = 'test_locked_file.ytdl'
+        MODES = 'war'  # Order is important
+
+        try:
+            for lock_mode in MODES:
+                with locked_file(FILE, lock_mode, False) as f:
+                    if lock_mode == 'r':
+                        self.assertEqual(f.read(), TEXT * 2, 'Wrong file content')
+                    else:
+                        f.write(TEXT)
+                    for test_mode in MODES:
+                        testing_write = test_mode != 'r'
+                        try:
+                            with locked_file(FILE, test_mode, False):
+                                pass
+                        except (BlockingIOError, PermissionError):
+                            if not testing_write:  # FIXME
+                                print(f'Known issue: Exclusive lock ({lock_mode}) blocks read access ({test_mode})')
+                                continue
+                            self.assertTrue(testing_write, f'{test_mode} is blocked by {lock_mode}')
+                        else:
+                            self.assertFalse(testing_write, f'{test_mode} is not blocked by {lock_mode}')
+        finally:
+            try:
+                os.remove(FILE)
+            except Exception:
+                pass
+
 
 if __name__ == '__main__':
     unittest.main()
index 02b5ae2eef78e3efb6349d57d58ced5c48b670fc..84b2603dffff18a359798287b32747ebd0ed8b42 100644 (file)
@@ -684,8 +684,9 @@ def sanitize_open(filename, open_mode):
         try:
             try:
                 if sys.platform == 'win32':
-                    # FIXME: Windows only has mandatory locking which also locks the file from being read.
-                    # So for now, don't lock the file on windows. Ref: https://github.com/yt-dlp/yt-dlp/issues/3124
+                    # FIXME: An exclusive lock also locks the file from being read.
+                    # Since windows locks are mandatory, don't lock the file on windows (for now).
+                    # Ref: https://github.com/yt-dlp/yt-dlp/issues/3124
                     raise LockingUnsupportedError()
                 stream = locked_file(filename, open_mode, block=False).__enter__()
             except LockingUnsupportedError: