1cef7893435aa41160dd1255c43cb8498279738ccChris Craik# Copyright 2015 The Chromium Authors. All rights reserved.
2cef7893435aa41160dd1255c43cb8498279738ccChris Craik# Use of this source code is governed by a BSD-style license that can be
3cef7893435aa41160dd1255c43cb8498279738ccChris Craik# found in the LICENSE file.
4cef7893435aa41160dd1255c43cb8498279738ccChris Craik
5cef7893435aa41160dd1255c43cb8498279738ccChris Craik# pylint: disable=unused-argument
6cef7893435aa41160dd1255c43cb8498279738ccChris Craik
7cef7893435aa41160dd1255c43cb8498279738ccChris Craikimport os
8cef7893435aa41160dd1255c43cb8498279738ccChris Craikimport unittest
9cef7893435aa41160dd1255c43cb8498279738ccChris Craik
107332cdb42368a904cbf7418de329868989e592daChris Craikfrom py_utils import cloud_storage
11cef7893435aa41160dd1255c43cb8498279738ccChris Craikimport mock
12cef7893435aa41160dd1255c43cb8498279738ccChris Craikfrom pyfakefs import fake_filesystem_unittest
13cef7893435aa41160dd1255c43cb8498279738ccChris Craikfrom pyfakefs import fake_filesystem
14576fd2a645575980f16b6731dab0f4f150100657Chris Craikfrom pyfakefs import fake_filesystem_glob
15cef7893435aa41160dd1255c43cb8498279738ccChris Craik
16cef7893435aa41160dd1255c43cb8498279738ccChris Craikimport dependency_manager
17cef7893435aa41160dd1255c43cb8498279738ccChris Craikfrom dependency_manager import uploader
18cef7893435aa41160dd1255c43cb8498279738ccChris Craik
19cef7893435aa41160dd1255c43cb8498279738ccChris Craik
20cef7893435aa41160dd1255c43cb8498279738ccChris Craikclass BaseConfigCreationAndUpdateUnittests(fake_filesystem_unittest.TestCase):
21cef7893435aa41160dd1255c43cb8498279738ccChris Craik  def setUp(self):
22cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.addTypeEqualityFunc(uploader.CloudStorageUploader,
23cef7893435aa41160dd1255c43cb8498279738ccChris Craik                             uploader.CloudStorageUploader.__eq__)
24cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.setUpPyfakefs()
25cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.dependencies = {
26cef7893435aa41160dd1255c43cb8498279738ccChris Craik        'dep1': {'cloud_storage_bucket': 'bucket1',
27cef7893435aa41160dd1255c43cb8498279738ccChris Craik                 'cloud_storage_base_folder': 'dependencies_folder',
28cef7893435aa41160dd1255c43cb8498279738ccChris Craik                 'file_info': {
29cef7893435aa41160dd1255c43cb8498279738ccChris Craik                     'plat1': {
30cef7893435aa41160dd1255c43cb8498279738ccChris Craik                         'cloud_storage_hash': 'hash11',
31cef7893435aa41160dd1255c43cb8498279738ccChris Craik                         'download_path': '../../relative/dep1/path1'},
32cef7893435aa41160dd1255c43cb8498279738ccChris Craik                     'plat2': {
33cef7893435aa41160dd1255c43cb8498279738ccChris Craik                         'cloud_storage_hash': 'hash12',
34cef7893435aa41160dd1255c43cb8498279738ccChris Craik                         'download_path': '../../relative/dep1/path2'}}},
35cef7893435aa41160dd1255c43cb8498279738ccChris Craik        'dep2': {'cloud_storage_bucket': 'bucket2',
36cef7893435aa41160dd1255c43cb8498279738ccChris Craik                 'file_info': {
37cef7893435aa41160dd1255c43cb8498279738ccChris Craik                     'plat1': {
38cef7893435aa41160dd1255c43cb8498279738ccChris Craik                         'cloud_storage_hash': 'hash21',
39cef7893435aa41160dd1255c43cb8498279738ccChris Craik                         'download_path': '../../relative/dep2/path1'},
40cef7893435aa41160dd1255c43cb8498279738ccChris Craik                     'plat2': {
41cef7893435aa41160dd1255c43cb8498279738ccChris Craik                         'cloud_storage_hash': 'hash22',
42cef7893435aa41160dd1255c43cb8498279738ccChris Craik                         'download_path': '../../relative/dep2/path2'}}}}
43cef7893435aa41160dd1255c43cb8498279738ccChris Craik
44cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.expected_file_lines = [
45cef7893435aa41160dd1255c43cb8498279738ccChris Craik      # pylint: disable=bad-continuation
46cef7893435aa41160dd1255c43cb8498279738ccChris Craik      '{', '"config_type": "BaseConfig",', '"dependencies": {',
47cef7893435aa41160dd1255c43cb8498279738ccChris Craik        '"dep1": {', '"cloud_storage_base_folder": "dependencies_folder",',
48cef7893435aa41160dd1255c43cb8498279738ccChris Craik          '"cloud_storage_bucket": "bucket1",', '"file_info": {',
49cef7893435aa41160dd1255c43cb8498279738ccChris Craik            '"plat1": {', '"cloud_storage_hash": "hash11",',
50cef7893435aa41160dd1255c43cb8498279738ccChris Craik              '"download_path": "../../relative/dep1/path1"', '},',
51cef7893435aa41160dd1255c43cb8498279738ccChris Craik            '"plat2": {', '"cloud_storage_hash": "hash12",',
52cef7893435aa41160dd1255c43cb8498279738ccChris Craik              '"download_path": "../../relative/dep1/path2"', '}', '}', '},',
53cef7893435aa41160dd1255c43cb8498279738ccChris Craik        '"dep2": {', '"cloud_storage_bucket": "bucket2",', '"file_info": {',
54cef7893435aa41160dd1255c43cb8498279738ccChris Craik            '"plat1": {', '"cloud_storage_hash": "hash21",',
55cef7893435aa41160dd1255c43cb8498279738ccChris Craik              '"download_path": "../../relative/dep2/path1"', '},',
56cef7893435aa41160dd1255c43cb8498279738ccChris Craik            '"plat2": {', '"cloud_storage_hash": "hash22",',
57cef7893435aa41160dd1255c43cb8498279738ccChris Craik              '"download_path": "../../relative/dep2/path2"', '}', '}', '}',
58cef7893435aa41160dd1255c43cb8498279738ccChris Craik      '}', '}']
59cef7893435aa41160dd1255c43cb8498279738ccChris Craik
60cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.file_path = os.path.abspath(os.path.join(
61cef7893435aa41160dd1255c43cb8498279738ccChris Craik        'path', 'to', 'config', 'file'))
62cef7893435aa41160dd1255c43cb8498279738ccChris Craik
63cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.new_dep_path = 'path/to/new/dep'
64cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.fs.CreateFile(self.new_dep_path)
65cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.new_dep_hash = 'A23B56B7F23E798601F'
66cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.new_dependencies = {
67cef7893435aa41160dd1255c43cb8498279738ccChris Craik        'dep1': {'cloud_storage_bucket': 'bucket1',
68cef7893435aa41160dd1255c43cb8498279738ccChris Craik                 'cloud_storage_base_folder': 'dependencies_folder',
69cef7893435aa41160dd1255c43cb8498279738ccChris Craik                 'file_info': {
70cef7893435aa41160dd1255c43cb8498279738ccChris Craik                     'plat1': {
71cef7893435aa41160dd1255c43cb8498279738ccChris Craik                         'cloud_storage_hash': 'hash11',
72cef7893435aa41160dd1255c43cb8498279738ccChris Craik                         'download_path': '../../relative/dep1/path1'},
73cef7893435aa41160dd1255c43cb8498279738ccChris Craik                     'plat2': {
74cef7893435aa41160dd1255c43cb8498279738ccChris Craik                         'cloud_storage_hash': self.new_dep_hash,
75cef7893435aa41160dd1255c43cb8498279738ccChris Craik                         'download_path': '../../relative/dep1/path2'}}},
76cef7893435aa41160dd1255c43cb8498279738ccChris Craik        'dep2': {'cloud_storage_bucket': 'bucket2',
77cef7893435aa41160dd1255c43cb8498279738ccChris Craik                 'file_info': {
78cef7893435aa41160dd1255c43cb8498279738ccChris Craik                     'plat1': {
79cef7893435aa41160dd1255c43cb8498279738ccChris Craik                         'cloud_storage_hash': 'hash21',
80cef7893435aa41160dd1255c43cb8498279738ccChris Craik                         'download_path': '../../relative/dep2/path1'},
81cef7893435aa41160dd1255c43cb8498279738ccChris Craik                     'plat2': {
82cef7893435aa41160dd1255c43cb8498279738ccChris Craik                         'cloud_storage_hash': 'hash22',
83cef7893435aa41160dd1255c43cb8498279738ccChris Craik                         'download_path': '../../relative/dep2/path2'}}}}
84cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.new_bucket = 'bucket1'
85cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.new_remote_path = 'dependencies_folder/dep1_%s' % self.new_dep_hash
86cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.new_pending_upload = uploader.CloudStorageUploader(
87cef7893435aa41160dd1255c43cb8498279738ccChris Craik        self.new_bucket, self.new_remote_path, self.new_dep_path)
88cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.expected_new_backup_path = '.'.join([self.new_remote_path, 'old'])
89cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.new_expected_file_lines = [
90cef7893435aa41160dd1255c43cb8498279738ccChris Craik      # pylint: disable=bad-continuation
91cef7893435aa41160dd1255c43cb8498279738ccChris Craik      '{', '"config_type": "BaseConfig",', '"dependencies": {',
92cef7893435aa41160dd1255c43cb8498279738ccChris Craik        '"dep1": {', '"cloud_storage_base_folder": "dependencies_folder",',
93cef7893435aa41160dd1255c43cb8498279738ccChris Craik          '"cloud_storage_bucket": "bucket1",', '"file_info": {',
94cef7893435aa41160dd1255c43cb8498279738ccChris Craik            '"plat1": {', '"cloud_storage_hash": "hash11",',
95cef7893435aa41160dd1255c43cb8498279738ccChris Craik              '"download_path": "../../relative/dep1/path1"', '},',
96cef7893435aa41160dd1255c43cb8498279738ccChris Craik            '"plat2": {', '"cloud_storage_hash": "%s",' % self.new_dep_hash,
97cef7893435aa41160dd1255c43cb8498279738ccChris Craik              '"download_path": "../../relative/dep1/path2"', '}', '}', '},',
98cef7893435aa41160dd1255c43cb8498279738ccChris Craik        '"dep2": {', '"cloud_storage_bucket": "bucket2",', '"file_info": {',
99cef7893435aa41160dd1255c43cb8498279738ccChris Craik            '"plat1": {', '"cloud_storage_hash": "hash21",',
100cef7893435aa41160dd1255c43cb8498279738ccChris Craik              '"download_path": "../../relative/dep2/path1"', '},',
101cef7893435aa41160dd1255c43cb8498279738ccChris Craik            '"plat2": {', '"cloud_storage_hash": "hash22",',
102cef7893435aa41160dd1255c43cb8498279738ccChris Craik              '"download_path": "../../relative/dep2/path2"', '}', '}', '}',
103cef7893435aa41160dd1255c43cb8498279738ccChris Craik      '}', '}']
104cef7893435aa41160dd1255c43cb8498279738ccChris Craik
105cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.final_dep_path = 'path/to/final/dep'
106cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.fs.CreateFile(self.final_dep_path)
107cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.final_dep_hash = 'B34662F23B56B7F98601F'
108cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.final_bucket = 'bucket2'
109cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.final_remote_path = 'dep1_%s' % self.final_dep_hash
110cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.final_pending_upload = uploader.CloudStorageUploader(
111cef7893435aa41160dd1255c43cb8498279738ccChris Craik        self.final_bucket, self.final_remote_path, self.final_dep_path)
112cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.expected_final_backup_path = '.'.join([self.final_remote_path,
113cef7893435aa41160dd1255c43cb8498279738ccChris Craik                                                'old'])
114cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.final_dependencies = {
115cef7893435aa41160dd1255c43cb8498279738ccChris Craik        'dep1': {'cloud_storage_bucket': 'bucket1',
116cef7893435aa41160dd1255c43cb8498279738ccChris Craik                 'cloud_storage_base_folder': 'dependencies_folder',
117cef7893435aa41160dd1255c43cb8498279738ccChris Craik                 'file_info': {
118cef7893435aa41160dd1255c43cb8498279738ccChris Craik                     'plat1': {
119cef7893435aa41160dd1255c43cb8498279738ccChris Craik                         'cloud_storage_hash': 'hash11',
120cef7893435aa41160dd1255c43cb8498279738ccChris Craik                         'download_path': '../../relative/dep1/path1'},
121cef7893435aa41160dd1255c43cb8498279738ccChris Craik                     'plat2': {
122cef7893435aa41160dd1255c43cb8498279738ccChris Craik                         'cloud_storage_hash': self.new_dep_hash,
123cef7893435aa41160dd1255c43cb8498279738ccChris Craik                         'download_path': '../../relative/dep1/path2'}}},
124cef7893435aa41160dd1255c43cb8498279738ccChris Craik        'dep2': {'cloud_storage_bucket': 'bucket2',
125cef7893435aa41160dd1255c43cb8498279738ccChris Craik                 'file_info': {
126cef7893435aa41160dd1255c43cb8498279738ccChris Craik                     'plat1': {
127cef7893435aa41160dd1255c43cb8498279738ccChris Craik                         'cloud_storage_hash': self.final_dep_hash,
128cef7893435aa41160dd1255c43cb8498279738ccChris Craik                         'download_path': '../../relative/dep2/path1'},
129cef7893435aa41160dd1255c43cb8498279738ccChris Craik                     'plat2': {
130cef7893435aa41160dd1255c43cb8498279738ccChris Craik                         'cloud_storage_hash': 'hash22',
131cef7893435aa41160dd1255c43cb8498279738ccChris Craik                         'download_path': '../../relative/dep2/path2'}}}}
132cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.final_expected_file_lines = [
133cef7893435aa41160dd1255c43cb8498279738ccChris Craik      # pylint: disable=bad-continuation
134cef7893435aa41160dd1255c43cb8498279738ccChris Craik      '{', '"config_type": "BaseConfig",', '"dependencies": {',
135cef7893435aa41160dd1255c43cb8498279738ccChris Craik        '"dep1": {', '"cloud_storage_base_folder": "dependencies_folder",',
136cef7893435aa41160dd1255c43cb8498279738ccChris Craik          '"cloud_storage_bucket": "bucket1",', '"file_info": {',
137cef7893435aa41160dd1255c43cb8498279738ccChris Craik            '"plat1": {', '"cloud_storage_hash": "hash11",',
138cef7893435aa41160dd1255c43cb8498279738ccChris Craik              '"download_path": "../../relative/dep1/path1"', '},',
139cef7893435aa41160dd1255c43cb8498279738ccChris Craik            '"plat2": {', '"cloud_storage_hash": "%s",' % self.new_dep_hash,
140cef7893435aa41160dd1255c43cb8498279738ccChris Craik              '"download_path": "../../relative/dep1/path2"', '}', '}', '},',
141cef7893435aa41160dd1255c43cb8498279738ccChris Craik        '"dep2": {', '"cloud_storage_bucket": "bucket2",', '"file_info": {',
142cef7893435aa41160dd1255c43cb8498279738ccChris Craik            '"plat1": {', '"cloud_storage_hash": "%s",' % self.final_dep_hash,
143cef7893435aa41160dd1255c43cb8498279738ccChris Craik              '"download_path": "../../relative/dep2/path1"', '},',
144cef7893435aa41160dd1255c43cb8498279738ccChris Craik            '"plat2": {', '"cloud_storage_hash": "hash22",',
145cef7893435aa41160dd1255c43cb8498279738ccChris Craik              '"download_path": "../../relative/dep2/path2"', '}', '}', '}',
146cef7893435aa41160dd1255c43cb8498279738ccChris Craik      '}', '}']
147cef7893435aa41160dd1255c43cb8498279738ccChris Craik
148cef7893435aa41160dd1255c43cb8498279738ccChris Craik
149cef7893435aa41160dd1255c43cb8498279738ccChris Craik  def tearDown(self):
150cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.tearDownPyfakefs()
151cef7893435aa41160dd1255c43cb8498279738ccChris Craik
152cef7893435aa41160dd1255c43cb8498279738ccChris Craik  # Init is not meant to be overridden, so we should be mocking the
153cef7893435aa41160dd1255c43cb8498279738ccChris Craik  # base_config's json module, even in subclasses.
154cef7893435aa41160dd1255c43cb8498279738ccChris Craik  def testCreateEmptyConfig(self):
155cef7893435aa41160dd1255c43cb8498279738ccChris Craik    expected_file_lines = ['{',
156cef7893435aa41160dd1255c43cb8498279738ccChris Craik                           '"config_type": "BaseConfig",',
157cef7893435aa41160dd1255c43cb8498279738ccChris Craik                           '"dependencies": {}',
158cef7893435aa41160dd1255c43cb8498279738ccChris Craik                           '}']
159cef7893435aa41160dd1255c43cb8498279738ccChris Craik    config = dependency_manager.BaseConfig(self.file_path, writable=True)
160cef7893435aa41160dd1255c43cb8498279738ccChris Craik
161cef7893435aa41160dd1255c43cb8498279738ccChris Craik    file_module = fake_filesystem.FakeFileOpen(self.fs)
162cef7893435aa41160dd1255c43cb8498279738ccChris Craik    for line in file_module(self.file_path):
163cef7893435aa41160dd1255c43cb8498279738ccChris Craik      self.assertEqual(expected_file_lines.pop(0), line.strip())
164cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.fs.CloseOpenFile(file_module(self.file_path))
165cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertEqual({}, config._config_data)
166cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertEqual(self.file_path, config._config_path)
167cef7893435aa41160dd1255c43cb8498279738ccChris Craik
168cef7893435aa41160dd1255c43cb8498279738ccChris Craik  def testCreateEmptyConfigError(self):
169cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertRaises(dependency_manager.EmptyConfigError,
170cef7893435aa41160dd1255c43cb8498279738ccChris Craik                      dependency_manager.BaseConfig, self.file_path)
171cef7893435aa41160dd1255c43cb8498279738ccChris Craik
172cef7893435aa41160dd1255c43cb8498279738ccChris Craik  def testCloudStorageRemotePath(self):
173cef7893435aa41160dd1255c43cb8498279738ccChris Craik    dependency = 'dep_name'
174cef7893435aa41160dd1255c43cb8498279738ccChris Craik    cs_hash = self.new_dep_hash
175cef7893435aa41160dd1255c43cb8498279738ccChris Craik    cs_base_folder = 'dependency_remote_folder'
176cef7893435aa41160dd1255c43cb8498279738ccChris Craik    expected_remote_path = '%s/%s_%s' % (cs_base_folder, dependency, cs_hash)
177cef7893435aa41160dd1255c43cb8498279738ccChris Craik    remote_path = dependency_manager.BaseConfig._CloudStorageRemotePath(
178cef7893435aa41160dd1255c43cb8498279738ccChris Craik        dependency, cs_hash, cs_base_folder)
179cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertEqual(expected_remote_path, remote_path)
180cef7893435aa41160dd1255c43cb8498279738ccChris Craik
181cef7893435aa41160dd1255c43cb8498279738ccChris Craik    cs_base_folder = 'dependency_remote_folder'
182cef7893435aa41160dd1255c43cb8498279738ccChris Craik    expected_remote_path = '%s_%s' % (dependency, cs_hash)
183cef7893435aa41160dd1255c43cb8498279738ccChris Craik    remote_path = dependency_manager.BaseConfig._CloudStorageRemotePath(
184cef7893435aa41160dd1255c43cb8498279738ccChris Craik        dependency, cs_hash, cs_base_folder)
185cef7893435aa41160dd1255c43cb8498279738ccChris Craik
186cef7893435aa41160dd1255c43cb8498279738ccChris Craik  def testGetEmptyJsonDict(self):
187cef7893435aa41160dd1255c43cb8498279738ccChris Craik    expected_json_dict = {'config_type': 'BaseConfig',
188cef7893435aa41160dd1255c43cb8498279738ccChris Craik                          'dependencies': {}}
189cef7893435aa41160dd1255c43cb8498279738ccChris Craik    json_dict = dependency_manager.BaseConfig._GetJsonDict()
190cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertEqual(expected_json_dict, json_dict)
191cef7893435aa41160dd1255c43cb8498279738ccChris Craik
192cef7893435aa41160dd1255c43cb8498279738ccChris Craik  def testGetNonEmptyJsonDict(self):
193cef7893435aa41160dd1255c43cb8498279738ccChris Craik    expected_json_dict = {"config_type": "BaseConfig",
194cef7893435aa41160dd1255c43cb8498279738ccChris Craik                          "dependencies": self.dependencies}
195cef7893435aa41160dd1255c43cb8498279738ccChris Craik    json_dict = dependency_manager.BaseConfig._GetJsonDict(self.dependencies)
196cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertEqual(expected_json_dict, json_dict)
197cef7893435aa41160dd1255c43cb8498279738ccChris Craik
198cef7893435aa41160dd1255c43cb8498279738ccChris Craik  def testWriteEmptyConfigToFile(self):
199cef7893435aa41160dd1255c43cb8498279738ccChris Craik    expected_file_lines = ['{', '"config_type": "BaseConfig",',
200cef7893435aa41160dd1255c43cb8498279738ccChris Craik                           '"dependencies": {}', '}']
201cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertFalse(os.path.exists(self.file_path))
202cef7893435aa41160dd1255c43cb8498279738ccChris Craik    dependency_manager.BaseConfig._WriteConfigToFile(self.file_path)
203cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertTrue(os.path.exists(self.file_path))
204cef7893435aa41160dd1255c43cb8498279738ccChris Craik    file_module = fake_filesystem.FakeFileOpen(self.fs)
205cef7893435aa41160dd1255c43cb8498279738ccChris Craik    for line in file_module(self.file_path):
206cef7893435aa41160dd1255c43cb8498279738ccChris Craik      self.assertEqual(expected_file_lines.pop(0), line.strip())
207cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.fs.CloseOpenFile(file_module(self.file_path))
208cef7893435aa41160dd1255c43cb8498279738ccChris Craik
209cef7893435aa41160dd1255c43cb8498279738ccChris Craik  def testWriteNonEmptyConfigToFile(self):
210cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertFalse(os.path.exists(self.file_path))
211cef7893435aa41160dd1255c43cb8498279738ccChris Craik    dependency_manager.BaseConfig._WriteConfigToFile(self.file_path,
212cef7893435aa41160dd1255c43cb8498279738ccChris Craik                                                     self.dependencies)
213cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertTrue(os.path.exists(self.file_path))
214cef7893435aa41160dd1255c43cb8498279738ccChris Craik    expected_file_lines = list(self.expected_file_lines)
215cef7893435aa41160dd1255c43cb8498279738ccChris Craik    file_module = fake_filesystem.FakeFileOpen(self.fs)
216cef7893435aa41160dd1255c43cb8498279738ccChris Craik    for line in file_module(self.file_path):
217cef7893435aa41160dd1255c43cb8498279738ccChris Craik      self.assertEqual(expected_file_lines.pop(0), line.strip())
218cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.fs.CloseOpenFile(file_module(self.file_path))
219cef7893435aa41160dd1255c43cb8498279738ccChris Craik
220cef7893435aa41160dd1255c43cb8498279738ccChris Craik  @mock.patch('dependency_manager.uploader.cloud_storage')
221cef7893435aa41160dd1255c43cb8498279738ccChris Craik  def testExecuteUpdateJobsNoOp(self, uploader_cs_mock):
222cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.fs.CreateFile(self.file_path,
223cef7893435aa41160dd1255c43cb8498279738ccChris Craik                       contents='\n'.join(self.expected_file_lines))
224cef7893435aa41160dd1255c43cb8498279738ccChris Craik    config = dependency_manager.BaseConfig(self.file_path, writable=True)
225cef7893435aa41160dd1255c43cb8498279738ccChris Craik
226cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertFalse(config.ExecuteUpdateJobs())
227cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertFalse(config._IsDirty())
228cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertFalse(config._pending_uploads)
229cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertEqual(self.dependencies, config._config_data)
230cef7893435aa41160dd1255c43cb8498279738ccChris Craik    file_module = fake_filesystem.FakeFileOpen(self.fs)
231cef7893435aa41160dd1255c43cb8498279738ccChris Craik    expected_file_lines = list(self.expected_file_lines)
232cef7893435aa41160dd1255c43cb8498279738ccChris Craik    for line in file_module(self.file_path):
233cef7893435aa41160dd1255c43cb8498279738ccChris Craik      self.assertEqual(expected_file_lines.pop(0), line.strip())
234cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.fs.CloseOpenFile(file_module(self.file_path))
235cef7893435aa41160dd1255c43cb8498279738ccChris Craik
236cef7893435aa41160dd1255c43cb8498279738ccChris Craik  @mock.patch('dependency_manager.uploader.cloud_storage')
237cef7893435aa41160dd1255c43cb8498279738ccChris Craik  def testExecuteUpdateJobsFailureOnInsertNoCSCollision(
238cef7893435aa41160dd1255c43cb8498279738ccChris Craik      self, uploader_cs_mock):
239cef7893435aa41160dd1255c43cb8498279738ccChris Craik    uploader_cs_mock.Exists.return_value = False
240cef7893435aa41160dd1255c43cb8498279738ccChris Craik    uploader_cs_mock.Insert.side_effect = cloud_storage.CloudStorageError
241cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.fs.CreateFile(self.file_path,
242cef7893435aa41160dd1255c43cb8498279738ccChris Craik                       contents='\n'.join(self.expected_file_lines))
243cef7893435aa41160dd1255c43cb8498279738ccChris Craik    config = dependency_manager.BaseConfig(self.file_path, writable=True)
244cef7893435aa41160dd1255c43cb8498279738ccChris Craik    config._config_data = self.new_dependencies.copy()
245cef7893435aa41160dd1255c43cb8498279738ccChris Craik    config._is_dirty = True
246cef7893435aa41160dd1255c43cb8498279738ccChris Craik    config._pending_uploads = [self.new_pending_upload]
247cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertEqual(self.new_dependencies, config._config_data)
248cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertTrue(config._is_dirty)
249cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertEqual(1, len(config._pending_uploads))
250cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertEqual(self.new_pending_upload, config._pending_uploads[0])
251cef7893435aa41160dd1255c43cb8498279738ccChris Craik    expected_exists_calls = [mock.call(self.new_bucket, self.new_remote_path)]
252cef7893435aa41160dd1255c43cb8498279738ccChris Craik    expected_insert_calls = [mock.call(self.new_bucket, self.new_remote_path,
253cef7893435aa41160dd1255c43cb8498279738ccChris Craik                                       self.new_dep_path)]
254cef7893435aa41160dd1255c43cb8498279738ccChris Craik    expected_copy_calls = []
255cef7893435aa41160dd1255c43cb8498279738ccChris Craik    expected_delete_calls = []
256cef7893435aa41160dd1255c43cb8498279738ccChris Craik
257cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertRaises(cloud_storage.CloudStorageError,
258cef7893435aa41160dd1255c43cb8498279738ccChris Craik                      config.ExecuteUpdateJobs)
259cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertTrue(config._is_dirty)
260cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertEqual(1, len(config._pending_uploads))
261cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertEqual(self.new_pending_upload, config._pending_uploads[0])
262cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertEqual(self.new_dependencies, config._config_data)
263cef7893435aa41160dd1255c43cb8498279738ccChris Craik    file_module = fake_filesystem.FakeFileOpen(self.fs)
264cef7893435aa41160dd1255c43cb8498279738ccChris Craik    expected_file_lines = list(self.expected_file_lines)
265cef7893435aa41160dd1255c43cb8498279738ccChris Craik    for line in file_module(self.file_path):
266cef7893435aa41160dd1255c43cb8498279738ccChris Craik      self.assertEqual(expected_file_lines.pop(0), line.strip())
267cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.fs.CloseOpenFile(file_module(self.file_path))
268cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertEqual(1, len(config._pending_uploads))
269cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertEqual(self.new_pending_upload, config._pending_uploads[0])
270cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertEqual(expected_insert_calls,
271cef7893435aa41160dd1255c43cb8498279738ccChris Craik                     uploader_cs_mock.Insert.call_args_list)
272cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertEqual(expected_exists_calls,
273cef7893435aa41160dd1255c43cb8498279738ccChris Craik                     uploader_cs_mock.Exists.call_args_list)
274cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertEqual(expected_copy_calls,
275cef7893435aa41160dd1255c43cb8498279738ccChris Craik                     uploader_cs_mock.Copy.call_args_list)
276cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertEqual(expected_delete_calls,
277cef7893435aa41160dd1255c43cb8498279738ccChris Craik                     uploader_cs_mock.Delete.call_args_list)
278cef7893435aa41160dd1255c43cb8498279738ccChris Craik
279cef7893435aa41160dd1255c43cb8498279738ccChris Craik  @mock.patch('dependency_manager.uploader.cloud_storage')
280cef7893435aa41160dd1255c43cb8498279738ccChris Craik  def testExecuteUpdateJobsFailureOnInsertCSCollisionForce(
281cef7893435aa41160dd1255c43cb8498279738ccChris Craik      self, uploader_cs_mock):
282cef7893435aa41160dd1255c43cb8498279738ccChris Craik    uploader_cs_mock.Exists.return_value = True
283cef7893435aa41160dd1255c43cb8498279738ccChris Craik    uploader_cs_mock.Insert.side_effect = cloud_storage.CloudStorageError
284cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.fs.CreateFile(self.file_path,
285cef7893435aa41160dd1255c43cb8498279738ccChris Craik                       contents='\n'.join(self.expected_file_lines))
286cef7893435aa41160dd1255c43cb8498279738ccChris Craik    config = dependency_manager.BaseConfig(self.file_path, writable=True)
287cef7893435aa41160dd1255c43cb8498279738ccChris Craik    config._config_data = self.new_dependencies.copy()
288cef7893435aa41160dd1255c43cb8498279738ccChris Craik    config._is_dirty = True
289cef7893435aa41160dd1255c43cb8498279738ccChris Craik    config._pending_uploads = [self.new_pending_upload]
290cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertEqual(self.new_dependencies, config._config_data)
291cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertTrue(config._is_dirty)
292cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertEqual(1, len(config._pending_uploads))
293cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertEqual(self.new_pending_upload, config._pending_uploads[0])
294cef7893435aa41160dd1255c43cb8498279738ccChris Craik    expected_exists_calls = [mock.call(self.new_bucket, self.new_remote_path)]
295cef7893435aa41160dd1255c43cb8498279738ccChris Craik    expected_insert_calls = [mock.call(self.new_bucket, self.new_remote_path,
296cef7893435aa41160dd1255c43cb8498279738ccChris Craik                                       self.new_dep_path)]
297cef7893435aa41160dd1255c43cb8498279738ccChris Craik    expected_copy_calls = [mock.call(self.new_bucket, self.new_bucket,
298cef7893435aa41160dd1255c43cb8498279738ccChris Craik                                     self.new_remote_path,
299cef7893435aa41160dd1255c43cb8498279738ccChris Craik                                     self.expected_new_backup_path),
300cef7893435aa41160dd1255c43cb8498279738ccChris Craik                           mock.call(self.new_bucket, self.new_bucket,
301cef7893435aa41160dd1255c43cb8498279738ccChris Craik                                     self.expected_new_backup_path,
302cef7893435aa41160dd1255c43cb8498279738ccChris Craik                                     self.new_remote_path)]
303cef7893435aa41160dd1255c43cb8498279738ccChris Craik    expected_delete_calls = []
304cef7893435aa41160dd1255c43cb8498279738ccChris Craik
305cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertRaises(cloud_storage.CloudStorageError,
306cef7893435aa41160dd1255c43cb8498279738ccChris Craik                      config.ExecuteUpdateJobs, force=True)
307cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertTrue(config._is_dirty)
308cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertEqual(1, len(config._pending_uploads))
309cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertEqual(self.new_pending_upload, config._pending_uploads[0])
310cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertEqual(self.new_dependencies, config._config_data)
311cef7893435aa41160dd1255c43cb8498279738ccChris Craik    file_module = fake_filesystem.FakeFileOpen(self.fs)
312cef7893435aa41160dd1255c43cb8498279738ccChris Craik    expected_file_lines = list(self.expected_file_lines)
313cef7893435aa41160dd1255c43cb8498279738ccChris Craik    for line in file_module(self.file_path):
314cef7893435aa41160dd1255c43cb8498279738ccChris Craik      self.assertEqual(expected_file_lines.pop(0), line.strip())
315cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.fs.CloseOpenFile(file_module(self.file_path))
316cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertEqual(1, len(config._pending_uploads))
317cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertEqual(self.new_pending_upload, config._pending_uploads[0])
318cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertEqual(expected_insert_calls,
319cef7893435aa41160dd1255c43cb8498279738ccChris Craik                     uploader_cs_mock.Insert.call_args_list)
320cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertEqual(expected_exists_calls,
321cef7893435aa41160dd1255c43cb8498279738ccChris Craik                     uploader_cs_mock.Exists.call_args_list)
322cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertEqual(expected_copy_calls,
323cef7893435aa41160dd1255c43cb8498279738ccChris Craik                     uploader_cs_mock.Copy.call_args_list)
324cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertEqual(expected_delete_calls,
325cef7893435aa41160dd1255c43cb8498279738ccChris Craik                     uploader_cs_mock.Delete.call_args_list)
326cef7893435aa41160dd1255c43cb8498279738ccChris Craik
327cef7893435aa41160dd1255c43cb8498279738ccChris Craik  @mock.patch('dependency_manager.uploader.cloud_storage')
328cef7893435aa41160dd1255c43cb8498279738ccChris Craik  def testExecuteUpdateJobsFailureOnInsertCSCollisionNoForce(
329cef7893435aa41160dd1255c43cb8498279738ccChris Craik      self, uploader_cs_mock):
330cef7893435aa41160dd1255c43cb8498279738ccChris Craik    uploader_cs_mock.Exists.return_value = True
331cef7893435aa41160dd1255c43cb8498279738ccChris Craik    uploader_cs_mock.Insert.side_effect = cloud_storage.CloudStorageError
332cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.fs.CreateFile(self.file_path,
333cef7893435aa41160dd1255c43cb8498279738ccChris Craik                       contents='\n'.join(self.expected_file_lines))
334cef7893435aa41160dd1255c43cb8498279738ccChris Craik    config = dependency_manager.BaseConfig(self.file_path, writable=True)
335cef7893435aa41160dd1255c43cb8498279738ccChris Craik    config._config_data = self.new_dependencies.copy()
336cef7893435aa41160dd1255c43cb8498279738ccChris Craik    config._is_dirty = True
337cef7893435aa41160dd1255c43cb8498279738ccChris Craik    config._pending_uploads = [self.new_pending_upload]
338cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertEqual(self.new_dependencies, config._config_data)
339cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertTrue(config._is_dirty)
340cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertEqual(1, len(config._pending_uploads))
341cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertEqual(self.new_pending_upload, config._pending_uploads[0])
342cef7893435aa41160dd1255c43cb8498279738ccChris Craik    expected_exists_calls = [mock.call(self.new_bucket, self.new_remote_path)]
343cef7893435aa41160dd1255c43cb8498279738ccChris Craik    expected_insert_calls = []
344cef7893435aa41160dd1255c43cb8498279738ccChris Craik    expected_copy_calls = []
345cef7893435aa41160dd1255c43cb8498279738ccChris Craik    expected_delete_calls = []
346cef7893435aa41160dd1255c43cb8498279738ccChris Craik
347cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertRaises(cloud_storage.CloudStorageError,
348cef7893435aa41160dd1255c43cb8498279738ccChris Craik                      config.ExecuteUpdateJobs)
349cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertTrue(config._is_dirty)
350cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertEqual(1, len(config._pending_uploads))
351cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertEqual(self.new_pending_upload, config._pending_uploads[0])
352cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertEqual(self.new_dependencies, config._config_data)
353cef7893435aa41160dd1255c43cb8498279738ccChris Craik    file_module = fake_filesystem.FakeFileOpen(self.fs)
354cef7893435aa41160dd1255c43cb8498279738ccChris Craik    expected_file_lines = list(self.expected_file_lines)
355cef7893435aa41160dd1255c43cb8498279738ccChris Craik    for line in file_module(self.file_path):
356cef7893435aa41160dd1255c43cb8498279738ccChris Craik      self.assertEqual(expected_file_lines.pop(0), line.strip())
357cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.fs.CloseOpenFile(file_module(self.file_path))
358cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertEqual(1, len(config._pending_uploads))
359cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertEqual(self.new_pending_upload, config._pending_uploads[0])
360cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertEqual(expected_insert_calls,
361cef7893435aa41160dd1255c43cb8498279738ccChris Craik                     uploader_cs_mock.Insert.call_args_list)
362cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertEqual(expected_exists_calls,
363cef7893435aa41160dd1255c43cb8498279738ccChris Craik                     uploader_cs_mock.Exists.call_args_list)
364cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertEqual(expected_copy_calls,
365cef7893435aa41160dd1255c43cb8498279738ccChris Craik                     uploader_cs_mock.Copy.call_args_list)
366cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertEqual(expected_delete_calls,
367cef7893435aa41160dd1255c43cb8498279738ccChris Craik                     uploader_cs_mock.Delete.call_args_list)
368cef7893435aa41160dd1255c43cb8498279738ccChris Craik
369cef7893435aa41160dd1255c43cb8498279738ccChris Craik  @mock.patch('dependency_manager.uploader.cloud_storage')
370cef7893435aa41160dd1255c43cb8498279738ccChris Craik  def testExecuteUpdateJobsFailureOnCopy(
371cef7893435aa41160dd1255c43cb8498279738ccChris Craik      self, uploader_cs_mock):
372cef7893435aa41160dd1255c43cb8498279738ccChris Craik    uploader_cs_mock.Exists.return_value = True
373cef7893435aa41160dd1255c43cb8498279738ccChris Craik    uploader_cs_mock.Copy.side_effect = cloud_storage.CloudStorageError
374cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.fs.CreateFile(self.file_path,
375cef7893435aa41160dd1255c43cb8498279738ccChris Craik                       contents='\n'.join(self.expected_file_lines))
376cef7893435aa41160dd1255c43cb8498279738ccChris Craik    config = dependency_manager.BaseConfig(self.file_path, writable=True)
377cef7893435aa41160dd1255c43cb8498279738ccChris Craik    config._config_data = self.new_dependencies.copy()
378cef7893435aa41160dd1255c43cb8498279738ccChris Craik    config._is_dirty = True
379cef7893435aa41160dd1255c43cb8498279738ccChris Craik    config._pending_uploads = [self.new_pending_upload]
380cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertEqual(self.new_dependencies, config._config_data)
381cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertTrue(config._is_dirty)
382cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertEqual(1, len(config._pending_uploads))
383cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertEqual(self.new_pending_upload, config._pending_uploads[0])
384cef7893435aa41160dd1255c43cb8498279738ccChris Craik    expected_exists_calls = [mock.call(self.new_bucket, self.new_remote_path)]
385cef7893435aa41160dd1255c43cb8498279738ccChris Craik    expected_insert_calls = []
386cef7893435aa41160dd1255c43cb8498279738ccChris Craik    expected_copy_calls = [mock.call(self.new_bucket, self.new_bucket,
387cef7893435aa41160dd1255c43cb8498279738ccChris Craik                                     self.new_remote_path,
388cef7893435aa41160dd1255c43cb8498279738ccChris Craik                                     self.expected_new_backup_path)]
389cef7893435aa41160dd1255c43cb8498279738ccChris Craik    expected_delete_calls = []
390cef7893435aa41160dd1255c43cb8498279738ccChris Craik
391cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertRaises(cloud_storage.CloudStorageError,
392cef7893435aa41160dd1255c43cb8498279738ccChris Craik                      config.ExecuteUpdateJobs, force=True)
393cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertTrue(config._is_dirty)
394cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertEqual(1, len(config._pending_uploads))
395cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertEqual(self.new_pending_upload, config._pending_uploads[0])
396cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertEqual(self.new_dependencies, config._config_data)
397cef7893435aa41160dd1255c43cb8498279738ccChris Craik    file_module = fake_filesystem.FakeFileOpen(self.fs)
398cef7893435aa41160dd1255c43cb8498279738ccChris Craik    expected_file_lines = list(self.expected_file_lines)
399cef7893435aa41160dd1255c43cb8498279738ccChris Craik    for line in file_module(self.file_path):
400cef7893435aa41160dd1255c43cb8498279738ccChris Craik      self.assertEqual(expected_file_lines.pop(0), line.strip())
401cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.fs.CloseOpenFile(file_module(self.file_path))
402cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertEqual(1, len(config._pending_uploads))
403cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertEqual(self.new_pending_upload, config._pending_uploads[0])
404cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertEqual(expected_insert_calls,
405cef7893435aa41160dd1255c43cb8498279738ccChris Craik                     uploader_cs_mock.Insert.call_args_list)
406cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertEqual(expected_exists_calls,
407cef7893435aa41160dd1255c43cb8498279738ccChris Craik                     uploader_cs_mock.Exists.call_args_list)
408cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertEqual(expected_copy_calls,
409cef7893435aa41160dd1255c43cb8498279738ccChris Craik                     uploader_cs_mock.Copy.call_args_list)
410cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertEqual(expected_delete_calls,
411cef7893435aa41160dd1255c43cb8498279738ccChris Craik                     uploader_cs_mock.Delete.call_args_list)
412cef7893435aa41160dd1255c43cb8498279738ccChris Craik
413cef7893435aa41160dd1255c43cb8498279738ccChris Craik  @mock.patch('dependency_manager.uploader.cloud_storage')
414cef7893435aa41160dd1255c43cb8498279738ccChris Craik  def testExecuteUpdateJobsFailureOnSecondInsertNoCSCollision(
415cef7893435aa41160dd1255c43cb8498279738ccChris Craik      self, uploader_cs_mock):
416cef7893435aa41160dd1255c43cb8498279738ccChris Craik    uploader_cs_mock.Exists.return_value = False
417cef7893435aa41160dd1255c43cb8498279738ccChris Craik    uploader_cs_mock.Insert.side_effect = [
418cef7893435aa41160dd1255c43cb8498279738ccChris Craik        True, cloud_storage.CloudStorageError]
419cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.fs.CreateFile(self.file_path,
420cef7893435aa41160dd1255c43cb8498279738ccChris Craik                       contents='\n'.join(self.expected_file_lines))
421cef7893435aa41160dd1255c43cb8498279738ccChris Craik    config = dependency_manager.BaseConfig(self.file_path, writable=True)
422cef7893435aa41160dd1255c43cb8498279738ccChris Craik    config._config_data = self.new_dependencies.copy()
423cef7893435aa41160dd1255c43cb8498279738ccChris Craik    config._is_dirty = True
424cef7893435aa41160dd1255c43cb8498279738ccChris Craik    config._pending_uploads = [self.new_pending_upload,
425cef7893435aa41160dd1255c43cb8498279738ccChris Craik                               self.final_pending_upload]
426cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertEqual(self.new_dependencies, config._config_data)
427cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertTrue(config._is_dirty)
428cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertEqual(2, len(config._pending_uploads))
429cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertEqual(self.new_pending_upload, config._pending_uploads[0])
430cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertEqual(self.final_pending_upload, config._pending_uploads[1])
431cef7893435aa41160dd1255c43cb8498279738ccChris Craik    expected_exists_calls = [mock.call(self.new_bucket, self.new_remote_path),
432cef7893435aa41160dd1255c43cb8498279738ccChris Craik                             mock.call(self.final_bucket,
433cef7893435aa41160dd1255c43cb8498279738ccChris Craik                                       self.final_remote_path)]
434cef7893435aa41160dd1255c43cb8498279738ccChris Craik    expected_insert_calls = [mock.call(self.new_bucket, self.new_remote_path,
435cef7893435aa41160dd1255c43cb8498279738ccChris Craik                                       self.new_dep_path),
436cef7893435aa41160dd1255c43cb8498279738ccChris Craik                             mock.call(self.final_bucket,
437cef7893435aa41160dd1255c43cb8498279738ccChris Craik                                       self.final_remote_path,
438cef7893435aa41160dd1255c43cb8498279738ccChris Craik                                       self.final_dep_path)]
439cef7893435aa41160dd1255c43cb8498279738ccChris Craik    expected_copy_calls = []
440cef7893435aa41160dd1255c43cb8498279738ccChris Craik    expected_delete_calls = [mock.call(self.new_bucket, self.new_remote_path)]
441cef7893435aa41160dd1255c43cb8498279738ccChris Craik
442cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertRaises(cloud_storage.CloudStorageError,
443cef7893435aa41160dd1255c43cb8498279738ccChris Craik                      config.ExecuteUpdateJobs)
444cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertTrue(config._is_dirty)
445cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertEqual(2, len(config._pending_uploads))
446cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertEqual(self.new_pending_upload, config._pending_uploads[0])
447cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertEqual(self.final_pending_upload, config._pending_uploads[1])
448cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertEqual(self.new_dependencies, config._config_data)
449cef7893435aa41160dd1255c43cb8498279738ccChris Craik    file_module = fake_filesystem.FakeFileOpen(self.fs)
450cef7893435aa41160dd1255c43cb8498279738ccChris Craik    expected_file_lines = list(self.expected_file_lines)
451cef7893435aa41160dd1255c43cb8498279738ccChris Craik    for line in file_module(self.file_path):
452cef7893435aa41160dd1255c43cb8498279738ccChris Craik      self.assertEqual(expected_file_lines.pop(0), line.strip())
453cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.fs.CloseOpenFile(file_module(self.file_path))
454cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertEqual(expected_insert_calls,
455cef7893435aa41160dd1255c43cb8498279738ccChris Craik                     uploader_cs_mock.Insert.call_args_list)
456cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertEqual(expected_exists_calls,
457cef7893435aa41160dd1255c43cb8498279738ccChris Craik                     uploader_cs_mock.Exists.call_args_list)
458cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertEqual(expected_copy_calls,
459cef7893435aa41160dd1255c43cb8498279738ccChris Craik                     uploader_cs_mock.Copy.call_args_list)
460cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertEqual(expected_delete_calls,
461cef7893435aa41160dd1255c43cb8498279738ccChris Craik                     uploader_cs_mock.Delete.call_args_list)
462cef7893435aa41160dd1255c43cb8498279738ccChris Craik
463cef7893435aa41160dd1255c43cb8498279738ccChris Craik  @mock.patch('dependency_manager.uploader.cloud_storage')
464cef7893435aa41160dd1255c43cb8498279738ccChris Craik  def testExecuteUpdateJobsFailureOnSecondInsertCSCollisionForce(
465cef7893435aa41160dd1255c43cb8498279738ccChris Craik      self, uploader_cs_mock):
466cef7893435aa41160dd1255c43cb8498279738ccChris Craik    uploader_cs_mock.Exists.return_value = True
467cef7893435aa41160dd1255c43cb8498279738ccChris Craik    uploader_cs_mock.Insert.side_effect = [
468cef7893435aa41160dd1255c43cb8498279738ccChris Craik        True, cloud_storage.CloudStorageError]
469cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.fs.CreateFile(self.file_path,
470cef7893435aa41160dd1255c43cb8498279738ccChris Craik                       contents='\n'.join(self.expected_file_lines))
471cef7893435aa41160dd1255c43cb8498279738ccChris Craik    config = dependency_manager.BaseConfig(self.file_path, writable=True)
472cef7893435aa41160dd1255c43cb8498279738ccChris Craik    config._config_data = self.new_dependencies.copy()
473cef7893435aa41160dd1255c43cb8498279738ccChris Craik    config._is_dirty = True
474cef7893435aa41160dd1255c43cb8498279738ccChris Craik    config._pending_uploads = [self.new_pending_upload,
475cef7893435aa41160dd1255c43cb8498279738ccChris Craik                               self.final_pending_upload]
476cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertEqual(self.new_dependencies, config._config_data)
477cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertTrue(config._is_dirty)
478cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertEqual(2, len(config._pending_uploads))
479cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertEqual(self.new_pending_upload, config._pending_uploads[0])
480cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertEqual(self.final_pending_upload, config._pending_uploads[1])
481cef7893435aa41160dd1255c43cb8498279738ccChris Craik    expected_exists_calls = [mock.call(self.new_bucket, self.new_remote_path),
482cef7893435aa41160dd1255c43cb8498279738ccChris Craik                             mock.call(self.final_bucket,
483cef7893435aa41160dd1255c43cb8498279738ccChris Craik                                       self.final_remote_path)]
484cef7893435aa41160dd1255c43cb8498279738ccChris Craik    expected_insert_calls = [mock.call(self.new_bucket, self.new_remote_path,
485cef7893435aa41160dd1255c43cb8498279738ccChris Craik                                       self.new_dep_path),
486cef7893435aa41160dd1255c43cb8498279738ccChris Craik                             mock.call(self.final_bucket,
487cef7893435aa41160dd1255c43cb8498279738ccChris Craik                                       self.final_remote_path,
488cef7893435aa41160dd1255c43cb8498279738ccChris Craik                                       self.final_dep_path)]
489cef7893435aa41160dd1255c43cb8498279738ccChris Craik    expected_copy_calls = [mock.call(self.new_bucket, self.new_bucket,
490cef7893435aa41160dd1255c43cb8498279738ccChris Craik                                     self.new_remote_path,
491cef7893435aa41160dd1255c43cb8498279738ccChris Craik                                     self.expected_new_backup_path),
492cef7893435aa41160dd1255c43cb8498279738ccChris Craik                           mock.call(self.final_bucket, self.final_bucket,
493cef7893435aa41160dd1255c43cb8498279738ccChris Craik                                     self.final_remote_path,
494cef7893435aa41160dd1255c43cb8498279738ccChris Craik                                     self.expected_final_backup_path),
495cef7893435aa41160dd1255c43cb8498279738ccChris Craik                           mock.call(self.final_bucket, self.final_bucket,
496cef7893435aa41160dd1255c43cb8498279738ccChris Craik                                     self.expected_final_backup_path,
497cef7893435aa41160dd1255c43cb8498279738ccChris Craik                                     self.final_remote_path),
498cef7893435aa41160dd1255c43cb8498279738ccChris Craik                           mock.call(self.new_bucket, self.new_bucket,
499cef7893435aa41160dd1255c43cb8498279738ccChris Craik                                     self.expected_new_backup_path,
500cef7893435aa41160dd1255c43cb8498279738ccChris Craik                                     self.new_remote_path)]
501cef7893435aa41160dd1255c43cb8498279738ccChris Craik    expected_delete_calls = []
502cef7893435aa41160dd1255c43cb8498279738ccChris Craik
503cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertRaises(cloud_storage.CloudStorageError,
504cef7893435aa41160dd1255c43cb8498279738ccChris Craik                      config.ExecuteUpdateJobs, force=True)
505cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertTrue(config._is_dirty)
506cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertEqual(2, len(config._pending_uploads))
507cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertEqual(self.new_pending_upload, config._pending_uploads[0])
508cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertEqual(self.final_pending_upload, config._pending_uploads[1])
509cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertEqual(self.new_dependencies, config._config_data)
510cef7893435aa41160dd1255c43cb8498279738ccChris Craik    file_module = fake_filesystem.FakeFileOpen(self.fs)
511cef7893435aa41160dd1255c43cb8498279738ccChris Craik    expected_file_lines = list(self.expected_file_lines)
512cef7893435aa41160dd1255c43cb8498279738ccChris Craik    for line in file_module(self.file_path):
513cef7893435aa41160dd1255c43cb8498279738ccChris Craik      self.assertEqual(expected_file_lines.pop(0), line.strip())
514cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.fs.CloseOpenFile(file_module(self.file_path))
515cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertEqual(expected_insert_calls,
516cef7893435aa41160dd1255c43cb8498279738ccChris Craik                     uploader_cs_mock.Insert.call_args_list)
517cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertEqual(expected_exists_calls,
518cef7893435aa41160dd1255c43cb8498279738ccChris Craik                     uploader_cs_mock.Exists.call_args_list)
519cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertEqual(expected_copy_calls,
520cef7893435aa41160dd1255c43cb8498279738ccChris Craik                     uploader_cs_mock.Copy.call_args_list)
521cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertEqual(expected_delete_calls,
522cef7893435aa41160dd1255c43cb8498279738ccChris Craik                     uploader_cs_mock.Delete.call_args_list)
523cef7893435aa41160dd1255c43cb8498279738ccChris Craik
524cef7893435aa41160dd1255c43cb8498279738ccChris Craik  @mock.patch('dependency_manager.uploader.cloud_storage')
525cef7893435aa41160dd1255c43cb8498279738ccChris Craik  def testExecuteUpdateJobsFailureOnSecondInsertFirstCSCollisionForce(
526cef7893435aa41160dd1255c43cb8498279738ccChris Craik      self, uploader_cs_mock):
527cef7893435aa41160dd1255c43cb8498279738ccChris Craik    uploader_cs_mock.Exists.side_effect = [True, False, True]
528cef7893435aa41160dd1255c43cb8498279738ccChris Craik    uploader_cs_mock.Insert.side_effect = [
529cef7893435aa41160dd1255c43cb8498279738ccChris Craik        True, cloud_storage.CloudStorageError]
530cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.fs.CreateFile(self.file_path,
531cef7893435aa41160dd1255c43cb8498279738ccChris Craik                       contents='\n'.join(self.expected_file_lines))
532cef7893435aa41160dd1255c43cb8498279738ccChris Craik    config = dependency_manager.BaseConfig(self.file_path, writable=True)
533cef7893435aa41160dd1255c43cb8498279738ccChris Craik    config._config_data = self.new_dependencies.copy()
534cef7893435aa41160dd1255c43cb8498279738ccChris Craik    config._is_dirty = True
535cef7893435aa41160dd1255c43cb8498279738ccChris Craik    config._pending_uploads = [self.new_pending_upload,
536cef7893435aa41160dd1255c43cb8498279738ccChris Craik                               self.final_pending_upload]
537cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertEqual(self.new_dependencies, config._config_data)
538cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertTrue(config._is_dirty)
539cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertEqual(2, len(config._pending_uploads))
540cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertEqual(self.new_pending_upload, config._pending_uploads[0])
541cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertEqual(self.final_pending_upload, config._pending_uploads[1])
542cef7893435aa41160dd1255c43cb8498279738ccChris Craik    expected_exists_calls = [mock.call(self.new_bucket, self.new_remote_path),
543cef7893435aa41160dd1255c43cb8498279738ccChris Craik                             mock.call(self.final_bucket,
544cef7893435aa41160dd1255c43cb8498279738ccChris Craik                                       self.final_remote_path)]
545cef7893435aa41160dd1255c43cb8498279738ccChris Craik    expected_insert_calls = [mock.call(self.new_bucket, self.new_remote_path,
546cef7893435aa41160dd1255c43cb8498279738ccChris Craik                                       self.new_dep_path),
547cef7893435aa41160dd1255c43cb8498279738ccChris Craik                             mock.call(self.final_bucket,
548cef7893435aa41160dd1255c43cb8498279738ccChris Craik                                       self.final_remote_path,
549cef7893435aa41160dd1255c43cb8498279738ccChris Craik                                       self.final_dep_path)]
550cef7893435aa41160dd1255c43cb8498279738ccChris Craik    expected_copy_calls = [mock.call(self.new_bucket, self.new_bucket,
551cef7893435aa41160dd1255c43cb8498279738ccChris Craik                                     self.new_remote_path,
552cef7893435aa41160dd1255c43cb8498279738ccChris Craik                                     self.expected_new_backup_path),
553cef7893435aa41160dd1255c43cb8498279738ccChris Craik                           mock.call(self.new_bucket, self.new_bucket,
554cef7893435aa41160dd1255c43cb8498279738ccChris Craik                                     self.expected_new_backup_path,
555cef7893435aa41160dd1255c43cb8498279738ccChris Craik                                     self.new_remote_path)]
556cef7893435aa41160dd1255c43cb8498279738ccChris Craik    expected_delete_calls = []
557cef7893435aa41160dd1255c43cb8498279738ccChris Craik
558cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertRaises(cloud_storage.CloudStorageError,
559cef7893435aa41160dd1255c43cb8498279738ccChris Craik                      config.ExecuteUpdateJobs, force=True)
560cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertTrue(config._is_dirty)
561cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertEqual(2, len(config._pending_uploads))
562cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertEqual(self.new_pending_upload, config._pending_uploads[0])
563cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertEqual(self.final_pending_upload, config._pending_uploads[1])
564cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertEqual(self.new_dependencies, config._config_data)
565cef7893435aa41160dd1255c43cb8498279738ccChris Craik    file_module = fake_filesystem.FakeFileOpen(self.fs)
566cef7893435aa41160dd1255c43cb8498279738ccChris Craik    expected_file_lines = list(self.expected_file_lines)
567cef7893435aa41160dd1255c43cb8498279738ccChris Craik    for line in file_module(self.file_path):
568cef7893435aa41160dd1255c43cb8498279738ccChris Craik      self.assertEqual(expected_file_lines.pop(0), line.strip())
569cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.fs.CloseOpenFile(file_module(self.file_path))
570cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertEqual(expected_insert_calls,
571cef7893435aa41160dd1255c43cb8498279738ccChris Craik                     uploader_cs_mock.Insert.call_args_list)
572cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertEqual(expected_exists_calls,
573cef7893435aa41160dd1255c43cb8498279738ccChris Craik                     uploader_cs_mock.Exists.call_args_list)
574cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertEqual(expected_copy_calls,
575cef7893435aa41160dd1255c43cb8498279738ccChris Craik                     uploader_cs_mock.Copy.call_args_list)
576cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertEqual(expected_delete_calls,
577cef7893435aa41160dd1255c43cb8498279738ccChris Craik                     uploader_cs_mock.Delete.call_args_list)
578cef7893435aa41160dd1255c43cb8498279738ccChris Craik
579cef7893435aa41160dd1255c43cb8498279738ccChris Craik  @mock.patch('dependency_manager.uploader.cloud_storage')
580cef7893435aa41160dd1255c43cb8498279738ccChris Craik  def testExecuteUpdateJobsFailureOnFirstCSCollisionNoForce(
581cef7893435aa41160dd1255c43cb8498279738ccChris Craik      self, uploader_cs_mock):
582cef7893435aa41160dd1255c43cb8498279738ccChris Craik    uploader_cs_mock.Exists.side_effect = [True, False, True]
583cef7893435aa41160dd1255c43cb8498279738ccChris Craik    uploader_cs_mock.Insert.side_effect = [
584cef7893435aa41160dd1255c43cb8498279738ccChris Craik        True, cloud_storage.CloudStorageError]
585cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.fs.CreateFile(self.file_path,
586cef7893435aa41160dd1255c43cb8498279738ccChris Craik                       contents='\n'.join(self.expected_file_lines))
587cef7893435aa41160dd1255c43cb8498279738ccChris Craik    config = dependency_manager.BaseConfig(self.file_path, writable=True)
588cef7893435aa41160dd1255c43cb8498279738ccChris Craik    config._config_data = self.new_dependencies.copy()
589cef7893435aa41160dd1255c43cb8498279738ccChris Craik    config._is_dirty = True
590cef7893435aa41160dd1255c43cb8498279738ccChris Craik    config._pending_uploads = [self.new_pending_upload,
591cef7893435aa41160dd1255c43cb8498279738ccChris Craik                               self.final_pending_upload]
592cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertEqual(self.new_dependencies, config._config_data)
593cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertTrue(config._is_dirty)
594cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertEqual(2, len(config._pending_uploads))
595cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertEqual(self.new_pending_upload, config._pending_uploads[0])
596cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertEqual(self.final_pending_upload, config._pending_uploads[1])
597cef7893435aa41160dd1255c43cb8498279738ccChris Craik    expected_exists_calls = [mock.call(self.new_bucket, self.new_remote_path)]
598cef7893435aa41160dd1255c43cb8498279738ccChris Craik    expected_insert_calls = []
599cef7893435aa41160dd1255c43cb8498279738ccChris Craik    expected_copy_calls = []
600cef7893435aa41160dd1255c43cb8498279738ccChris Craik    expected_delete_calls = []
601cef7893435aa41160dd1255c43cb8498279738ccChris Craik
602cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertRaises(cloud_storage.CloudStorageError,
603cef7893435aa41160dd1255c43cb8498279738ccChris Craik                      config.ExecuteUpdateJobs)
604cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertTrue(config._is_dirty)
605cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertEqual(2, len(config._pending_uploads))
606cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertEqual(self.new_pending_upload, config._pending_uploads[0])
607cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertEqual(self.final_pending_upload, config._pending_uploads[1])
608cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertEqual(self.new_dependencies, config._config_data)
609cef7893435aa41160dd1255c43cb8498279738ccChris Craik    file_module = fake_filesystem.FakeFileOpen(self.fs)
610cef7893435aa41160dd1255c43cb8498279738ccChris Craik    expected_file_lines = list(self.expected_file_lines)
611cef7893435aa41160dd1255c43cb8498279738ccChris Craik    for line in file_module(self.file_path):
612cef7893435aa41160dd1255c43cb8498279738ccChris Craik      self.assertEqual(expected_file_lines.pop(0), line.strip())
613cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.fs.CloseOpenFile(file_module(self.file_path))
614cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertEqual(expected_insert_calls,
615cef7893435aa41160dd1255c43cb8498279738ccChris Craik                     uploader_cs_mock.Insert.call_args_list)
616cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertEqual(expected_exists_calls,
617cef7893435aa41160dd1255c43cb8498279738ccChris Craik                     uploader_cs_mock.Exists.call_args_list)
618cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertEqual(expected_copy_calls,
619cef7893435aa41160dd1255c43cb8498279738ccChris Craik                     uploader_cs_mock.Copy.call_args_list)
620cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertEqual(expected_delete_calls,
621cef7893435aa41160dd1255c43cb8498279738ccChris Craik                     uploader_cs_mock.Delete.call_args_list)
622cef7893435aa41160dd1255c43cb8498279738ccChris Craik
623cef7893435aa41160dd1255c43cb8498279738ccChris Craik  @mock.patch('dependency_manager.uploader.cloud_storage')
624cef7893435aa41160dd1255c43cb8498279738ccChris Craik  def testExecuteUpdateJobsFailureOnSecondCopyCSCollision(
625cef7893435aa41160dd1255c43cb8498279738ccChris Craik      self, uploader_cs_mock):
626cef7893435aa41160dd1255c43cb8498279738ccChris Craik    uploader_cs_mock.Exists.return_value = True
627cef7893435aa41160dd1255c43cb8498279738ccChris Craik    uploader_cs_mock.Insert.return_value = True
628cef7893435aa41160dd1255c43cb8498279738ccChris Craik    uploader_cs_mock.Copy.side_effect = [
629cef7893435aa41160dd1255c43cb8498279738ccChris Craik        True, cloud_storage.CloudStorageError, True]
630cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.fs.CreateFile(self.file_path,
631cef7893435aa41160dd1255c43cb8498279738ccChris Craik                       contents='\n'.join(self.expected_file_lines))
632cef7893435aa41160dd1255c43cb8498279738ccChris Craik    config = dependency_manager.BaseConfig(self.file_path, writable=True)
633cef7893435aa41160dd1255c43cb8498279738ccChris Craik    config._config_data = self.new_dependencies.copy()
634cef7893435aa41160dd1255c43cb8498279738ccChris Craik    config._is_dirty = True
635cef7893435aa41160dd1255c43cb8498279738ccChris Craik    config._pending_uploads = [self.new_pending_upload,
636cef7893435aa41160dd1255c43cb8498279738ccChris Craik                               self.final_pending_upload]
637cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertEqual(self.new_dependencies, config._config_data)
638cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertTrue(config._is_dirty)
639cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertEqual(2, len(config._pending_uploads))
640cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertEqual(self.new_pending_upload, config._pending_uploads[0])
641cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertEqual(self.final_pending_upload, config._pending_uploads[1])
642cef7893435aa41160dd1255c43cb8498279738ccChris Craik    expected_exists_calls = [mock.call(self.new_bucket, self.new_remote_path),
643cef7893435aa41160dd1255c43cb8498279738ccChris Craik                             mock.call(self.final_bucket,
644cef7893435aa41160dd1255c43cb8498279738ccChris Craik                                       self.final_remote_path)]
645cef7893435aa41160dd1255c43cb8498279738ccChris Craik    expected_insert_calls = [mock.call(self.new_bucket, self.new_remote_path,
646cef7893435aa41160dd1255c43cb8498279738ccChris Craik                                       self.new_dep_path)]
647cef7893435aa41160dd1255c43cb8498279738ccChris Craik    expected_copy_calls = [mock.call(self.new_bucket, self.new_bucket,
648cef7893435aa41160dd1255c43cb8498279738ccChris Craik                                     self.new_remote_path,
649cef7893435aa41160dd1255c43cb8498279738ccChris Craik                                     self.expected_new_backup_path),
650cef7893435aa41160dd1255c43cb8498279738ccChris Craik                           mock.call(self.final_bucket, self.final_bucket,
651cef7893435aa41160dd1255c43cb8498279738ccChris Craik                                     self.final_remote_path,
652cef7893435aa41160dd1255c43cb8498279738ccChris Craik                                     self.expected_final_backup_path),
653cef7893435aa41160dd1255c43cb8498279738ccChris Craik                           mock.call(self.new_bucket, self.new_bucket,
654cef7893435aa41160dd1255c43cb8498279738ccChris Craik                                     self.expected_new_backup_path,
655cef7893435aa41160dd1255c43cb8498279738ccChris Craik                                     self.new_remote_path)]
656cef7893435aa41160dd1255c43cb8498279738ccChris Craik    expected_delete_calls = []
657cef7893435aa41160dd1255c43cb8498279738ccChris Craik
658cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertRaises(cloud_storage.CloudStorageError,
659cef7893435aa41160dd1255c43cb8498279738ccChris Craik                      config.ExecuteUpdateJobs, force=True)
660cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertTrue(config._is_dirty)
661cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertEqual(2, len(config._pending_uploads))
662cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertEqual(self.new_pending_upload, config._pending_uploads[0])
663cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertEqual(self.final_pending_upload, config._pending_uploads[1])
664cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertEqual(self.new_dependencies, config._config_data)
665cef7893435aa41160dd1255c43cb8498279738ccChris Craik    file_module = fake_filesystem.FakeFileOpen(self.fs)
666cef7893435aa41160dd1255c43cb8498279738ccChris Craik    expected_file_lines = list(self.expected_file_lines)
667cef7893435aa41160dd1255c43cb8498279738ccChris Craik    for line in file_module(self.file_path):
668cef7893435aa41160dd1255c43cb8498279738ccChris Craik      self.assertEqual(expected_file_lines.pop(0), line.strip())
669cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.fs.CloseOpenFile(file_module(self.file_path))
670cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertEqual(expected_insert_calls,
671cef7893435aa41160dd1255c43cb8498279738ccChris Craik                     uploader_cs_mock.Insert.call_args_list)
672cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertEqual(expected_exists_calls,
673cef7893435aa41160dd1255c43cb8498279738ccChris Craik                     uploader_cs_mock.Exists.call_args_list)
674cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertEqual(expected_copy_calls,
675cef7893435aa41160dd1255c43cb8498279738ccChris Craik                     uploader_cs_mock.Copy.call_args_list)
676cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertEqual(expected_delete_calls,
677cef7893435aa41160dd1255c43cb8498279738ccChris Craik                     uploader_cs_mock.Delete.call_args_list)
678cef7893435aa41160dd1255c43cb8498279738ccChris Craik
679cef7893435aa41160dd1255c43cb8498279738ccChris Craik  @mock.patch('dependency_manager.uploader.cloud_storage')
680cef7893435aa41160dd1255c43cb8498279738ccChris Craik  def testExecuteUpdateJobsFailureOnSecondCopyNoCSCollisionForce(
681cef7893435aa41160dd1255c43cb8498279738ccChris Craik      self, uploader_cs_mock):
682cef7893435aa41160dd1255c43cb8498279738ccChris Craik    uploader_cs_mock.Exists.side_effect = [False, True, False]
683cef7893435aa41160dd1255c43cb8498279738ccChris Craik    uploader_cs_mock.Copy.side_effect = cloud_storage.CloudStorageError
684cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.fs.CreateFile(self.file_path,
685cef7893435aa41160dd1255c43cb8498279738ccChris Craik                       contents='\n'.join(self.expected_file_lines))
686cef7893435aa41160dd1255c43cb8498279738ccChris Craik    config = dependency_manager.BaseConfig(self.file_path, writable=True)
687cef7893435aa41160dd1255c43cb8498279738ccChris Craik    config._config_data = self.new_dependencies.copy()
688cef7893435aa41160dd1255c43cb8498279738ccChris Craik    config._is_dirty = True
689cef7893435aa41160dd1255c43cb8498279738ccChris Craik    config._pending_uploads = [self.new_pending_upload,
690cef7893435aa41160dd1255c43cb8498279738ccChris Craik                               self.final_pending_upload]
691cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertEqual(self.new_dependencies, config._config_data)
692cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertTrue(config._is_dirty)
693cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertEqual(2, len(config._pending_uploads))
694cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertEqual(self.new_pending_upload, config._pending_uploads[0])
695cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertEqual(self.final_pending_upload, config._pending_uploads[1])
696cef7893435aa41160dd1255c43cb8498279738ccChris Craik    expected_exists_calls = [mock.call(self.new_bucket, self.new_remote_path),
697cef7893435aa41160dd1255c43cb8498279738ccChris Craik                             mock.call(self.final_bucket,
698cef7893435aa41160dd1255c43cb8498279738ccChris Craik                                       self.final_remote_path)]
699cef7893435aa41160dd1255c43cb8498279738ccChris Craik    expected_insert_calls = [mock.call(self.new_bucket, self.new_remote_path,
700cef7893435aa41160dd1255c43cb8498279738ccChris Craik                                       self.new_dep_path)]
701cef7893435aa41160dd1255c43cb8498279738ccChris Craik    expected_copy_calls = [mock.call(self.final_bucket, self.final_bucket,
702cef7893435aa41160dd1255c43cb8498279738ccChris Craik                                     self.final_remote_path,
703cef7893435aa41160dd1255c43cb8498279738ccChris Craik                                     self.expected_final_backup_path)]
704cef7893435aa41160dd1255c43cb8498279738ccChris Craik    expected_delete_calls = [mock.call(self.new_bucket, self.new_remote_path)]
705cef7893435aa41160dd1255c43cb8498279738ccChris Craik
706cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertRaises(cloud_storage.CloudStorageError,
707cef7893435aa41160dd1255c43cb8498279738ccChris Craik                      config.ExecuteUpdateJobs, force=True)
708cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertTrue(config._is_dirty)
709cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertEqual(2, len(config._pending_uploads))
710cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertEqual(self.new_pending_upload, config._pending_uploads[0])
711cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertEqual(self.final_pending_upload, config._pending_uploads[1])
712cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertEqual(self.new_dependencies, config._config_data)
713cef7893435aa41160dd1255c43cb8498279738ccChris Craik    file_module = fake_filesystem.FakeFileOpen(self.fs)
714cef7893435aa41160dd1255c43cb8498279738ccChris Craik    expected_file_lines = list(self.expected_file_lines)
715cef7893435aa41160dd1255c43cb8498279738ccChris Craik    for line in file_module(self.file_path):
716cef7893435aa41160dd1255c43cb8498279738ccChris Craik      self.assertEqual(expected_file_lines.pop(0), line.strip())
717cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.fs.CloseOpenFile(file_module(self.file_path))
718cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertEqual(expected_insert_calls,
719cef7893435aa41160dd1255c43cb8498279738ccChris Craik                     uploader_cs_mock.Insert.call_args_list)
720cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertEqual(expected_exists_calls,
721cef7893435aa41160dd1255c43cb8498279738ccChris Craik                     uploader_cs_mock.Exists.call_args_list)
722cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertEqual(expected_copy_calls,
723cef7893435aa41160dd1255c43cb8498279738ccChris Craik                     uploader_cs_mock.Copy.call_args_list)
724cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertEqual(expected_delete_calls,
725cef7893435aa41160dd1255c43cb8498279738ccChris Craik                     uploader_cs_mock.Delete.call_args_list)
726cef7893435aa41160dd1255c43cb8498279738ccChris Craik
727cef7893435aa41160dd1255c43cb8498279738ccChris Craik  @mock.patch('dependency_manager.uploader.cloud_storage')
728cef7893435aa41160dd1255c43cb8498279738ccChris Craik  def testExecuteUpdateJobsFailureOnSecondCopyNoCSCollisionNoForce(
729cef7893435aa41160dd1255c43cb8498279738ccChris Craik      self, uploader_cs_mock):
730cef7893435aa41160dd1255c43cb8498279738ccChris Craik    uploader_cs_mock.Exists.side_effect = [False, True, False]
731cef7893435aa41160dd1255c43cb8498279738ccChris Craik    uploader_cs_mock.Copy.side_effect = cloud_storage.CloudStorageError
732cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.fs.CreateFile(self.file_path,
733cef7893435aa41160dd1255c43cb8498279738ccChris Craik                       contents='\n'.join(self.expected_file_lines))
734cef7893435aa41160dd1255c43cb8498279738ccChris Craik    config = dependency_manager.BaseConfig(self.file_path, writable=True)
735cef7893435aa41160dd1255c43cb8498279738ccChris Craik    config._config_data = self.new_dependencies.copy()
736cef7893435aa41160dd1255c43cb8498279738ccChris Craik    config._is_dirty = True
737cef7893435aa41160dd1255c43cb8498279738ccChris Craik    config._pending_uploads = [self.new_pending_upload,
738cef7893435aa41160dd1255c43cb8498279738ccChris Craik                               self.final_pending_upload]
739cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertEqual(self.new_dependencies, config._config_data)
740cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertTrue(config._is_dirty)
741cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertEqual(2, len(config._pending_uploads))
742cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertEqual(self.new_pending_upload, config._pending_uploads[0])
743cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertEqual(self.final_pending_upload, config._pending_uploads[1])
744cef7893435aa41160dd1255c43cb8498279738ccChris Craik    expected_exists_calls = [mock.call(self.new_bucket, self.new_remote_path),
745cef7893435aa41160dd1255c43cb8498279738ccChris Craik                             mock.call(self.final_bucket,
746cef7893435aa41160dd1255c43cb8498279738ccChris Craik                                       self.final_remote_path)]
747cef7893435aa41160dd1255c43cb8498279738ccChris Craik    expected_insert_calls = [mock.call(self.new_bucket, self.new_remote_path,
748cef7893435aa41160dd1255c43cb8498279738ccChris Craik                                       self.new_dep_path)]
749cef7893435aa41160dd1255c43cb8498279738ccChris Craik    expected_copy_calls = []
750cef7893435aa41160dd1255c43cb8498279738ccChris Craik    expected_delete_calls = [mock.call(self.new_bucket, self.new_remote_path)]
751cef7893435aa41160dd1255c43cb8498279738ccChris Craik
752cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertRaises(cloud_storage.CloudStorageError,
753cef7893435aa41160dd1255c43cb8498279738ccChris Craik                      config.ExecuteUpdateJobs)
754cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertTrue(config._is_dirty)
755cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertEqual(2, len(config._pending_uploads))
756cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertEqual(self.new_pending_upload, config._pending_uploads[0])
757cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertEqual(self.final_pending_upload, config._pending_uploads[1])
758cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertEqual(self.new_dependencies, config._config_data)
759cef7893435aa41160dd1255c43cb8498279738ccChris Craik    file_module = fake_filesystem.FakeFileOpen(self.fs)
760cef7893435aa41160dd1255c43cb8498279738ccChris Craik    expected_file_lines = list(self.expected_file_lines)
761cef7893435aa41160dd1255c43cb8498279738ccChris Craik    for line in file_module(self.file_path):
762cef7893435aa41160dd1255c43cb8498279738ccChris Craik      self.assertEqual(expected_file_lines.pop(0), line.strip())
763cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.fs.CloseOpenFile(file_module(self.file_path))
764cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertEqual(expected_insert_calls,
765cef7893435aa41160dd1255c43cb8498279738ccChris Craik                     uploader_cs_mock.Insert.call_args_list)
766cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertEqual(expected_exists_calls,
767cef7893435aa41160dd1255c43cb8498279738ccChris Craik                     uploader_cs_mock.Exists.call_args_list)
768cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertEqual(expected_copy_calls,
769cef7893435aa41160dd1255c43cb8498279738ccChris Craik                     uploader_cs_mock.Copy.call_args_list)
770cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertEqual(expected_delete_calls,
771cef7893435aa41160dd1255c43cb8498279738ccChris Craik                     uploader_cs_mock.Delete.call_args_list)
772cef7893435aa41160dd1255c43cb8498279738ccChris Craik
773cef7893435aa41160dd1255c43cb8498279738ccChris Craik  @mock.patch('dependency_manager.uploader.cloud_storage')
774cef7893435aa41160dd1255c43cb8498279738ccChris Craik  def testExecuteUpdateJobsSuccessOnePendingDepNoCloudStorageCollision(
775cef7893435aa41160dd1255c43cb8498279738ccChris Craik      self, uploader_cs_mock):
776cef7893435aa41160dd1255c43cb8498279738ccChris Craik    uploader_cs_mock.Exists.return_value = False
777cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.fs.CreateFile(self.file_path,
778cef7893435aa41160dd1255c43cb8498279738ccChris Craik                       contents='\n'.join(self.expected_file_lines))
779cef7893435aa41160dd1255c43cb8498279738ccChris Craik    config = dependency_manager.BaseConfig(self.file_path, writable=True)
780cef7893435aa41160dd1255c43cb8498279738ccChris Craik    config._config_data = self.new_dependencies.copy()
781cef7893435aa41160dd1255c43cb8498279738ccChris Craik    config._pending_uploads = [self.new_pending_upload]
782cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertEqual(self.new_dependencies, config._config_data)
783cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertTrue(config._IsDirty())
784cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertEqual(1, len(config._pending_uploads))
785cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertEqual(self.new_pending_upload, config._pending_uploads[0])
786cef7893435aa41160dd1255c43cb8498279738ccChris Craik    expected_exists_calls = [mock.call(self.new_bucket, self.new_remote_path)]
787cef7893435aa41160dd1255c43cb8498279738ccChris Craik    expected_insert_calls = [mock.call(self.new_bucket, self.new_remote_path,
788cef7893435aa41160dd1255c43cb8498279738ccChris Craik                                       self.new_dep_path)]
789cef7893435aa41160dd1255c43cb8498279738ccChris Craik    expected_copy_calls = []
790cef7893435aa41160dd1255c43cb8498279738ccChris Craik    expected_delete_calls = []
791cef7893435aa41160dd1255c43cb8498279738ccChris Craik
792cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertTrue(config.ExecuteUpdateJobs())
793cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertFalse(config._IsDirty())
794cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertFalse(config._pending_uploads)
795cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertEqual(self.new_dependencies, config._config_data)
796cef7893435aa41160dd1255c43cb8498279738ccChris Craik    file_module = fake_filesystem.FakeFileOpen(self.fs)
797cef7893435aa41160dd1255c43cb8498279738ccChris Craik    expected_file_lines = list(self.new_expected_file_lines)
798cef7893435aa41160dd1255c43cb8498279738ccChris Craik    for line in file_module(self.file_path):
799cef7893435aa41160dd1255c43cb8498279738ccChris Craik      self.assertEqual(expected_file_lines.pop(0), line.strip())
800cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.fs.CloseOpenFile(file_module(self.file_path))
801cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertFalse(config._pending_uploads)
802cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertEqual(expected_insert_calls,
803cef7893435aa41160dd1255c43cb8498279738ccChris Craik                     uploader_cs_mock.Insert.call_args_list)
804cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertEqual(expected_exists_calls,
805cef7893435aa41160dd1255c43cb8498279738ccChris Craik                     uploader_cs_mock.Exists.call_args_list)
806cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertEqual(expected_copy_calls,
807cef7893435aa41160dd1255c43cb8498279738ccChris Craik                     uploader_cs_mock.Copy.call_args_list)
808cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertEqual(expected_delete_calls,
809cef7893435aa41160dd1255c43cb8498279738ccChris Craik                     uploader_cs_mock.Delete.call_args_list)
810cef7893435aa41160dd1255c43cb8498279738ccChris Craik
811cef7893435aa41160dd1255c43cb8498279738ccChris Craik  @mock.patch('dependency_manager.uploader.cloud_storage')
812cef7893435aa41160dd1255c43cb8498279738ccChris Craik  def testExecuteUpdateJobsSuccessOnePendingDepCloudStorageCollision(
813cef7893435aa41160dd1255c43cb8498279738ccChris Craik      self, uploader_cs_mock):
814cef7893435aa41160dd1255c43cb8498279738ccChris Craik    uploader_cs_mock.Exists.return_value = True
815cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.fs.CreateFile(self.file_path,
816cef7893435aa41160dd1255c43cb8498279738ccChris Craik                       contents='\n'.join(self.expected_file_lines))
817cef7893435aa41160dd1255c43cb8498279738ccChris Craik    config = dependency_manager.BaseConfig(self.file_path, writable=True)
818cef7893435aa41160dd1255c43cb8498279738ccChris Craik    config._config_data = self.new_dependencies.copy()
819cef7893435aa41160dd1255c43cb8498279738ccChris Craik    config._pending_uploads = [self.new_pending_upload]
820cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertEqual(self.new_dependencies, config._config_data)
821cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertTrue(config._IsDirty())
822cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertEqual(1, len(config._pending_uploads))
823cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertEqual(self.new_pending_upload, config._pending_uploads[0])
824cef7893435aa41160dd1255c43cb8498279738ccChris Craik    expected_exists_calls = [mock.call(self.new_bucket, self.new_remote_path)]
825cef7893435aa41160dd1255c43cb8498279738ccChris Craik    expected_insert_calls = [mock.call(self.new_bucket, self.new_remote_path,
826cef7893435aa41160dd1255c43cb8498279738ccChris Craik                                       self.new_dep_path)]
827cef7893435aa41160dd1255c43cb8498279738ccChris Craik    expected_copy_calls = [mock.call(self.new_bucket, self.new_bucket,
828cef7893435aa41160dd1255c43cb8498279738ccChris Craik                                     self.new_remote_path,
829cef7893435aa41160dd1255c43cb8498279738ccChris Craik                                     self.expected_new_backup_path)]
830cef7893435aa41160dd1255c43cb8498279738ccChris Craik
831cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertTrue(config.ExecuteUpdateJobs(force=True))
832cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertFalse(config._IsDirty())
833cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertFalse(config._pending_uploads)
834cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertEqual(self.new_dependencies, config._config_data)
835cef7893435aa41160dd1255c43cb8498279738ccChris Craik    file_module = fake_filesystem.FakeFileOpen(self.fs)
836cef7893435aa41160dd1255c43cb8498279738ccChris Craik    expected_file_lines = list(self.new_expected_file_lines)
837cef7893435aa41160dd1255c43cb8498279738ccChris Craik    for line in file_module(self.file_path):
838cef7893435aa41160dd1255c43cb8498279738ccChris Craik      self.assertEqual(expected_file_lines.pop(0), line.strip())
839cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.fs.CloseOpenFile(file_module(self.file_path))
840cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertFalse(config._pending_uploads)
841cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertEqual(expected_insert_calls,
842cef7893435aa41160dd1255c43cb8498279738ccChris Craik                     uploader_cs_mock.Insert.call_args_list)
843cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertEqual(expected_exists_calls,
844cef7893435aa41160dd1255c43cb8498279738ccChris Craik                     uploader_cs_mock.Exists.call_args_list)
845cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertEqual(expected_copy_calls,
846cef7893435aa41160dd1255c43cb8498279738ccChris Craik                     uploader_cs_mock.Copy.call_args_list)
847cef7893435aa41160dd1255c43cb8498279738ccChris Craik
848cef7893435aa41160dd1255c43cb8498279738ccChris Craik  @mock.patch('dependency_manager.uploader.cloud_storage')
849cef7893435aa41160dd1255c43cb8498279738ccChris Craik  def testExecuteUpdateJobsErrorOnePendingDepCloudStorageCollisionNoForce(
850cef7893435aa41160dd1255c43cb8498279738ccChris Craik      self, uploader_cs_mock):
851cef7893435aa41160dd1255c43cb8498279738ccChris Craik    uploader_cs_mock.Exists.return_value = True
852cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.fs.CreateFile(self.file_path,
853cef7893435aa41160dd1255c43cb8498279738ccChris Craik                       contents='\n'.join(self.expected_file_lines))
854cef7893435aa41160dd1255c43cb8498279738ccChris Craik    config = dependency_manager.BaseConfig(self.file_path, writable=True)
855cef7893435aa41160dd1255c43cb8498279738ccChris Craik    config._config_data = self.new_dependencies.copy()
856cef7893435aa41160dd1255c43cb8498279738ccChris Craik    config._is_dirty = True
857cef7893435aa41160dd1255c43cb8498279738ccChris Craik    config._pending_uploads = [self.new_pending_upload]
858cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertEqual(self.new_dependencies, config._config_data)
859cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertTrue(config._is_dirty)
860cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertEqual(1, len(config._pending_uploads))
861cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertEqual(self.new_pending_upload, config._pending_uploads[0])
862cef7893435aa41160dd1255c43cb8498279738ccChris Craik    expected_exists_calls = [mock.call(self.new_bucket, self.new_remote_path)]
863cef7893435aa41160dd1255c43cb8498279738ccChris Craik    expected_insert_calls = []
864cef7893435aa41160dd1255c43cb8498279738ccChris Craik    expected_copy_calls = []
865cef7893435aa41160dd1255c43cb8498279738ccChris Craik
866cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertRaises(dependency_manager.CloudStorageUploadConflictError,
867cef7893435aa41160dd1255c43cb8498279738ccChris Craik                      config.ExecuteUpdateJobs)
868cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertTrue(config._is_dirty)
869cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertTrue(config._pending_uploads)
870cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertEqual(self.new_dependencies, config._config_data)
871cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertEqual(1, len(config._pending_uploads))
872cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertEqual(self.new_pending_upload, config._pending_uploads[0])
873cef7893435aa41160dd1255c43cb8498279738ccChris Craik    file_module = fake_filesystem.FakeFileOpen(self.fs)
874cef7893435aa41160dd1255c43cb8498279738ccChris Craik    expected_file_lines = list(self.expected_file_lines)
875cef7893435aa41160dd1255c43cb8498279738ccChris Craik    for line in file_module(self.file_path):
876cef7893435aa41160dd1255c43cb8498279738ccChris Craik      self.assertEqual(expected_file_lines.pop(0), line.strip())
877cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.fs.CloseOpenFile(file_module(self.file_path))
878cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertEqual(expected_insert_calls,
879cef7893435aa41160dd1255c43cb8498279738ccChris Craik                     uploader_cs_mock.Insert.call_args_list)
880cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertEqual(expected_exists_calls,
881cef7893435aa41160dd1255c43cb8498279738ccChris Craik                     uploader_cs_mock.Exists.call_args_list)
882cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertEqual(expected_copy_calls,
883cef7893435aa41160dd1255c43cb8498279738ccChris Craik                     uploader_cs_mock.Copy.call_args_list)
884cef7893435aa41160dd1255c43cb8498279738ccChris Craik
885cef7893435aa41160dd1255c43cb8498279738ccChris Craik  @mock.patch('dependency_manager.uploader.cloud_storage')
886cef7893435aa41160dd1255c43cb8498279738ccChris Craik  def testExecuteUpdateJobsSuccessMultiplePendingDepsOneCloudStorageCollision(
887cef7893435aa41160dd1255c43cb8498279738ccChris Craik      self, uploader_cs_mock):
888cef7893435aa41160dd1255c43cb8498279738ccChris Craik    uploader_cs_mock.Exists.side_effect = [False, True]
889cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.fs.CreateFile(self.file_path,
890cef7893435aa41160dd1255c43cb8498279738ccChris Craik                       contents='\n'.join(self.expected_file_lines))
891cef7893435aa41160dd1255c43cb8498279738ccChris Craik    config = dependency_manager.BaseConfig(self.file_path, writable=True)
892cef7893435aa41160dd1255c43cb8498279738ccChris Craik    config._config_data = self.final_dependencies.copy()
893cef7893435aa41160dd1255c43cb8498279738ccChris Craik    config._pending_uploads = [self.new_pending_upload,
894cef7893435aa41160dd1255c43cb8498279738ccChris Craik                               self.final_pending_upload]
895cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertEqual(self.final_dependencies, config._config_data)
896cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertTrue(config._IsDirty())
897cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertEqual(2, len(config._pending_uploads))
898cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertEqual(self.new_pending_upload, config._pending_uploads[0])
899cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertEqual(self.final_pending_upload, config._pending_uploads[1])
900cef7893435aa41160dd1255c43cb8498279738ccChris Craik
901cef7893435aa41160dd1255c43cb8498279738ccChris Craik    expected_exists_calls = [mock.call(self.new_bucket, self.new_remote_path),
902cef7893435aa41160dd1255c43cb8498279738ccChris Craik                             mock.call(self.final_bucket,
903cef7893435aa41160dd1255c43cb8498279738ccChris Craik                                       self.final_remote_path)]
904cef7893435aa41160dd1255c43cb8498279738ccChris Craik    expected_insert_calls = [mock.call(self.new_bucket, self.new_remote_path,
905cef7893435aa41160dd1255c43cb8498279738ccChris Craik                                       self.new_dep_path),
906cef7893435aa41160dd1255c43cb8498279738ccChris Craik                             mock.call(self.final_bucket,
907cef7893435aa41160dd1255c43cb8498279738ccChris Craik                                       self.final_remote_path,
908cef7893435aa41160dd1255c43cb8498279738ccChris Craik                                       self.final_dep_path)]
909cef7893435aa41160dd1255c43cb8498279738ccChris Craik    expected_copy_calls = [mock.call(self.final_bucket, self.final_bucket,
910cef7893435aa41160dd1255c43cb8498279738ccChris Craik                                     self.final_remote_path,
911cef7893435aa41160dd1255c43cb8498279738ccChris Craik                                     self.expected_final_backup_path)]
912cef7893435aa41160dd1255c43cb8498279738ccChris Craik
913cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertTrue(config.ExecuteUpdateJobs(force=True))
914cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertFalse(config._IsDirty())
915cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertFalse(config._pending_uploads)
916cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertEqual(self.final_dependencies, config._config_data)
917cef7893435aa41160dd1255c43cb8498279738ccChris Craik    file_module = fake_filesystem.FakeFileOpen(self.fs)
918cef7893435aa41160dd1255c43cb8498279738ccChris Craik    expected_file_lines = list(self.final_expected_file_lines)
919cef7893435aa41160dd1255c43cb8498279738ccChris Craik    for line in file_module(self.file_path):
920cef7893435aa41160dd1255c43cb8498279738ccChris Craik      self.assertEqual(expected_file_lines.pop(0), line.strip())
921cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.fs.CloseOpenFile(file_module(self.file_path))
922cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertFalse(config._pending_uploads)
923cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertEqual(expected_insert_calls,
924cef7893435aa41160dd1255c43cb8498279738ccChris Craik                     uploader_cs_mock.Insert.call_args_list)
925cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertEqual(expected_exists_calls,
926cef7893435aa41160dd1255c43cb8498279738ccChris Craik                     uploader_cs_mock.Exists.call_args_list)
927cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertEqual(expected_copy_calls,
928cef7893435aa41160dd1255c43cb8498279738ccChris Craik                     uploader_cs_mock.Copy.call_args_list)
929cef7893435aa41160dd1255c43cb8498279738ccChris Craik
930cef7893435aa41160dd1255c43cb8498279738ccChris Craik  @mock.patch('dependency_manager.uploader.cloud_storage')
931cef7893435aa41160dd1255c43cb8498279738ccChris Craik  def testUpdateCloudStorageDependenciesReadOnlyConfig(
932cef7893435aa41160dd1255c43cb8498279738ccChris Craik      self, uploader_cs_mock):
933cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.fs.CreateFile(self.file_path,
934cef7893435aa41160dd1255c43cb8498279738ccChris Craik                       contents='\n'.join(self.expected_file_lines))
935cef7893435aa41160dd1255c43cb8498279738ccChris Craik    config = dependency_manager.BaseConfig(self.file_path)
936cef7893435aa41160dd1255c43cb8498279738ccChris Craik    with self.assertRaises(dependency_manager.ReadWriteError):
937cef7893435aa41160dd1255c43cb8498279738ccChris Craik      config.AddCloudStorageDependencyUpdateJob(
938cef7893435aa41160dd1255c43cb8498279738ccChris Craik          'dep', 'plat', 'path')
939cef7893435aa41160dd1255c43cb8498279738ccChris Craik    with self.assertRaises(dependency_manager.ReadWriteError):
940cef7893435aa41160dd1255c43cb8498279738ccChris Craik      config.AddCloudStorageDependencyUpdateJob(
941cef7893435aa41160dd1255c43cb8498279738ccChris Craik          'dep', 'plat', 'path', version='1.2.3')
942cef7893435aa41160dd1255c43cb8498279738ccChris Craik    with self.assertRaises(dependency_manager.ReadWriteError):
943cef7893435aa41160dd1255c43cb8498279738ccChris Craik      config.AddCloudStorageDependencyUpdateJob(
944cef7893435aa41160dd1255c43cb8498279738ccChris Craik          'dep', 'plat', 'path', execute_job=False)
945cef7893435aa41160dd1255c43cb8498279738ccChris Craik    with self.assertRaises(dependency_manager.ReadWriteError):
946cef7893435aa41160dd1255c43cb8498279738ccChris Craik      config.AddCloudStorageDependencyUpdateJob(
947cef7893435aa41160dd1255c43cb8498279738ccChris Craik          'dep', 'plat', 'path', version='1.2.3', execute_job=False)
948cef7893435aa41160dd1255c43cb8498279738ccChris Craik
949cef7893435aa41160dd1255c43cb8498279738ccChris Craik  @mock.patch('dependency_manager.uploader.cloud_storage')
950cef7893435aa41160dd1255c43cb8498279738ccChris Craik  def testUpdateCloudStorageDependenciesMissingDependency(
951cef7893435aa41160dd1255c43cb8498279738ccChris Craik      self, uploader_cs_mock):
952cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.fs.CreateFile(self.file_path,
953cef7893435aa41160dd1255c43cb8498279738ccChris Craik                       contents='\n'.join(self.expected_file_lines))
954cef7893435aa41160dd1255c43cb8498279738ccChris Craik    config = dependency_manager.BaseConfig(self.file_path, writable=True)
955cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertRaises(ValueError, config.AddCloudStorageDependencyUpdateJob,
956cef7893435aa41160dd1255c43cb8498279738ccChris Craik                      'dep', 'plat', 'path')
957cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertRaises(ValueError, config.AddCloudStorageDependencyUpdateJob,
958cef7893435aa41160dd1255c43cb8498279738ccChris Craik                      'dep', 'plat', 'path', version='1.2.3')
959cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertRaises(ValueError, config.AddCloudStorageDependencyUpdateJob,
960cef7893435aa41160dd1255c43cb8498279738ccChris Craik                      'dep', 'plat', 'path', execute_job=False)
961cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertRaises(ValueError, config.AddCloudStorageDependencyUpdateJob,
962cef7893435aa41160dd1255c43cb8498279738ccChris Craik                      'dep', 'plat', 'path', version='1.2.3', execute_job=False)
963cef7893435aa41160dd1255c43cb8498279738ccChris Craik
964cef7893435aa41160dd1255c43cb8498279738ccChris Craik  @mock.patch('dependency_manager.uploader.cloud_storage')
965cef7893435aa41160dd1255c43cb8498279738ccChris Craik  @mock.patch('dependency_manager.base_config.cloud_storage')
966cef7893435aa41160dd1255c43cb8498279738ccChris Craik  def testUpdateCloudStorageDependenciesWrite(
967cef7893435aa41160dd1255c43cb8498279738ccChris Craik      self, base_config_cs_mock, uploader_cs_mock):
968cef7893435aa41160dd1255c43cb8498279738ccChris Craik    expected_dependencies = self.dependencies
969cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.fs.CreateFile(self.file_path,
970cef7893435aa41160dd1255c43cb8498279738ccChris Craik                       contents='\n'.join(self.expected_file_lines))
971cef7893435aa41160dd1255c43cb8498279738ccChris Craik    config = dependency_manager.BaseConfig(self.file_path, writable=True)
972cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertFalse(config._IsDirty())
973cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertEqual(expected_dependencies, config._config_data)
974cef7893435aa41160dd1255c43cb8498279738ccChris Craik
975cef7893435aa41160dd1255c43cb8498279738ccChris Craik    base_config_cs_mock.CalculateHash.return_value = self.new_dep_hash
976cef7893435aa41160dd1255c43cb8498279738ccChris Craik    uploader_cs_mock.Exists.return_value = False
977cef7893435aa41160dd1255c43cb8498279738ccChris Craik    expected_dependencies = self.new_dependencies
978cef7893435aa41160dd1255c43cb8498279738ccChris Craik    config.AddCloudStorageDependencyUpdateJob(
979cef7893435aa41160dd1255c43cb8498279738ccChris Craik        'dep1', 'plat2', self.new_dep_path, execute_job=True)
980cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertFalse(config._IsDirty())
981cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertFalse(config._pending_uploads)
982cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertEqual(expected_dependencies, config._config_data)
983cef7893435aa41160dd1255c43cb8498279738ccChris Craik    # check that file contents has been updated
984cef7893435aa41160dd1255c43cb8498279738ccChris Craik    file_module = fake_filesystem.FakeFileOpen(self.fs)
985cef7893435aa41160dd1255c43cb8498279738ccChris Craik    expected_file_lines = list(self.new_expected_file_lines)
986cef7893435aa41160dd1255c43cb8498279738ccChris Craik    for line in file_module(self.file_path):
987cef7893435aa41160dd1255c43cb8498279738ccChris Craik      self.assertEqual(expected_file_lines.pop(0), line.strip())
988cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.fs.CloseOpenFile(file_module(self.file_path))
989cef7893435aa41160dd1255c43cb8498279738ccChris Craik
990cef7893435aa41160dd1255c43cb8498279738ccChris Craik    expected_dependencies = self.final_dependencies
991cef7893435aa41160dd1255c43cb8498279738ccChris Craik    base_config_cs_mock.CalculateHash.return_value = self.final_dep_hash
992cef7893435aa41160dd1255c43cb8498279738ccChris Craik    config.AddCloudStorageDependencyUpdateJob(
993cef7893435aa41160dd1255c43cb8498279738ccChris Craik        'dep2', 'plat1', self.final_dep_path, execute_job=True)
994cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertFalse(config._IsDirty())
995cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertFalse(config._pending_uploads)
996cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertEqual(expected_dependencies, config._config_data)
997cef7893435aa41160dd1255c43cb8498279738ccChris Craik    # check that file contents has been updated
998cef7893435aa41160dd1255c43cb8498279738ccChris Craik    expected_file_lines = list(self.final_expected_file_lines)
999cef7893435aa41160dd1255c43cb8498279738ccChris Craik    file_module = fake_filesystem.FakeFileOpen(self.fs)
1000cef7893435aa41160dd1255c43cb8498279738ccChris Craik    for line in file_module(self.file_path):
1001cef7893435aa41160dd1255c43cb8498279738ccChris Craik      self.assertEqual(expected_file_lines.pop(0), line.strip())
1002cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.fs.CloseOpenFile(file_module(self.file_path))
1003cef7893435aa41160dd1255c43cb8498279738ccChris Craik
1004cef7893435aa41160dd1255c43cb8498279738ccChris Craik  @mock.patch('dependency_manager.uploader.cloud_storage')
1005cef7893435aa41160dd1255c43cb8498279738ccChris Craik  @mock.patch('dependency_manager.base_config.cloud_storage')
1006cef7893435aa41160dd1255c43cb8498279738ccChris Craik  def testUpdateCloudStorageDependenciesNoWrite(
1007cef7893435aa41160dd1255c43cb8498279738ccChris Craik      self, base_config_cs_mock, uploader_cs_mock):
1008cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.fs.CreateFile(self.file_path,
1009cef7893435aa41160dd1255c43cb8498279738ccChris Craik                       contents='\n'.join(self.expected_file_lines))
1010cef7893435aa41160dd1255c43cb8498279738ccChris Craik    config = dependency_manager.BaseConfig(self.file_path, writable=True)
1011cef7893435aa41160dd1255c43cb8498279738ccChris Craik
1012cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertRaises(ValueError, config.AddCloudStorageDependencyUpdateJob,
1013cef7893435aa41160dd1255c43cb8498279738ccChris Craik                      'dep', 'plat', 'path')
1014cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertRaises(ValueError, config.AddCloudStorageDependencyUpdateJob,
1015cef7893435aa41160dd1255c43cb8498279738ccChris Craik                      'dep', 'plat', 'path', version='1.2.3')
1016cef7893435aa41160dd1255c43cb8498279738ccChris Craik
1017cef7893435aa41160dd1255c43cb8498279738ccChris Craik    expected_dependencies = self.dependencies
1018cef7893435aa41160dd1255c43cb8498279738ccChris Craik    config = dependency_manager.BaseConfig(self.file_path, writable=True)
1019cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertFalse(config._IsDirty())
1020cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertFalse(config._pending_uploads)
1021cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertEqual(expected_dependencies, config._config_data)
1022cef7893435aa41160dd1255c43cb8498279738ccChris Craik
1023cef7893435aa41160dd1255c43cb8498279738ccChris Craik    base_config_cs_mock.CalculateHash.return_value = self.new_dep_hash
1024cef7893435aa41160dd1255c43cb8498279738ccChris Craik    uploader_cs_mock.Exists.return_value = False
1025cef7893435aa41160dd1255c43cb8498279738ccChris Craik    expected_dependencies = self.new_dependencies
1026cef7893435aa41160dd1255c43cb8498279738ccChris Craik    config.AddCloudStorageDependencyUpdateJob(
1027cef7893435aa41160dd1255c43cb8498279738ccChris Craik        'dep1', 'plat2', self.new_dep_path, execute_job=False)
1028cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertTrue(config._IsDirty())
1029cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertEqual(1, len(config._pending_uploads))
1030cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertEqual(self.new_pending_upload, config._pending_uploads[0])
1031cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertEqual(expected_dependencies, config._config_data)
1032cef7893435aa41160dd1255c43cb8498279738ccChris Craik    # check that file contents have not been updated.
1033cef7893435aa41160dd1255c43cb8498279738ccChris Craik    expected_file_lines = list(self.expected_file_lines)
1034cef7893435aa41160dd1255c43cb8498279738ccChris Craik    file_module = fake_filesystem.FakeFileOpen(self.fs)
1035cef7893435aa41160dd1255c43cb8498279738ccChris Craik    for line in file_module(self.file_path):
1036cef7893435aa41160dd1255c43cb8498279738ccChris Craik      self.assertEqual(expected_file_lines.pop(0), line.strip())
1037cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.fs.CloseOpenFile(file_module(self.file_path))
1038cef7893435aa41160dd1255c43cb8498279738ccChris Craik
1039cef7893435aa41160dd1255c43cb8498279738ccChris Craik    expected_dependencies = self.final_dependencies
1040cef7893435aa41160dd1255c43cb8498279738ccChris Craik    base_config_cs_mock.CalculateHash.return_value = self.final_dep_hash
1041cef7893435aa41160dd1255c43cb8498279738ccChris Craik    config.AddCloudStorageDependencyUpdateJob(
1042cef7893435aa41160dd1255c43cb8498279738ccChris Craik        'dep2', 'plat1', self.final_dep_path, execute_job=False)
1043cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertTrue(config._IsDirty())
1044cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertEqual(expected_dependencies, config._config_data)
1045cef7893435aa41160dd1255c43cb8498279738ccChris Craik    # check that file contents have not been updated.
1046cef7893435aa41160dd1255c43cb8498279738ccChris Craik    expected_file_lines = list(self.expected_file_lines)
1047cef7893435aa41160dd1255c43cb8498279738ccChris Craik    file_module = fake_filesystem.FakeFileOpen(self.fs)
1048cef7893435aa41160dd1255c43cb8498279738ccChris Craik    for line in file_module(self.file_path):
1049cef7893435aa41160dd1255c43cb8498279738ccChris Craik      self.assertEqual(expected_file_lines.pop(0), line.strip())
1050cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.fs.CloseOpenFile(file_module(self.file_path))
1051cef7893435aa41160dd1255c43cb8498279738ccChris Craik
1052cef7893435aa41160dd1255c43cb8498279738ccChris Craik
1053cef7893435aa41160dd1255c43cb8498279738ccChris Craikclass BaseConfigDataManipulationUnittests(fake_filesystem_unittest.TestCase):
1054cef7893435aa41160dd1255c43cb8498279738ccChris Craik  def setUp(self):
1055cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.addTypeEqualityFunc(uploader.CloudStorageUploader,
1056cef7893435aa41160dd1255c43cb8498279738ccChris Craik                             uploader.CloudStorageUploader.__eq__)
1057cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.setUpPyfakefs()
1058cef7893435aa41160dd1255c43cb8498279738ccChris Craik
1059cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.cs_bucket = 'bucket1'
1060cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.cs_base_folder = 'dependencies_folder'
1061cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.cs_hash = 'hash12'
1062cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.download_path = '../../relative/dep1/path2'
1063cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.local_paths = ['../../../relative/local/path21',
1064cef7893435aa41160dd1255c43cb8498279738ccChris Craik                        '../../../relative/local/path22']
1065cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.platform_dict = {'cloud_storage_hash': self.cs_hash,
1066cef7893435aa41160dd1255c43cb8498279738ccChris Craik                          'download_path': self.download_path,
1067cef7893435aa41160dd1255c43cb8498279738ccChris Craik                          'local_paths': self.local_paths}
1068cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.dependencies = {
1069cef7893435aa41160dd1255c43cb8498279738ccChris Craik        'dep1': {
1070cef7893435aa41160dd1255c43cb8498279738ccChris Craik            'cloud_storage_bucket': self.cs_bucket,
1071cef7893435aa41160dd1255c43cb8498279738ccChris Craik            'cloud_storage_base_folder': self.cs_base_folder,
1072cef7893435aa41160dd1255c43cb8498279738ccChris Craik            'file_info': {
1073cef7893435aa41160dd1255c43cb8498279738ccChris Craik                'plat1': {
1074cef7893435aa41160dd1255c43cb8498279738ccChris Craik                    'cloud_storage_hash': 'hash11',
1075cef7893435aa41160dd1255c43cb8498279738ccChris Craik                    'download_path': '../../relative/dep1/path1',
1076cef7893435aa41160dd1255c43cb8498279738ccChris Craik                    'local_paths': ['../../../relative/local/path11',
1077cef7893435aa41160dd1255c43cb8498279738ccChris Craik                                    '../../../relative/local/path12']},
1078cef7893435aa41160dd1255c43cb8498279738ccChris Craik                'plat2': self.platform_dict
1079cef7893435aa41160dd1255c43cb8498279738ccChris Craik            }
1080cef7893435aa41160dd1255c43cb8498279738ccChris Craik        },
1081cef7893435aa41160dd1255c43cb8498279738ccChris Craik        'dep2': {
1082cef7893435aa41160dd1255c43cb8498279738ccChris Craik            'cloud_storage_bucket': 'bucket2',
1083cef7893435aa41160dd1255c43cb8498279738ccChris Craik            'file_info': {
1084cef7893435aa41160dd1255c43cb8498279738ccChris Craik                'plat1': {
1085cef7893435aa41160dd1255c43cb8498279738ccChris Craik                    'cloud_storage_hash': 'hash21',
1086cef7893435aa41160dd1255c43cb8498279738ccChris Craik                    'download_path': '../../relative/dep2/path1',
1087cef7893435aa41160dd1255c43cb8498279738ccChris Craik                    'local_paths': ['../../../relative/local/path31',
1088cef7893435aa41160dd1255c43cb8498279738ccChris Craik                                    '../../../relative/local/path32']},
1089cef7893435aa41160dd1255c43cb8498279738ccChris Craik                'plat2': {
1090cef7893435aa41160dd1255c43cb8498279738ccChris Craik                    'cloud_storage_hash': 'hash22',
1091cef7893435aa41160dd1255c43cb8498279738ccChris Craik                    'download_path': '../../relative/dep2/path2'}}}}
1092cef7893435aa41160dd1255c43cb8498279738ccChris Craik
1093cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.file_path = os.path.abspath(os.path.join(
1094cef7893435aa41160dd1255c43cb8498279738ccChris Craik        'path', 'to', 'config', 'file'))
1095cef7893435aa41160dd1255c43cb8498279738ccChris Craik
1096cef7893435aa41160dd1255c43cb8498279738ccChris Craik
1097cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.expected_file_lines = [
1098cef7893435aa41160dd1255c43cb8498279738ccChris Craik      # pylint: disable=bad-continuation
1099cef7893435aa41160dd1255c43cb8498279738ccChris Craik      '{', '"config_type": "BaseConfig",', '"dependencies": {',
1100cef7893435aa41160dd1255c43cb8498279738ccChris Craik        '"dep1": {', '"cloud_storage_base_folder": "dependencies_folder",',
1101cef7893435aa41160dd1255c43cb8498279738ccChris Craik          '"cloud_storage_bucket": "bucket1",', '"file_info": {',
1102cef7893435aa41160dd1255c43cb8498279738ccChris Craik            '"plat1": {', '"cloud_storage_hash": "hash11",',
1103cef7893435aa41160dd1255c43cb8498279738ccChris Craik              '"download_path": "../../relative/dep1/path1",',
1104cef7893435aa41160dd1255c43cb8498279738ccChris Craik              '"local_paths": [', '"../../../relative/local/path11",',
1105cef7893435aa41160dd1255c43cb8498279738ccChris Craik                              '"../../../relative/local/path12"', ']', '},',
1106cef7893435aa41160dd1255c43cb8498279738ccChris Craik            '"plat2": {', '"cloud_storage_hash": "hash12",',
1107cef7893435aa41160dd1255c43cb8498279738ccChris Craik              '"download_path": "../../relative/dep1/path2",',
1108cef7893435aa41160dd1255c43cb8498279738ccChris Craik              '"local_paths": [', '"../../../relative/local/path21",',
1109cef7893435aa41160dd1255c43cb8498279738ccChris Craik                              '"../../../relative/local/path22"', ']',
1110cef7893435aa41160dd1255c43cb8498279738ccChris Craik              '}', '}', '},',
1111cef7893435aa41160dd1255c43cb8498279738ccChris Craik        '"dep2": {', '"cloud_storage_bucket": "bucket2",', '"file_info": {',
1112cef7893435aa41160dd1255c43cb8498279738ccChris Craik            '"plat1": {', '"cloud_storage_hash": "hash21",',
1113cef7893435aa41160dd1255c43cb8498279738ccChris Craik              '"download_path": "../../relative/dep2/path1",',
1114cef7893435aa41160dd1255c43cb8498279738ccChris Craik              '"local_paths": [', '"../../../relative/local/path31",',
1115cef7893435aa41160dd1255c43cb8498279738ccChris Craik                              '"../../../relative/local/path32"', ']', '},',
1116cef7893435aa41160dd1255c43cb8498279738ccChris Craik            '"plat2": {', '"cloud_storage_hash": "hash22",',
1117cef7893435aa41160dd1255c43cb8498279738ccChris Craik              '"download_path": "../../relative/dep2/path2"', '}', '}', '}',
1118cef7893435aa41160dd1255c43cb8498279738ccChris Craik      '}', '}']
1119cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.fs.CreateFile(self.file_path,
1120cef7893435aa41160dd1255c43cb8498279738ccChris Craik                       contents='\n'.join(self.expected_file_lines))
1121cef7893435aa41160dd1255c43cb8498279738ccChris Craik
1122cef7893435aa41160dd1255c43cb8498279738ccChris Craik
1123cef7893435aa41160dd1255c43cb8498279738ccChris Craik  def testSetPlatformDataFailureNotWritable(self):
1124cef7893435aa41160dd1255c43cb8498279738ccChris Craik    config = dependency_manager.BaseConfig(self.file_path)
1125cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertRaises(
1126cef7893435aa41160dd1255c43cb8498279738ccChris Craik        dependency_manager.ReadWriteError, config._SetPlatformData,
1127cef7893435aa41160dd1255c43cb8498279738ccChris Craik        'dep1', 'plat1', 'cloud_storage_bucket', 'new_bucket')
1128cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertEqual(self.dependencies, config._config_data)
1129cef7893435aa41160dd1255c43cb8498279738ccChris Craik
1130cef7893435aa41160dd1255c43cb8498279738ccChris Craik  def testSetPlatformDataFailure(self):
1131cef7893435aa41160dd1255c43cb8498279738ccChris Craik    config = dependency_manager.BaseConfig(self.file_path, writable=True)
1132cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertRaises(ValueError, config._SetPlatformData, 'missing_dep',
1133cef7893435aa41160dd1255c43cb8498279738ccChris Craik                      'plat2', 'cloud_storage_bucket', 'new_bucket')
1134cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertEqual(self.dependencies, config._config_data)
1135cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertRaises(ValueError, config._SetPlatformData, 'dep1',
1136cef7893435aa41160dd1255c43cb8498279738ccChris Craik                      'missing_plat', 'cloud_storage_bucket', 'new_bucket')
1137cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertEqual(self.dependencies, config._config_data)
1138cef7893435aa41160dd1255c43cb8498279738ccChris Craik
1139cef7893435aa41160dd1255c43cb8498279738ccChris Craik
1140cef7893435aa41160dd1255c43cb8498279738ccChris Craik  def testSetPlatformDataCloudStorageBucketSuccess(self):
1141cef7893435aa41160dd1255c43cb8498279738ccChris Craik    config = dependency_manager.BaseConfig(self.file_path, writable=True)
1142cef7893435aa41160dd1255c43cb8498279738ccChris Craik    updated_cs_dependencies = {
1143cef7893435aa41160dd1255c43cb8498279738ccChris Craik        'dep1': {'cloud_storage_bucket': 'new_bucket',
1144cef7893435aa41160dd1255c43cb8498279738ccChris Craik                 'cloud_storage_base_folder': 'dependencies_folder',
1145cef7893435aa41160dd1255c43cb8498279738ccChris Craik                 'file_info': {
1146cef7893435aa41160dd1255c43cb8498279738ccChris Craik                     'plat1': {
1147cef7893435aa41160dd1255c43cb8498279738ccChris Craik                         'cloud_storage_hash': 'hash11',
1148cef7893435aa41160dd1255c43cb8498279738ccChris Craik                         'download_path': '../../relative/dep1/path1',
1149cef7893435aa41160dd1255c43cb8498279738ccChris Craik                         'local_paths': ['../../../relative/local/path11',
1150cef7893435aa41160dd1255c43cb8498279738ccChris Craik                                         '../../../relative/local/path12']},
1151cef7893435aa41160dd1255c43cb8498279738ccChris Craik                     'plat2': {
1152cef7893435aa41160dd1255c43cb8498279738ccChris Craik                         'cloud_storage_hash': 'hash12',
1153cef7893435aa41160dd1255c43cb8498279738ccChris Craik                         'download_path': '../../relative/dep1/path2',
1154cef7893435aa41160dd1255c43cb8498279738ccChris Craik                         'local_paths': ['../../../relative/local/path21',
1155cef7893435aa41160dd1255c43cb8498279738ccChris Craik                                         '../../../relative/local/path22']}}},
1156cef7893435aa41160dd1255c43cb8498279738ccChris Craik        'dep2': {'cloud_storage_bucket': 'bucket2',
1157cef7893435aa41160dd1255c43cb8498279738ccChris Craik                 'file_info': {
1158cef7893435aa41160dd1255c43cb8498279738ccChris Craik                     'plat1': {
1159cef7893435aa41160dd1255c43cb8498279738ccChris Craik                         'cloud_storage_hash': 'hash21',
1160cef7893435aa41160dd1255c43cb8498279738ccChris Craik                         'download_path': '../../relative/dep2/path1',
1161cef7893435aa41160dd1255c43cb8498279738ccChris Craik                         'local_paths': ['../../../relative/local/path31',
1162cef7893435aa41160dd1255c43cb8498279738ccChris Craik                                         '../../../relative/local/path32']},
1163cef7893435aa41160dd1255c43cb8498279738ccChris Craik                     'plat2': {
1164cef7893435aa41160dd1255c43cb8498279738ccChris Craik                         'cloud_storage_hash': 'hash22',
1165cef7893435aa41160dd1255c43cb8498279738ccChris Craik                         'download_path': '../../relative/dep2/path2'}}}}
1166cef7893435aa41160dd1255c43cb8498279738ccChris Craik    config._SetPlatformData('dep1', 'plat2', 'cloud_storage_bucket',
1167cef7893435aa41160dd1255c43cb8498279738ccChris Craik                            'new_bucket')
1168cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertEqual(updated_cs_dependencies, config._config_data)
1169cef7893435aa41160dd1255c43cb8498279738ccChris Craik
1170cef7893435aa41160dd1255c43cb8498279738ccChris Craik  def testSetPlatformDataCloudStorageBaseFolderSuccess(self):
1171cef7893435aa41160dd1255c43cb8498279738ccChris Craik    config = dependency_manager.BaseConfig(self.file_path, writable=True)
1172cef7893435aa41160dd1255c43cb8498279738ccChris Craik    updated_cs_dependencies = {
1173cef7893435aa41160dd1255c43cb8498279738ccChris Craik        'dep1': {'cloud_storage_bucket': 'bucket1',
1174cef7893435aa41160dd1255c43cb8498279738ccChris Craik                 'cloud_storage_base_folder': 'new_dependencies_folder',
1175cef7893435aa41160dd1255c43cb8498279738ccChris Craik                 'file_info': {
1176cef7893435aa41160dd1255c43cb8498279738ccChris Craik                     'plat1': {
1177cef7893435aa41160dd1255c43cb8498279738ccChris Craik                         'cloud_storage_hash': 'hash11',
1178cef7893435aa41160dd1255c43cb8498279738ccChris Craik                         'download_path': '../../relative/dep1/path1',
1179cef7893435aa41160dd1255c43cb8498279738ccChris Craik                         'local_paths': ['../../../relative/local/path11',
1180cef7893435aa41160dd1255c43cb8498279738ccChris Craik                                         '../../../relative/local/path12']},
1181cef7893435aa41160dd1255c43cb8498279738ccChris Craik                     'plat2': {
1182cef7893435aa41160dd1255c43cb8498279738ccChris Craik                         'cloud_storage_hash': 'hash12',
1183cef7893435aa41160dd1255c43cb8498279738ccChris Craik                         'download_path': '../../relative/dep1/path2',
1184cef7893435aa41160dd1255c43cb8498279738ccChris Craik                         'local_paths': ['../../../relative/local/path21',
1185cef7893435aa41160dd1255c43cb8498279738ccChris Craik                                         '../../../relative/local/path22']}}},
1186cef7893435aa41160dd1255c43cb8498279738ccChris Craik        'dep2': {'cloud_storage_bucket': 'bucket2',
1187cef7893435aa41160dd1255c43cb8498279738ccChris Craik                 'file_info': {
1188cef7893435aa41160dd1255c43cb8498279738ccChris Craik                     'plat1': {
1189cef7893435aa41160dd1255c43cb8498279738ccChris Craik                         'cloud_storage_hash': 'hash21',
1190cef7893435aa41160dd1255c43cb8498279738ccChris Craik                         'download_path': '../../relative/dep2/path1',
1191cef7893435aa41160dd1255c43cb8498279738ccChris Craik                         'local_paths': ['../../../relative/local/path31',
1192cef7893435aa41160dd1255c43cb8498279738ccChris Craik                                         '../../../relative/local/path32']},
1193cef7893435aa41160dd1255c43cb8498279738ccChris Craik                     'plat2': {
1194cef7893435aa41160dd1255c43cb8498279738ccChris Craik                         'cloud_storage_hash': 'hash22',
1195cef7893435aa41160dd1255c43cb8498279738ccChris Craik                         'download_path': '../../relative/dep2/path2'}}}}
1196cef7893435aa41160dd1255c43cb8498279738ccChris Craik    config._SetPlatformData('dep1', 'plat2', 'cloud_storage_base_folder',
1197cef7893435aa41160dd1255c43cb8498279738ccChris Craik                            'new_dependencies_folder')
1198cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertEqual(updated_cs_dependencies, config._config_data)
1199cef7893435aa41160dd1255c43cb8498279738ccChris Craik
1200cef7893435aa41160dd1255c43cb8498279738ccChris Craik  def testSetPlatformDataHashSuccess(self):
1201cef7893435aa41160dd1255c43cb8498279738ccChris Craik    config = dependency_manager.BaseConfig(self.file_path, writable=True)
1202cef7893435aa41160dd1255c43cb8498279738ccChris Craik    updated_cs_dependencies = {
1203cef7893435aa41160dd1255c43cb8498279738ccChris Craik        'dep1': {'cloud_storage_bucket': 'bucket1',
1204cef7893435aa41160dd1255c43cb8498279738ccChris Craik                 'cloud_storage_base_folder': 'dependencies_folder',
1205cef7893435aa41160dd1255c43cb8498279738ccChris Craik                 'file_info': {
1206cef7893435aa41160dd1255c43cb8498279738ccChris Craik                     'plat1': {
1207cef7893435aa41160dd1255c43cb8498279738ccChris Craik                         'cloud_storage_hash': 'hash11',
1208cef7893435aa41160dd1255c43cb8498279738ccChris Craik                         'download_path': '../../relative/dep1/path1',
1209cef7893435aa41160dd1255c43cb8498279738ccChris Craik                         'local_paths': ['../../../relative/local/path11',
1210cef7893435aa41160dd1255c43cb8498279738ccChris Craik                                         '../../../relative/local/path12']},
1211cef7893435aa41160dd1255c43cb8498279738ccChris Craik                     'plat2': {
1212cef7893435aa41160dd1255c43cb8498279738ccChris Craik                         'cloud_storage_hash': 'new_hash',
1213cef7893435aa41160dd1255c43cb8498279738ccChris Craik                         'download_path': '../../relative/dep1/path2',
1214cef7893435aa41160dd1255c43cb8498279738ccChris Craik                         'local_paths': ['../../../relative/local/path21',
1215cef7893435aa41160dd1255c43cb8498279738ccChris Craik                                         '../../../relative/local/path22']}}},
1216cef7893435aa41160dd1255c43cb8498279738ccChris Craik        'dep2': {'cloud_storage_bucket': 'bucket2',
1217cef7893435aa41160dd1255c43cb8498279738ccChris Craik                 'file_info': {
1218cef7893435aa41160dd1255c43cb8498279738ccChris Craik                     'plat1': {
1219cef7893435aa41160dd1255c43cb8498279738ccChris Craik                         'cloud_storage_hash': 'hash21',
1220cef7893435aa41160dd1255c43cb8498279738ccChris Craik                         'download_path': '../../relative/dep2/path1',
1221cef7893435aa41160dd1255c43cb8498279738ccChris Craik                         'local_paths': ['../../../relative/local/path31',
1222cef7893435aa41160dd1255c43cb8498279738ccChris Craik                                         '../../../relative/local/path32']},
1223cef7893435aa41160dd1255c43cb8498279738ccChris Craik                     'plat2': {
1224cef7893435aa41160dd1255c43cb8498279738ccChris Craik                         'cloud_storage_hash': 'hash22',
1225cef7893435aa41160dd1255c43cb8498279738ccChris Craik                         'download_path': '../../relative/dep2/path2'}}}}
1226cef7893435aa41160dd1255c43cb8498279738ccChris Craik    config._SetPlatformData('dep1', 'plat2', 'cloud_storage_hash',
1227cef7893435aa41160dd1255c43cb8498279738ccChris Craik                            'new_hash')
1228cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertEqual(updated_cs_dependencies, config._config_data)
1229cef7893435aa41160dd1255c43cb8498279738ccChris Craik
1230cef7893435aa41160dd1255c43cb8498279738ccChris Craik  def testSetPlatformDataDownloadPathSuccess(self):
1231cef7893435aa41160dd1255c43cb8498279738ccChris Craik    config = dependency_manager.BaseConfig(self.file_path, writable=True)
1232cef7893435aa41160dd1255c43cb8498279738ccChris Craik    updated_cs_dependencies = {
1233cef7893435aa41160dd1255c43cb8498279738ccChris Craik        'dep1': {'cloud_storage_bucket': 'bucket1',
1234cef7893435aa41160dd1255c43cb8498279738ccChris Craik                 'cloud_storage_base_folder': 'dependencies_folder',
1235cef7893435aa41160dd1255c43cb8498279738ccChris Craik                 'file_info': {
1236cef7893435aa41160dd1255c43cb8498279738ccChris Craik                     'plat1': {
1237cef7893435aa41160dd1255c43cb8498279738ccChris Craik                         'cloud_storage_hash': 'hash11',
1238cef7893435aa41160dd1255c43cb8498279738ccChris Craik                         'download_path': '../../relative/dep1/path1',
1239cef7893435aa41160dd1255c43cb8498279738ccChris Craik                         'local_paths': ['../../../relative/local/path11',
1240cef7893435aa41160dd1255c43cb8498279738ccChris Craik                                         '../../../relative/local/path12']},
1241cef7893435aa41160dd1255c43cb8498279738ccChris Craik                     'plat2': {
1242cef7893435aa41160dd1255c43cb8498279738ccChris Craik                         'cloud_storage_hash': 'hash12',
1243cef7893435aa41160dd1255c43cb8498279738ccChris Craik                         'download_path': '../../new/dep1/path2',
1244cef7893435aa41160dd1255c43cb8498279738ccChris Craik                         'local_paths': ['../../../relative/local/path21',
1245cef7893435aa41160dd1255c43cb8498279738ccChris Craik                                         '../../../relative/local/path22']}}},
1246cef7893435aa41160dd1255c43cb8498279738ccChris Craik        'dep2': {'cloud_storage_bucket': 'bucket2',
1247cef7893435aa41160dd1255c43cb8498279738ccChris Craik                 'file_info': {
1248cef7893435aa41160dd1255c43cb8498279738ccChris Craik                     'plat1': {
1249cef7893435aa41160dd1255c43cb8498279738ccChris Craik                         'cloud_storage_hash': 'hash21',
1250cef7893435aa41160dd1255c43cb8498279738ccChris Craik                         'download_path': '../../relative/dep2/path1',
1251cef7893435aa41160dd1255c43cb8498279738ccChris Craik                         'local_paths': ['../../../relative/local/path31',
1252cef7893435aa41160dd1255c43cb8498279738ccChris Craik                                         '../../../relative/local/path32']},
1253cef7893435aa41160dd1255c43cb8498279738ccChris Craik                     'plat2': {
1254cef7893435aa41160dd1255c43cb8498279738ccChris Craik                         'cloud_storage_hash': 'hash22',
1255cef7893435aa41160dd1255c43cb8498279738ccChris Craik                         'download_path': '../../relative/dep2/path2'}}}}
1256cef7893435aa41160dd1255c43cb8498279738ccChris Craik    config._SetPlatformData('dep1', 'plat2', 'download_path',
1257cef7893435aa41160dd1255c43cb8498279738ccChris Craik                            '../../new/dep1/path2')
1258cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertEqual(updated_cs_dependencies, config._config_data)
1259cef7893435aa41160dd1255c43cb8498279738ccChris Craik
1260cef7893435aa41160dd1255c43cb8498279738ccChris Craik  def testSetPlatformDataLocalPathSuccess(self):
1261cef7893435aa41160dd1255c43cb8498279738ccChris Craik    config = dependency_manager.BaseConfig(self.file_path, writable=True)
1262cef7893435aa41160dd1255c43cb8498279738ccChris Craik    updated_cs_dependencies = {
1263cef7893435aa41160dd1255c43cb8498279738ccChris Craik        'dep1': {'cloud_storage_bucket': 'bucket1',
1264cef7893435aa41160dd1255c43cb8498279738ccChris Craik                 'cloud_storage_base_folder': 'dependencies_folder',
1265cef7893435aa41160dd1255c43cb8498279738ccChris Craik                 'file_info': {
1266cef7893435aa41160dd1255c43cb8498279738ccChris Craik                     'plat1': {
1267cef7893435aa41160dd1255c43cb8498279738ccChris Craik                         'cloud_storage_hash': 'hash11',
1268cef7893435aa41160dd1255c43cb8498279738ccChris Craik                         'download_path': '../../relative/dep1/path1',
1269cef7893435aa41160dd1255c43cb8498279738ccChris Craik                         'local_paths': ['../../../relative/local/path11',
1270cef7893435aa41160dd1255c43cb8498279738ccChris Craik                                         '../../../relative/local/path12']},
1271cef7893435aa41160dd1255c43cb8498279738ccChris Craik                     'plat2': {
1272cef7893435aa41160dd1255c43cb8498279738ccChris Craik                         'cloud_storage_hash': 'hash12',
1273cef7893435aa41160dd1255c43cb8498279738ccChris Craik                         'download_path': '../../relative/dep1/path2',
1274cef7893435aa41160dd1255c43cb8498279738ccChris Craik                         'local_paths': ['../../new/relative/local/path21',
1275cef7893435aa41160dd1255c43cb8498279738ccChris Craik                                         '../../new/relative/local/path22']}}},
1276cef7893435aa41160dd1255c43cb8498279738ccChris Craik        'dep2': {'cloud_storage_bucket': 'bucket2',
1277cef7893435aa41160dd1255c43cb8498279738ccChris Craik                 'file_info': {
1278cef7893435aa41160dd1255c43cb8498279738ccChris Craik                     'plat1': {
1279cef7893435aa41160dd1255c43cb8498279738ccChris Craik                         'cloud_storage_hash': 'hash21',
1280cef7893435aa41160dd1255c43cb8498279738ccChris Craik                         'download_path': '../../relative/dep2/path1',
1281cef7893435aa41160dd1255c43cb8498279738ccChris Craik                         'local_paths': ['../../../relative/local/path31',
1282cef7893435aa41160dd1255c43cb8498279738ccChris Craik                                         '../../../relative/local/path32']},
1283cef7893435aa41160dd1255c43cb8498279738ccChris Craik                     'plat2': {
1284cef7893435aa41160dd1255c43cb8498279738ccChris Craik                         'cloud_storage_hash': 'hash22',
1285cef7893435aa41160dd1255c43cb8498279738ccChris Craik                         'download_path': '../../relative/dep2/path2'}}}}
1286cef7893435aa41160dd1255c43cb8498279738ccChris Craik    config._SetPlatformData('dep1', 'plat2', 'local_paths',
1287cef7893435aa41160dd1255c43cb8498279738ccChris Craik                            ['../../new/relative/local/path21',
1288cef7893435aa41160dd1255c43cb8498279738ccChris Craik                             '../../new/relative/local/path22'])
1289cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertEqual(updated_cs_dependencies, config._config_data)
1290cef7893435aa41160dd1255c43cb8498279738ccChris Craik
1291cef7893435aa41160dd1255c43cb8498279738ccChris Craik  def testGetPlatformDataFailure(self):
1292cef7893435aa41160dd1255c43cb8498279738ccChris Craik    config = dependency_manager.BaseConfig(self.file_path, writable=True)
1293cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertRaises(ValueError, config._GetPlatformData, 'missing_dep',
1294cef7893435aa41160dd1255c43cb8498279738ccChris Craik                      'plat2', 'cloud_storage_bucket')
1295cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertEqual(self.dependencies, config._config_data)
1296cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertRaises(ValueError, config._GetPlatformData, 'dep1',
1297cef7893435aa41160dd1255c43cb8498279738ccChris Craik                      'missing_plat', 'cloud_storage_bucket')
1298cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertEqual(self.dependencies, config._config_data)
1299cef7893435aa41160dd1255c43cb8498279738ccChris Craik
1300cef7893435aa41160dd1255c43cb8498279738ccChris Craik  def testGetPlatformDataDictSuccess(self):
1301cef7893435aa41160dd1255c43cb8498279738ccChris Craik    config = dependency_manager.BaseConfig(self.file_path, writable=True)
1302cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertEqual(self.platform_dict,
1303cef7893435aa41160dd1255c43cb8498279738ccChris Craik                     config._GetPlatformData('dep1', 'plat2'))
1304cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertEqual(self.dependencies, config._config_data)
1305cef7893435aa41160dd1255c43cb8498279738ccChris Craik
1306cef7893435aa41160dd1255c43cb8498279738ccChris Craik  def testGetPlatformDataCloudStorageBucketSuccess(self):
1307cef7893435aa41160dd1255c43cb8498279738ccChris Craik    config = dependency_manager.BaseConfig(self.file_path, writable=True)
1308cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertEqual(self.cs_bucket, config._GetPlatformData(
1309cef7893435aa41160dd1255c43cb8498279738ccChris Craik        'dep1', 'plat2', 'cloud_storage_bucket'))
1310cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertEqual(self.dependencies, config._config_data)
1311cef7893435aa41160dd1255c43cb8498279738ccChris Craik
1312cef7893435aa41160dd1255c43cb8498279738ccChris Craik  def testGetPlatformDataCloudStorageBaseFolderSuccess(self):
1313cef7893435aa41160dd1255c43cb8498279738ccChris Craik    config = dependency_manager.BaseConfig(self.file_path, writable=True)
1314cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertEqual(self.cs_base_folder, config._GetPlatformData(
1315cef7893435aa41160dd1255c43cb8498279738ccChris Craik        'dep1', 'plat2', 'cloud_storage_base_folder'))
1316cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertEqual(self.dependencies, config._config_data)
1317cef7893435aa41160dd1255c43cb8498279738ccChris Craik
1318cef7893435aa41160dd1255c43cb8498279738ccChris Craik  def testGetPlatformDataHashSuccess(self):
1319cef7893435aa41160dd1255c43cb8498279738ccChris Craik    config = dependency_manager.BaseConfig(self.file_path, writable=True)
1320cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertEqual(self.cs_hash, config._GetPlatformData(
1321cef7893435aa41160dd1255c43cb8498279738ccChris Craik        'dep1', 'plat2', 'cloud_storage_hash'))
1322cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertEqual(self.dependencies, config._config_data)
1323cef7893435aa41160dd1255c43cb8498279738ccChris Craik
1324cef7893435aa41160dd1255c43cb8498279738ccChris Craik  def testGetPlatformDataDownloadPathSuccess(self):
1325cef7893435aa41160dd1255c43cb8498279738ccChris Craik    config = dependency_manager.BaseConfig(self.file_path, writable=True)
1326cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertEqual(self.download_path, config._GetPlatformData(
1327cef7893435aa41160dd1255c43cb8498279738ccChris Craik        'dep1', 'plat2', 'download_path'))
1328cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertEqual(self.dependencies, config._config_data)
1329cef7893435aa41160dd1255c43cb8498279738ccChris Craik
1330cef7893435aa41160dd1255c43cb8498279738ccChris Craik  def testGetPlatformDataLocalPathSuccess(self):
1331cef7893435aa41160dd1255c43cb8498279738ccChris Craik    config = dependency_manager.BaseConfig(self.file_path, writable=True)
1332cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertEqual(self.local_paths, config._GetPlatformData(
1333cef7893435aa41160dd1255c43cb8498279738ccChris Craik        'dep1', 'plat2', 'local_paths'))
1334cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertEqual(self.dependencies, config._config_data)
1335cef7893435aa41160dd1255c43cb8498279738ccChris Craik
1336cef7893435aa41160dd1255c43cb8498279738ccChris Craikclass BaseConfigTest(unittest.TestCase):
1337cef7893435aa41160dd1255c43cb8498279738ccChris Craik  """ Subclassable unittests for BaseConfig.
1338cef7893435aa41160dd1255c43cb8498279738ccChris Craik  For subclasses: override setUp, GetConfigDataFromDict,
1339cef7893435aa41160dd1255c43cb8498279738ccChris Craik    and EndToEndExpectedConfigData as needed.
1340cef7893435aa41160dd1255c43cb8498279738ccChris Craik
1341cef7893435aa41160dd1255c43cb8498279738ccChris Craik    setUp must set the following properties:
1342cef7893435aa41160dd1255c43cb8498279738ccChris Craik      self.config_type: String returnedd from GetConfigType in config subclass.
1343cef7893435aa41160dd1255c43cb8498279738ccChris Craik      self.config_class: the class for the config subclass.
1344cef7893435aa41160dd1255c43cb8498279738ccChris Craik      self.config_module: importable module for the config subclass.
1345cef7893435aa41160dd1255c43cb8498279738ccChris Craik      self.empty_dict: expected dictionary for an empty config, as it would be
1346cef7893435aa41160dd1255c43cb8498279738ccChris Craik        stored in a json file.
1347cef7893435aa41160dd1255c43cb8498279738ccChris Craik      self.one_dep_dict: example dictionary for a config with one dependency,
1348cef7893435aa41160dd1255c43cb8498279738ccChris Craik        as it would be stored in a json file.
1349cef7893435aa41160dd1255c43cb8498279738ccChris Craik  """
1350cef7893435aa41160dd1255c43cb8498279738ccChris Craik  def setUp(self):
1351cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.config_type = 'BaseConfig'
1352cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.config_class = dependency_manager.BaseConfig
1353cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.config_module = 'dependency_manager.base_config'
1354cef7893435aa41160dd1255c43cb8498279738ccChris Craik
1355cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.empty_dict = {'config_type': self.config_type,
1356cef7893435aa41160dd1255c43cb8498279738ccChris Craik                       'dependencies': {}}
1357cef7893435aa41160dd1255c43cb8498279738ccChris Craik
1358cef7893435aa41160dd1255c43cb8498279738ccChris Craik    dependency_dict = {
1359cef7893435aa41160dd1255c43cb8498279738ccChris Craik        'dep': {
1360cef7893435aa41160dd1255c43cb8498279738ccChris Craik            'cloud_storage_base_folder': 'cs_base_folder1',
1361cef7893435aa41160dd1255c43cb8498279738ccChris Craik            'cloud_storage_bucket': 'bucket1',
1362cef7893435aa41160dd1255c43cb8498279738ccChris Craik            'file_info': {
1363cef7893435aa41160dd1255c43cb8498279738ccChris Craik                'plat1_arch1': {
1364cef7893435aa41160dd1255c43cb8498279738ccChris Craik                    'cloud_storage_hash': 'hash111',
1365cef7893435aa41160dd1255c43cb8498279738ccChris Craik                    'download_path': 'download_path111',
1366cef7893435aa41160dd1255c43cb8498279738ccChris Craik                    'cs_remote_path': 'cs_path111',
1367cef7893435aa41160dd1255c43cb8498279738ccChris Craik                    'version_in_cs': 'version_111',
1368cef7893435aa41160dd1255c43cb8498279738ccChris Craik                    'local_paths': ['local_path1110', 'local_path1111']
1369cef7893435aa41160dd1255c43cb8498279738ccChris Craik                },
1370cef7893435aa41160dd1255c43cb8498279738ccChris Craik                'plat1_arch2': {
1371cef7893435aa41160dd1255c43cb8498279738ccChris Craik                    'cloud_storage_hash': 'hash112',
1372cef7893435aa41160dd1255c43cb8498279738ccChris Craik                    'download_path': 'download_path112',
1373cef7893435aa41160dd1255c43cb8498279738ccChris Craik                    'cs_remote_path': 'cs_path112',
1374cef7893435aa41160dd1255c43cb8498279738ccChris Craik                    'local_paths': ['local_path1120', 'local_path1121']
1375cef7893435aa41160dd1255c43cb8498279738ccChris Craik                },
1376cef7893435aa41160dd1255c43cb8498279738ccChris Craik                'win_arch1': {
1377cef7893435aa41160dd1255c43cb8498279738ccChris Craik                    'cloud_storage_hash': 'hash1w1',
1378cef7893435aa41160dd1255c43cb8498279738ccChris Craik                    'download_path': 'download\\path\\1w1',
1379cef7893435aa41160dd1255c43cb8498279738ccChris Craik                    'cs_remote_path': 'cs_path1w1',
1380cef7893435aa41160dd1255c43cb8498279738ccChris Craik                    'local_paths': ['local\\path\\1w10', 'local\\path\\1w11']
1381cef7893435aa41160dd1255c43cb8498279738ccChris Craik                },
1382cef7893435aa41160dd1255c43cb8498279738ccChris Craik                'all_the_variables': {
1383cef7893435aa41160dd1255c43cb8498279738ccChris Craik                    'cloud_storage_hash': 'hash111',
1384cef7893435aa41160dd1255c43cb8498279738ccChris Craik                    'download_path': 'download_path111',
1385cef7893435aa41160dd1255c43cb8498279738ccChris Craik                    'cs_remote_path': 'cs_path111',
1386cef7893435aa41160dd1255c43cb8498279738ccChris Craik                    'version_in_cs': 'version_111',
1387576fd2a645575980f16b6731dab0f4f150100657Chris Craik                    'path_within_archive': 'path/within/archive',
1388cef7893435aa41160dd1255c43cb8498279738ccChris Craik                    'local_paths': ['local_path1110', 'local_path1111']
1389cef7893435aa41160dd1255c43cb8498279738ccChris Craik                }
1390cef7893435aa41160dd1255c43cb8498279738ccChris Craik            }
1391cef7893435aa41160dd1255c43cb8498279738ccChris Craik        }
1392cef7893435aa41160dd1255c43cb8498279738ccChris Craik    }
1393cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.one_dep_dict = {'config_type': self.config_type,
1394cef7893435aa41160dd1255c43cb8498279738ccChris Craik                         'dependencies': dependency_dict}
1395cef7893435aa41160dd1255c43cb8498279738ccChris Craik
1396cef7893435aa41160dd1255c43cb8498279738ccChris Craik  def GetConfigDataFromDict(self, config_dict):
1397cef7893435aa41160dd1255c43cb8498279738ccChris Craik    return config_dict.get('dependencies', {})
1398cef7893435aa41160dd1255c43cb8498279738ccChris Craik
1399cef7893435aa41160dd1255c43cb8498279738ccChris Craik  @mock.patch('os.path')
1400cef7893435aa41160dd1255c43cb8498279738ccChris Craik  @mock.patch('__builtin__.open')
1401cef7893435aa41160dd1255c43cb8498279738ccChris Craik  def testInitBaseProperties(self, open_mock, path_mock):
1402cef7893435aa41160dd1255c43cb8498279738ccChris Craik    # Init is not meant to be overridden, so we should be mocking the
1403cef7893435aa41160dd1255c43cb8498279738ccChris Craik    # base_config's json module, even in subclasses.
1404cef7893435aa41160dd1255c43cb8498279738ccChris Craik    json_module = 'dependency_manager.base_config.json'
1405cef7893435aa41160dd1255c43cb8498279738ccChris Craik    with mock.patch(json_module) as json_mock:
1406cef7893435aa41160dd1255c43cb8498279738ccChris Craik      json_mock.load.return_value = self.empty_dict.copy()
1407cef7893435aa41160dd1255c43cb8498279738ccChris Craik      config = self.config_class('file_path')
1408cef7893435aa41160dd1255c43cb8498279738ccChris Craik      self.assertEqual('file_path', config._config_path)
1409cef7893435aa41160dd1255c43cb8498279738ccChris Craik      self.assertEqual(self.config_type, config.GetConfigType())
1410cef7893435aa41160dd1255c43cb8498279738ccChris Craik      self.assertEqual(self.GetConfigDataFromDict(self.empty_dict),
1411cef7893435aa41160dd1255c43cb8498279738ccChris Craik                       config._config_data)
1412cef7893435aa41160dd1255c43cb8498279738ccChris Craik
1413cef7893435aa41160dd1255c43cb8498279738ccChris Craik
1414cef7893435aa41160dd1255c43cb8498279738ccChris Craik  @mock.patch('dependency_manager.dependency_info.DependencyInfo')
1415cef7893435aa41160dd1255c43cb8498279738ccChris Craik  @mock.patch('os.path')
1416cef7893435aa41160dd1255c43cb8498279738ccChris Craik  @mock.patch('__builtin__.open')
1417cef7893435aa41160dd1255c43cb8498279738ccChris Craik  def testInitWithDependencies(self, open_mock, path_mock, dep_info_mock):
1418cef7893435aa41160dd1255c43cb8498279738ccChris Craik    # Init is not meant to be overridden, so we should be mocking the
1419cef7893435aa41160dd1255c43cb8498279738ccChris Craik    # base_config's json module, even in subclasses.
1420cef7893435aa41160dd1255c43cb8498279738ccChris Craik    json_module = 'dependency_manager.base_config.json'
1421cef7893435aa41160dd1255c43cb8498279738ccChris Craik    with mock.patch(json_module) as json_mock:
1422cef7893435aa41160dd1255c43cb8498279738ccChris Craik      json_mock.load.return_value = self.one_dep_dict
1423cef7893435aa41160dd1255c43cb8498279738ccChris Craik      config = self.config_class('file_path')
1424cef7893435aa41160dd1255c43cb8498279738ccChris Craik      self.assertEqual('file_path', config._config_path)
1425cef7893435aa41160dd1255c43cb8498279738ccChris Craik      self.assertEqual(self.config_type, config.GetConfigType())
1426cef7893435aa41160dd1255c43cb8498279738ccChris Craik      self.assertEqual(self.GetConfigDataFromDict(self.one_dep_dict),
1427cef7893435aa41160dd1255c43cb8498279738ccChris Craik                       config._config_data)
1428cef7893435aa41160dd1255c43cb8498279738ccChris Craik
1429cef7893435aa41160dd1255c43cb8498279738ccChris Craik  def testFormatPath(self):
1430cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertEqual(None, self.config_class._FormatPath(None))
1431cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertEqual('', self.config_class._FormatPath(''))
1432cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertEqual('some_string',
1433cef7893435aa41160dd1255c43cb8498279738ccChris Craik                     self.config_class._FormatPath('some_string'))
1434cef7893435aa41160dd1255c43cb8498279738ccChris Craik
1435cef7893435aa41160dd1255c43cb8498279738ccChris Craik    expected_path = os.path.join('some', 'file', 'path')
1436cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertEqual(expected_path,
1437cef7893435aa41160dd1255c43cb8498279738ccChris Craik                     self.config_class._FormatPath('some/file/path'))
1438cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertEqual(expected_path,
1439cef7893435aa41160dd1255c43cb8498279738ccChris Craik                     self.config_class._FormatPath('some\\file\\path'))
1440cef7893435aa41160dd1255c43cb8498279738ccChris Craik
1441cef7893435aa41160dd1255c43cb8498279738ccChris Craik  @mock.patch('dependency_manager.base_config.json')
1442cef7893435aa41160dd1255c43cb8498279738ccChris Craik  @mock.patch('dependency_manager.dependency_info.DependencyInfo')
1443cef7893435aa41160dd1255c43cb8498279738ccChris Craik  @mock.patch('os.path.exists')
1444cef7893435aa41160dd1255c43cb8498279738ccChris Craik  @mock.patch('__builtin__.open')
1445cef7893435aa41160dd1255c43cb8498279738ccChris Craik  def testIterDependenciesError(
1446cef7893435aa41160dd1255c43cb8498279738ccChris Craik      self, open_mock, exists_mock, dep_info_mock, json_mock):
1447cef7893435aa41160dd1255c43cb8498279738ccChris Craik    # Init is not meant to be overridden, so we should be mocking the
1448cef7893435aa41160dd1255c43cb8498279738ccChris Craik    # base_config's json module, even in subclasses.
1449cef7893435aa41160dd1255c43cb8498279738ccChris Craik    json_mock.load.return_value = self.one_dep_dict
1450cef7893435aa41160dd1255c43cb8498279738ccChris Craik    config = self.config_class('file_path', writable=True)
1451cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertEqual(self.GetConfigDataFromDict(self.one_dep_dict),
1452cef7893435aa41160dd1255c43cb8498279738ccChris Craik                     config._config_data)
1453cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertTrue(config._writable)
1454cef7893435aa41160dd1255c43cb8498279738ccChris Craik    with self.assertRaises(dependency_manager.ReadWriteError):
1455cef7893435aa41160dd1255c43cb8498279738ccChris Craik      for _ in config.IterDependencyInfo():
1456cef7893435aa41160dd1255c43cb8498279738ccChris Craik        pass
1457cef7893435aa41160dd1255c43cb8498279738ccChris Craik
1458cef7893435aa41160dd1255c43cb8498279738ccChris Craik  @mock.patch('dependency_manager.base_config.json')
1459cef7893435aa41160dd1255c43cb8498279738ccChris Craik  @mock.patch('dependency_manager.dependency_info.DependencyInfo')
1460cef7893435aa41160dd1255c43cb8498279738ccChris Craik  @mock.patch('os.path.exists')
1461cef7893435aa41160dd1255c43cb8498279738ccChris Craik  @mock.patch('__builtin__.open')
1462cef7893435aa41160dd1255c43cb8498279738ccChris Craik  def testIterDependencies(
1463cef7893435aa41160dd1255c43cb8498279738ccChris Craik      self, open_mock, exists_mock, dep_info_mock, json_mock):
1464cef7893435aa41160dd1255c43cb8498279738ccChris Craik    json_mock.load.return_value = self.one_dep_dict
1465cef7893435aa41160dd1255c43cb8498279738ccChris Craik    config = self.config_class('file_path')
1466cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertEqual(self.GetConfigDataFromDict(self.one_dep_dict),
1467cef7893435aa41160dd1255c43cb8498279738ccChris Craik                     config._config_data)
1468cef7893435aa41160dd1255c43cb8498279738ccChris Craik    expected_dep_info = ['dep_info0', 'dep_info1', 'dep_info2']
1469cef7893435aa41160dd1255c43cb8498279738ccChris Craik    dep_info_mock.side_effect = expected_dep_info
1470cef7893435aa41160dd1255c43cb8498279738ccChris Craik    expected_calls = [
1471cef7893435aa41160dd1255c43cb8498279738ccChris Craik        mock.call('dep', 'plat1_arch1', 'file_path', cs_bucket='bucket1',
1472cef7893435aa41160dd1255c43cb8498279738ccChris Craik                  cs_hash='hash111', download_path='download_path111',
1473cef7893435aa41160dd1255c43cb8498279738ccChris Craik                  cs_remote_path='cs_path111',
1474cef7893435aa41160dd1255c43cb8498279738ccChris Craik                  local_paths=['local_path1110', 'local_path1111']),
1475cef7893435aa41160dd1255c43cb8498279738ccChris Craik        mock.call('dep', 'plat1_arch1', 'file_path', cs_bucket='bucket1',
1476cef7893435aa41160dd1255c43cb8498279738ccChris Craik                  cs_hash='hash112', download_path='download_path112',
1477cef7893435aa41160dd1255c43cb8498279738ccChris Craik                  cs_remote_path='cs_path112',
1478cef7893435aa41160dd1255c43cb8498279738ccChris Craik                  local_paths=['local_path1120', 'local_path1121']),
1479cef7893435aa41160dd1255c43cb8498279738ccChris Craik        mock.call('dep', 'win_arch1', 'file_path', cs_bucket='bucket1',
1480cef7893435aa41160dd1255c43cb8498279738ccChris Craik                  cs_hash='hash1w1',
1481cef7893435aa41160dd1255c43cb8498279738ccChris Craik                  download_path=os.path.join('download', 'path', '1w1'),
1482cef7893435aa41160dd1255c43cb8498279738ccChris Craik                  cs_remote_path='cs_path1w1',
1483cef7893435aa41160dd1255c43cb8498279738ccChris Craik                  local_paths=[os.path.join('download', 'path', '1w10'),
1484cef7893435aa41160dd1255c43cb8498279738ccChris Craik                               os.path.join('download', 'path', '1w11')])]
1485cef7893435aa41160dd1255c43cb8498279738ccChris Craik    deps_seen = []
1486cef7893435aa41160dd1255c43cb8498279738ccChris Craik    for dep_info in config.IterDependencyInfo():
1487cef7893435aa41160dd1255c43cb8498279738ccChris Craik      deps_seen.append(dep_info)
1488cef7893435aa41160dd1255c43cb8498279738ccChris Craik    dep_info_mock.assert_call_args(expected_calls)
1489cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertItemsEqual(expected_dep_info, deps_seen)
1490576fd2a645575980f16b6731dab0f4f150100657Chris Craik
1491576fd2a645575980f16b6731dab0f4f150100657Chris Craik  @mock.patch('dependency_manager.base_config.json')
1492576fd2a645575980f16b6731dab0f4f150100657Chris Craik  @mock.patch('os.path.exists')
1493576fd2a645575980f16b6731dab0f4f150100657Chris Craik  @mock.patch('__builtin__.open')
1494576fd2a645575980f16b6731dab0f4f150100657Chris Craik  def testIterDependenciesStaleGlob(self, open_mock, exists_mock, json_mock):
1495576fd2a645575980f16b6731dab0f4f150100657Chris Craik    json_mock.load.return_value = self.one_dep_dict
1496576fd2a645575980f16b6731dab0f4f150100657Chris Craik    config = self.config_class('file_path')
1497576fd2a645575980f16b6731dab0f4f150100657Chris Craik
1498576fd2a645575980f16b6731dab0f4f150100657Chris Craik    abspath = os.path.abspath
1499576fd2a645575980f16b6731dab0f4f150100657Chris Craik    should_match = set(map(abspath, [
1500576fd2a645575980f16b6731dab0f4f150100657Chris Craik        'dep_all_the_variables_0123456789abcdef0123456789abcdef01234567',
1501576fd2a645575980f16b6731dab0f4f150100657Chris Craik        'dep_all_the_variables_123456789abcdef0123456789abcdef012345678']))
1502576fd2a645575980f16b6731dab0f4f150100657Chris Craik    # Not testing case changes, because Windows is case-insensitive.
1503576fd2a645575980f16b6731dab0f4f150100657Chris Craik    should_not_match = set(map(abspath, [
1504576fd2a645575980f16b6731dab0f4f150100657Chris Craik        # A configuration that doesn't unzip shouldn't clear any stale unzips.
1505576fd2a645575980f16b6731dab0f4f150100657Chris Craik        'dep_plat1_arch1_0123456789abcdef0123456789abcdef01234567',
1506576fd2a645575980f16b6731dab0f4f150100657Chris Craik        # "Hash" component less than 40 characters (not a valid SHA1 hash).
1507576fd2a645575980f16b6731dab0f4f150100657Chris Craik        'dep_all_the_variables_0123456789abcdef0123456789abcdef0123456',
1508576fd2a645575980f16b6731dab0f4f150100657Chris Craik        # "Hash" component greater than 40 characters (not a valid SHA1 hash).
1509576fd2a645575980f16b6731dab0f4f150100657Chris Craik        'dep_all_the_variables_0123456789abcdef0123456789abcdef012345678',
1510576fd2a645575980f16b6731dab0f4f150100657Chris Craik        # "Hash" component not comprised of hex (not a valid SHA1 hash).
1511576fd2a645575980f16b6731dab0f4f150100657Chris Craik        'dep_all_the_variables_0123456789gggggg0123456789gggggg01234567']))
1512576fd2a645575980f16b6731dab0f4f150100657Chris Craik
1513576fd2a645575980f16b6731dab0f4f150100657Chris Craik    # Create a fake filesystem just for glob to use
1514576fd2a645575980f16b6731dab0f4f150100657Chris Craik    fake_fs = fake_filesystem.FakeFilesystem()
1515576fd2a645575980f16b6731dab0f4f150100657Chris Craik    fake_glob = fake_filesystem_glob.FakeGlobModule(fake_fs)
1516576fd2a645575980f16b6731dab0f4f150100657Chris Craik    for stale_dir in set.union(should_match, should_not_match):
1517576fd2a645575980f16b6731dab0f4f150100657Chris Craik      fake_fs.CreateDirectory(stale_dir)
1518576fd2a645575980f16b6731dab0f4f150100657Chris Craik      fake_fs.CreateFile(os.path.join(stale_dir, 'some_file'))
1519576fd2a645575980f16b6731dab0f4f150100657Chris Craik
1520576fd2a645575980f16b6731dab0f4f150100657Chris Craik    for dep_info in config.IterDependencyInfo():
1521576fd2a645575980f16b6731dab0f4f150100657Chris Craik      if dep_info.platform == 'all_the_variables':
1522576fd2a645575980f16b6731dab0f4f150100657Chris Craik        cs_info = dep_info.cloud_storage_info
1523576fd2a645575980f16b6731dab0f4f150100657Chris Craik        actual_glob = cs_info._archive_info._stale_unzip_path_glob
1524576fd2a645575980f16b6731dab0f4f150100657Chris Craik        actual_matches = set(fake_glob.glob(actual_glob))
1525576fd2a645575980f16b6731dab0f4f150100657Chris Craik        self.assertItemsEqual(should_match, actual_matches)
1526