summaryrefslogtreecommitdiffstats
path: root/tests/test_platform_utils.py
blob: 919351e7fde7228f20f3ce56e67bb4a12ad3a4a8 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
# Copyright (C) 2021 The Android Open Source Project
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#      http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

"""Unittests for the platform_utils.py module."""

from pathlib import Path

import pytest

import platform_utils


def test_remove_missing_ok(tmp_path: Path) -> None:
    """Check missing_ok handling."""
    path = tmp_path / "test"

    # Should not fail.
    platform_utils.remove(path, missing_ok=True)

    # Should fail.
    with pytest.raises(OSError):
        platform_utils.remove(path)
    with pytest.raises(OSError):
        platform_utils.remove(path, missing_ok=False)

    # Should not fail if it exists.
    path.touch()
    platform_utils.remove(path, missing_ok=True)
    assert not path.exists()

    path.touch()
    platform_utils.remove(path)
    assert not path.exists()

    path.touch()
    platform_utils.remove(path, missing_ok=False)
    assert not path.exists()


def test_removedirs_nonexistent(tmp_path: Path) -> None:
    """removedirs should silently succeed on nonexistent paths."""
    platform_utils.removedirs(tmp_path / "does-not-exist")


def test_removedirs_symlink(tmp_path: Path) -> None:
    """removedirs should remove a symlink."""
    link = tmp_path / "link"
    link.symlink_to("target")
    platform_utils.removedirs(link)
    assert not link.exists()


def test_removedirs_empty_dir(tmp_path: Path) -> None:
    """removedirs should remove an empty directory."""
    d = tmp_path / "empty"
    d.mkdir()
    platform_utils.removedirs(d)
    assert not d.exists()


def test_removedirs_nested_empty_dirs(tmp_path: Path) -> None:
    """removedirs should remove nested empty directories."""
    d = tmp_path / "a" / "b" / "c"
    d.mkdir(parents=True)
    platform_utils.removedirs(tmp_path / "a")
    assert not (tmp_path / "a").exists()


def test_removedirs_symlinks_inside_dir(tmp_path: Path) -> None:
    """removedirs should remove symlinks inside a directory."""
    d = tmp_path / "dir"
    d.mkdir()
    (d / "link1").symlink_to("target1")
    (d / "link2").symlink_to("target2")
    platform_utils.removedirs(d)
    assert not d.exists()


def test_removedirs_preserves_user_files(tmp_path: Path) -> None:
    """removedirs should not delete regular files or their parent dirs."""
    d = tmp_path / "dir"
    d.mkdir()
    (d / "link").symlink_to("target")
    (d / "user-file.txt").write_text("keep me")
    platform_utils.removedirs(d)
    assert d.exists()
    assert not (d / "link").exists()
    assert (d / "user-file.txt").read_text() == "keep me"


def test_removedirs_deep_nested_with_symlinks(tmp_path: Path) -> None:
    """removedirs should handle deep nesting: sub/dir/target."""
    d = tmp_path / "sub" / "dir"
    d.mkdir(parents=True)
    (d / "link").symlink_to("target")
    platform_utils.removedirs(tmp_path / "sub")
    assert not (tmp_path / "sub").exists()


def test_removedirs_regular_file_noop(tmp_path: Path) -> None:
    """removedirs should not delete a regular file."""
    f = tmp_path / "file.txt"
    f.write_text("data")
    platform_utils.removedirs(f)
    assert f.exists()