95
97
os.path.join(self.temp_dir, ".click", "users", "user"),
96
98
Click.User.for_user(self.db, "user").get_overlay_db())
100
def test_ensure_db_ownership(self):
101
# getpwnam results are cached properly, in a way that doesn't fail
102
# due to confusion with getpwnam returning a pointer to a static
104
with self.run_in_subprocess(
105
"chown", "geteuid", "getpwnam") as (enter, preloads):
107
preloads["geteuid"].return_value = 0
108
getpwnam_result = Passwd()
110
def getpwnam_side_effect(name):
111
if name == b"clickpkg":
112
getpwnam_result.pw_uid = 1
113
getpwnam_result.pw_gid = 1
115
getpwnam_result.pw_uid = 2
116
getpwnam_result.pw_gid = 2
117
return self.make_pointer(getpwnam_result)
119
preloads["getpwnam"].side_effect = getpwnam_side_effect
120
registry = Click.User.for_user(self.db, "user")
121
os.makedirs(os.path.join(self.temp_dir, "a", "1.0"))
122
click_dir = os.path.join(self.temp_dir, ".click")
124
registry.set_version("a", "1.0")
125
self.assertEqual(3, preloads["chown"].call_count)
126
preloads["chown"].assert_any_call(click_dir.encode(), 1, 1)
127
preloads["chown"].assert_any_call(
128
os.path.join(click_dir, "users").encode(), 1, 1)
129
preloads["chown"].assert_any_call(
130
os.path.join(click_dir, "users", "user").encode(), 2, 2)
132
# Try again, now that both password file entries should be
134
shutil.rmtree(os.path.join(self.temp_dir, ".click"))
135
preloads["chown"].reset_mock()
136
registry.set_version("a", "1.0")
137
self.assertEqual(3, preloads["chown"].call_count)
138
preloads["chown"].assert_any_call(click_dir.encode(), 1, 1)
139
preloads["chown"].assert_any_call(
140
os.path.join(click_dir, "users").encode(), 1, 1)
141
preloads["chown"].assert_any_call(
142
os.path.join(click_dir, "users", "user").encode(), 2, 2)
98
144
def test_get_package_names_missing(self):
100
146
db.add(os.path.join(self.temp_dir, "nonexistent"))