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