network_ShillInitScripts.py revision f2d52f19e042df144e7d53431fb5fe7d3888ec67
1e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewartimport grp
2e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewartimport logging
3e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewartimport mock_flimflam
4e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewartimport os
5e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewartimport pwd
6e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewartimport stat
7e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewartimport time
8e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewartimport utils
9e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart
10e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewartfrom autotest_lib.client.bin import test
11e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewartfrom autotest_lib.client.common_lib import error
12e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart
13e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewartclass network_ShillInitScripts(test.test):
14e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart    """ Test that shill init scripts perform as expected.  Use the
15e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart        real filesystem (doing a best effort to archive and restore
16e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart        current state).  The shill manager is stopped and a proxy
17e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart        DBus entity is installed to accept DBus messages that are sent
18e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart        via "dbus-send" in the shill startup scripts.  However, the
19e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart        "real" shill is still also started from time to time and we
20e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart        check that it is run with the right command line arguments.
21e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart    """
22e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart    version = 1
23e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart    save_directories = [ '/var/cache/shill',
24e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart                         '/var/cache/flimflam',
25e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart                         '/var/run/shill',
26e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart                         '/home/chronos/user/shill',
27e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart                         '/home/chronos/user/flimflam',
28e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart                         '/var/run/state/logged-in',
29e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart                         '/var/run/dhcpcd',
30e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart                         '/var/lib/dhcpcd',
31e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart                         '/home/chronos/.disable_shill' ]
32e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart    fake_user = 'not-a-real-user@chromium.org'
33e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart    saved_config = '/tmp/network_ShillInitScripts_saved_config.tgz'
34e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart    cryptohome_path_command = 'cryptohome-path'
35e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart    flimflam_user_profile = '/home/chronos/user/flimflam/flimflam.profile'
36e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart    old_shill_user_profile = '/home/chronos/user/shill/shill.profile'
379f29def08d6ff2f472aee180bee3bc22f8880c74Paul Stewart    guest_shill_user_profile_dir = '/var/run/shill/guest_user_profile/shill'
38e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart    magic_header = '# --- shill init file test magic header ---'
39e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart
40e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart    def start_shill(self):
41e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart        utils.system('start shill')
42e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart
43e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart    def stop_shill(self):
44e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart        # Halt the running shill instance.
45e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart        utils.system('stop shill', ignore_status=True)
46e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart
47e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart        for attempt in range(10):
48e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart            if not self.find_pid('shill'):
49e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart                break
50e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart            time.sleep(1)
51e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart        else:
52e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart            error.TestFail('Shill process does not appear to be dying')
53e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart
549f29def08d6ff2f472aee180bee3bc22f8880c74Paul Stewart    def login(self, user=None):
55e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart        # Note: "start" blocks until the "script" block completes.
569f29def08d6ff2f472aee180bee3bc22f8880c74Paul Stewart        utils.system('start login CHROMEOS_USER=%s' % (user or self.fake_user))
579f29def08d6ff2f472aee180bee3bc22f8880c74Paul Stewart
589f29def08d6ff2f472aee180bee3bc22f8880c74Paul Stewart    def login_guest(self):
599f29def08d6ff2f472aee180bee3bc22f8880c74Paul Stewart        # For guest login, session-manager passes an empty CHROMEOS_USER arg.
609f29def08d6ff2f472aee180bee3bc22f8880c74Paul Stewart        self.login('""')
61e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart
62e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart    def logout(self):
63e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart        # Note: "start" blocks until the "script" block completes.
64e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart        utils.system('start logout')
65e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart
66e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart    def start_test(self):
67e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart        self.stop_shill()
68e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart
69e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart        # Deduce the cryptohome directory name for our fake user.
70e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart        self.cryptohome_dir = utils.system_output(
71e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart            '%s system %s' % (self.cryptohome_path_command, self.fake_user))
72e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart
73e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart        # Just in case this hash actually exists, add this to the list of
74e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart        # saved directories.
75e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart        self.save_directories.append(self.cryptohome_dir)
76e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart
77e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart        # Archive the system state we will be modifying, then remove them.
78e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart        utils.system('tar zcvf %s --directory / --ignore-failed-read %s'
79e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart                     ' 2>/dev/null' %
80e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart                     (self.saved_config, ' '.join(self.save_directories)))
81e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart        utils.system('rm -rf %s' % ' '.join(self.save_directories),
82e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart                     ignore_status=True)
83e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart
84e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart        # Create the fake user's system cryptohome directory.
85e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart        os.mkdir(self.cryptohome_dir)
86e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart        self.new_shill_user_profile_dir = ('%s/shill' % self.cryptohome_dir)
87e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart        self.new_shill_user_profile = ('%s/shill.profile' %
88e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart                                       self.new_shill_user_profile_dir)
89e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart
90e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart        # Start a mock flimflam instance to accept and log DBus calls.
91e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart        self.mock_flimflam = mock_flimflam.MockFlimflam()
92e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart        self.mock_flimflam.start()
93e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart
94e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart    def erase_state(self):
95e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart        utils.system('rm -rf %s' % ' '.join(self.save_directories))
96e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart        os.mkdir(self.cryptohome_dir)
97e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart
98e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart    def end_test(self):
99e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart        self.mock_flimflam.quit()
100e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart        self.mock_flimflam.join()
101e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart        self.erase_state()
102e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart        utils.system('tar zxvf %s --directory /' % self.saved_config)
103e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart        utils.system('rm -f %s' % self.saved_config)
104e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart        self.start_shill()
105e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart
106e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart    def assure(self, must_be_true, assertion_name):
107e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart        if not must_be_true:
108e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart            raise error.TestFail('Assertion failed: %s' % assertion_name)
109e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart
110e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart    def assure_path_owner(self, path, owner):
111e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart        self.assure(pwd.getpwuid(os.stat(path).st_uid)[0] == owner,
112e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart                    'Path %s is owned by %s' % (path, owner))
113e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart
114e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart    def assure_path_group(self, path, group):
115e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart        self.assure(grp.getgrgid(os.stat(path).st_gid)[0] == group,
116e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart                    'Path %s is group-owned by %s' % (path, group))
117e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart
118e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart    def assure_exists(self, path, assertion_name):
119e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart        self.assure(os.path.exists(path), '%s exists' % assertion_name)
120e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart
121e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart    def assure_is_dir(self, path, assertion_name):
122e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart        self.assure_exists(path, assertion_name)
123e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart        self.assure(stat.S_ISDIR(os.lstat(path).st_mode),
124e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart                    '%s is a directory' % assertion_name)
125e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart
126e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart    def assure_is_link(self, path, assertion_name):
127e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart        self.assure_exists(path, assertion_name)
128e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart        self.assure(stat.S_ISLNK(os.lstat(path).st_mode),
129e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart                    '%s is a symbolic link' % assertion_name)
130e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart
131e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart    def assure_is_link_to(self, path, pointer, assertion_name):
132e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart        self.assure_is_link(path, assertion_name)
133e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart        self.assure(os.readlink(path) == pointer,
134e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart                    '%s is a symbolic link to %s' % (assertion_name, pointer))
135e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart
136e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart    def assure_method_calls(self, expected_method_calls, assertion_name):
137e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart        method_calls = self.mock_flimflam.get_method_calls()
138e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart        if len(expected_method_calls) != len(method_calls):
139e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart            self.assure(false, '%s: method call count does not match' %
140e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart                        assertion_name)
141e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart        for expected, actual in zip(expected_method_calls, method_calls):
142e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart            self.assure(actual.method == expected[0],
143e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart                        '%s: method %s matches expected %s' %
144e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart                        (assertion_name, actual.method, expected[0]))
145e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart            self.assure(actual.argument == expected[1],
146e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart                        '%s: argument %s matches expected %s' %
147e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart                        (assertion_name, actual.argument, expected[1]))
148e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart
149e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart    def create_file_with_contents(self, filename, contents):
150e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart        file(filename, 'w').write(contents)
151e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart
152e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart    def touch(self, filename):
153e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart        self.create_file_with_contents(filename, '')
154e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart
155e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart    def create_new_shill_user_profile(self, contents):
156e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart        os.mkdir(self.new_shill_user_profile_dir)
157e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart        self.create_file_with_contents(self.new_shill_user_profile, contents)
158e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart
159e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart    def create_old_shill_user_profile(self, contents):
160e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart        os.mkdir('/home/chronos/user/shill')
161e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart        self.create_file_with_contents(self.old_shill_user_profile, contents)
162e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart
163e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart    def create_flimflam_user_profile(self, contents):
164e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart        os.mkdir('/home/chronos/user/flimflam')
165e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart        self.create_file_with_contents(self.flimflam_user_profile, contents)
166e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart
167e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart    def file_contents(self, filename):
168e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart        return file(filename).read()
169e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart
170e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart    def find_pid(self, process_name):
171e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart        return utils.system_output('pgrep %s' % process_name,
172e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart                                   ignore_status=True).split('\n')
173e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart
174e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart    def get_commandline(self):
175e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart        pid = self.find_pid('shill')[0]
176e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart        return file('/proc/%s/cmdline' % pid).read().split('\0')
177e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart
178e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart    def run_once(self):
179e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart        self.start_test()
180e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart        try:
181e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart            self.run_tests()
182e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart        finally:
183e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart            # Stop any shill instances started during testing.
184e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart            self.stop_shill()
185e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart            self.end_test()
186e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart
187e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart    def run_tests(self):
188e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart        for test in (self.test_start_shill,
189e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart                     self.test_start_logged_in,
190e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart                     self.test_start_port_flimflam_profile,
191e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart                     self.test_login,
1929f29def08d6ff2f472aee180bee3bc22f8880c74Paul Stewart                     self.test_login_guest,
193e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart                     self.test_login_profile_exists,
194e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart                     self.test_login_old_shill_profile,
195e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart                     self.test_login_invalid_old_shill_profile,
196e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart                     self.test_login_ignore_old_shill_profile,
197e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart                     self.test_login_flimflam_profile,
198e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart                     self.test_login_ignore_flimflam_profile,
199e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart                     self.test_login_prefer_old_shill_profile,
200e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart                     self.test_logout):
201e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart          test()
202e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart          self.stop_shill()
203e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart          self.erase_state()
204e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart
205e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart    def test_start_shill(self):
206e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart        """ Test all created pathnames during shill startup.  Ensure the
207e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart            push argument is not provided by default.
208e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart        """
209e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart        self.touch('/home/chronos/.disable_shill')
210e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart        self.start_shill()
2119f29def08d6ff2f472aee180bee3bc22f8880c74Paul Stewart        self.assure_is_dir('/var/run/shill', 'Shill run directory')
212e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart        self.assure_is_dir('/var/lib/dhcpcd', 'dhcpcd lib directory')
213e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart        self.assure_path_owner('/var/lib/dhcpcd', 'dhcp')
214e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart        self.assure_path_group('/var/lib/dhcpcd', 'dhcp')
215e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart        self.assure_is_dir('/var/run/dhcpcd', 'dhcpcd run directory')
216e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart        self.assure_path_owner('/var/run/dhcpcd', 'dhcp')
217e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart        self.assure_path_group('/var/run/dhcpcd', 'dhcp')
218e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart        self.assure(not os.path.exists('/home/chronos/.disable_shill'),
219e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart                    'Shill disable file does not exist')
220e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart        self.assure('--push=~chronos/shill' not in self.get_commandline(),
221e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart                    'Shill command line does not contain push argument')
222e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart
223e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart    def test_start_logged_in(self):
224e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart        """ The "--push" argument should be added if the shill is started
225e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart            while a user is logged in.
226e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart        """
227f2d52f19e042df144e7d53431fb5fe7d3888ec67Paul Stewart        os.mkdir('/var/run/shill')
228f2d52f19e042df144e7d53431fb5fe7d3888ec67Paul Stewart        os.mkdir('/var/run/shill/user_profiles')
229f2d52f19e042df144e7d53431fb5fe7d3888ec67Paul Stewart        self.create_new_shill_user_profile('')
230f2d52f19e042df144e7d53431fb5fe7d3888ec67Paul Stewart        os.symlink(self.new_shill_user_profile_dir,
231f2d52f19e042df144e7d53431fb5fe7d3888ec67Paul Stewart                   '/var/run/shill/user_profiles/chronos')
232e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart        self.touch('/var/run/state/logged-in')
233e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart        self.start_shill()
234e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart        command_line = self.get_commandline()
235e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart        self.assure('--push=~chronos/shill' in command_line,
236e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart                    'Shill command line contains push argument: %s' %
237e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart                    repr(command_line))
238e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart        os.unlink('/var/run/state/logged-in')
239e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart
240e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart    def test_start_port_flimflam_profile(self):
241e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart        """ Startup should move an old flimflam profile into place if
242e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart            a shill profile does not already exist.
243e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart        """
244e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart        os.mkdir('/var/cache/flimflam')
245e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart        flimflam_profile = '/var/cache/flimflam/default.profile'
246e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart        self.create_file_with_contents(flimflam_profile, self.magic_header)
247e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart        shill_profile = '/var/cache/shill/default.profile'
248e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart        self.start_shill()
249e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart        self.assure(not os.path.exists(flimflam_profile),
250e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart                    'Flimflam profile no longer exists')
251e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart        self.assure(os.path.exists(shill_profile),
252e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart                    'Shill profile exists')
253e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart        self.assure(self.magic_header in self.file_contents(shill_profile),
254e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart                    'Shill default profile contains our magic header')
255e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart
256e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart    def test_start_ignore_flimflam_profile(self):
257e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart        """ Startup should ignore an old flimflam profile if a shill profile
258e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart            already exists.
259e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart        """
260e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart        os.mkdir('/var/cache/flimflam')
261e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart        os.mkdir('/var/cache/shill')
262e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart        flimflam_profile = '/var/cache/flimflam/default.profile'
263e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart        self.create_file_with_contents(flimflam_profile, self.magic_header)
264e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart        shill_profile = '/var/cache/shill/default.profile'
265e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart        self.touch(shill_profile)
266e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart        self.start_shill()
267e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart        self.assure(os.path.exists(flimflam_profile),
268e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart                    'Flimflam profile still exists')
269e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart        self.assure(self.magic_header not in self.file_contents(shill_profile),
270e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart                    'Shill default profile does not contain our magic header')
271e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart
272e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart    def test_login(self):
273e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart        """ Login should create a profile directory, then create and push
274e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart            a user profile, given no previous state.
275e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart        """
276e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart        os.mkdir('/var/run/shill')
277e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart        self.login()
278e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart        self.assure(not os.path.exists(self.flimflam_user_profile),
279e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart                    'Flimflam user profile does not exist')
280e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart        self.assure(not os.path.exists(self.old_shill_user_profile),
281e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart                    'Old shill user profile does not exist')
282e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart        self.assure(not os.path.exists(self.new_shill_user_profile),
283e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart                    'New shill user profile does not exist')
284e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart        # The DBus "CreateProfile" method should have been handled
285e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart        # by our mock_flimflam instance, so the profile directory
286e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart        # should not have actually been created.
287e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart        self.assure_is_dir(self.new_shill_user_profile_dir,
288e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart                           'New shill user profile directory')
289e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart        self.assure_is_dir('/var/run/shill/user_profiles',
290e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart                           'Shill profile root')
291e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart        self.assure_is_link_to('/var/run/shill/user_profiles/chronos',
292e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart                               self.new_shill_user_profile_dir,
293e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart                               'Shill profile link')
294e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart        self.assure_method_calls([[ 'CreateProfile', '~chronos/shill' ],
295e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart                                  [ 'PushProfile', '~chronos/shill' ]],
296e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart                                 'CreateProfile and PushProfile are called')
297e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart
2989f29def08d6ff2f472aee180bee3bc22f8880c74Paul Stewart    def test_login_guest(self):
2999f29def08d6ff2f472aee180bee3bc22f8880c74Paul Stewart        """ Login should create a temporary profile directory in /var/run,
3009f29def08d6ff2f472aee180bee3bc22f8880c74Paul Stewart            instead of using one within the root directory for normal users.
3019f29def08d6ff2f472aee180bee3bc22f8880c74Paul Stewart        """
3029f29def08d6ff2f472aee180bee3bc22f8880c74Paul Stewart        os.mkdir('/var/run/shill')
3039f29def08d6ff2f472aee180bee3bc22f8880c74Paul Stewart        self.login_guest()
3049f29def08d6ff2f472aee180bee3bc22f8880c74Paul Stewart        self.assure(not os.path.exists(self.flimflam_user_profile),
3059f29def08d6ff2f472aee180bee3bc22f8880c74Paul Stewart                    'Flimflam user profile does not exist')
3069f29def08d6ff2f472aee180bee3bc22f8880c74Paul Stewart        self.assure(not os.path.exists(self.old_shill_user_profile),
3079f29def08d6ff2f472aee180bee3bc22f8880c74Paul Stewart                    'Old shill user profile does not exist')
3089f29def08d6ff2f472aee180bee3bc22f8880c74Paul Stewart        self.assure(not os.path.exists(self.new_shill_user_profile),
3099f29def08d6ff2f472aee180bee3bc22f8880c74Paul Stewart                    'New shill user profile does not exist')
3109f29def08d6ff2f472aee180bee3bc22f8880c74Paul Stewart        self.assure(not os.path.exists(self.new_shill_user_profile_dir),
3119f29def08d6ff2f472aee180bee3bc22f8880c74Paul Stewart                    'New shill user profile directory')
3129f29def08d6ff2f472aee180bee3bc22f8880c74Paul Stewart        self.assure_is_dir(self.guest_shill_user_profile_dir,
3139f29def08d6ff2f472aee180bee3bc22f8880c74Paul Stewart                           'shill guest user profile directory')
3149f29def08d6ff2f472aee180bee3bc22f8880c74Paul Stewart        self.assure_is_dir('/var/run/shill/user_profiles',
3159f29def08d6ff2f472aee180bee3bc22f8880c74Paul Stewart                           'Shill profile root')
3169f29def08d6ff2f472aee180bee3bc22f8880c74Paul Stewart        self.assure_is_link_to('/var/run/shill/user_profiles/chronos',
3179f29def08d6ff2f472aee180bee3bc22f8880c74Paul Stewart                               self.guest_shill_user_profile_dir,
3189f29def08d6ff2f472aee180bee3bc22f8880c74Paul Stewart                               'Shill profile link')
3199f29def08d6ff2f472aee180bee3bc22f8880c74Paul Stewart        self.assure_method_calls([[ 'CreateProfile', '~chronos/shill' ],
3209f29def08d6ff2f472aee180bee3bc22f8880c74Paul Stewart                                  [ 'PushProfile', '~chronos/shill' ]],
3219f29def08d6ff2f472aee180bee3bc22f8880c74Paul Stewart                                 'CreateProfile and PushProfile are called')
3229f29def08d6ff2f472aee180bee3bc22f8880c74Paul Stewart
323e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart    def test_login_profile_exists(self):
324e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart        """ Login script should only push (and not create) the user profile
325e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart            if a user profile already exists.
326e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart        """
327e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart        os.mkdir('/var/run/shill')
328e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart        os.mkdir(self.new_shill_user_profile_dir)
329e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart        self.touch(self.new_shill_user_profile)
330e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart        self.login()
331e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart        self.assure_method_calls([[ 'PushProfile', '~chronos/shill' ]],
332e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart                                 'Only PushProfile is called')
333e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart
334e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart    def test_login_old_shill_profile(self):
335e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart        """ Login script should move an old shill user profile into place
336e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart            if a new one does not exist.
337e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart        """
338e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart        os.mkdir('/var/run/shill')
339e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart        self.create_old_shill_user_profile(self.magic_header)
340e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart        self.login()
341e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart        self.assure(not os.path.exists(self.old_shill_user_profile),
342e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart                    'Old shill user profile no longer exists')
343e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart        self.assure(not os.path.exists('/home/chronos/user/shill'),
344e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart                    'Old shill user profile directory no longer exists')
345e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart        self.assure_exists(self.new_shill_user_profile,
346e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart                           'New shill profile')
347e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart        self.assure(self.magic_header in
348e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart                    self.file_contents(self.new_shill_user_profile),
349e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart                    'Shill user profile contains our magic header')
350e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart        self.assure_method_calls([[ 'PushProfile', '~chronos/shill' ]],
351e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart                                 'Only PushProfile is called')
352e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart
353e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart    def make_symlink(self, path):
354e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart        os.symlink('/etc/hosts', path)
355e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart
356e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart    def make_special_file(self, path):
357e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart        os.mknod(path, stat.S_IFIFO)
358e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart
359e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart    def make_bad_owner(self, path):
360e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart        self.touch(path)
361e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart        os.lchown(path, 1000, 1000)
362e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart
363e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart    def test_login_invalid_old_shill_profile(self):
364e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart        """ Login script should ignore non-regular files or files not owned
365e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart            by the correct user.  The original file should be removed.
366e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart        """
367e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart        os.mkdir('/var/run/shill')
368e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart        for file_creation_method in (self.make_symlink,
369e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart                                     self.make_special_file,
370e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart                                     os.mkdir,
371e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart                                     self.make_bad_owner):
372e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart            os.mkdir('/home/chronos/user/shill')
373e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart            file_creation_method(self.old_shill_user_profile)
374e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart            self.login()
375e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart            self.assure(not os.path.exists(self.old_shill_user_profile),
376e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart                        'Old shill user profile no longer exists')
377e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart            self.assure(not os.path.exists('/home/chronos/user/shill'),
378e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart                        'Old shill user profile directory no longer exists')
379e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart            self.assure(not os.path.exists(self.new_shill_user_profile),
380e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart                        'New shill profile was not created')
381e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart            self.assure_method_calls([[ 'CreateProfile', '~chronos/shill' ],
382e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart                                      [ 'PushProfile', '~chronos/shill' ]],
383e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart                                     'CreateProfile and PushProfile are called')
384e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart
385e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart    def test_login_ignore_old_shill_profile(self):
386e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart        """ Login script should ignore an old shill user profile if a new one
387e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart            exists.
388e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart        """
389e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart        os.mkdir('/var/run/shill')
390e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart        self.create_new_shill_user_profile('')
391e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart        self.create_old_shill_user_profile(self.magic_header)
392e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart        self.login()
393e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart        self.assure(os.path.exists(self.old_shill_user_profile),
394e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart                    'Old shill user profile still exists')
395e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart        self.assure_exists(self.new_shill_user_profile,
396e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart                           'New shill profile')
397e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart        self.assure(self.magic_header not in
398e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart                    self.file_contents(self.new_shill_user_profile),
399e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart                    'Shill user profile does not contain our magic header')
400e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart        self.assure_method_calls([[ 'PushProfile', '~chronos/shill' ]],
401e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart                                 'Only PushProfile is called')
402e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart
403e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart    def test_login_flimflam_profile(self):
404e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart        """ Login script should move a flimflam user profile into place
405e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart            if a shill one does not exist.
406e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart        """
407e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart        os.mkdir('/var/run/shill')
408e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart        self.create_flimflam_user_profile(self.magic_header)
409e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart        self.login()
410e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart        self.assure(not os.path.exists(self.flimflam_user_profile),
411e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart                    'Flimflam user profile no longer exists')
412e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart        self.assure(not os.path.exists('/home/chronos/user/flimflam'),
413e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart                    'Flimflam user profile directory no longer exists')
414e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart        self.assure_exists(self.new_shill_user_profile,
415e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart                           'New shill profile')
416e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart        self.assure(self.magic_header in
417e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart                    self.file_contents(self.new_shill_user_profile),
418e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart                    'Shill user profile contains our magic header')
419e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart        self.assure_method_calls([[ 'PushProfile', '~chronos/shill' ]],
420e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart                                 'Only PushProfile is called')
421e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart
422e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart    def test_login_ignore_flimflam_profile(self):
423e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart        """ Login script should ignore an old flimflam user profile if a new
424e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart            one exists.
425e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart        """
426e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart        os.mkdir('/var/run/shill')
427e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart        self.create_flimflam_user_profile(self.magic_header)
428e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart        self.create_new_shill_user_profile('')
429e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart        self.login()
430e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart        self.assure_exists(self.new_shill_user_profile,
431e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart                           'New shill profile')
432e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart        self.assure(self.magic_header not in
433e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart                    self.file_contents(self.new_shill_user_profile),
434e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart                    'Shill user profile does not contain our magic header')
435e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart        self.assure_method_calls([[ 'PushProfile', '~chronos/shill' ]],
436e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart                                 'Only PushProfile is called')
437e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart
438e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart    def test_login_prefer_old_shill_profile(self):
439e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart        """ Login script should use the old shill user profile in preference
440e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart            to a flimflam user profile if the new user profile does not
441e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart            exist.
442e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart        """
443e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart        os.mkdir('/var/run/shill')
444e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart        self.create_flimflam_user_profile('')
445e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart        self.create_old_shill_user_profile(self.magic_header)
446e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart        self.login()
447e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart        self.assure(not os.path.exists(self.flimflam_user_profile),
448e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart                    'Flimflam user profile was removed')
449e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart        self.assure(not os.path.exists(self.old_shill_user_profile),
450e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart                    'Old shill user profile no longer exists')
451e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart        self.assure_exists(self.new_shill_user_profile,
452e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart                           'New shill profile')
453e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart        self.assure(self.magic_header in
454e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart                    self.file_contents(self.new_shill_user_profile),
455e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart                    'Shill user profile contains our magic header')
456e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart        self.assure_method_calls([[ 'PushProfile', '~chronos/shill' ]],
457e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart                                 'Only PushProfile is called')
458e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart
459e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart    def test_logout(self):
4609f29def08d6ff2f472aee180bee3bc22f8880c74Paul Stewart        os.makedirs('/var/run/shill/user_profiles')
4619f29def08d6ff2f472aee180bee3bc22f8880c74Paul Stewart        os.makedirs(self.guest_shill_user_profile_dir)
462e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart        self.touch('/var/run/state/logged-in')
463e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart        self.logout()
464e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart        self.assure(not os.path.exists('/var/run/state/logged-in'),
465e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart                    'Logged-in file was removed')
466e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart        self.assure(not os.path.exists('/var/run/shill/user_profiles'),
467e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart                    'User profile directory was removed')
4689f29def08d6ff2f472aee180bee3bc22f8880c74Paul Stewart        self.assure(not os.path.exists(self.guest_shill_user_profile_dir),
4699f29def08d6ff2f472aee180bee3bc22f8880c74Paul Stewart                    'Guest user profile directory was removed')
470e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart        self.assure_method_calls([[ 'PopProfile', '~chronos/shill' ]],
471e10e707a71de78209daaba21e0d3bb7d951ba4afPaul Stewart                                 'PopProfile is called')
472