1#!/usr/bin/env python
2# Copyright 2017 The Chromium Authors. All rights reserved.
3# Use of this source code is governed by a BSD-style license that can be
4# found in the LICENSE file.
5"""
6Unit tests for the contents of flag_changer.py.
7The test will invoke real devices
8"""
9
10import os
11import posixpath
12import sys
13import unittest
14
15if __name__ == '__main__':
16  sys.path.append(
17      os.path.abspath(os.path.join(os.path.dirname(__file__), '..', '..', )))
18
19from devil.android import device_test_case
20from devil.android import device_utils
21from devil.android import flag_changer
22from devil.android.sdk import adb_wrapper
23
24
25_CMDLINE_FILE = 'dummy-command-line'
26
27
28class FlagChangerTest(device_test_case.DeviceTestCase):
29
30  def setUp(self):
31    super(FlagChangerTest, self).setUp()
32    self.adb = adb_wrapper.AdbWrapper(self.serial)
33    self.adb.WaitForDevice()
34    self.device = device_utils.DeviceUtils(
35        self.adb, default_timeout=10, default_retries=0)
36    # pylint: disable=protected-access
37    self.cmdline_path = posixpath.join(flag_changer._CMDLINE_DIR, _CMDLINE_FILE)
38    self.cmdline_path_legacy = posixpath.join(
39        flag_changer._CMDLINE_DIR_LEGACY, _CMDLINE_FILE)
40
41  def tearDown(self):
42    super(FlagChangerTest, self).tearDown()
43    self.device.RemovePath(
44        [self.cmdline_path, self.cmdline_path_legacy], force=True, as_root=True)
45
46  def testFlagChanger_restoreFlags(self):
47    if not self.device.HasRoot():
48      self.skipTest('Test needs a rooted device')
49
50    # Write some custom chrome command line flags.
51    self.device.WriteFile(
52        self.cmdline_path, 'chrome --some --old --flags')
53
54    # Write some more flags on a command line file in the legacy location.
55    self.device.WriteFile(
56        self.cmdline_path_legacy, 'some --stray --flags', as_root=True)
57    self.assertTrue(self.device.PathExists(self.cmdline_path_legacy))
58
59    changer = flag_changer.FlagChanger(self.device, _CMDLINE_FILE)
60
61    # Legacy command line file is removed, ensuring Chrome picks up the
62    # right file.
63    self.assertFalse(self.device.PathExists(self.cmdline_path_legacy))
64
65    # Write some new files, and check they are set.
66    new_flags = ['--my', '--new', '--flags=with special value']
67    self.assertItemsEqual(
68        changer.ReplaceFlags(new_flags),
69        new_flags)
70
71    # Restore and go back to the old flags.
72    self.assertItemsEqual(
73        changer.Restore(),
74        ['--some', '--old', '--flags'])
75
76  def testFlagChanger_removeFlags(self):
77    self.device.RemovePath(self.cmdline_path, force=True)
78    self.assertFalse(self.device.PathExists(self.cmdline_path))
79
80    with flag_changer.CustomCommandLineFlags(
81        self.device, _CMDLINE_FILE, ['--some', '--flags']):
82      self.assertTrue(self.device.PathExists(self.cmdline_path))
83
84    self.assertFalse(self.device.PathExists(self.cmdline_path))
85
86
87if __name__ == '__main__':
88  unittest.main()
89