1cef7893435aa41160dd1255c43cb8498279738ccChris Craik# Copyright 2016 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 Craikimport json 6cef7893435aa41160dd1255c43cb8498279738ccChris Craikimport os 7cef7893435aa41160dd1255c43cb8498279738ccChris Craik 8cef7893435aa41160dd1255c43cb8498279738ccChris Craikfrom pyfakefs import fake_filesystem_unittest 9cef7893435aa41160dd1255c43cb8498279738ccChris Craikfrom dependency_manager import exceptions 10cef7893435aa41160dd1255c43cb8498279738ccChris Craik 117332cdb42368a904cbf7418de329868989e592daChris Craikfrom py_utils import binary_manager 12cef7893435aa41160dd1255c43cb8498279738ccChris Craik 13cef7893435aa41160dd1255c43cb8498279738ccChris Craikclass BinaryManagerTest(fake_filesystem_unittest.TestCase): 14cef7893435aa41160dd1255c43cb8498279738ccChris Craik # TODO(aiolos): disable cloud storage use during this test. 15cef7893435aa41160dd1255c43cb8498279738ccChris Craik 16cef7893435aa41160dd1255c43cb8498279738ccChris Craik def setUp(self): 17cef7893435aa41160dd1255c43cb8498279738ccChris Craik self.setUpPyfakefs() 18cef7893435aa41160dd1255c43cb8498279738ccChris Craik # pylint: disable=bad-continuation 19cef7893435aa41160dd1255c43cb8498279738ccChris Craik self.expected_dependencies = { 20cef7893435aa41160dd1255c43cb8498279738ccChris Craik 'dep_1': { 21cef7893435aa41160dd1255c43cb8498279738ccChris Craik 'cloud_storage_base_folder': 'dependencies/fake_config', 22cef7893435aa41160dd1255c43cb8498279738ccChris Craik 'cloud_storage_bucket': 'chrome-tel', 23cef7893435aa41160dd1255c43cb8498279738ccChris Craik 'file_info': { 24cef7893435aa41160dd1255c43cb8498279738ccChris Craik 'linux_x86_64': { 25cef7893435aa41160dd1255c43cb8498279738ccChris Craik 'cloud_storage_hash': '661ce936b3276f7ec3d687ab62be05b96d796f21', 26cef7893435aa41160dd1255c43cb8498279738ccChris Craik 'download_path': 'bin/linux/x86_64/dep_1' 27cef7893435aa41160dd1255c43cb8498279738ccChris Craik }, 28cef7893435aa41160dd1255c43cb8498279738ccChris Craik 'mac_x86_64': { 29cef7893435aa41160dd1255c43cb8498279738ccChris Craik 'cloud_storage_hash': 'c7b1bfc6399dc683058e88dac1ef0f877edea74b', 30cef7893435aa41160dd1255c43cb8498279738ccChris Craik 'download_path': 'bin/mac/x86_64/dep_1' 31cef7893435aa41160dd1255c43cb8498279738ccChris Craik }, 32cef7893435aa41160dd1255c43cb8498279738ccChris Craik 'win_AMD64': { 33cef7893435aa41160dd1255c43cb8498279738ccChris Craik 'cloud_storage_hash': 'ac4fee89a51662b9d920bce443c19b9b2929b198', 34cef7893435aa41160dd1255c43cb8498279738ccChris Craik 'download_path': 'bin/win/AMD64/dep_1.exe' 35cef7893435aa41160dd1255c43cb8498279738ccChris Craik }, 36cef7893435aa41160dd1255c43cb8498279738ccChris Craik 'win_x86': { 37cef7893435aa41160dd1255c43cb8498279738ccChris Craik 'cloud_storage_hash': 'e246e183553ea26967d7b323ea269e3357b9c837', 38cef7893435aa41160dd1255c43cb8498279738ccChris Craik 'download_path': 'bin/win/x86/dep_1.exe' 39cef7893435aa41160dd1255c43cb8498279738ccChris Craik } 40cef7893435aa41160dd1255c43cb8498279738ccChris Craik } 41cef7893435aa41160dd1255c43cb8498279738ccChris Craik }, 42cef7893435aa41160dd1255c43cb8498279738ccChris Craik 'dep_2': { 43cef7893435aa41160dd1255c43cb8498279738ccChris Craik 'cloud_storage_base_folder': 'dependencies/fake_config', 44cef7893435aa41160dd1255c43cb8498279738ccChris Craik 'cloud_storage_bucket': 'chrome-tel', 45cef7893435aa41160dd1255c43cb8498279738ccChris Craik 'file_info': { 46cef7893435aa41160dd1255c43cb8498279738ccChris Craik 'linux_x86_64': { 47cef7893435aa41160dd1255c43cb8498279738ccChris Craik 'cloud_storage_hash': '13a57efae9a680ac0f160b3567e02e81f4ac493c', 48cef7893435aa41160dd1255c43cb8498279738ccChris Craik 'download_path': 'bin/linux/x86_64/dep_2', 49cef7893435aa41160dd1255c43cb8498279738ccChris Craik 'local_paths': [ 50cef7893435aa41160dd1255c43cb8498279738ccChris Craik '../../example/location/linux/dep_2', 51cef7893435aa41160dd1255c43cb8498279738ccChris Craik '../../example/location2/linux/dep_2' 52cef7893435aa41160dd1255c43cb8498279738ccChris Craik ] 53cef7893435aa41160dd1255c43cb8498279738ccChris Craik }, 54cef7893435aa41160dd1255c43cb8498279738ccChris Craik 'mac_x86_64': { 55cef7893435aa41160dd1255c43cb8498279738ccChris Craik 'cloud_storage_hash': 'd10c0ddaa8586b20449e951216bee852fa0f8850', 56cef7893435aa41160dd1255c43cb8498279738ccChris Craik 'download_path': 'bin/mac/x86_64/dep_2', 57cef7893435aa41160dd1255c43cb8498279738ccChris Craik 'local_paths': [ 58cef7893435aa41160dd1255c43cb8498279738ccChris Craik '../../example/location/mac/dep_2', 59cef7893435aa41160dd1255c43cb8498279738ccChris Craik '../../example/location2/mac/dep_2' 60cef7893435aa41160dd1255c43cb8498279738ccChris Craik ] 61cef7893435aa41160dd1255c43cb8498279738ccChris Craik }, 62cef7893435aa41160dd1255c43cb8498279738ccChris Craik 'win_AMD64': { 63cef7893435aa41160dd1255c43cb8498279738ccChris Craik 'cloud_storage_hash': 'fd5b417f78c7f7d9192a98967058709ded1d399d', 64cef7893435aa41160dd1255c43cb8498279738ccChris Craik 'download_path': 'bin/win/AMD64/dep_2.exe', 65cef7893435aa41160dd1255c43cb8498279738ccChris Craik 'local_paths': [ 66cef7893435aa41160dd1255c43cb8498279738ccChris Craik '../../example/location/win64/dep_2', 67cef7893435aa41160dd1255c43cb8498279738ccChris Craik '../../example/location2/win64/dep_2' 68cef7893435aa41160dd1255c43cb8498279738ccChris Craik ] 69cef7893435aa41160dd1255c43cb8498279738ccChris Craik }, 70cef7893435aa41160dd1255c43cb8498279738ccChris Craik 'win_x86': { 71cef7893435aa41160dd1255c43cb8498279738ccChris Craik 'cloud_storage_hash': 'cf5c8fe920378ce30d057e76591d57f63fd31c1a', 72cef7893435aa41160dd1255c43cb8498279738ccChris Craik 'download_path': 'bin/win/x86/dep_2.exe', 73cef7893435aa41160dd1255c43cb8498279738ccChris Craik 'local_paths': [ 74cef7893435aa41160dd1255c43cb8498279738ccChris Craik '../../example/location/win32/dep_2', 75cef7893435aa41160dd1255c43cb8498279738ccChris Craik '../../example/location2/win32/dep_2' 76cef7893435aa41160dd1255c43cb8498279738ccChris Craik ] 77cef7893435aa41160dd1255c43cb8498279738ccChris Craik }, 78cef7893435aa41160dd1255c43cb8498279738ccChris Craik 'android_k_x64': { 79cef7893435aa41160dd1255c43cb8498279738ccChris Craik 'cloud_storage_hash': '09177be2fed00b44df0e777932828425440b23b3', 80cef7893435aa41160dd1255c43cb8498279738ccChris Craik 'download_path': 'bin/android/x64/k/dep_2.apk', 81cef7893435aa41160dd1255c43cb8498279738ccChris Craik 'local_paths': [ 82cef7893435aa41160dd1255c43cb8498279738ccChris Craik '../../example/location/android_x64/k/dep_2', 83cef7893435aa41160dd1255c43cb8498279738ccChris Craik '../../example/location2/android_x64/k/dep_2' 84cef7893435aa41160dd1255c43cb8498279738ccChris Craik ] 85cef7893435aa41160dd1255c43cb8498279738ccChris Craik }, 86cef7893435aa41160dd1255c43cb8498279738ccChris Craik 'android_l_x64': { 87cef7893435aa41160dd1255c43cb8498279738ccChris Craik 'cloud_storage_hash': '09177be2fed00b44df0e777932828425440b23b3', 88cef7893435aa41160dd1255c43cb8498279738ccChris Craik 'download_path': 'bin/android/x64/l/dep_2.apk', 89cef7893435aa41160dd1255c43cb8498279738ccChris Craik 'local_paths': [ 90cef7893435aa41160dd1255c43cb8498279738ccChris Craik '../../example/location/android_x64/l/dep_2', 91cef7893435aa41160dd1255c43cb8498279738ccChris Craik '../../example/location2/android_x64/l/dep_2' 92cef7893435aa41160dd1255c43cb8498279738ccChris Craik ] 93cef7893435aa41160dd1255c43cb8498279738ccChris Craik }, 94cef7893435aa41160dd1255c43cb8498279738ccChris Craik 'android_k_x86': { 95cef7893435aa41160dd1255c43cb8498279738ccChris Craik 'cloud_storage_hash': 'bcf02af039713a48b69b89bd7f0f9c81ed8183a4', 96cef7893435aa41160dd1255c43cb8498279738ccChris Craik 'download_path': 'bin/android/x86/k/dep_2.apk', 97cef7893435aa41160dd1255c43cb8498279738ccChris Craik 'local_paths': [ 98cef7893435aa41160dd1255c43cb8498279738ccChris Craik '../../example/location/android_x86/k/dep_2', 99cef7893435aa41160dd1255c43cb8498279738ccChris Craik '../../example/location2/android_x86/k/dep_2' 100cef7893435aa41160dd1255c43cb8498279738ccChris Craik ] 101cef7893435aa41160dd1255c43cb8498279738ccChris Craik }, 102cef7893435aa41160dd1255c43cb8498279738ccChris Craik 'android_l_x86': { 103cef7893435aa41160dd1255c43cb8498279738ccChris Craik 'cloud_storage_hash': '12a74cec071017ba11655b5740b8a58e2f52a219', 104cef7893435aa41160dd1255c43cb8498279738ccChris Craik 'download_path': 'bin/android/x86/l/dep_2.apk', 105cef7893435aa41160dd1255c43cb8498279738ccChris Craik 'local_paths': [ 106cef7893435aa41160dd1255c43cb8498279738ccChris Craik '../../example/location/android_x86/l/dep_2', 107cef7893435aa41160dd1255c43cb8498279738ccChris Craik '../../example/location2/android_x86/l/dep_2' 108cef7893435aa41160dd1255c43cb8498279738ccChris Craik ] 109cef7893435aa41160dd1255c43cb8498279738ccChris Craik } 110cef7893435aa41160dd1255c43cb8498279738ccChris Craik } 111cef7893435aa41160dd1255c43cb8498279738ccChris Craik }, 112cef7893435aa41160dd1255c43cb8498279738ccChris Craik 'dep_3': { 113cef7893435aa41160dd1255c43cb8498279738ccChris Craik 'file_info': { 114cef7893435aa41160dd1255c43cb8498279738ccChris Craik 'linux_x86_64': { 115cef7893435aa41160dd1255c43cb8498279738ccChris Craik 'local_paths': [ 116cef7893435aa41160dd1255c43cb8498279738ccChris Craik '../../example/location/linux/dep_3', 117cef7893435aa41160dd1255c43cb8498279738ccChris Craik '../../example/location2/linux/dep_3' 118cef7893435aa41160dd1255c43cb8498279738ccChris Craik ] 119cef7893435aa41160dd1255c43cb8498279738ccChris Craik }, 120cef7893435aa41160dd1255c43cb8498279738ccChris Craik 'mac_x86_64': { 121cef7893435aa41160dd1255c43cb8498279738ccChris Craik 'local_paths': [ 122cef7893435aa41160dd1255c43cb8498279738ccChris Craik '../../example/location/mac/dep_3', 123cef7893435aa41160dd1255c43cb8498279738ccChris Craik '../../example/location2/mac/dep_3' 124cef7893435aa41160dd1255c43cb8498279738ccChris Craik ] 125cef7893435aa41160dd1255c43cb8498279738ccChris Craik }, 126cef7893435aa41160dd1255c43cb8498279738ccChris Craik 'win_AMD64': { 127cef7893435aa41160dd1255c43cb8498279738ccChris Craik 'local_paths': [ 128cef7893435aa41160dd1255c43cb8498279738ccChris Craik '../../example/location/win64/dep_3', 129cef7893435aa41160dd1255c43cb8498279738ccChris Craik '../../example/location2/win64/dep_3' 130cef7893435aa41160dd1255c43cb8498279738ccChris Craik ] 131cef7893435aa41160dd1255c43cb8498279738ccChris Craik }, 132cef7893435aa41160dd1255c43cb8498279738ccChris Craik 'win_x86': { 133cef7893435aa41160dd1255c43cb8498279738ccChris Craik 'local_paths': [ 134cef7893435aa41160dd1255c43cb8498279738ccChris Craik '../../example/location/win32/dep_3', 135cef7893435aa41160dd1255c43cb8498279738ccChris Craik '../../example/location2/win32/dep_3' 136cef7893435aa41160dd1255c43cb8498279738ccChris Craik ] 137cef7893435aa41160dd1255c43cb8498279738ccChris Craik } 138cef7893435aa41160dd1255c43cb8498279738ccChris Craik } 139cef7893435aa41160dd1255c43cb8498279738ccChris Craik } 140cef7893435aa41160dd1255c43cb8498279738ccChris Craik } 141cef7893435aa41160dd1255c43cb8498279738ccChris Craik # pylint: enable=bad-continuation 142cef7893435aa41160dd1255c43cb8498279738ccChris Craik fake_config = { 143cef7893435aa41160dd1255c43cb8498279738ccChris Craik 'config_type': 'BaseConfig', 144cef7893435aa41160dd1255c43cb8498279738ccChris Craik 'dependencies': self.expected_dependencies 145cef7893435aa41160dd1255c43cb8498279738ccChris Craik } 146cef7893435aa41160dd1255c43cb8498279738ccChris Craik 14747f0f1e200da8a481462f364f822c98fe1b1cd5bChris Craik self.base_config = os.path.join(os.path.dirname(__file__), 148cef7893435aa41160dd1255c43cb8498279738ccChris Craik 'example_config.json') 14947f0f1e200da8a481462f364f822c98fe1b1cd5bChris Craik self.fs.CreateFile(self.base_config, contents=json.dumps(fake_config)) 150cef7893435aa41160dd1255c43cb8498279738ccChris Craik linux_file = os.path.join( 15147f0f1e200da8a481462f364f822c98fe1b1cd5bChris Craik os.path.dirname(self.base_config), 152cef7893435aa41160dd1255c43cb8498279738ccChris Craik os.path.join('..', '..', 'example', 'location2', 'linux', 'dep_2')) 153cef7893435aa41160dd1255c43cb8498279738ccChris Craik android_file = os.path.join( 15447f0f1e200da8a481462f364f822c98fe1b1cd5bChris Craik os.path.dirname(self.base_config), 155cef7893435aa41160dd1255c43cb8498279738ccChris Craik '..', '..', 'example', 'location', 'android_x86', 'l', 'dep_2') 156cef7893435aa41160dd1255c43cb8498279738ccChris Craik self.expected_dep2_linux_file = os.path.abspath(linux_file) 157cef7893435aa41160dd1255c43cb8498279738ccChris Craik self.expected_dep2_android_file = os.path.abspath(android_file) 158cef7893435aa41160dd1255c43cb8498279738ccChris Craik self.fs.CreateFile(self.expected_dep2_linux_file) 159cef7893435aa41160dd1255c43cb8498279738ccChris Craik self.fs.CreateFile(self.expected_dep2_android_file) 160cef7893435aa41160dd1255c43cb8498279738ccChris Craik 161cef7893435aa41160dd1255c43cb8498279738ccChris Craik def tearDown(self): 162cef7893435aa41160dd1255c43cb8498279738ccChris Craik self.tearDownPyfakefs() 163cef7893435aa41160dd1255c43cb8498279738ccChris Craik 164cef7893435aa41160dd1255c43cb8498279738ccChris Craik def testInitializationNoConfig(self): 165cef7893435aa41160dd1255c43cb8498279738ccChris Craik with self.assertRaises(ValueError): 166cef7893435aa41160dd1255c43cb8498279738ccChris Craik binary_manager.BinaryManager(None) 167cef7893435aa41160dd1255c43cb8498279738ccChris Craik 168cef7893435aa41160dd1255c43cb8498279738ccChris Craik def testInitializationMissingConfig(self): 169cef7893435aa41160dd1255c43cb8498279738ccChris Craik with self.assertRaises(ValueError): 170cef7893435aa41160dd1255c43cb8498279738ccChris Craik binary_manager.BinaryManager(os.path.join('missing', 'path')) 171cef7893435aa41160dd1255c43cb8498279738ccChris Craik 172cef7893435aa41160dd1255c43cb8498279738ccChris Craik def testInitializationWithConfig(self): 173cef7893435aa41160dd1255c43cb8498279738ccChris Craik with self.assertRaises(ValueError): 174cef7893435aa41160dd1255c43cb8498279738ccChris Craik manager = binary_manager.BinaryManager(self.base_config) 175cef7893435aa41160dd1255c43cb8498279738ccChris Craik manager = binary_manager.BinaryManager([self.base_config]) 176cef7893435aa41160dd1255c43cb8498279738ccChris Craik self.assertItemsEqual(self.expected_dependencies, 177cef7893435aa41160dd1255c43cb8498279738ccChris Craik manager._dependency_manager._lookup_dict) 178cef7893435aa41160dd1255c43cb8498279738ccChris Craik 179cef7893435aa41160dd1255c43cb8498279738ccChris Craik def testSuccessfulFetchPathNoOsVersion(self): 180cef7893435aa41160dd1255c43cb8498279738ccChris Craik manager = binary_manager.BinaryManager([self.base_config]) 18147f0f1e200da8a481462f364f822c98fe1b1cd5bChris Craik found_path = manager.FetchPath('dep_2', 'linux', 'x86_64') 182cef7893435aa41160dd1255c43cb8498279738ccChris Craik self.assertEqual(self.expected_dep2_linux_file, found_path) 183cef7893435aa41160dd1255c43cb8498279738ccChris Craik 184cef7893435aa41160dd1255c43cb8498279738ccChris Craik def testSuccessfulFetchPathOsVersion(self): 185cef7893435aa41160dd1255c43cb8498279738ccChris Craik manager = binary_manager.BinaryManager([self.base_config]) 18647f0f1e200da8a481462f364f822c98fe1b1cd5bChris Craik found_path = manager.FetchPath('dep_2', 'android', 'x86', 'l') 187cef7893435aa41160dd1255c43cb8498279738ccChris Craik self.assertEqual(self.expected_dep2_android_file, found_path) 188cef7893435aa41160dd1255c43cb8498279738ccChris Craik 189cef7893435aa41160dd1255c43cb8498279738ccChris Craik def testSuccessfulFetchPathFallbackToNoOsVersion(self): 190cef7893435aa41160dd1255c43cb8498279738ccChris Craik manager = binary_manager.BinaryManager([self.base_config]) 19147f0f1e200da8a481462f364f822c98fe1b1cd5bChris Craik found_path = manager.FetchPath('dep_2', 'linux', 'x86_64', 'fake_version') 192cef7893435aa41160dd1255c43cb8498279738ccChris Craik self.assertEqual(self.expected_dep2_linux_file, found_path) 193cef7893435aa41160dd1255c43cb8498279738ccChris Craik 194cef7893435aa41160dd1255c43cb8498279738ccChris Craik def testFailedFetchPathMissingDep(self): 195cef7893435aa41160dd1255c43cb8498279738ccChris Craik manager = binary_manager.BinaryManager([self.base_config]) 196cef7893435aa41160dd1255c43cb8498279738ccChris Craik with self.assertRaises(exceptions.NoPathFoundError): 19747f0f1e200da8a481462f364f822c98fe1b1cd5bChris Craik manager.FetchPath('missing_dep', 'linux', 'x86_64') 198cef7893435aa41160dd1255c43cb8498279738ccChris Craik with self.assertRaises(exceptions.NoPathFoundError): 19947f0f1e200da8a481462f364f822c98fe1b1cd5bChris Craik manager.FetchPath('missing_dep', 'android', 'x86', 'l') 200cef7893435aa41160dd1255c43cb8498279738ccChris Craik with self.assertRaises(exceptions.NoPathFoundError): 20147f0f1e200da8a481462f364f822c98fe1b1cd5bChris Craik manager.FetchPath('dep_1', 'linux', 'bad_arch') 202cef7893435aa41160dd1255c43cb8498279738ccChris Craik with self.assertRaises(exceptions.NoPathFoundError): 20347f0f1e200da8a481462f364f822c98fe1b1cd5bChris Craik manager.FetchPath('dep_1', 'bad_os', 'x86') 204cef7893435aa41160dd1255c43cb8498279738ccChris Craik 205cef7893435aa41160dd1255c43cb8498279738ccChris Craik def testSuccessfulLocalPathNoOsVersion(self): 206cef7893435aa41160dd1255c43cb8498279738ccChris Craik manager = binary_manager.BinaryManager([self.base_config]) 20747f0f1e200da8a481462f364f822c98fe1b1cd5bChris Craik found_path = manager.LocalPath('dep_2', 'linux', 'x86_64') 208cef7893435aa41160dd1255c43cb8498279738ccChris Craik self.assertEqual(self.expected_dep2_linux_file, found_path) 209cef7893435aa41160dd1255c43cb8498279738ccChris Craik 210cef7893435aa41160dd1255c43cb8498279738ccChris Craik def testSuccessfulLocalPathOsVersion(self): 211cef7893435aa41160dd1255c43cb8498279738ccChris Craik manager = binary_manager.BinaryManager([self.base_config]) 21247f0f1e200da8a481462f364f822c98fe1b1cd5bChris Craik found_path = manager.LocalPath('dep_2', 'android', 'x86', 'l') 213cef7893435aa41160dd1255c43cb8498279738ccChris Craik self.assertEqual(self.expected_dep2_android_file, found_path) 214cef7893435aa41160dd1255c43cb8498279738ccChris Craik 215