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