| Index: swarm_client/tests/isolate_test.py
|
| ===================================================================
|
| --- swarm_client/tests/isolate_test.py (revision 235167)
|
| +++ swarm_client/tests/isolate_test.py (working copy)
|
| @@ -1,1696 +0,0 @@
|
| -#!/usr/bin/env python
|
| -# Copyright (c) 2012 The Chromium Authors. All rights reserved.
|
| -# Use of this source code is governed by a BSD-style license that can be
|
| -# found in the LICENSE file.
|
| -
|
| -import cStringIO
|
| -import hashlib
|
| -import json
|
| -import logging
|
| -import os
|
| -import sys
|
| -import tempfile
|
| -import unittest
|
| -
|
| -import auto_stub
|
| -
|
| -ROOT_DIR = unicode(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
|
| -sys.path.insert(0, ROOT_DIR)
|
| -
|
| -import isolate
|
| -from utils import file_path
|
| -# Create shortcuts.
|
| -from isolate import KEY_TOUCHED, KEY_TRACKED, KEY_UNTRACKED
|
| -
|
| -
|
| -ALGO = hashlib.sha1
|
| -
|
| -
|
| -def _size(*args):
|
| - return os.stat(os.path.join(ROOT_DIR, *args)).st_size
|
| -
|
| -
|
| -def hash_file(*args):
|
| - return isolate.isolateserver.hash_file(os.path.join(ROOT_DIR, *args), ALGO)
|
| -
|
| -
|
| -class IsolateBase(auto_stub.TestCase):
|
| - def setUp(self):
|
| - super(IsolateBase, self).setUp()
|
| - self.old_cwd = os.getcwd()
|
| - self.cwd = tempfile.mkdtemp(prefix='isolate_')
|
| - # Everything should work even from another directory.
|
| - os.chdir(self.cwd)
|
| -
|
| - def tearDown(self):
|
| - try:
|
| - os.chdir(self.old_cwd)
|
| - isolate.run_isolated.rmtree(self.cwd)
|
| - finally:
|
| - super(IsolateBase, self).tearDown()
|
| -
|
| -
|
| -class IsolateTest(IsolateBase):
|
| - def test_savedstate_load_minimal(self):
|
| - # The file referenced by 'isolate_file' must exist even if its content is
|
| - # not read.
|
| - open(os.path.join(self.cwd, 'fake.isolate'), 'wb').close()
|
| - values = {
|
| - 'isolate_file': 'fake.isolate',
|
| - }
|
| - expected = {
|
| - 'algo': 'sha-1',
|
| - 'child_isolated_files': [],
|
| - 'command': [],
|
| - 'files': {},
|
| - 'isolate_file': 'fake.isolate',
|
| - 'variables': {
|
| - 'OS': isolate.get_flavor(),
|
| - },
|
| - 'version': '1.0',
|
| - }
|
| - saved_state = isolate.SavedState.load(values, self.cwd)
|
| - self.assertEqual(expected, saved_state.flatten())
|
| -
|
| - def test_savedstate_load(self):
|
| - # The file referenced by 'isolate_file' must exist even if its content is
|
| - # not read.
|
| - open(os.path.join(self.cwd, 'fake.isolate'), 'wb').close()
|
| - values = {
|
| - 'isolate_file': 'fake.isolate',
|
| - 'variables': {
|
| - 'foo': 42,
|
| - 'OS': isolate.get_flavor(),
|
| - },
|
| - }
|
| - expected = {
|
| - 'algo': 'sha-1',
|
| - 'child_isolated_files': [],
|
| - 'command': [],
|
| - 'files': {},
|
| - 'isolate_file': 'fake.isolate',
|
| - 'variables': {
|
| - 'foo': 42,
|
| - 'OS': isolate.get_flavor(),
|
| - },
|
| - 'version': '1.0',
|
| - }
|
| - saved_state = isolate.SavedState.load(values, self.cwd)
|
| - self.assertEqual(expected, saved_state.flatten())
|
| -
|
| - def test_unknown_key(self):
|
| - try:
|
| - isolate.verify_variables({'foo': [],})
|
| - self.fail()
|
| - except AssertionError:
|
| - pass
|
| -
|
| - def test_unknown_var(self):
|
| - try:
|
| - isolate.verify_condition({'variables': {'foo': [],}}, {})
|
| - self.fail()
|
| - except AssertionError:
|
| - pass
|
| -
|
| - def test_union(self):
|
| - value1 = {
|
| - 'a': set(['A']),
|
| - 'b': ['B', 'C'],
|
| - 'c': 'C',
|
| - }
|
| - value2 = {
|
| - 'a': set(['B', 'C']),
|
| - 'b': [],
|
| - 'd': set(),
|
| - }
|
| - expected = {
|
| - 'a': set(['A', 'B', 'C']),
|
| - 'b': ['B', 'C'],
|
| - 'c': 'C',
|
| - 'd': set(),
|
| - }
|
| - self.assertEqual(expected, isolate.union(value1, value2))
|
| -
|
| - def test_eval_content(self):
|
| - try:
|
| - # Intrinsics are not available.
|
| - isolate.eval_content('map(str, [1, 2])')
|
| - self.fail()
|
| - except NameError:
|
| - pass
|
| -
|
| - def test_load_isolate_as_config_empty(self):
|
| - self.assertEqual({}, isolate.load_isolate_as_config(
|
| - self.cwd, {}, None).flatten())
|
| -
|
| - def test_load_isolate_as_config(self):
|
| - value = {
|
| - 'conditions': [
|
| - ['OS=="amiga" or OS=="atari" or OS=="coleco" or OS=="dendy"', {
|
| - 'variables': {
|
| - KEY_TRACKED: ['a'],
|
| - KEY_UNTRACKED: ['b'],
|
| - KEY_TOUCHED: ['touched'],
|
| - },
|
| - }],
|
| - ['OS=="atari"', {
|
| - 'variables': {
|
| - KEY_TRACKED: ['c', 'x'],
|
| - KEY_UNTRACKED: ['d'],
|
| - KEY_TOUCHED: ['touched_a'],
|
| - 'command': ['echo', 'Hello World'],
|
| - 'read_only': True,
|
| - },
|
| - }],
|
| - ['OS=="amiga" or OS=="coleco" or OS=="dendy"', {
|
| - 'variables': {
|
| - KEY_TRACKED: ['e', 'x'],
|
| - KEY_UNTRACKED: ['f'],
|
| - KEY_TOUCHED: ['touched_e'],
|
| - 'command': ['echo', 'You should get an Atari'],
|
| - },
|
| - }],
|
| - ['OS=="amiga"', {
|
| - 'variables': {
|
| - KEY_TRACKED: ['g'],
|
| - 'read_only': False,
|
| - },
|
| - }],
|
| - ['OS=="amiga" or OS=="atari" or OS=="dendy"', {
|
| - 'variables': {
|
| - KEY_UNTRACKED: ['h'],
|
| - },
|
| - }],
|
| - ],
|
| - }
|
| - expected = {
|
| - ('amiga',): {
|
| - 'command': ['echo', 'You should get an Atari'],
|
| - KEY_TOUCHED: ['touched', 'touched_e'],
|
| - KEY_TRACKED: ['a', 'e', 'g', 'x'],
|
| - KEY_UNTRACKED: ['b', 'f', 'h'],
|
| - 'read_only': False,
|
| - },
|
| - ('atari',): {
|
| - 'command': ['echo', 'Hello World'],
|
| - KEY_TOUCHED: ['touched', 'touched_a'],
|
| - KEY_TRACKED: ['a', 'c', 'x'],
|
| - KEY_UNTRACKED: ['b', 'd', 'h'],
|
| - 'read_only': True,
|
| - },
|
| - ('coleco',): {
|
| - 'command': ['echo', 'You should get an Atari'],
|
| - KEY_TOUCHED: ['touched', 'touched_e'],
|
| - KEY_TRACKED: ['a', 'e', 'x'],
|
| - KEY_UNTRACKED: ['b', 'f'],
|
| - },
|
| - ('dendy',): {
|
| - 'command': ['echo', 'You should get an Atari'],
|
| - KEY_TOUCHED: ['touched', 'touched_e'],
|
| - KEY_TRACKED: ['a', 'e', 'x'],
|
| - KEY_UNTRACKED: ['b', 'f', 'h'],
|
| - },
|
| - }
|
| - self.assertEqual(
|
| - expected, isolate.load_isolate_as_config(
|
| - self.cwd, value, None).flatten())
|
| -
|
| - def test_load_isolate_as_config_duplicate_command(self):
|
| - value = {
|
| - 'variables': {
|
| - 'command': ['rm', '-rf', '/'],
|
| - },
|
| - 'conditions': [
|
| - ['OS=="atari"', {
|
| - 'variables': {
|
| - 'command': ['echo', 'Hello World'],
|
| - },
|
| - }],
|
| - ],
|
| - }
|
| - try:
|
| - isolate.load_isolate_as_config(self.cwd, value, None)
|
| - self.fail()
|
| - except AssertionError:
|
| - pass
|
| -
|
| - def test_invert_map(self):
|
| - value = {
|
| - ('amiga',): {
|
| - 'command': ['echo', 'You should get an Atari'],
|
| - KEY_TOUCHED: ['touched', 'touched_e'],
|
| - KEY_TRACKED: ['a', 'e', 'g', 'x'],
|
| - KEY_UNTRACKED: ['b', 'f', 'h'],
|
| - 'read_only': False,
|
| - },
|
| - ('atari',): {
|
| - 'command': ['echo', 'Hello World'],
|
| - KEY_TOUCHED: ['touched', 'touched_a'],
|
| - KEY_TRACKED: ['a', 'c', 'x'],
|
| - KEY_UNTRACKED: ['b', 'd', 'h'],
|
| - 'read_only': True,
|
| - },
|
| - ('coleco',): {
|
| - 'command': ['echo', 'You should get an Atari'],
|
| - KEY_TOUCHED: ['touched', 'touched_e'],
|
| - KEY_TRACKED: ['a', 'e', 'x'],
|
| - KEY_UNTRACKED: ['b', 'f'],
|
| - },
|
| - ('dendy',): {
|
| - 'command': ['echo', 'You should get an Atari'],
|
| - KEY_TOUCHED: ['touched', 'touched_e'],
|
| - KEY_TRACKED: ['a', 'e', 'x'],
|
| - KEY_UNTRACKED: ['b', 'f', 'h'],
|
| - },
|
| - }
|
| - amiga, atari, coleco, dendy = (
|
| - set([(os,)]) for os in ('amiga', 'atari', 'coleco', 'dendy'))
|
| - expected_values = {
|
| - 'command': {
|
| - ('echo', 'Hello World'): atari,
|
| - ('echo', 'You should get an Atari'): amiga | coleco | dendy,
|
| - },
|
| - KEY_TRACKED: {
|
| - 'a': amiga | atari | coleco | dendy,
|
| - 'c': atari,
|
| - 'e': amiga | coleco | dendy,
|
| - 'g': amiga,
|
| - 'x': amiga | atari | coleco | dendy,
|
| - },
|
| - KEY_UNTRACKED: {
|
| - 'b': amiga | atari | coleco | dendy,
|
| - 'd': atari,
|
| - 'f': amiga | coleco | dendy,
|
| - 'h': amiga | atari | dendy,
|
| - },
|
| - KEY_TOUCHED: {
|
| - 'touched': amiga | atari | coleco | dendy,
|
| - 'touched_a': atari,
|
| - 'touched_e': amiga | coleco | dendy,
|
| - },
|
| - 'read_only': {
|
| - False: amiga,
|
| - True: atari,
|
| - },
|
| - }
|
| - actual_values = isolate.invert_map(value)
|
| - self.assertEqual(expected_values, actual_values)
|
| -
|
| - def test_reduce_inputs(self):
|
| - amiga, atari, coleco, dendy = (
|
| - set([(os,)]) for os in ('amiga', 'atari', 'coleco', 'dendy'))
|
| - values = {
|
| - 'command': {
|
| - ('echo', 'Hello World'): atari,
|
| - ('echo', 'You should get an Atari'): amiga | coleco | dendy,
|
| - },
|
| - KEY_TRACKED: {
|
| - 'a': amiga | atari | coleco | dendy,
|
| - 'c': atari,
|
| - 'e': amiga | coleco | dendy,
|
| - 'g': amiga,
|
| - 'x': amiga | atari | coleco | dendy,
|
| - },
|
| - KEY_UNTRACKED: {
|
| - 'b': amiga | atari | coleco | dendy,
|
| - 'd': atari,
|
| - 'f': amiga | coleco | dendy,
|
| - 'h': amiga | atari | dendy,
|
| - },
|
| - KEY_TOUCHED: {
|
| - 'touched': amiga | atari | coleco | dendy,
|
| - 'touched_a': atari,
|
| - 'touched_e': amiga | coleco | dendy,
|
| - },
|
| - 'read_only': {
|
| - False: amiga,
|
| - True: atari,
|
| - },
|
| - }
|
| - expected_values = {
|
| - 'command': {
|
| - ('echo', 'Hello World'): atari,
|
| - ('echo', 'You should get an Atari'): amiga | coleco | dendy,
|
| - },
|
| - KEY_TRACKED: {
|
| - 'a': amiga | atari | coleco | dendy,
|
| - 'c': atari,
|
| - 'e': amiga | coleco | dendy,
|
| - 'g': amiga,
|
| - 'x': amiga | atari | coleco | dendy,
|
| - },
|
| - KEY_UNTRACKED: {
|
| - 'b': amiga | atari | coleco | dendy,
|
| - 'd': atari,
|
| - 'f': amiga | coleco | dendy,
|
| - 'h': amiga | atari | dendy,
|
| - },
|
| - KEY_TOUCHED: {
|
| - 'touched': amiga | atari | coleco | dendy,
|
| - 'touched_a': atari,
|
| - 'touched_e': amiga | coleco | dendy,
|
| - },
|
| - 'read_only': {
|
| - False: amiga,
|
| - True: atari,
|
| - },
|
| - }
|
| - actual_values = isolate.reduce_inputs(values)
|
| - self.assertEqual(expected_values, actual_values)
|
| -
|
| - def test_reduce_inputs_merge_subfolders_and_files(self):
|
| - linux, mac, win = (set([(os,)]) for os in ('linux', 'mac', 'win'))
|
| - values = {
|
| - KEY_TRACKED: {
|
| - 'folder/tracked_file': win,
|
| - 'folder_helper/tracked_file': win,
|
| - },
|
| - KEY_UNTRACKED: {
|
| - 'folder/': linux | mac | win,
|
| - 'folder/subfolder/': win,
|
| - 'folder/untracked_file': linux | mac | win,
|
| - 'folder_helper/': linux,
|
| - },
|
| - KEY_TOUCHED: {
|
| - 'folder/touched_file': win,
|
| - 'folder/helper_folder/deep_file': win,
|
| - 'folder_helper/touched_file1': mac | win,
|
| - 'folder_helper/touched_file2': linux,
|
| - },
|
| - }
|
| - expected_values = {
|
| - 'command': {},
|
| - KEY_TRACKED: {
|
| - 'folder_helper/tracked_file': win,
|
| - },
|
| - KEY_UNTRACKED: {
|
| - 'folder/': linux | mac | win,
|
| - 'folder_helper/': linux,
|
| - },
|
| - KEY_TOUCHED: {
|
| - 'folder_helper/touched_file1': mac | win,
|
| - },
|
| - 'read_only': {},
|
| - }
|
| - actual_values = isolate.reduce_inputs(values)
|
| - self.assertEqual(expected_values, actual_values)
|
| -
|
| - def test_reduce_inputs_take_strongest_dependency(self):
|
| - amiga, atari, coleco, dendy = (
|
| - set([(os,)]) for os in ('amiga', 'atari', 'coleco', 'dendy'))
|
| - values = {
|
| - 'command': {
|
| - ('echo', 'Hello World'): atari,
|
| - ('echo', 'You should get an Atari'): amiga | coleco | dendy,
|
| - },
|
| - KEY_TRACKED: {
|
| - 'a': amiga | atari | coleco | dendy,
|
| - 'b': amiga | atari | coleco,
|
| - },
|
| - KEY_UNTRACKED: {
|
| - 'c': amiga | atari | coleco | dendy,
|
| - 'd': amiga | coleco | dendy,
|
| - },
|
| - KEY_TOUCHED: {
|
| - 'a': amiga | atari | coleco | dendy,
|
| - 'b': atari | coleco | dendy,
|
| - 'c': amiga | atari | coleco | dendy,
|
| - 'd': atari | coleco | dendy,
|
| - },
|
| - }
|
| - expected_values = {
|
| - 'command': {
|
| - ('echo', 'Hello World'): atari,
|
| - ('echo', 'You should get an Atari'): amiga | coleco | dendy,
|
| - },
|
| - KEY_TRACKED: {
|
| - 'a': amiga | atari | coleco | dendy,
|
| - 'b': amiga | atari | coleco,
|
| - },
|
| - KEY_UNTRACKED: {
|
| - 'c': amiga | atari | coleco | dendy,
|
| - 'd': amiga | coleco | dendy,
|
| - },
|
| - KEY_TOUCHED: {
|
| - 'b': dendy,
|
| - 'd': atari,
|
| - },
|
| - 'read_only': {},
|
| - }
|
| - actual_values = isolate.reduce_inputs(values)
|
| - self.assertEqual(expected_values, actual_values)
|
| -
|
| - def test_convert_map_to_isolate_dict(self):
|
| - amiga = ('amiga',)
|
| - atari = ('atari',)
|
| - coleco = ('coleco',)
|
| - dendy = ('dendy',)
|
| - values = {
|
| - 'command': {
|
| - ('echo', 'Hello World'): (atari,),
|
| - ('echo', 'You should get an Atari'): (amiga, coleco, dendy),
|
| - },
|
| - KEY_TRACKED: {
|
| - 'a': (amiga, atari, coleco, dendy),
|
| - 'c': (atari,),
|
| - 'e': (amiga, coleco, dendy),
|
| - 'g': (amiga,),
|
| - 'x': (amiga, atari, coleco, dendy),
|
| - },
|
| - KEY_UNTRACKED: {
|
| - 'b': (amiga, atari, coleco, dendy),
|
| - 'd': (atari,),
|
| - 'f': (amiga, coleco, dendy),
|
| - 'h': (amiga, atari, dendy),
|
| - },
|
| - KEY_TOUCHED: {
|
| - 'touched': (amiga, atari, coleco, dendy),
|
| - 'touched_a': (atari,),
|
| - 'touched_e': (amiga, coleco, dendy),
|
| - },
|
| - 'read_only': {
|
| - False: (amiga,),
|
| - True: (atari,),
|
| - },
|
| - }
|
| - expected_conditions = [
|
| - ['OS=="amiga"', {
|
| - 'variables': {
|
| - KEY_TRACKED: ['g'],
|
| - 'read_only': False,
|
| - },
|
| - }],
|
| - ['OS=="amiga" or OS=="atari" or OS=="coleco" or OS=="dendy"', {
|
| - 'variables': {
|
| - KEY_TRACKED: ['a', 'x'],
|
| - KEY_UNTRACKED: ['b'],
|
| - KEY_TOUCHED: ['touched'],
|
| - },
|
| - }],
|
| - ['OS=="amiga" or OS=="atari" or OS=="dendy"', {
|
| - 'variables': {
|
| - KEY_UNTRACKED: ['h'],
|
| - },
|
| - }],
|
| - ['OS=="amiga" or OS=="coleco" or OS=="dendy"', {
|
| - 'variables': {
|
| - 'command': ['echo', 'You should get an Atari'],
|
| - KEY_TRACKED: ['e'],
|
| - KEY_UNTRACKED: ['f'],
|
| - KEY_TOUCHED: ['touched_e'],
|
| - },
|
| - }],
|
| - ['OS=="atari"', {
|
| - 'variables': {
|
| - 'command': ['echo', 'Hello World'],
|
| - KEY_TRACKED: ['c'],
|
| - KEY_UNTRACKED: ['d'],
|
| - KEY_TOUCHED: ['touched_a'],
|
| - 'read_only': True,
|
| - },
|
| - }],
|
| - ]
|
| - actual = isolate.convert_map_to_isolate_dict(values, ('OS',))
|
| - self.assertEqual(expected_conditions, sorted(actual.pop('conditions')))
|
| - self.assertFalse(actual)
|
| -
|
| - def test_merge_two_empty(self):
|
| - # Flat stay flat. Pylint is confused about union() return type.
|
| - # pylint: disable=E1103
|
| - actual = isolate.union(
|
| - isolate.union(
|
| - isolate.Configs(None),
|
| - isolate.load_isolate_as_config(self.cwd, {}, None)),
|
| - isolate.load_isolate_as_config(self.cwd, {}, None)).flatten()
|
| - self.assertEqual({}, actual)
|
| -
|
| - def test_merge_empty(self):
|
| - actual = isolate.convert_map_to_isolate_dict(
|
| - isolate.reduce_inputs(isolate.invert_map({})), ('dummy1', 'dummy2'))
|
| - self.assertEqual({'conditions': []}, actual)
|
| -
|
| - def test_load_two_conditions(self):
|
| - linux = {
|
| - 'conditions': [
|
| - ['OS=="linux"', {
|
| - 'variables': {
|
| - 'isolate_dependency_tracked': [
|
| - 'file_linux',
|
| - 'file_common',
|
| - ],
|
| - },
|
| - }],
|
| - ],
|
| - }
|
| - mac = {
|
| - 'conditions': [
|
| - ['OS=="mac"', {
|
| - 'variables': {
|
| - 'isolate_dependency_tracked': [
|
| - 'file_mac',
|
| - 'file_common',
|
| - ],
|
| - },
|
| - }],
|
| - ],
|
| - }
|
| - expected = {
|
| - ('linux',): {
|
| - 'isolate_dependency_tracked': ['file_common', 'file_linux'],
|
| - },
|
| - ('mac',): {
|
| - 'isolate_dependency_tracked': ['file_common', 'file_mac'],
|
| - },
|
| - }
|
| - # Pylint is confused about union() return type.
|
| - # pylint: disable=E1103
|
| - configs = isolate.union(
|
| - isolate.union(
|
| - isolate.Configs(None),
|
| - isolate.load_isolate_as_config(self.cwd, linux, None)),
|
| - isolate.load_isolate_as_config(self.cwd, mac, None)).flatten()
|
| - self.assertEqual(expected, configs)
|
| -
|
| - def test_load_three_conditions(self):
|
| - linux = {
|
| - 'conditions': [
|
| - ['OS=="linux" and chromeos==1', {
|
| - 'variables': {
|
| - 'isolate_dependency_tracked': [
|
| - 'file_linux',
|
| - 'file_common',
|
| - ],
|
| - },
|
| - }],
|
| - ],
|
| - }
|
| - mac = {
|
| - 'conditions': [
|
| - ['OS=="mac" and chromeos==0', {
|
| - 'variables': {
|
| - 'isolate_dependency_tracked': [
|
| - 'file_mac',
|
| - 'file_common',
|
| - ],
|
| - },
|
| - }],
|
| - ],
|
| - }
|
| - win = {
|
| - 'conditions': [
|
| - ['OS=="win" and chromeos==0', {
|
| - 'variables': {
|
| - 'isolate_dependency_tracked': [
|
| - 'file_win',
|
| - 'file_common',
|
| - ],
|
| - },
|
| - }],
|
| - ],
|
| - }
|
| - expected = {
|
| - ('linux', 1): {
|
| - 'isolate_dependency_tracked': ['file_common', 'file_linux'],
|
| - },
|
| - ('mac', 0): {
|
| - 'isolate_dependency_tracked': ['file_common', 'file_mac'],
|
| - },
|
| - ('win', 0): {
|
| - 'isolate_dependency_tracked': ['file_common', 'file_win'],
|
| - },
|
| - }
|
| - # Pylint is confused about union() return type.
|
| - # pylint: disable=E1103
|
| - configs = isolate.union(
|
| - isolate.union(
|
| - isolate.union(
|
| - isolate.Configs(None),
|
| - isolate.load_isolate_as_config(self.cwd, linux, None)),
|
| - isolate.load_isolate_as_config(self.cwd, mac, None)),
|
| - isolate.load_isolate_as_config(self.cwd, win, None)).flatten()
|
| - self.assertEqual(expected, configs)
|
| -
|
| - def test_merge_three_conditions(self):
|
| - values = {
|
| - ('linux',): {
|
| - 'isolate_dependency_tracked': ['file_common', 'file_linux'],
|
| - },
|
| - ('mac',): {
|
| - 'isolate_dependency_tracked': ['file_common', 'file_mac'],
|
| - },
|
| - ('win',): {
|
| - 'isolate_dependency_tracked': ['file_common', 'file_win'],
|
| - },
|
| - }
|
| - expected = {
|
| - 'conditions': [
|
| - ['OS=="linux"', {
|
| - 'variables': {
|
| - 'isolate_dependency_tracked': [
|
| - 'file_linux',
|
| - ],
|
| - },
|
| - }],
|
| - ['OS=="linux" or OS=="mac" or OS=="win"', {
|
| - 'variables': {
|
| - 'isolate_dependency_tracked': [
|
| - 'file_common',
|
| - ],
|
| - },
|
| - }],
|
| - ['OS=="mac"', {
|
| - 'variables': {
|
| - 'isolate_dependency_tracked': [
|
| - 'file_mac',
|
| - ],
|
| - },
|
| - }],
|
| - ['OS=="win"', {
|
| - 'variables': {
|
| - 'isolate_dependency_tracked': [
|
| - 'file_win',
|
| - ],
|
| - },
|
| - }],
|
| - ],
|
| - }
|
| - actual = isolate.convert_map_to_isolate_dict(
|
| - isolate.reduce_inputs(isolate.invert_map(values)), ('OS',))
|
| - self.assertEqual(expected, actual)
|
| -
|
| - def test_configs_comment(self):
|
| - # Pylint is confused with isolate.union() return type.
|
| - # pylint: disable=E1103
|
| - configs = isolate.union(
|
| - isolate.load_isolate_as_config(
|
| - self.cwd, {}, '# Yo dawg!\n# Chill out.\n'),
|
| - isolate.load_isolate_as_config(self.cwd, {}, None))
|
| - self.assertEqual('# Yo dawg!\n# Chill out.\n', configs.file_comment)
|
| -
|
| - configs = isolate.union(
|
| - isolate.load_isolate_as_config(self.cwd, {}, None),
|
| - isolate.load_isolate_as_config(
|
| - self.cwd, {}, '# Yo dawg!\n# Chill out.\n'))
|
| - self.assertEqual('# Yo dawg!\n# Chill out.\n', configs.file_comment)
|
| -
|
| - # Only keep the first one.
|
| - configs = isolate.union(
|
| - isolate.load_isolate_as_config(self.cwd, {}, '# Yo dawg!\n'),
|
| - isolate.load_isolate_as_config(self.cwd, {}, '# Chill out.\n'))
|
| - self.assertEqual('# Yo dawg!\n', configs.file_comment)
|
| -
|
| - def test_load_with_includes(self):
|
| - included_isolate = {
|
| - 'variables': {
|
| - 'isolate_dependency_tracked': [
|
| - 'file_common',
|
| - ],
|
| - },
|
| - 'conditions': [
|
| - ['OS=="linux"', {
|
| - 'variables': {
|
| - 'isolate_dependency_tracked': [
|
| - 'file_linux',
|
| - ],
|
| - },
|
| - }, {
|
| - 'variables': {
|
| - 'isolate_dependency_tracked': [
|
| - 'file_non_linux',
|
| - ],
|
| - },
|
| - }],
|
| - ],
|
| - }
|
| - isolate.trace_inputs.write_json(
|
| - os.path.join(self.cwd, 'included.isolate'), included_isolate, True)
|
| - values = {
|
| - 'includes': ['included.isolate'],
|
| - 'variables': {
|
| - 'isolate_dependency_tracked': [
|
| - 'file_less_common',
|
| - ],
|
| - },
|
| - 'conditions': [
|
| - ['OS=="mac"', {
|
| - 'variables': {
|
| - 'isolate_dependency_tracked': [
|
| - 'file_mac',
|
| - ],
|
| - },
|
| - }],
|
| - ],
|
| - }
|
| - actual = isolate.load_isolate_as_config(self.cwd, values, None)
|
| -
|
| - expected = {
|
| - ('linux',): {
|
| - 'isolate_dependency_tracked': [
|
| - 'file_common',
|
| - 'file_less_common',
|
| - 'file_linux',
|
| - ],
|
| - },
|
| - ('mac',): {
|
| - 'isolate_dependency_tracked': [
|
| - 'file_common',
|
| - 'file_less_common',
|
| - 'file_mac',
|
| - 'file_non_linux',
|
| - ],
|
| - },
|
| - ('win',): {
|
| - 'isolate_dependency_tracked': [
|
| - 'file_common',
|
| - 'file_less_common',
|
| - 'file_non_linux',
|
| - ],
|
| - },
|
| - }
|
| - self.assertEqual(expected, actual.flatten())
|
| -
|
| - def test_extract_comment(self):
|
| - self.assertEqual(
|
| - '# Foo\n# Bar\n', isolate.extract_comment('# Foo\n# Bar\n{}'))
|
| - self.assertEqual('', isolate.extract_comment('{}'))
|
| -
|
| - def _test_pretty_print_impl(self, value, expected):
|
| - actual = cStringIO.StringIO()
|
| - isolate.pretty_print(value, actual)
|
| - self.assertEqual(expected, actual.getvalue())
|
| -
|
| - def test_pretty_print_empty(self):
|
| - self._test_pretty_print_impl({}, '{\n}\n')
|
| -
|
| - def test_pretty_print_mid_size(self):
|
| - value = {
|
| - 'variables': {
|
| - 'bar': [
|
| - 'file1',
|
| - 'file2',
|
| - ],
|
| - },
|
| - 'conditions': [
|
| - ['OS=\"foo\"', {
|
| - 'variables': {
|
| - isolate.KEY_UNTRACKED: [
|
| - 'dir1',
|
| - 'dir2',
|
| - ],
|
| - isolate.KEY_TRACKED: [
|
| - 'file4',
|
| - 'file3',
|
| - ],
|
| - 'command': ['python', '-c', 'print "H\\i\'"'],
|
| - 'read_only': True,
|
| - 'relative_cwd': 'isol\'at\\e',
|
| - },
|
| - }],
|
| - ['OS=\"bar\"', {
|
| - 'variables': {},
|
| - }, {
|
| - 'variables': {},
|
| - }],
|
| - ],
|
| - }
|
| - expected = (
|
| - "{\n"
|
| - " 'variables': {\n"
|
| - " 'bar': [\n"
|
| - " 'file1',\n"
|
| - " 'file2',\n"
|
| - " ],\n"
|
| - " },\n"
|
| - " 'conditions': [\n"
|
| - " ['OS=\"foo\"', {\n"
|
| - " 'variables': {\n"
|
| - " 'command': [\n"
|
| - " 'python',\n"
|
| - " '-c',\n"
|
| - " 'print \"H\\i\'\"',\n"
|
| - " ],\n"
|
| - " 'relative_cwd': 'isol\\'at\\\\e',\n"
|
| - " 'read_only': True\n"
|
| - " 'isolate_dependency_tracked': [\n"
|
| - " 'file4',\n"
|
| - " 'file3',\n"
|
| - " ],\n"
|
| - " 'isolate_dependency_untracked': [\n"
|
| - " 'dir1',\n"
|
| - " 'dir2',\n"
|
| - " ],\n"
|
| - " },\n"
|
| - " }],\n"
|
| - " ['OS=\"bar\"', {\n"
|
| - " 'variables': {\n"
|
| - " },\n"
|
| - " }, {\n"
|
| - " 'variables': {\n"
|
| - " },\n"
|
| - " }],\n"
|
| - " ],\n"
|
| - "}\n")
|
| - self._test_pretty_print_impl(value, expected)
|
| -
|
| - def test_convert_old_to_new_bypass(self):
|
| - isolate_not_needing_conversion = {
|
| - 'conditions': [
|
| - ['OS=="mac"', {'variables': {'foo': 'bar'}}],
|
| - ['condition shouldn\'t matter', {'variables': {'x': 'y'}}],
|
| - ],
|
| - }
|
| - self.assertEqual(
|
| - isolate_not_needing_conversion,
|
| - isolate.convert_old_to_new_format(isolate_not_needing_conversion))
|
| -
|
| - def test_convert_old_to_new_else(self):
|
| - isolate_with_else_clauses = {
|
| - 'conditions': [
|
| - ['OS=="mac"', {
|
| - 'variables': {'foo': 'bar'},
|
| - }, {
|
| - 'variables': {'x': 'y'},
|
| - }],
|
| - ['OS=="foo"', {
|
| - }, {
|
| - 'variables': {'p': 'q'},
|
| - }],
|
| - ],
|
| - }
|
| - expected_output = {
|
| - 'conditions': [
|
| - ['OS=="foo" or OS=="linux" or OS=="win"', {
|
| - 'variables': {'x': 'y'},
|
| - }],
|
| - ['OS=="linux" or OS=="mac" or OS=="win"', {
|
| - 'variables': {'p': 'q'},
|
| - }],
|
| - ['OS=="mac"', {
|
| - 'variables': {'foo': 'bar'},
|
| - }],
|
| - ],
|
| - }
|
| - self.assertEqual(
|
| - expected_output,
|
| - isolate.convert_old_to_new_format(isolate_with_else_clauses))
|
| -
|
| - def test_convert_old_to_new_default_variables(self):
|
| - isolate_with_default_variables = {
|
| - 'conditions': [
|
| - ['OS=="abc"', {
|
| - 'variables': {'foo': 'bar'},
|
| - }],
|
| - ],
|
| - 'variables': {'p': 'q'},
|
| - }
|
| - expected_output = {
|
| - 'conditions': [
|
| - ['OS=="abc"', {
|
| - 'variables': {'foo': 'bar'},
|
| - }],
|
| - ['OS=="abc" or OS=="linux" or OS=="mac" or OS=="win"', {
|
| - 'variables': {'p': 'q'},
|
| - }],
|
| - ],
|
| - }
|
| - self.assertEqual(
|
| - expected_output,
|
| - isolate.convert_old_to_new_format(isolate_with_default_variables))
|
| -
|
| - def test_variable_arg(self):
|
| - parser = isolate.OptionParserIsolate()
|
| - parser.require_isolated = False
|
| - expected = {
|
| - 'Baz': 'sub=string',
|
| - 'EXECUTABLE_SUFFIX': '.exe' if isolate.get_flavor() == 'win' else '',
|
| - 'Foo': 'bar',
|
| - 'OS': isolate.get_flavor(),
|
| - }
|
| -
|
| - options, args = parser.parse_args(
|
| - ['-V', 'Foo', 'bar', '-V', 'Baz=sub=string'])
|
| - self.assertEqual(expected, options.variables)
|
| - self.assertEqual([], args)
|
| -
|
| - def test_variable_arg_fail(self):
|
| - parser = isolate.OptionParserIsolate()
|
| - self.mock(sys, 'stderr', cStringIO.StringIO())
|
| - self.assertRaises(SystemExit, parser.parse_args, ['-V', 'Foo'])
|
| -
|
| - def test_blacklist(self):
|
| - ok = [
|
| - '.git2',
|
| - '.pyc',
|
| - '.swp',
|
| - 'allo.git',
|
| - 'foo',
|
| - ]
|
| - blocked = [
|
| - '.git',
|
| - os.path.join('foo', '.git'),
|
| - 'foo.pyc',
|
| - 'bar.swp',
|
| - ]
|
| - blacklist = isolate.trace_inputs.gen_blacklist(isolate.DEFAULT_BLACKLIST)
|
| - for i in ok:
|
| - self.assertFalse(blacklist(i), i)
|
| - for i in blocked:
|
| - self.assertTrue(blacklist(i), i)
|
| -
|
| - def test_blacklist_chromium(self):
|
| - ok = [
|
| - '.run_test_cases',
|
| - 'testserver.log2',
|
| - ]
|
| - blocked = [
|
| - 'foo.run_test_cases',
|
| - 'testserver.log',
|
| - os.path.join('foo', 'testserver.log'),
|
| - ]
|
| - blacklist = isolate.trace_inputs.gen_blacklist(isolate.DEFAULT_BLACKLIST)
|
| - for i in ok:
|
| - self.assertFalse(blacklist(i), i)
|
| - for i in blocked:
|
| - self.assertTrue(blacklist(i), i)
|
| -
|
| - if sys.platform == 'darwin':
|
| - def test_expand_symlinks_path_case(self):
|
| - # Ensures that the resulting path case is fixed on case insensitive file
|
| - # system.
|
| - os.symlink('dest', os.path.join(self.cwd, 'link'))
|
| - os.mkdir(os.path.join(self.cwd, 'Dest'))
|
| - open(os.path.join(self.cwd, 'Dest', 'file.txt'), 'w').close()
|
| -
|
| - result = isolate.expand_symlinks(unicode(self.cwd), 'link')
|
| - self.assertEqual((u'Dest', [u'link']), result)
|
| - result = isolate.expand_symlinks(unicode(self.cwd), 'link/File.txt')
|
| - self.assertEqual((u'Dest/file.txt', [u'link']), result)
|
| -
|
| - def test_expand_directories_and_symlinks_path_case(self):
|
| - # Ensures that the resulting path case is fixed on case insensitive file
|
| - # system. A superset of test_expand_symlinks_path_case.
|
| - # Create *all* the paths with the wrong path case.
|
| - basedir = os.path.join(self.cwd, 'baseDir')
|
| - os.mkdir(basedir.lower())
|
| - subdir = os.path.join(basedir, 'subDir')
|
| - os.mkdir(subdir.lower())
|
| - open(os.path.join(subdir, 'Foo.txt'), 'w').close()
|
| - os.symlink('subDir', os.path.join(basedir, 'linkdir'))
|
| - actual = isolate.expand_directories_and_symlinks(
|
| - unicode(self.cwd), [u'baseDir/'], lambda _: None, True, False)
|
| - expected = [
|
| - u'basedir/linkdir',
|
| - u'basedir/subdir/Foo.txt',
|
| - u'basedir/subdir/Foo.txt',
|
| - ]
|
| - self.assertEqual(expected, actual)
|
| -
|
| - def test_process_input_path_case_simple(self):
|
| - # Ensure the symlink dest is saved in the right path case.
|
| - subdir = os.path.join(self.cwd, 'subdir')
|
| - os.mkdir(subdir)
|
| - linkdir = os.path.join(self.cwd, 'linkdir')
|
| - os.symlink('subDir', linkdir)
|
| - actual = isolate.process_input(
|
| - unicode(linkdir.upper()), {}, True, 'mac', ALGO)
|
| - expected = {'l': u'subdir', 'm': 360, 't': int(os.stat(linkdir).st_mtime)}
|
| - self.assertEqual(expected, actual)
|
| -
|
| - def test_process_input_path_case_complex(self):
|
| - # Ensure the symlink dest is saved in the right path case. This includes 2
|
| - # layers of symlinks.
|
| - basedir = os.path.join(self.cwd, 'basebir')
|
| - os.mkdir(basedir)
|
| -
|
| - linkeddir2 = os.path.join(self.cwd, 'linkeddir2')
|
| - os.mkdir(linkeddir2)
|
| -
|
| - linkeddir1 = os.path.join(basedir, 'linkeddir1')
|
| - os.symlink('../linkedDir2', linkeddir1)
|
| -
|
| - subsymlinkdir = os.path.join(basedir, 'symlinkdir')
|
| - os.symlink('linkedDir1', subsymlinkdir)
|
| -
|
| - actual = isolate.process_input(
|
| - unicode(subsymlinkdir.upper()), {}, True, 'mac', ALGO)
|
| - expected = {
|
| - 'l': u'linkeddir1', 'm': 360, 't': int(os.stat(subsymlinkdir).st_mtime),
|
| - }
|
| - self.assertEqual(expected, actual)
|
| -
|
| - actual = isolate.process_input(
|
| - unicode(linkeddir1.upper()), {}, True, 'mac', ALGO)
|
| - expected = {
|
| - 'l': u'../linkeddir2', 'm': 360, 't': int(os.stat(linkeddir1).st_mtime),
|
| - }
|
| - self.assertEqual(expected, actual)
|
| -
|
| - if sys.platform != 'win32':
|
| - def test_symlink_input_absolute_path(self):
|
| - # A symlink is outside of the checkout, it should be treated as a normal
|
| - # directory.
|
| - # .../src
|
| - # .../src/out -> .../tmp/foo
|
| - # .../tmp
|
| - # .../tmp/foo
|
| - src = os.path.join(self.cwd, u'src')
|
| - src_out = os.path.join(src, 'out')
|
| - tmp = os.path.join(self.cwd, 'tmp')
|
| - tmp_foo = os.path.join(tmp, 'foo')
|
| - os.mkdir(src)
|
| - os.mkdir(tmp)
|
| - os.mkdir(tmp_foo)
|
| - # The problem was that it's an absolute path, so it must be considered a
|
| - # normal directory.
|
| - os.symlink(tmp, src_out)
|
| - open(os.path.join(tmp_foo, 'bar.txt'), 'w').close()
|
| - actual = isolate.expand_symlinks(src, u'out/foo/bar.txt')
|
| - self.assertEqual((u'out/foo/bar.txt', []), actual)
|
| -
|
| -
|
| -class IsolateLoad(IsolateBase):
|
| - def setUp(self):
|
| - super(IsolateLoad, self).setUp()
|
| - self.directory = tempfile.mkdtemp(prefix='isolate_')
|
| -
|
| - def tearDown(self):
|
| - try:
|
| - isolate.run_isolated.rmtree(self.directory)
|
| - finally:
|
| - super(IsolateLoad, self).tearDown()
|
| -
|
| - def _get_option(self, isolate_file):
|
| - OS = isolate.get_flavor()
|
| - chromeos_value = int(OS == 'linux')
|
| - class Options(object):
|
| - isolated = os.path.join(self.directory, 'foo.isolated')
|
| - outdir = os.path.join(self.directory, 'outdir')
|
| - isolate = isolate_file
|
| - variables = {'foo': 'bar', 'OS': OS, 'chromeos': chromeos_value}
|
| - ignore_broken_items = False
|
| - return Options()
|
| -
|
| - def _cleanup_isolated(self, expected_isolated):
|
| - """Modifies isolated to remove the non-deterministic parts."""
|
| - if sys.platform == 'win32':
|
| - # 'm' are not saved in windows.
|
| - for values in expected_isolated['files'].itervalues():
|
| - self.assertTrue(values.pop('m'))
|
| -
|
| - def _cleanup_saved_state(self, actual_saved_state):
|
| - for item in actual_saved_state['files'].itervalues():
|
| - self.assertTrue(item.pop('t'))
|
| -
|
| - 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, 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'),
|
| - },
|
| - },
|
| - 'os': isolate.get_flavor(),
|
| - 'relative_cwd': os.path.join(u'tests', 'isolate'),
|
| - 'version': '1.0',
|
| - }
|
| - 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'],
|
| - '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': isolate.safe_relpath(
|
| - file_path.get_native_path_case(isolate_file),
|
| - os.path.dirname(options.isolated)),
|
| - 'relative_cwd': os.path.join(u'tests', 'isolate'),
|
| - 'variables': {
|
| - 'foo': 'bar',
|
| - 'OS': isolate.get_flavor(),
|
| - 'chromeos': options.variables['chromeos'],
|
| - },
|
| - 'version': '1.0',
|
| - }
|
| - 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)
|
| - chromeos_value = int(isolate.get_flavor() == 'linux')
|
| - options.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': '1.0',
|
| - }
|
| - 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'],
|
| - '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': isolate.safe_relpath(
|
| - file_path.get_native_path_case(isolate_file),
|
| - os.path.dirname(options.isolated)),
|
| - 'relative_cwd': os.path.join(u'tests', 'isolate'),
|
| - 'variables': {
|
| - 'foo': 'bar',
|
| - 'OS': isolate.get_flavor(),
|
| - 'chromeos': chromeos_value,
|
| - },
|
| - 'version': '1.0',
|
| - }
|
| - 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 = {
|
| - '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'),
|
| - },
|
| - },
|
| - 'os': isolate.get_flavor(),
|
| - 'relative_cwd': os.path.join(u'tests', 'isolate'),
|
| - 'version': '1.0',
|
| - }
|
| - 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'],
|
| - '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': isolate.safe_relpath(
|
| - file_path.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,
|
| - },
|
| - 'version': '1.0',
|
| - }
|
| - self._cleanup_isolated(expected_saved_state)
|
| - self._cleanup_saved_state(actual_saved_state)
|
| - self.assertEqual(expected_saved_state, actual_saved_state)
|
| -
|
| - 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.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_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 = {
|
| - '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'),
|
| - },
|
| - },
|
| - 'os': isolate.get_flavor(),
|
| - 'relative_cwd': os.path.join(u'tests', 'isolate'),
|
| - 'version': '1.0',
|
| - }
|
| - 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'],
|
| - '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': isolate.safe_relpath(
|
| - file_path.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,
|
| - },
|
| - 'version': '1.0',
|
| - }
|
| - 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)
|
| - chromeos_value = int(isolate.get_flavor() == 'linux')
|
| - # Any directory outside ROOT_DIR/tests/isolate.
|
| - options.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'),
|
| - },
|
| - },
|
| - 'os': isolate.get_flavor(),
|
| - 'relative_cwd': os.path.join(u'tests', 'isolate'),
|
| - 'version': '1.0',
|
| - }
|
| - self._cleanup_isolated(expected_isolated)
|
| - self.assertEqual(expected_isolated, actual_isolated)
|
| -
|
| - expected_saved_state = {
|
| - 'algo': 'sha-1',
|
| - 'child_isolated_files': [],
|
| - 'command': [],
|
| - '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': isolate.safe_relpath(
|
| - file_path.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.path.join(u'..', '..', 'third_party'),
|
| - 'OS': isolate.get_flavor(),
|
| - 'chromeos': chromeos_value,
|
| - },
|
| - 'version': '1.0',
|
| - }
|
| - 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_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'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'os': unicode(isolate.get_flavor()),
|
| - u'relative_cwd': u'.',
|
| - u'version': u'1.0',
|
| - }
|
| - 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'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'os': unicode(isolate.get_flavor()),
|
| - u'version': u'1.0',
|
| - }
|
| - 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'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'os': unicode(isolate.get_flavor()),
|
| - u'version': u'1.0',
|
| - }
|
| - 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'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'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': isolate.safe_relpath(
|
| - file_path.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',
|
| - },
|
| - u'version': u'1.0',
|
| - }
|
| - 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)))
|
| -
|
| -
|
| -class IsolateCommand(IsolateBase):
|
| - def load_complete_state(self, *_):
|
| - """Creates a minimalist CompleteState instance without an .isolated
|
| - reference.
|
| - """
|
| - out = isolate.CompleteState(None, isolate.SavedState(self.cwd))
|
| - out.saved_state.isolate_file = u'blah.isolate'
|
| - out.saved_state.relative_cwd = u''
|
| - return out
|
| -
|
| - def test_CMDrewrite(self):
|
| - isolate_file = os.path.join(self.cwd, 'x.isolate')
|
| - data = (
|
| - '# Foo',
|
| - '{',
|
| - '}',
|
| - )
|
| - with open(isolate_file, 'wb') as f:
|
| - f.write('\n'.join(data))
|
| -
|
| - self.mock(sys, 'stdout', cStringIO.StringIO())
|
| - cmd = ['-i', isolate_file]
|
| - self.assertEqual(0, isolate.CMDrewrite(isolate.OptionParserIsolate(), cmd))
|
| - with open(isolate_file, 'rb') as f:
|
| - actual = f.read()
|
| -
|
| - expected = "# Foo\n{\n 'conditions': [\n ],\n}\n"
|
| - self.assertEqual(expected, actual)
|
| -
|
| - if sys.platform != 'win32':
|
| - def test_CMDcheck_no_mode_on_windows(self):
|
| - # Store for Windows, make sure file mode are not included. Hopefully, run
|
| - # this test on another OS.
|
| - isolate_file = os.path.join(
|
| - ROOT_DIR, 'tests', 'isolate', 'symlink_full.isolate')
|
| - isolated_file = os.path.join(self.cwd, 'foo.isolated')
|
| - cmd = [
|
| - '-i', isolate_file,
|
| - '-V', 'OS', 'win',
|
| - '-V', 'chromeos', '0',
|
| - '-s', isolated_file,
|
| - ]
|
| - self.assertEqual(0, isolate.CMDcheck(isolate.OptionParserIsolate(), cmd))
|
| - with open(isolated_file, 'rb') as f:
|
| - actual = json.load(f)
|
| - mapped = [
|
| - os.path.join(u'files2', 'subdir', '42.txt'),
|
| - os.path.join(u'files2', 'test_file1.txt'),
|
| - os.path.join(u'files2', 'test_file2.txt'),
|
| - os.path.join(u'symlink_full.py'),
|
| - ]
|
| - files = dict(
|
| - (
|
| - f,
|
| - {
|
| - u'h': unicode(hash_file('tests', 'isolate', f)),
|
| - u's': _size('tests', 'isolate', f),
|
| - }
|
| - )
|
| - for f in mapped)
|
| - expected = {
|
| - u'algo': u'sha-1',
|
| - u'command': [u'python', u'symlink_full.py'],
|
| - u'files': files,
|
| - u'os': u'win',
|
| - u'relative_cwd': u'.',
|
| - u'version': u'1.0',
|
| - }
|
| - self.assertEqual(expected, actual)
|
| -
|
| - def test_CMDrun_extra_args(self):
|
| - cmd = [
|
| - 'run',
|
| - '--isolate', 'blah.isolate',
|
| - '--outdir', os.path.join(self.cwd, 'jumbo'),
|
| - '--', 'extra_args',
|
| - ]
|
| - self.mock(isolate, 'load_complete_state', self.load_complete_state)
|
| - self.mock(isolate.subprocess, 'call', lambda *_, **_kwargs: 0)
|
| - self.assertEqual(0, isolate.CMDrun(isolate.OptionParserIsolate(), cmd))
|
| -
|
| -
|
| -if __name__ == '__main__':
|
| - logging.basicConfig(
|
| - level=logging.DEBUG if '-v' in sys.argv else logging.ERROR,
|
| - format='%(levelname)5s %(filename)15s(%(lineno)3d): %(message)s')
|
| - if '-v' in sys.argv:
|
| - unittest.TestCase.maxDiff = None
|
| - unittest.main()
|
|
|