Ejemplo n.º 1
0
  def testCommit(self):
    type(self.device).build_version_sdk = mock.PropertyMock(
        return_value=version_codes.LOLLIPOP_MR1)
    prefs = shared_prefs.SharedPrefs(self.device, 'com.some.package',
                                     'other_prefs.xml')
    self.assertFalse(self.device.FileExists(prefs.path))  # file does not exist
    prefs.Load()
    self.assertEquals(len(prefs), 0)  # file did not exist, collection is empty
    prefs.SetInt('magicNumber', 42)
    prefs.SetFloat('myMetric', 3.14)
    prefs.SetLong('bigNumner', 6000000000)
    prefs.SetStringSet('apps', ['gmail', 'chrome', 'music'])
    self.assertFalse(self.device.FileExists(prefs.path))  # still does not exist
    self.assertTrue(prefs.changed)
    prefs.Commit()
    self.assertTrue(self.device.FileExists(prefs.path))  # should exist now
    self.device.KillAll.assert_called_once_with(
        prefs.package, exact=True, as_root=True, quiet=True)
    self.assertFalse(prefs.changed)

    prefs = shared_prefs.SharedPrefs(self.device, 'com.some.package',
                                     'other_prefs.xml')
    self.assertEquals(len(prefs), 0)  # collection is empty before loading
    prefs.Load()
    self.assertEquals(
        prefs.AsDict(), {
            'magicNumber': 42,
            'myMetric': 3.14,
            'bigNumner': 6000000000,
            'apps': ['gmail', 'chrome', 'music']
        })  # data survived roundtrip
Ejemplo n.º 2
0
  def testEncryptedPath(self):
    type(self.device).build_version_sdk = mock.PropertyMock(
        return_value=version_codes.MARSHMALLOW)
    with shared_prefs.SharedPrefs(self.device, 'com.some.package',
        'prefs.xml', use_encrypted_path=True) as prefs:
      self.assertTrue(prefs.path.startswith('/data/data'))

    type(self.device).build_version_sdk = mock.PropertyMock(
        return_value=version_codes.NOUGAT)
    with shared_prefs.SharedPrefs(self.device, 'com.some.package',
        'prefs.xml', use_encrypted_path=True) as prefs:
      self.assertTrue(prefs.path.startswith('/data/user_de/0'))
Ejemplo n.º 3
0
  def testAsContextManager_commitAborted(self):
    with self.assertRaises(TypeError):
      with shared_prefs.SharedPrefs(self.device, 'com.some.package',
                                    'prefs.xml') as prefs:
        prefs.SetBoolean('featureEnabled', True)
        prefs.Remove('someHashValue')
        prefs.SetString('newString', 'hello')
        prefs.SetInt('newString', 123)  # oops!

    self.assertEquals(self.device.WriteFile.call_args_list, [])  # did not write
    with shared_prefs.SharedPrefs(self.device, 'com.some.package',
                                  'prefs.xml') as prefs:
      # contents were not modified
      self.assertEquals(prefs.AsDict(), self.expected_data)
Ejemplo n.º 4
0
  def testAsContextManager_readAndWrite(self):
    with shared_prefs.SharedPrefs(
        self.device, 'com.some.package', 'prefs.xml') as prefs:
      prefs.SetBoolean('featureEnabled', True)
      prefs.Remove('someHashValue')
      prefs.SetString('newString', 'hello')

    self.assertTrue(self.device.WriteFile.called) # did write
    with shared_prefs.SharedPrefs(
        self.device, 'com.some.package', 'prefs.xml') as prefs:
      # changes persisted
      self.assertTrue(prefs.GetBoolean('featureEnabled'))
      self.assertFalse(prefs.HasProperty('someHashValue'))
      self.assertEquals(prefs.GetString('newString'), 'hello')
      self.assertTrue(prefs.HasProperty('databaseVersion')) # still there
Ejemplo n.º 5
0
def main():
    parser = argparse.ArgumentParser(
        description='Manually apply shared preference JSON files.')
    parser.add_argument('filepaths',
                        nargs='*',
                        help='Any number of paths to shared preference JSON '
                        'files to apply.')
    args = parser.parse_args()

    all_devices = device_utils.DeviceUtils.HealthyDevices()
    if not all_devices:
        raise RuntimeError('No healthy devices attached')

    for filepath in args.filepaths:
        all_settings = shared_preference_utils.ExtractSettingsFromJson(
            filepath)
        for setting in all_settings:
            for device in all_devices:
                shared_pref = shared_prefs.SharedPrefs(
                    device,
                    setting['package'],
                    setting['filename'],
                    use_encrypted_path=setting.get('supports_encrypted_path',
                                                   False))
                shared_preference_utils.ApplySharedPreferenceSetting(
                    shared_pref, setting)
Ejemplo n.º 6
0
 def testAsContextManager_onlyReads(self):
     with shared_prefs.SharedPrefs(self.device, 'com.some.package',
                                   'prefs.xml') as prefs:
         self.assertEquals(prefs.AsDict(),
                           self.expected_data)  # loaded and ready
     self.assertEquals(self.device.WriteFile.call_args_list,
                       [])  # did not write
 def edit_shared_prefs():
     for pref in self._test_instance.edit_shared_prefs:
         prefs = shared_prefs.SharedPrefs(dev, pref['package'],
                                          pref['filename'])
         prefs.Load()
         for key in pref.get('remove', []):
             try:
                 prefs.Remove(key)
             except KeyError:
                 logging.warning(
                     "Attempted to remove non-existent key %s", key)
         for key, value in pref.get('set', {}).iteritems():
             if isinstance(value, bool):
                 prefs.SetBoolean(key, value)
             elif isinstance(value, basestring):
                 prefs.SetString(key, value)
             elif isinstance(value, long) or isinstance(value, int):
                 prefs.SetLong(key, value)
             elif isinstance(value, list):
                 prefs.SetStringSet(key, value)
             else:
                 raise ValueError(
                     "Given invalid value type %s for key %s" %
                     (str(type(value)), key))
         prefs.Commit()
Ejemplo n.º 8
0
 def testLoad(self):
   prefs = shared_prefs.SharedPrefs(self.device, 'com.some.package',
                                    'prefs.xml')
   self.assertEquals(len(prefs), 0)  # collection is empty before loading
   prefs.Load()
   self.assertEquals(len(prefs), len(self.expected_data))
   self.assertEquals(prefs.AsDict(), self.expected_data)
   self.assertFalse(prefs.changed)
Ejemplo n.º 9
0
 def testClear(self):
   prefs = shared_prefs.SharedPrefs(self.device, 'com.some.package',
                                    'prefs.xml')
   prefs.Load()
   self.assertEquals(prefs.AsDict(), self.expected_data)
   self.assertFalse(prefs.changed)
   prefs.Clear()
   self.assertEquals(len(prefs), 0)  # collection is empty now
   self.assertTrue(prefs.changed)
Ejemplo n.º 10
0
 def testPropertyType(self):
   prefs = shared_prefs.SharedPrefs(self.device, 'com.some.package',
                                    'prefs.xml')
   prefs.SetInt('myValue', 444)
   self.assertEquals(prefs.PropertyType('myValue'), 'int')
   with self.assertRaises(TypeError):
     prefs.GetString('myValue')
   with self.assertRaises(TypeError):
     prefs.SetString('myValue', 'hello')
Ejemplo n.º 11
0
 def edit_shared_prefs(dev):
     for setting in self._test_instance.edit_shared_prefs:
         shared_pref = shared_prefs.SharedPrefs(
             dev,
             setting['package'],
             setting['filename'],
             use_encrypted_path=setting.get(
                 'supports_encrypted_path', False))
         shared_preference_utils.ApplySharedPreferenceSetting(
             shared_pref, setting)
Ejemplo n.º 12
0
    def testAsContextManager_readAndWrite(self):
        type(self.presentation.device).build_version_sdk = mock.PropertyMock(
            return_value=version_codes.LOLLIPOP_MR1)
        with shared_prefs.SharedPrefs(self.presentation.device,
                                      'com.some.package',
                                      'prefs.xml') as prefs:
            prefs.SetBoolean('featureEnabled', True)
            prefs.Remove('someHashValue')
            prefs.SetString('newString', 'hello')

        self.assertTrue(self.presentation.device.WriteFile.called)  # did write
        with shared_prefs.SharedPrefs(self.presentation.device,
                                      'com.some.package',
                                      'prefs.xml') as prefs:
            # changes persisted
            self.assertTrue(prefs.GetBoolean('featureEnabled'))
            self.assertFalse(prefs.HasProperty('someHashValue'))
            self.assertEquals(prefs.GetString('newString'), 'hello')
            self.assertTrue(
                prefs.HasProperty('databaseVersion'))  # still there
      def edit_shared_prefs(dev):
        for setting in self._test_instance.edit_shared_prefs:
          shared_pref = shared_prefs.SharedPrefs(
              dev, setting['package'], setting['filename'],
              use_encrypted_path=setting.get('supports_encrypted_path', False))
          pref_to_restore = copy.copy(shared_pref)
          pref_to_restore.Load()
          self._shared_prefs_to_restore.append(pref_to_restore)

          shared_preference_utils.ApplySharedPreferenceSetting(
              shared_pref, setting)
Ejemplo n.º 14
0
 def testPropertyLifetime(self):
   prefs = shared_prefs.SharedPrefs(self.device, 'com.some.package',
                                    'prefs.xml')
   self.assertEquals(len(prefs), 0)  # collection is empty before loading
   prefs.SetInt('myValue', 444)
   self.assertEquals(len(prefs), 1)
   self.assertEquals(prefs.GetInt('myValue'), 444)
   self.assertTrue(prefs.HasProperty('myValue'))
   prefs.Remove('myValue')
   self.assertEquals(len(prefs), 0)
   self.assertFalse(prefs.HasProperty('myValue'))
   with self.assertRaises(KeyError):
     prefs.GetInt('myValue')
Ejemplo n.º 15
0
def ApplySharedPreferenceSettings(device, settings):
  """Applies the given app settings to the given device.

  Modifies an installed app's settings by modifying its shared preference
  settings file. Provided settings data must be a list of settings dictionaries,
  where dictionaries are in the following format:
  {
    "package": "com.example.package",
    "filename": "AppSettingsFile.xml",
    "set": {
      "SomeBoolToSet": true,
      "SomeStringToSet": "StringValue",
    },
    "remove": [
      "list",
      "of",
      "keys",
      "to",
      "remove",
    ]
  }

  Example JSON files that can be read with ExtractSettingsFromJson and passed to
  this function are in //chrome/android/shared_preference_files/test/.

  Args:
    device: The devil DeviceUtils object for the device the settings will be
        applied to.
    settings: A list of settings dictionaries to apply.
  """
  for pref in settings:
    prefs = shared_prefs.SharedPrefs(device, pref['package'], pref['filename'])
    prefs.Load()
    for key in pref.get('remove', []):
      try:
        prefs.Remove(key)
      except KeyError:
        logging.warning("Attempted to remove non-existent key %s", key)
    for key, value in pref.get('set', {}).iteritems():
      if isinstance(value, bool):
        prefs.SetBoolean(key, value)
      elif isinstance(value, basestring):
        prefs.SetString(key, value)
      elif isinstance(value, long) or isinstance(value, int):
        prefs.SetLong(key, value)
      elif isinstance(value, list):
        prefs.SetStringSet(key, value)
      else:
        raise ValueError("Given invalid value type %s for key %s" % (
            str(type(value)), key))
    prefs.Commit()
Ejemplo n.º 16
0
 def testForceCommit(self):
   prefs = shared_prefs.SharedPrefs(
       self.device, 'com.some.package', 'prefs.xml')
   prefs.Load()
   new_xml = 'Not valid XML'
   self.device.WriteFile('/data/data/com.some.package/shared_prefs/prefs.xml',
       new_xml)
   prefs.Commit()
   # Since we didn't change anything, Commit() should be a no-op.
   self.assertEquals(self.device.ReadFile(
       '/data/data/com.some.package/shared_prefs/prefs.xml'), new_xml)
   prefs.Commit(force_commit=True)
   # Forcing the commit should restore the originally read XML.
   self.assertEquals(self.device.ReadFile(
       '/data/data/com.some.package/shared_prefs/prefs.xml'), INITIAL_XML)
Ejemplo n.º 17
0
    def GetSharedPrefs(self, package, filename):
        """Creates a Devil SharedPrefs instance.

    See devil.android.sdk.shared_prefs for the documentation of the returned
    object.

    Args:
      package: A string containing the package of the app that the SharedPrefs
          instance will be for.
      filename: A string containing the specific settings file of the app that
          the SharedPrefs instance will be for.

    Returns:
      A reference to a SharedPrefs object for the given package and filename
      on whatever device the platform backend has a reference to.
    """
        return shared_prefs.SharedPrefs(self._device, package, filename)
Ejemplo n.º 18
0
  def GetSharedPrefs(self, package, filename, use_encrypted_path=False):
    """Creates a Devil SharedPrefs instance.

    See devil.android.sdk.shared_prefs for the documentation of the returned
    object.

    Args:
      package: A string containing the package of the app that the SharedPrefs
          instance will be for.
      filename: A string containing the specific settings file of the app that
          the SharedPrefs instance will be for.
      use_encrypted_path: Whether to use the newer device-encrypted path
          (/data/user_de/) instead of the older unencrypted path (/data/data/).

    Returns:
      A reference to a SharedPrefs object for the given package and filename
      on whatever device the platform backend has a reference to.
    """
    return shared_prefs.SharedPrefs(
        self._device, package, filename, use_encrypted_path=use_encrypted_path)
 def testForceCommit(self):
     type(self.device).build_version_sdk = mock.PropertyMock(
         return_value=version_codes.LOLLIPOP_MR1)
     prefs = shared_prefs.SharedPrefs(self.device, 'com.some.package',
                                      'prefs.xml')
     prefs.Load()
     new_xml = 'Not valid XML'
     self.device.WriteFile(
         '/data/data/com.some.package/shared_prefs/prefs.xml', new_xml)
     prefs.Commit()
     # Since we didn't change anything, Commit() should be a no-op.
     self.assertEquals(
         self.device.ReadFile(
             '/data/data/com.some.package/shared_prefs/prefs.xml'), new_xml)
     prefs.Commit(force_commit=True)
     # Forcing the commit should restore the originally read XML.
     self.assertEquals(
         self.device.ReadFile(
             '/data/data/com.some.package/shared_prefs/prefs.xml'),
         INITIAL_XML)
Ejemplo n.º 20
0
def StandaloneVrDeviceSetup(device):
  """Performs any additional setup necessary for standalone Android VR devices.

  Arguments:
    device: The device to check.
  """
  if device.product_name not in _STANDALONE_VR_DEVICES:
    return

  # Modify VrCore's settings so that any first time setup, etc. is skipped.
  shared_pref = shared_prefs.SharedPrefs(device, 'com.google.vr.vrcore',
      'VrCoreSettings.xml', use_encrypted_path=True)
  shared_pref.Load()
  # Skip first time setup.
  shared_pref.SetBoolean('DaydreamSetupComplete', True)
  # Disable the automatic prompt that shows anytime the device detects that a
  # controller isn't connected.
  shared_pref.SetBoolean('gConfigFlags:controller_recovery_enabled', False)
  # Use an automated controller instead of a real one so we get past the
  # controller pairing screen that's shown on startup.
  shared_pref.SetBoolean('UseAutomatedController', True)
  shared_pref.Commit()
Ejemplo n.º 21
0
 def edit_shared_prefs(dev):
     for setting in self._test_instance.edit_shared_prefs:
         shared_pref = shared_prefs.SharedPrefs(
             dev, setting['package'], setting['filename'])
         shared_preference_utils.ApplySharedPreferenceSetting(
             shared_pref, setting)