~ubuntu-branches/ubuntu/utopic/click/utopic-proposed

« back to all changes in this revision

Viewing changes to click/tests/test_user.py

  • Committer: Package Import Robot
  • Author(s): Ubuntu daily release, Loïc Minier, Colin Watson
  • Date: 2014-06-04 08:37:18 UTC
  • Revision ID: package-import@ubuntu.com-20140604083718-ltnkys31fsyconxd
Tags: 0.4.24
[ Loïc Minier ]
* Add 14.10 framework in places where all frameworks are listed.

[ Colin Watson ]
* Copy the pw_uid and pw_gid members from getpwnam's return value and
  cache those separately, since getpwnam returns a pointer to a static
  buffer so just caching its return value is not useful (LP: #1323998).
* Handle the renaming of upstart-app-launch to ubuntu-app-launch: we now
  cope with both old and new names.

Show diffs side-by-side

added added

removed removed

Lines of Context:
25
25
 
26
26
import json
27
27
import os
 
28
import shutil
28
29
 
29
30
from gi.repository import Click
30
31
 
31
32
from click.json_helpers import json_array_to_python, json_object_to_python
 
33
from click.tests.gimock_types import Passwd
32
34
from click.tests.helpers import TestCase, mkfile
33
35
 
34
36
 
95
97
            os.path.join(self.temp_dir, ".click", "users", "user"),
96
98
            Click.User.for_user(self.db, "user").get_overlay_db())
97
99
 
 
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
 
103
        # buffer.
 
104
        with self.run_in_subprocess(
 
105
                "chown", "geteuid", "getpwnam") as (enter, preloads):
 
106
            enter()
 
107
            preloads["geteuid"].return_value = 0
 
108
            getpwnam_result = Passwd()
 
109
 
 
110
            def getpwnam_side_effect(name):
 
111
                if name == b"clickpkg":
 
112
                    getpwnam_result.pw_uid = 1
 
113
                    getpwnam_result.pw_gid = 1
 
114
                else:
 
115
                    getpwnam_result.pw_uid = 2
 
116
                    getpwnam_result.pw_gid = 2
 
117
                return self.make_pointer(getpwnam_result)
 
118
 
 
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")
 
123
 
 
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)
 
131
 
 
132
            # Try again, now that both password file entries should be
 
133
            # cached.
 
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)
 
143
 
98
144
    def test_get_package_names_missing(self):
99
145
        db = Click.DB()
100
146
        db.add(os.path.join(self.temp_dir, "nonexistent"))