def test_variable_not_exist(self): isolate_file = os.path.join( ROOT_DIR, 'tests', 'isolate', 'touch_root.isolate') options = self._get_option(isolate_file) options.path_variables['PRODUCT_DIR'] = os.path.join(u'tests', u'isolate') native_cwd = file_path.get_native_path_case(unicode(self.cwd)) try: isolate.load_complete_state(options, self.cwd, None, False) self.fail() except isolate.ExecutionError, e: self.assertEqual( 'PRODUCT_DIR=%s is not a directory' % os.path.join(native_cwd, 'tests', 'isolate'), e.args[0])
def test_subdir_variable(self): # The resulting .isolated file will be missing ../../isolate.py. It is # because this file is outside the --subdir parameter. isolate_file = os.path.join( ROOT_DIR, 'tests', 'isolate', 'touch_root.isolate') options = self._get_option(isolate_file) options.variables['BAZ'] = os.path.join('tests', 'isolate') complete_state = isolate.load_complete_state(options, '<(BAZ)') actual_isolated = complete_state.isolated.flatten() actual_saved_state = complete_state.saved_state.flatten() expected_isolated = { 'command': ['python', 'touch_root.py'], 'files': { os.path.join('tests', 'isolate', 'touch_root.py'): { 'm': 488, 'h': _sha1('tests', 'isolate', 'touch_root.py'), 's': _size('tests', 'isolate', 'touch_root.py'), }, }, 'os': isolate.get_flavor(), 'relative_cwd': os.path.join('tests', 'isolate'), } self._cleanup_isolated(expected_isolated, actual_isolated) self.assertEqual(expected_isolated, actual_isolated) expected_saved_state = { 'isolate_file': isolate_file, 'variables': { 'foo': 'bar', 'BAZ': os.path.join('tests', 'isolate'), }, } self.assertEqual(expected_saved_state, actual_saved_state)
def test_subdir(self): # The resulting .isolated file will be missing ../../isolate.py. It is # because this file is outside the --subdir parameter. isolate_file = os.path.join( ROOT_DIR, 'tests', 'isolate', 'touch_root.isolate') options = self._get_option(isolate_file) chromeos_value = int(isolate.get_flavor() == 'linux') options.config_variables['chromeos'] = chromeos_value complete_state = isolate.load_complete_state( options, self.cwd, os.path.join('tests', 'isolate'), False) actual_isolated = complete_state.saved_state.to_isolated() actual_saved_state = complete_state.saved_state.flatten() expected_isolated = { 'algo': 'sha-1', 'command': ['python', 'touch_root.py'], 'files': { os.path.join(u'tests', 'isolate', 'touch_root.py'): { 'm': 488, 'h': hash_file('tests', 'isolate', 'touch_root.py'), 's': _size('tests', 'isolate', 'touch_root.py'), }, }, 'os': isolate.get_flavor(), 'relative_cwd': os.path.join(u'tests', 'isolate'), 'version': isolate.isolateserver.ISOLATED_FILE_VERSION, } self._cleanup_isolated(expected_isolated) self.assertEqual(expected_isolated, actual_isolated) expected_saved_state = { 'algo': 'sha-1', 'child_isolated_files': [], 'command': ['python', 'touch_root.py'], 'config_variables': { 'OS': isolate.get_flavor(), 'chromeos': chromeos_value, }, 'extra_variables': { 'foo': 'bar', }, 'files': { os.path.join(u'tests', 'isolate', 'touch_root.py'): { 'm': 488, 'h': hash_file('tests', 'isolate', 'touch_root.py'), 's': _size('tests', 'isolate', 'touch_root.py'), }, }, 'isolate_file': file_path.safe_relpath( file_path.get_native_path_case(isolate_file), os.path.dirname(options.isolated)), 'relative_cwd': os.path.join(u'tests', 'isolate'), 'path_variables': {}, 'version': isolate.isolateserver.ISOLATED_FILE_VERSION, } self._cleanup_isolated(expected_saved_state) self._cleanup_saved_state(actual_saved_state) self.assertEqual(expected_saved_state, actual_saved_state)
def test_subdir(self): # The resulting .isolated file will be missing ../../isolate.py. It is # because this file is outside the --subdir parameter. isolate_file = os.path.join( ROOT_DIR, 'tests', 'isolate', 'touch_root.isolate') options = self._get_option(isolate_file) complete_state = isolate.load_complete_state( options, self.cwd, os.path.join('tests', 'isolate'), False) actual_isolated = complete_state.saved_state.to_isolated() actual_saved_state = complete_state.saved_state.flatten() expected_isolated = { 'algo': 'sha-1', 'command': ['python', 'touch_root.py'], 'files': { os.path.join(u'tests', 'isolate', 'touch_root.py'): { 'm': 488, 'h': hash_file('tests', 'isolate', 'touch_root.py'), 's': _size('tests', 'isolate', 'touch_root.py'), }, }, 'relative_cwd': os.path.join(u'tests', 'isolate'), 'version': isolate.isolateserver.ISOLATED_FILE_VERSION, } self._cleanup_isolated(expected_isolated) self.assertEqual(expected_isolated, actual_isolated) expected_saved_state = { 'OS': sys.platform, 'algo': 'sha-1', 'child_isolated_files': [], 'command': ['python', 'touch_root.py'], 'config_variables': { 'OS': 'linux', 'chromeos': 1, }, 'extra_variables': { 'foo': 'bar', }, 'files': { os.path.join(u'tests', 'isolate', 'touch_root.py'): { 'm': 488, 'h': hash_file('tests', 'isolate', 'touch_root.py'), 's': _size('tests', 'isolate', 'touch_root.py'), }, }, 'isolate_file': file_path.safe_relpath( file_path.get_native_path_case(isolate_file), os.path.dirname(options.isolated)), 'path_variables': {}, 'relative_cwd': os.path.join(u'tests', 'isolate'), 'root_dir': file_path.get_native_path_case(ROOT_DIR), 'version': isolate.SavedState.EXPECTED_VERSION, } self._cleanup_isolated(expected_saved_state) self._cleanup_saved_state(actual_saved_state) self.assertEqual(expected_saved_state, actual_saved_state)
def test_subdir_variable(self): # The resulting .isolated file will be missing ../../isolate.py. It is # because this file is outside the --subdir parameter. isolate_file = os.path.join( ROOT_DIR, 'tests', 'isolate', 'touch_root.isolate') options = self._get_option(isolate_file) chromeos_value = int(isolate.get_flavor() == 'linux') options.variables['chromeos'] = chromeos_value options.variables['BAZ'] = os.path.join('tests', 'isolate') complete_state = isolate.load_complete_state( options, self.cwd, '<(BAZ)', False) actual_isolated = complete_state.saved_state.to_isolated() actual_saved_state = complete_state.saved_state.flatten() expected_isolated = { 'command': ['python', 'touch_root.py'], 'files': { os.path.join('tests', 'isolate', 'touch_root.py'): { 'm': 488, 'h': _sha1('tests', 'isolate', 'touch_root.py'), 's': _size('tests', 'isolate', 'touch_root.py'), }, }, 'os': isolate.get_flavor(), 'relative_cwd': os.path.join('tests', 'isolate'), } self._cleanup_isolated(expected_isolated) self.assertEqual(expected_isolated, actual_isolated) expected_saved_state = { 'child_isolated_files': [], 'command': ['python', 'touch_root.py'], 'files': { os.path.join(u'tests', 'isolate', 'touch_root.py'): { 'm': 488, 'h': _sha1('tests', 'isolate', 'touch_root.py'), 's': _size('tests', 'isolate', 'touch_root.py'), }, }, 'isolate_file': isolate.safe_relpath( isolate.trace_inputs.get_native_path_case(isolate_file), os.path.dirname(options.isolated)), 'relative_cwd': os.path.join(u'tests', 'isolate'), 'variables': { 'foo': 'bar', 'BAZ': os.path.join('tests', 'isolate'), 'OS': isolate.get_flavor(), 'chromeos': chromeos_value, }, } self._cleanup_isolated(expected_saved_state) self._cleanup_saved_state(actual_saved_state) self.assertEqual(expected_saved_state, actual_saved_state)
def test_chromium_split(self): # Create an .isolate file and a tree of random stuff. isolate_file = os.path.join( ROOT_DIR, 'tests', 'isolate', 'split.isolate') options = self._get_option(isolate_file) options.path_variables = { 'DEPTH': '.', 'PRODUCT_DIR': os.path.join('files1'), } options.config_variables = { 'OS': 'linux', } complete_state = isolate.load_complete_state( options, os.path.join(ROOT_DIR, 'tests', 'isolate'), None, False) # By saving the files, it forces splitting the data up. complete_state.save_files() actual_isolated_master = tools.read_json( os.path.join(self.directory, 'foo.isolated')) expected_isolated_master = { u'algo': u'sha-1', u'command': [u'python', u'split.py'], u'files': { u'split.py': { u'm': 488, u'h': unicode(hash_file('tests', 'isolate', 'split.py')), u's': _size('tests', 'isolate', 'split.py'), }, }, u'includes': [ unicode(hash_file(os.path.join(self.directory, 'foo.0.isolated'))), unicode(hash_file(os.path.join(self.directory, 'foo.1.isolated'))), ], u'relative_cwd': u'.', u'version': unicode(isolate.isolateserver.ISOLATED_FILE_VERSION), } self._cleanup_isolated(expected_isolated_master) self.assertEqual(expected_isolated_master, actual_isolated_master) actual_isolated_0 = tools.read_json( os.path.join(self.directory, 'foo.0.isolated')) expected_isolated_0 = { u'algo': u'sha-1', u'files': { os.path.join(u'test', 'data', 'foo.txt'): { u'm': 416, u'h': unicode( hash_file('tests', 'isolate', 'test', 'data', 'foo.txt')), u's': _size('tests', 'isolate', 'test', 'data', 'foo.txt'), }, }, u'version': unicode(isolate.isolateserver.ISOLATED_FILE_VERSION), } self._cleanup_isolated(expected_isolated_0) self.assertEqual(expected_isolated_0, actual_isolated_0) actual_isolated_1 = tools.read_json( os.path.join(self.directory, 'foo.1.isolated')) expected_isolated_1 = { u'algo': u'sha-1', u'files': { os.path.join(u'files1', 'subdir', '42.txt'): { u'm': 416, u'h': unicode( hash_file('tests', 'isolate', 'files1', 'subdir', '42.txt')), u's': _size('tests', 'isolate', 'files1', 'subdir', '42.txt'), }, }, u'version': unicode(isolate.isolateserver.ISOLATED_FILE_VERSION), } self._cleanup_isolated(expected_isolated_1) self.assertEqual(expected_isolated_1, actual_isolated_1) actual_saved_state = tools.read_json( isolate.isolatedfile_to_state(options.isolated)) isolated_base = unicode(os.path.basename(options.isolated)) expected_saved_state = { u'OS': unicode(sys.platform), u'algo': u'sha-1', u'child_isolated_files': [ isolated_base[:-len('.isolated')] + '.0.isolated', isolated_base[:-len('.isolated')] + '.1.isolated', ], u'command': [u'python', u'split.py'], u'config_variables': { u'OS': u'linux', }, u'extra_variables': { u'foo': u'bar', }, u'files': { os.path.join(u'files1', 'subdir', '42.txt'): { u'm': 416, u'h': unicode( hash_file('tests', 'isolate', 'files1', 'subdir', '42.txt')), u's': _size('tests', 'isolate', 'files1', 'subdir', '42.txt'), }, u'split.py': { u'm': 488, u'h': unicode(hash_file('tests', 'isolate', 'split.py')), u's': _size('tests', 'isolate', 'split.py'), }, os.path.join(u'test', 'data', 'foo.txt'): { u'm': 416, u'h': unicode( hash_file('tests', 'isolate', 'test', 'data', 'foo.txt')), u's': _size('tests', 'isolate', 'test', 'data', 'foo.txt'), }, }, u'isolate_file': file_path.safe_relpath( file_path.get_native_path_case(isolate_file), unicode(os.path.dirname(options.isolated))), u'path_variables': { u'DEPTH': u'.', u'PRODUCT_DIR': u'files1', }, u'relative_cwd': u'.', u'root_dir': file_path.get_native_path_case( os.path.dirname(isolate_file)), u'version': unicode(isolate.SavedState.EXPECTED_VERSION), } self._cleanup_isolated(expected_saved_state) self._cleanup_saved_state(actual_saved_state) self.assertEqual(expected_saved_state, actual_saved_state) self.assertEqual( [ 'foo.0.isolated', 'foo.1.isolated', 'foo.isolated', 'foo.isolated.state', ], sorted(os.listdir(self.directory)))
def test_subdir_variable(self): # the resulting .isolated file will be missing ../../isolate.py. it is # because this file is outside the --subdir parameter. isolate_file = os.path.join( ROOT_DIR, 'tests', 'isolate', 'touch_root.isolate') options = self._get_option(isolate_file) # Path variables are keyed on the directory containing the .isolate file. options.path_variables['TEST_ISOLATE'] = '.' # Note that options.isolated is in self.directory, which is a temporary # directory. complete_state = isolate.load_complete_state( options, os.path.join(ROOT_DIR, 'tests', 'isolate'), '<(TEST_ISOLATE)', False) actual_isolated = complete_state.saved_state.to_isolated() actual_saved_state = complete_state.saved_state.flatten() expected_isolated = { 'algo': 'sha-1', 'command': ['python', 'touch_root.py'], 'files': { os.path.join('tests', 'isolate', 'touch_root.py'): { 'm': 488, 'h': hash_file('tests', 'isolate', 'touch_root.py'), 's': _size('tests', 'isolate', 'touch_root.py'), }, }, 'relative_cwd': os.path.join(u'tests', 'isolate'), 'version': isolate.isolateserver.ISOLATED_FILE_VERSION, } self._cleanup_isolated(expected_isolated) self.assertEqual(expected_isolated, actual_isolated) # It is important to note: # - the root directory is ROOT_DIR. # - relative_cwd is tests/isolate. # - TEST_ISOLATE is based of relative_cwd, so it represents tests/isolate. # - anything outside TEST_ISOLATE was not included in the 'files' section. expected_saved_state = { 'OS': sys.platform, 'algo': 'sha-1', 'child_isolated_files': [], 'command': ['python', 'touch_root.py'], 'config_variables': { 'OS': 'linux', 'chromeos': 1, }, 'extra_variables': { 'foo': 'bar', }, 'files': { os.path.join(u'tests', 'isolate', 'touch_root.py'): { 'm': 488, 'h': hash_file('tests', 'isolate', 'touch_root.py'), 's': _size('tests', 'isolate', 'touch_root.py'), }, }, 'isolate_file': file_path.safe_relpath( file_path.get_native_path_case(isolate_file), os.path.dirname(options.isolated)), 'path_variables': { 'TEST_ISOLATE': '.', }, 'relative_cwd': os.path.join(u'tests', 'isolate'), 'root_dir': file_path.get_native_path_case(ROOT_DIR), 'version': isolate.SavedState.EXPECTED_VERSION, } self._cleanup_isolated(expected_saved_state) self._cleanup_saved_state(actual_saved_state) self.assertEqual(expected_saved_state, actual_saved_state)
def test_load_stale_isolated(self): isolate_file = os.path.join( ROOT_DIR, 'tests', 'isolate', 'touch_root.isolate') # Data to be loaded in the .isolated file. Do not create a .state file. input_data = { 'command': ['python'], 'files': { 'foo': { "m": 416, "h": "invalid", "s": 538, "t": 1335146921, }, os.path.join('tests', 'isolate', 'touch_root.py'): { "m": 488, "h": "invalid", "s": 538, "t": 1335146921, }, }, } options = self._get_option(isolate_file) tools.write_json(options.isolated, input_data, False) # A CompleteState object contains two parts: # - Result instance stored in complete_state.isolated, corresponding to the # .isolated file, is what is read by run_test_from_archive.py. # - SavedState instance stored in compelte_state.saved_state, # corresponding to the .state file, which is simply to aid the developer # when re-running the same command multiple times and contain # discardable information. complete_state = isolate.load_complete_state(options, self.cwd, None, False) actual_isolated = complete_state.saved_state.to_isolated() actual_saved_state = complete_state.saved_state.flatten() expected_isolated = { 'algo': 'sha-1', 'command': ['python', 'touch_root.py'], 'files': { os.path.join(u'tests', 'isolate', 'touch_root.py'): { 'm': 488, 'h': hash_file('tests', 'isolate', 'touch_root.py'), 's': _size('tests', 'isolate', 'touch_root.py'), }, u'isolate.py': { 'm': 488, 'h': hash_file('isolate.py'), 's': _size('isolate.py'), }, }, 'relative_cwd': os.path.join(u'tests', 'isolate'), 'version': isolate.isolateserver.ISOLATED_FILE_VERSION, } self._cleanup_isolated(expected_isolated) self.assertEqual(expected_isolated, actual_isolated) expected_saved_state = { 'OS': sys.platform, 'algo': 'sha-1', 'child_isolated_files': [], 'command': ['python', 'touch_root.py'], 'config_variables': { 'OS': 'linux', 'chromeos': options.config_variables['chromeos'], }, 'extra_variables': { 'foo': 'bar', }, 'files': { os.path.join(u'tests', 'isolate', 'touch_root.py'): { 'm': 488, 'h': hash_file('tests', 'isolate', 'touch_root.py'), 's': _size('tests', 'isolate', 'touch_root.py'), }, u'isolate.py': { 'm': 488, 'h': hash_file('isolate.py'), 's': _size('isolate.py'), }, }, 'isolate_file': file_path.safe_relpath( file_path.get_native_path_case(isolate_file), os.path.dirname(options.isolated)), 'path_variables': {}, 'relative_cwd': os.path.join(u'tests', 'isolate'), 'root_dir': file_path.get_native_path_case(ROOT_DIR), 'version': isolate.SavedState.EXPECTED_VERSION, } self._cleanup_isolated(expected_saved_state) self._cleanup_saved_state(actual_saved_state) self.assertEqual(expected_saved_state, actual_saved_state)
def test_chromium_split(self): # Create an .isolate file and a tree of random stuff. isolate_file = os.path.join( ROOT_DIR, 'tests', 'isolate', 'split.isolate') options = self._get_option(isolate_file) options.variables = { 'OS': isolate.get_flavor(), 'DEPTH': '.', 'PRODUCT_DIR': os.path.join('files1'), } complete_state = isolate.load_complete_state( options, os.path.join(ROOT_DIR, 'tests', 'isolate'), None, False) # By saving the files, it forces splitting the data up. complete_state.save_files() actual_isolated_master = isolate.trace_inputs.read_json( os.path.join(self.directory, 'foo.isolated')) expected_isolated_master = { u'command': [u'python', u'split.py'], u'files': { u'split.py': { u'm': 488, u'h': unicode(_sha1('tests', 'isolate', 'split.py')), u's': _size('tests', 'isolate', 'split.py'), }, }, u'includes': [ unicode(_sha1(os.path.join(self.directory, 'foo.0.isolated'))), unicode(_sha1(os.path.join(self.directory, 'foo.1.isolated'))), ], u'os': unicode(isolate.get_flavor()), u'relative_cwd': u'.', } self._cleanup_isolated(expected_isolated_master) self.assertEqual(expected_isolated_master, actual_isolated_master) actual_isolated_0 = isolate.trace_inputs.read_json( os.path.join(self.directory, 'foo.0.isolated')) expected_isolated_0 = { u'files': { os.path.join(u'test', 'data', 'foo.txt'): { u'm': 416, u'h': unicode(_sha1('tests', 'isolate', 'test', 'data', 'foo.txt')), u's': _size('tests', 'isolate', 'test', 'data', 'foo.txt'), }, }, u'os': unicode(isolate.get_flavor()), } self._cleanup_isolated(expected_isolated_0) self.assertEqual(expected_isolated_0, actual_isolated_0) actual_isolated_1 = isolate.trace_inputs.read_json( os.path.join(self.directory, 'foo.1.isolated')) expected_isolated_1 = { u'files': { os.path.join(u'files1', 'subdir', '42.txt'): { u'm': 416, u'h': unicode( _sha1('tests', 'isolate', 'files1', 'subdir', '42.txt')), u's': _size('tests', 'isolate', 'files1', 'subdir', '42.txt'), }, }, u'os': unicode(isolate.get_flavor()), } self._cleanup_isolated(expected_isolated_1) self.assertEqual(expected_isolated_1, actual_isolated_1) actual_saved_state = isolate.trace_inputs.read_json( isolate.isolatedfile_to_state(options.isolated)) isolated_base = unicode(os.path.basename(options.isolated)) expected_saved_state = { u'child_isolated_files': [ isolated_base[:-len('.isolated')] + '.0.isolated', isolated_base[:-len('.isolated')] + '.1.isolated', ], u'command': [u'python', u'split.py'], u'files': { os.path.join(u'files1', 'subdir', '42.txt'): { u'm': 416, u'h': unicode( _sha1('tests', 'isolate', 'files1', 'subdir', '42.txt')), u's': _size('tests', 'isolate', 'files1', 'subdir', '42.txt'), }, u'split.py': { u'm': 488, u'h': unicode(_sha1('tests', 'isolate', 'split.py')), u's': _size('tests', 'isolate', 'split.py'), }, os.path.join(u'test', 'data', 'foo.txt'): { u'm': 416, u'h': unicode(_sha1('tests', 'isolate', 'test', 'data', 'foo.txt')), u's': _size('tests', 'isolate', 'test', 'data', 'foo.txt'), }, }, u'isolate_file': isolate.safe_relpath( isolate.trace_inputs.get_native_path_case(isolate_file), unicode(os.path.dirname(options.isolated))), u'relative_cwd': u'.', u'variables': { u'OS': unicode(isolate.get_flavor()), u'DEPTH': u'.', u'PRODUCT_DIR': u'files1', }, } self._cleanup_isolated(expected_saved_state) self._cleanup_saved_state(actual_saved_state) self.assertEqual(expected_saved_state, actual_saved_state) self.assertEqual( [ 'foo.0.isolated', 'foo.1.isolated', 'foo.isolated', 'foo.isolated.state', ], sorted(os.listdir(self.directory)))
def test_variable(self): isolate_file = os.path.join( ROOT_DIR, 'tests', 'isolate', 'touch_root.isolate') options = self._get_option(isolate_file) chromeos_value = int(isolate.get_flavor() == 'linux') options.variables['chromeos'] = chromeos_value options.variables['PRODUCT_DIR'] = os.path.join('tests', 'isolate') complete_state = isolate.load_complete_state(options, ROOT_DIR, None, False) actual_isolated = complete_state.saved_state.to_isolated() actual_saved_state = complete_state.saved_state.flatten() expected_isolated = { 'command': ['python', 'touch_root.py'], 'files': { 'isolate.py': { 'm': 488, 'h': _sha1('isolate.py'), 's': _size('isolate.py'), }, os.path.join('tests', 'isolate', 'touch_root.py'): { 'm': 488, 'h': _sha1('tests', 'isolate', 'touch_root.py'), 's': _size('tests', 'isolate', 'touch_root.py'), }, }, 'os': isolate.get_flavor(), 'relative_cwd': os.path.join('tests', 'isolate'), } self._cleanup_isolated(expected_isolated) self.assertEqual(expected_isolated, actual_isolated) expected_saved_state = { 'child_isolated_files': [], 'command': ['python', 'touch_root.py'], 'files': { u'isolate.py': { 'm': 488, 'h': _sha1('isolate.py'), 's': _size('isolate.py'), }, os.path.join(u'tests', 'isolate', 'touch_root.py'): { 'm': 488, 'h': _sha1('tests', 'isolate', 'touch_root.py'), 's': _size('tests', 'isolate', 'touch_root.py'), }, }, 'isolate_file': isolate.safe_relpath( isolate.trace_inputs.get_native_path_case(isolate_file), os.path.dirname(options.isolated)), 'relative_cwd': os.path.join(u'tests', 'isolate'), 'variables': { 'foo': 'bar', 'PRODUCT_DIR': '.', 'OS': isolate.get_flavor(), 'chromeos': chromeos_value, }, } self._cleanup_isolated(expected_saved_state) self._cleanup_saved_state(actual_saved_state) self.assertEqual(expected_saved_state, actual_saved_state) self.assertEqual([], os.listdir(self.directory))
def test_variable(self): isolate_file = os.path.join( ROOT_DIR, 'tests', 'isolate', 'touch_root.isolate') options = self._get_option(isolate_file) options.path_variables['PRODUCT_DIR'] = os.path.join('tests', 'isolate') complete_state = isolate.load_complete_state(options, ROOT_DIR, None, False) actual_isolated = complete_state.saved_state.to_isolated() actual_saved_state = complete_state.saved_state.flatten() expected_isolated = { 'algo': 'sha-1', 'command': ['python', 'touch_root.py'], 'files': { u'isolate.py': { 'm': 488, 'h': hash_file('isolate.py'), 's': _size('isolate.py'), }, os.path.join(u'tests', 'isolate', 'touch_root.py'): { 'm': 488, 'h': hash_file('tests', 'isolate', 'touch_root.py'), 's': _size('tests', 'isolate', 'touch_root.py'), }, }, 'relative_cwd': os.path.join(u'tests', 'isolate'), 'version': isolate.isolateserver.ISOLATED_FILE_VERSION, } self._cleanup_isolated(expected_isolated) self.assertEqual(expected_isolated, actual_isolated) expected_saved_state = { 'OS': sys.platform, 'algo': 'sha-1', 'child_isolated_files': [], 'command': ['python', 'touch_root.py'], 'config_variables': { 'OS': 'linux', 'chromeos': 1, }, 'extra_variables': { 'foo': 'bar', }, 'files': { u'isolate.py': { 'm': 488, 'h': hash_file('isolate.py'), 's': _size('isolate.py'), }, os.path.join(u'tests', 'isolate', 'touch_root.py'): { 'm': 488, 'h': hash_file('tests', 'isolate', 'touch_root.py'), 's': _size('tests', 'isolate', 'touch_root.py'), }, }, 'isolate_file': file_path.safe_relpath( file_path.get_native_path_case(isolate_file), os.path.dirname(options.isolated)), 'path_variables': { 'PRODUCT_DIR': '.', }, 'relative_cwd': os.path.join(u'tests', 'isolate'), 'root_dir': file_path.get_native_path_case(ROOT_DIR), 'version': isolate.SavedState.EXPECTED_VERSION, } self._cleanup_isolated(expected_saved_state) self._cleanup_saved_state(actual_saved_state) self.assertEqual(expected_saved_state, actual_saved_state) self.assertEqual([], os.listdir(self.directory))
def test_root_dir_because_of_variable(self): # Ensures that load_isolate() works even when path variables have deep root # dirs. The end result is similar to touch_root.isolate, except that # no_run.isolate doesn't reference '..' at all. # # A real world example would be PRODUCT_DIR=../../out/Release but nothing in # this directory is mapped. # # Imagine base/base_unittests.isolate would not map anything in # PRODUCT_DIR. In that case, the automatically determined root dir is # src/base, since nothing outside this directory is mapped. isolate_file = os.path.join( ROOT_DIR, 'tests', 'isolate', 'no_run.isolate') options = self._get_option(isolate_file) # Any directory outside ROOT_DIR/tests/isolate. options.path_variables['PRODUCT_DIR'] = os.path.join('third_party') complete_state = isolate.load_complete_state(options, ROOT_DIR, None, False) actual_isolated = complete_state.saved_state.to_isolated() actual_saved_state = complete_state.saved_state.flatten() expected_isolated = { 'algo': 'sha-1', 'files': { os.path.join(u'tests', 'isolate', 'files1', 'subdir', '42.txt'): { 'm': 416, 'h': hash_file('tests', 'isolate', 'files1', 'subdir', '42.txt'), 's': _size('tests', 'isolate', 'files1', 'subdir', '42.txt'), }, os.path.join(u'tests', 'isolate', 'files1', 'test_file1.txt'): { 'm': 416, 'h': hash_file('tests', 'isolate', 'files1', 'test_file1.txt'), 's': _size('tests', 'isolate', 'files1', 'test_file1.txt'), }, os.path.join(u'tests', 'isolate', 'files1', 'test_file2.txt'): { 'm': 416, 'h': hash_file('tests', 'isolate', 'files1', 'test_file2.txt'), 's': _size('tests', 'isolate', 'files1', 'test_file2.txt'), }, os.path.join(u'tests', 'isolate', 'no_run.isolate'): { 'm': 416, 'h': hash_file('tests', 'isolate', 'no_run.isolate'), 's': _size('tests', 'isolate', 'no_run.isolate'), }, }, 'relative_cwd': os.path.join(u'tests', 'isolate'), 'version': isolate.isolateserver.ISOLATED_FILE_VERSION, } self._cleanup_isolated(expected_isolated) self.assertEqual(expected_isolated, actual_isolated) expected_saved_state = { 'OS': sys.platform, 'algo': 'sha-1', 'child_isolated_files': [], 'command': [], 'config_variables': { 'OS': 'linux', 'chromeos': 1, }, 'extra_variables': { 'foo': 'bar', }, 'files': { os.path.join(u'tests', 'isolate', 'files1', 'subdir', '42.txt'): { 'm': 416, 'h': hash_file('tests', 'isolate', 'files1', 'subdir', '42.txt'), 's': _size('tests', 'isolate', 'files1', 'subdir', '42.txt'), }, os.path.join(u'tests', 'isolate', 'files1', 'test_file1.txt'): { 'm': 416, 'h': hash_file('tests', 'isolate', 'files1', 'test_file1.txt'), 's': _size('tests', 'isolate', 'files1', 'test_file1.txt'), }, os.path.join(u'tests', 'isolate', 'files1', 'test_file2.txt'): { 'm': 416, 'h': hash_file('tests', 'isolate', 'files1', 'test_file2.txt'), 's': _size('tests', 'isolate', 'files1', 'test_file2.txt'), }, os.path.join(u'tests', 'isolate', 'no_run.isolate'): { 'm': 416, 'h': hash_file('tests', 'isolate', 'no_run.isolate'), 's': _size('tests', 'isolate', 'no_run.isolate'), }, }, 'isolate_file': file_path.safe_relpath( file_path.get_native_path_case(isolate_file), os.path.dirname(options.isolated)), 'path_variables': { 'PRODUCT_DIR': os.path.join(u'..', '..', 'third_party'), }, 'relative_cwd': os.path.join(u'tests', 'isolate'), 'root_dir': file_path.get_native_path_case(ROOT_DIR), 'version': isolate.SavedState.EXPECTED_VERSION, } self._cleanup_isolated(expected_saved_state) self._cleanup_saved_state(actual_saved_state) self.assertEqual(expected_saved_state, actual_saved_state) self.assertEqual([], os.listdir(self.directory))
def test_load_stale_result(self): directory = tempfile.mkdtemp(prefix='isolate_') try: isolate_file = os.path.join(ROOT_DIR, 'data', 'isolate', 'touch_root.isolate') class Options(object): result = os.path.join(directory, 'result') outdir = os.path.join(directory, '0utdir') isolate = isolate_file variables = {'foo': 'bar'} # Data to be loaded in the .result file. Do not create a .state file. input_data = { 'command': ['python'], 'files': { 'foo': { "mode": 416, "sha-1": "invalid", "size": 538, "timestamp": 1335146921, }, os.path.join('data', 'isolate', 'touch_root.py'): { "mode": 488, "sha-1": "invalid", "size": 538, "timestamp": 1335146921, }, }, } isolate.trace_inputs.write_json(Options.result, input_data, False) # A CompleteState object contains two parts: # - Result instance stored in complete_state.result, corresponding to the # .result file, is what is read by run_test_from_archive.py. # - SavedState instance stored in compelte_state.saved_state, # corresponding to the .state file, which is simply to aid the developer # when re-running the same command multiple times and contain # discardable information. complete_state = isolate.load_complete_state( Options, isolate.STATS_ONLY) actual_result = complete_state.result.flatten() actual_saved_state = complete_state.saved_state.flatten() expected_result = { 'command': ['python', 'touch_root.py'], 'files': { os.path.join(u'data', 'isolate', 'touch_root.py'): { 'mode': 488, 'size': self._size('data', 'isolate', 'touch_root.py'), }, 'isolate.py': { 'mode': 488, 'size': self._size('isolate.py'), }, }, 'read_only': None, 'relative_cwd': os.path.join('data', 'isolate'), } if sys.platform == 'win32': # 'mode' are not saved in windows. for values in expected_result['files'].itervalues(): del values['mode'] for item in actual_result['files'].itervalues(): self.assertTrue(item.pop('timestamp')) self.assertEquals(expected_result, actual_result) expected_saved_state = { 'isolate_file': isolate_file, 'variables': { 'foo': 'bar' }, } self.assertEquals(expected_saved_state, actual_saved_state) finally: isolate.run_test_from_archive.rmtree(directory)
def test_load_stale_result(self): directory = tempfile.mkdtemp(prefix='isolate_') try: isolate_file = os.path.join( ROOT_DIR, 'data', 'isolate', 'touch_root.isolate') class Options(object): result = os.path.join(directory, 'result') outdir = os.path.join(directory, '0utdir') isolate = isolate_file variables = {'foo': 'bar'} # Data to be loaded in the .result file. Do not create a .state file. input_data = { 'command': ['python'], 'files': { 'foo': { "mode": 416, "sha-1": "invalid", "size": 538, "timestamp": 1335146921, }, os.path.join('data', 'isolate', 'touch_root.py'): { "mode": 488, "sha-1": "invalid", "size": 538, "timestamp": 1335146921, }, }, } isolate.trace_inputs.write_json(Options.result, input_data, False) # A CompleteState object contains two parts: # - Result instance stored in complete_state.result, corresponding to the # .result file, is what is read by run_test_from_archive.py. # - SavedState instance stored in compelte_state.saved_state, # corresponding to the .state file, which is simply to aid the developer # when re-running the same command multiple times and contain # discardable information. complete_state = isolate.load_complete_state(Options, isolate.STATS_ONLY) actual_result = complete_state.result.flatten() actual_saved_state = complete_state.saved_state.flatten() expected_result = { 'command': ['python', 'touch_root.py'], 'files': { os.path.join(u'data', 'isolate', 'touch_root.py'): { 'mode': 488, 'size': self._size('data', 'isolate', 'touch_root.py'), }, 'isolate.py': { 'mode': 488, 'size': self._size('isolate.py'), }, }, 'read_only': None, 'relative_cwd': os.path.join('data', 'isolate'), } if sys.platform == 'win32': # 'mode' are not saved in windows. for values in expected_result['files'].itervalues(): del values['mode'] for item in actual_result['files'].itervalues(): self.assertTrue(item.pop('timestamp')) self.assertEquals(expected_result, actual_result) expected_saved_state = { 'isolate_file': isolate_file, 'variables': {'foo': 'bar'}, } self.assertEquals(expected_saved_state, actual_saved_state) finally: isolate.run_test_from_archive.rmtree(directory)
def test_load_stale_isolated(self): isolate_file = os.path.join( ROOT_DIR, 'tests', 'isolate', 'touch_root.isolate') # Data to be loaded in the .isolated file. Do not create a .state file. input_data = { 'command': ['python'], 'files': { 'foo': { "m": 416, "h": "invalid", "s": 538, "t": 1335146921, }, os.path.join('tests', 'isolate', 'touch_root.py'): { "m": 488, "h": "invalid", "s": 538, "t": 1335146921, }, }, } options = self._get_option(isolate_file) isolate.trace_inputs.write_json(options.isolated, input_data, False) # A CompleteState object contains two parts: # - Result instance stored in complete_state.isolated, corresponding to the # .isolated file, is what is read by run_test_from_archive.py. # - SavedState instance stored in compelte_state.saved_state, # corresponding to the .state file, which is simply to aid the developer # when re-running the same command multiple times and contain # discardable information. complete_state = isolate.load_complete_state(options, None) actual_isolated = complete_state.isolated.flatten() actual_saved_state = complete_state.saved_state.flatten() expected_isolated = { 'command': ['python', 'touch_root.py'], 'files': { os.path.join(u'tests', 'isolate', 'touch_root.py'): { 'm': 488, 'h': _sha1('tests', 'isolate', 'touch_root.py'), 's': _size('tests', 'isolate', 'touch_root.py'), }, 'isolate.py': { 'm': 488, 'h': _sha1('isolate.py'), 's': _size('isolate.py'), }, }, 'os': isolate.get_flavor(), 'relative_cwd': os.path.join('tests', 'isolate'), } self._cleanup_isolated(expected_isolated, actual_isolated) self.assertEqual(expected_isolated, actual_isolated) expected_saved_state = { 'isolate_file': isolate_file, 'variables': {'foo': 'bar'}, } self.assertEqual(expected_saved_state, actual_saved_state)