summaryrefslogtreecommitdiffstats
path: root/python/mozbuild/mozbuild/test/test_util_fileavoidwrite.py
diff options
context:
space:
mode:
Diffstat (limited to 'python/mozbuild/mozbuild/test/test_util_fileavoidwrite.py')
-rw-r--r--python/mozbuild/mozbuild/test/test_util_fileavoidwrite.py110
1 files changed, 110 insertions, 0 deletions
diff --git a/python/mozbuild/mozbuild/test/test_util_fileavoidwrite.py b/python/mozbuild/mozbuild/test/test_util_fileavoidwrite.py
new file mode 100644
index 0000000000..38c8941562
--- /dev/null
+++ b/python/mozbuild/mozbuild/test/test_util_fileavoidwrite.py
@@ -0,0 +1,110 @@
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+"""Tests for the FileAvoidWrite object."""
+
+import locale
+import pathlib
+
+import pytest
+from mozunit import main
+
+from mozbuild.util import FileAvoidWrite
+
+
+@pytest.fixture
+def tmp_path(tmpdir):
+ """Backport of the tmp_path fixture from pytest 3.9.1."""
+ return pathlib.Path(str(tmpdir))
+
+
+def test_overwrite_contents(tmp_path):
+ file = tmp_path / "file.txt"
+ file.write_text("abc")
+
+ faw = FileAvoidWrite(str(file))
+ faw.write("bazqux")
+
+ assert faw.close() == (True, True)
+ assert file.read_text() == "bazqux"
+
+
+def test_store_new_contents(tmp_path):
+ file = tmp_path / "file.txt"
+
+ faw = FileAvoidWrite(str(file))
+ faw.write("content")
+
+ assert faw.close() == (False, True)
+ assert file.read_text() == "content"
+
+
+def test_change_binary_file_contents(tmp_path):
+ file = tmp_path / "file.dat"
+ file.write_bytes(b"\0")
+
+ faw = FileAvoidWrite(str(file), readmode="rb")
+ faw.write(b"\0\0\0")
+
+ assert faw.close() == (True, True)
+ assert file.read_bytes() == b"\0\0\0"
+
+
+def test_obj_as_context_manager(tmp_path):
+ file = tmp_path / "file.txt"
+
+ with FileAvoidWrite(str(file)) as fh:
+ fh.write("foobar")
+
+ assert file.read_text() == "foobar"
+
+
+def test_no_write_happens_if_file_contents_same(tmp_path):
+ file = tmp_path / "file.txt"
+ file.write_text("content")
+ original_write_time = file.stat().st_mtime
+
+ faw = FileAvoidWrite(str(file))
+ faw.write("content")
+
+ assert faw.close() == (True, False)
+ assert file.stat().st_mtime == original_write_time
+
+
+def test_diff_not_created_by_default(tmp_path):
+ file = tmp_path / "file.txt"
+ faw = FileAvoidWrite(str(file))
+ faw.write("dummy")
+ faw.close()
+ assert faw.diff is None
+
+
+def test_diff_update(tmp_path):
+ file = tmp_path / "diffable.txt"
+ file.write_text("old")
+
+ faw = FileAvoidWrite(str(file), capture_diff=True)
+ faw.write("new")
+ faw.close()
+
+ diff = "\n".join(faw.diff)
+ assert "-old" in diff
+ assert "+new" in diff
+
+
+@pytest.mark.skipif(
+ locale.getdefaultlocale()[1] == "cp1252",
+ reason="Fails on win32 terminals with cp1252 encoding",
+)
+def test_write_unicode(tmp_path):
+ # Unicode grinning face :D
+ binary_emoji = b"\xf0\x9f\x98\x80"
+
+ file = tmp_path / "file.dat"
+ faw = FileAvoidWrite(str(file))
+ faw.write(binary_emoji)
+ faw.close()
+
+
+if __name__ == "__main__":
+ main()