#!/usr/bin/env vpython3
# Copyright 2017 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 collections
import itertools
import logging
import os
import sys
import unittest

sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))

from third_party import schema

import metrics
# We have to disable monitoring before importing gclient.
metrics.DISABLE_METRICS_COLLECTION = True

import gclient
import gclient_eval
import gclient_utils


class GClientEvalTest(unittest.TestCase):
  def test_str(self):
    self.assertEqual('foo', gclient_eval._gclient_eval('"foo"'))

  def test_tuple(self):
    self.assertEqual(('a', 'b'), gclient_eval._gclient_eval('("a", "b")'))

  def test_list(self):
    self.assertEqual(['a', 'b'], gclient_eval._gclient_eval('["a", "b"]'))

  def test_dict(self):
    self.assertEqual({'a': 'b'}, gclient_eval._gclient_eval('{"a": "b"}'))

  def test_name_safe(self):
    self.assertEqual(True, gclient_eval._gclient_eval('True'))

  def test_name_unsafe(self):
    with self.assertRaises(ValueError) as cm:
      gclient_eval._gclient_eval('UnsafeName')
    self.assertIn('invalid name \'UnsafeName\'', str(cm.exception))

  def test_invalid_call(self):
    with self.assertRaises(ValueError) as cm:
      gclient_eval._gclient_eval('Foo("bar")')
    self.assertIn('Var is the only allowed function', str(cm.exception))

  def test_expands_vars(self):
    self.assertEqual(
        'foo',
        gclient_eval._gclient_eval('Var("bar")', vars_dict={'bar': 'foo'}))

  def test_expands_vars_with_braces(self):
    self.assertEqual(
        'foo',
        gclient_eval._gclient_eval('"{bar}"', vars_dict={'bar': 'foo'}))

  def test_invalid_var(self):
    with self.assertRaises(KeyError) as cm:
      gclient_eval._gclient_eval('"{bar}"', vars_dict={})
    self.assertIn('bar was used as a variable, but was not declared',
                  str(cm.exception))

  def test_plus(self):
    self.assertEqual('foo', gclient_eval._gclient_eval('"f" + "o" + "o"'))

  def test_format(self):
    self.assertEqual('foo', gclient_eval._gclient_eval('"%s" % "foo"'))

  def test_not_expression(self):
    with self.assertRaises(SyntaxError) as cm:
      gclient_eval._gclient_eval('def foo():\n  pass')
    self.assertIn('invalid syntax', str(cm.exception))

  def test_not_whitelisted(self):
    with self.assertRaises(ValueError) as cm:
      gclient_eval._gclient_eval('[x for x in [1, 2, 3]]')
    self.assertIn(
        'unexpected AST node: <_ast.ListComp object', str(cm.exception))

  def test_dict_ordered(self):
    for test_case in itertools.permutations(range(4)):
      input_data = ['{'] + ['"%s": "%s",' % (n, n) for n in test_case] + ['}']
      expected = [(str(n), str(n)) for n in test_case]
      result = gclient_eval._gclient_eval(''.join(input_data))
      self.assertEqual(expected, list(result.items()))


class ExecTest(unittest.TestCase):
  def test_multiple_assignment(self):
    with self.assertRaises(ValueError) as cm:
      gclient_eval.Exec('a, b, c = "a", "b", "c"')
    self.assertIn(
        'invalid assignment: target should be a name', str(cm.exception))

  def test_override(self):
    with self.assertRaises(ValueError) as cm:
      gclient_eval.Exec('a = "a"\na = "x"')
    self.assertIn(
        'invalid assignment: overrides var \'a\'', str(cm.exception))

  def test_schema_wrong_type(self):
    with self.assertRaises(gclient_utils.Error):
      gclient_eval.Exec('include_rules = {}')

  def test_recursedeps_list(self):
    local_scope = gclient_eval.Exec(
        'recursedeps = [["src/third_party/angle", "DEPS.chromium"]]')
    self.assertEqual(
        {'recursedeps': [['src/third_party/angle', 'DEPS.chromium']]},
        local_scope)

  def test_var(self):
    local_scope = gclient_eval.Exec('\n'.join([
        'vars = {',
        '  "foo": "bar",',
        '}',
        'deps = {',
        '  "a_dep": "a" + Var("foo") + "b",',
        '}',
    ]))
    self.assertEqual({
        'vars': collections.OrderedDict([('foo', 'bar')]),
        'deps': collections.OrderedDict([('a_dep', 'abarb')]),
    }, local_scope)

  def test_braces_var(self):
    local_scope = gclient_eval.Exec('\n'.join([
        'vars = {',
        '  "foo": "bar",',
        '}',
        'deps = {',
        '  "a_dep": "a{foo}b",',
        '}',
    ]))
    self.assertEqual({
        'vars': collections.OrderedDict([('foo', 'bar')]),
        'deps': collections.OrderedDict([('a_dep', 'abarb')]),
    }, local_scope)

  def test_empty_deps(self):
    local_scope = gclient_eval.Exec('deps = {}')
    self.assertEqual({'deps': {}}, local_scope)

  def test_overrides_vars(self):
    local_scope = gclient_eval.Exec('\n'.join([
        'vars = {',
        '  "foo": "bar",',
        '}',
        'deps = {',
        '  "a_dep": "a{foo}b",',
        '}',
    ]), vars_override={'foo': 'baz'})
    self.assertEqual({
        'vars': collections.OrderedDict([('foo', 'bar')]),
        'deps': collections.OrderedDict([('a_dep', 'abazb')]),
    }, local_scope)

  def test_doesnt_override_undeclared_vars(self):
    with self.assertRaises(KeyError) as cm:
      gclient_eval.Exec('\n'.join([
          'vars = {',
          '  "foo": "bar",',
          '}',
          'deps = {',
          '  "a_dep": "a{baz}b",',
          '}',
      ]), vars_override={'baz': 'lalala'})
    self.assertIn('baz was used as a variable, but was not declared',
                  str(cm.exception))

  def test_doesnt_allow_duplicate_deps(self):
    with self.assertRaises(ValueError) as cm:
      gclient_eval.Parse('\n'.join([
        'deps = {',
        '  "a_dep": {',
        '    "url": "a_url@a_rev",',
        '    "condition": "foo",',
        '  },',
        '  "a_dep": {',
        '    "url": "a_url@another_rev",',
        '    "condition": "not foo",',
        '  }',
        '}',
      ]), '<unknown>')
    self.assertIn('duplicate key in dictionary: a_dep', str(cm.exception))


class UpdateConditionTest(unittest.TestCase):
  def test_both_present(self):
    info = {'condition': 'foo'}
    gclient_eval.UpdateCondition(info, 'and', 'bar')
    self.assertEqual(info, {'condition': '(foo) and (bar)'})

    info = {'condition': 'foo'}
    gclient_eval.UpdateCondition(info, 'or', 'bar')
    self.assertEqual(info, {'condition': '(foo) or (bar)'})

  def test_one_present_and(self):
    # If one of info's condition or new_condition is present, and |op| == 'and'
    # then the the result must be the present condition.
    info = {'condition': 'foo'}
    gclient_eval.UpdateCondition(info, 'and', None)
    self.assertEqual(info, {'condition': 'foo'})

    info = {}
    gclient_eval.UpdateCondition(info, 'and', 'bar')
    self.assertEqual(info, {'condition': 'bar'})

  def test_both_absent_and(self):
    # Nothing happens
    info = {}
    gclient_eval.UpdateCondition(info, 'and', None)
    self.assertEqual(info, {})

  def test_or(self):
    # If one of info's condition and new_condition is not present, then there
    # shouldn't be a condition. An absent value is treated as implicitly True.
    info = {'condition': 'foo'}
    gclient_eval.UpdateCondition(info, 'or', None)
    self.assertEqual(info, {})

    info = {}
    gclient_eval.UpdateCondition(info, 'or', 'bar')
    self.assertEqual(info, {})

    info = {}
    gclient_eval.UpdateCondition(info, 'or', None)
    self.assertEqual(info, {})


class EvaluateConditionTest(unittest.TestCase):
  def test_true(self):
    self.assertTrue(gclient_eval.EvaluateCondition('True', {}))

  def test_variable(self):
    self.assertFalse(gclient_eval.EvaluateCondition('foo', {'foo': 'False'}))

  def test_variable_cyclic_reference(self):
    with self.assertRaises(ValueError) as cm:
      self.assertTrue(gclient_eval.EvaluateCondition('bar', {'bar': 'bar'}))
    self.assertIn(
        'invalid cyclic reference to \'bar\' (inside \'bar\')',
        str(cm.exception))

  def test_operators(self):
    self.assertFalse(gclient_eval.EvaluateCondition(
        'a and not (b or c)', {'a': 'True', 'b': 'False', 'c': 'True'}))

  def test_expansion(self):
    self.assertTrue(gclient_eval.EvaluateCondition(
        'a or b', {'a': 'b and c', 'b': 'not c', 'c': 'False'}))

  def test_string_equality(self):
    self.assertTrue(gclient_eval.EvaluateCondition(
        'foo == "baz"', {'foo': '"baz"'}))
    self.assertFalse(gclient_eval.EvaluateCondition(
        'foo == "bar"', {'foo': '"baz"'}))

  def test_string_inequality(self):
    self.assertTrue(gclient_eval.EvaluateCondition(
        'foo != "bar"', {'foo': '"baz"'}))
    self.assertFalse(gclient_eval.EvaluateCondition(
        'foo != "baz"', {'foo': '"baz"'}))

  def test_triple_or(self):
    self.assertTrue(gclient_eval.EvaluateCondition(
        'a or b or c', {'a': 'False', 'b': 'False', 'c': 'True'}))
    self.assertFalse(gclient_eval.EvaluateCondition(
        'a or b or c', {'a': 'False', 'b': 'False', 'c': 'False'}))

  def test_triple_and(self):
    self.assertTrue(gclient_eval.EvaluateCondition(
        'a and b and c', {'a': 'True', 'b': 'True', 'c': 'True'}))
    self.assertFalse(gclient_eval.EvaluateCondition(
        'a and b and c', {'a': 'True', 'b': 'True', 'c': 'False'}))

  def test_triple_and_and_or(self):
    self.assertTrue(gclient_eval.EvaluateCondition(
        'a and b and c or d or e',
        {'a': 'False', 'b': 'False', 'c': 'False', 'd': 'False', 'e': 'True'}))
    self.assertFalse(gclient_eval.EvaluateCondition(
        'a and b and c or d or e',
        {'a': 'True', 'b': 'True', 'c': 'False', 'd': 'False', 'e': 'False'}))

  def test_string_bool(self):
    self.assertFalse(gclient_eval.EvaluateCondition(
        'false_str_var and true_var',
        {'false_str_var': 'False', 'true_var': True}))

  def test_string_bool_typo(self):
    with self.assertRaises(ValueError) as cm:
      gclient_eval.EvaluateCondition(
          'false_var_str and true_var',
          {'false_str_var': 'False', 'true_var': True})
    self.assertIn(
        'invalid "and" operand \'false_var_str\' '
            '(inside \'false_var_str and true_var\')',
        str(cm.exception))

  def test_non_bool_in_or(self):
    with self.assertRaises(ValueError) as cm:
      gclient_eval.EvaluateCondition(
          'string_var or true_var',
          {'string_var': 'Kittens', 'true_var': True})
    self.assertIn(
        'invalid "or" operand \'Kittens\' '
            '(inside \'string_var or true_var\')',
        str(cm.exception))

  def test_non_bool_in_and(self):
    with self.assertRaises(ValueError) as cm:
      gclient_eval.EvaluateCondition(
          'string_var and true_var',
          {'string_var': 'Kittens', 'true_var': True})
    self.assertIn(
        'invalid "and" operand \'Kittens\' '
            '(inside \'string_var and true_var\')',
        str(cm.exception))

  def test_tuple_presence(self):
    self.assertTrue(gclient_eval.EvaluateCondition(
      'foo in ("bar", "baz")', {'foo': 'bar'}))
    self.assertFalse(gclient_eval.EvaluateCondition(
      'foo in ("bar", "baz")', {'foo': 'not_bar'}))

  def test_unsupported_tuple_operation(self):
    with self.assertRaises(ValueError) as cm:
      gclient_eval.EvaluateCondition('foo == ("bar", "baz")', {'foo': 'bar'})
    self.assertIn('unexpected AST node', str(cm.exception))

    with self.assertRaises(ValueError) as cm:
      gclient_eval.EvaluateCondition('(foo,) == "bar"', {'foo': 'bar'})
    self.assertIn('unexpected AST node', str(cm.exception))


class VarTest(unittest.TestCase):
  def assert_adds_var(self, before, after):
    local_scope = gclient_eval.Exec('\n'.join(before))
    gclient_eval.AddVar(local_scope, 'baz', 'lemur')
    results = gclient_eval.RenderDEPSFile(local_scope)
    self.assertEqual(results, '\n'.join(after))

  def test_adds_var(self):
    before = [
        'vars = {',
        '  "foo": "bar",',
        '}',
    ]
    after = [
        'vars = {',
        '  "baz": "lemur",',
        '  "foo": "bar",',
        '}',
    ]
    self.assert_adds_var(before, after)

  def test_adds_var_twice(self):
    local_scope = gclient_eval.Exec('\n'.join([
        'vars = {',
        '  "foo": "bar",',
        '}',
    ]))

    gclient_eval.AddVar(local_scope, 'baz', 'lemur')
    gclient_eval.AddVar(local_scope, 'v8_revision', 'deadbeef')
    result = gclient_eval.RenderDEPSFile(local_scope)

    self.assertEqual(result, '\n'.join([
        'vars = {',
        '  "v8_revision": "deadbeef",',
        '  "baz": "lemur",',
        '  "foo": "bar",',
        '}',
    ]))

  def test_gets_and_sets_var(self):
    local_scope = gclient_eval.Exec('\n'.join([
        'vars = {',
        '  "foo": "bar",',
        '}',
    ]))

    result = gclient_eval.GetVar(local_scope, 'foo')
    self.assertEqual(result, "bar")

    gclient_eval.SetVar(local_scope, 'foo', 'baz')
    result = gclient_eval.RenderDEPSFile(local_scope)

    self.assertEqual(result, '\n'.join([
        'vars = {',
        '  "foo": "baz",',
        '}',
    ]))

  def test_gets_and_sets_var_non_string(self):
    local_scope = gclient_eval.Exec('\n'.join([
        'vars = {',
        '  "foo": True,',
        '}',
    ]))

    result = gclient_eval.GetVar(local_scope, 'foo')
    self.assertEqual(result, True)

    gclient_eval.SetVar(local_scope, 'foo', 'False')
    result = gclient_eval.RenderDEPSFile(local_scope)

    self.assertEqual(result, '\n'.join([
        'vars = {',
        '  "foo": False,',
        '}',
    ]))


  def test_add_preserves_formatting(self):
    before = [
        '# Copyright stuff',
        '# some initial comments',
        '',
        'vars = { ',
        '  # Some comments.',
        '  "foo": "bar",',
        '',
        '  # More comments.',
        '  # Even more comments.',
        '  "v8_revision":   ',
        '       "deadbeef",',
        ' # Someone formatted this wrong',
        '}',
    ]
    after = [
        '# Copyright stuff',
        '# some initial comments',
        '',
        'vars = { ',
        '  "baz": "lemur",',
        '  # Some comments.',
        '  "foo": "bar",',
        '',
        '  # More comments.',
        '  # Even more comments.',
        '  "v8_revision":   ',
        '       "deadbeef",',
        ' # Someone formatted this wrong',
        '}',
    ]
    self.assert_adds_var(before, after)

  def test_set_preserves_formatting(self):
    local_scope = gclient_eval.Exec('\n'.join([
        'vars = {',
        '   # Comment with trailing space ',
        ' "foo": \'bar\',',
        '}',
    ]))

    gclient_eval.SetVar(local_scope, 'foo', 'baz')
    result = gclient_eval.RenderDEPSFile(local_scope)

    self.assertEqual(result, '\n'.join([
        'vars = {',
        '   # Comment with trailing space ',
        ' "foo": \'baz\',',
        '}',
    ]))


class CipdTest(unittest.TestCase):
  def test_gets_and_sets_cipd(self):
    local_scope = gclient_eval.Exec('\n'.join([
        'deps = {',
        '    "src/cipd/package": {',
        '        "packages": [',
        '            {',
        '                "package": "some/cipd/package",',
        '                "version": "deadbeef",',
        '            },',
        '            {',
        '                "package": "another/cipd/package",',
        '                "version": "version:5678",',
        '            },',
        '        ],',
        '        "condition": "checkout_android",',
        '        "dep_type": "cipd",',
        '    },',
        '}',
    ]))

    self.assertEqual(
        gclient_eval.GetCIPD(
            local_scope, 'src/cipd/package', 'some/cipd/package'),
        'deadbeef')

    self.assertEqual(
        gclient_eval.GetCIPD(
            local_scope, 'src/cipd/package', 'another/cipd/package'),
        'version:5678')

    gclient_eval.SetCIPD(
        local_scope, 'src/cipd/package', 'another/cipd/package', 'version:6789')
    gclient_eval.SetCIPD(
        local_scope, 'src/cipd/package', 'some/cipd/package', 'foobar')
    result = gclient_eval.RenderDEPSFile(local_scope)

    self.assertEqual(result, '\n'.join([
        'deps = {',
        '    "src/cipd/package": {',
        '        "packages": [',
        '            {',
        '                "package": "some/cipd/package",',
        '                "version": "foobar",',
        '            },',
        '            {',
        '                "package": "another/cipd/package",',
        '                "version": "version:6789",',
        '            },',
        '        ],',
        '        "condition": "checkout_android",',
        '        "dep_type": "cipd",',
        '    },',
        '}',
    ]))

  def test_gets_and_sets_cipd_vars(self):
    local_scope = gclient_eval.Exec('\n'.join([
        'vars = {',
        '    "cipd-rev": "git_revision:deadbeef",',
        '    "another-cipd-rev": "version:1.0.3",',
        '}',
        'deps = {',
        '    "src/cipd/package": {',
        '        "packages": [',
        '            {',
        '                "package": "some/cipd/package",',
        '                "version": Var("cipd-rev"),',
        '            },',
        '            {',
        '                "package": "another/cipd/package",',
        '                "version": "{another-cipd-rev}",',
        '            },',
        '        ],',
        '        "condition": "checkout_android",',
        '        "dep_type": "cipd",',
        '    },',
        '}',
    ]))

    self.assertEqual(
        gclient_eval.GetCIPD(
            local_scope, 'src/cipd/package', 'some/cipd/package'),
        'git_revision:deadbeef')

    self.assertEqual(
        gclient_eval.GetCIPD(
            local_scope, 'src/cipd/package', 'another/cipd/package'),
        'version:1.0.3')

    gclient_eval.SetCIPD(
        local_scope, 'src/cipd/package', 'another/cipd/package',
        'version:1.1.0')
    gclient_eval.SetCIPD(
        local_scope, 'src/cipd/package', 'some/cipd/package',
        'git_revision:foobar')
    result = gclient_eval.RenderDEPSFile(local_scope)

    self.assertEqual(result, '\n'.join([
        'vars = {',
        '    "cipd-rev": "git_revision:foobar",',
        '    "another-cipd-rev": "version:1.1.0",',
        '}',
        'deps = {',
        '    "src/cipd/package": {',
        '        "packages": [',
        '            {',
        '                "package": "some/cipd/package",',
        '                "version": Var("cipd-rev"),',
        '            },',
        '            {',
        '                "package": "another/cipd/package",',
        '                "version": "{another-cipd-rev}",',
        '            },',
        '        ],',
        '        "condition": "checkout_android",',
        '        "dep_type": "cipd",',
        '    },',
        '}',
    ]))

  def test_preserves_escaped_vars(self):
    local_scope = gclient_eval.Exec('\n'.join([
        'deps = {',
        '    "src/cipd/package": {',
        '        "packages": [',
        '            {',
        '                "package": "package/${{platform}}",',
        '                "version": "version:abcd",',
        '            },',
        '        ],',
        '        "dep_type": "cipd",',
        '    },',
        '}',
    ]))

    gclient_eval.SetCIPD(
        local_scope, 'src/cipd/package', 'package/${platform}', 'version:dcba')
    result = gclient_eval.RenderDEPSFile(local_scope)

    self.assertEqual(result, '\n'.join([
        'deps = {',
        '    "src/cipd/package": {',
        '        "packages": [',
        '            {',
        '                "package": "package/${{platform}}",',
        '                "version": "version:dcba",',
        '            },',
        '        ],',
        '        "dep_type": "cipd",',
        '    },',
        '}',
    ]))


class RevisionTest(unittest.TestCase):
  def assert_gets_and_sets_revision(self, before, after, rev_before='deadbeef'):
    local_scope = gclient_eval.Exec('\n'.join(before))

    result = gclient_eval.GetRevision(local_scope, 'src/dep')
    self.assertEqual(result, rev_before)

    gclient_eval.SetRevision(local_scope, 'src/dep', 'deadfeed')
    self.assertEqual('\n'.join(after), gclient_eval.RenderDEPSFile(local_scope))

  def test_revision(self):
    before = [
        'deps = {',
        '  "src/dep": "https://example.com/dep.git@deadbeef",',
        '}',
    ]
    after = [
        'deps = {',
        '  "src/dep": "https://example.com/dep.git@deadfeed",',
        '}',
    ]
    self.assert_gets_and_sets_revision(before, after)

  def test_revision_new_line(self):
    before = [
        'deps = {',
        '  "src/dep": "https://example.com/dep.git@"',
        '             + "deadbeef",',
        '}',
    ]
    after = [
        'deps = {',
        '  "src/dep": "https://example.com/dep.git@"',
        '             + "deadfeed",',
        '}',
    ]
    self.assert_gets_and_sets_revision(before, after)

  def test_revision_windows_local_path(self):
    before = [
        'deps = {',
        '  "src/dep": "file:///C:\\\\path.git@deadbeef",',
        '}',
    ]
    after = [
        'deps = {',
        '  "src/dep": "file:///C:\\\\path.git@deadfeed",',
        '}',
    ]
    self.assert_gets_and_sets_revision(before, after)

  def test_revision_multiline_strings(self):
    deps = [
        'deps = {',
        '  "src/dep": "https://example.com/dep.git@"',
        '             "deadbeef",',
        '}',
    ]
    with self.assertRaises(ValueError) as e:
      local_scope = gclient_eval.Exec('\n'.join(deps))
      gclient_eval.SetRevision(local_scope, 'src/dep', 'deadfeed')
    self.assertEqual(
        'Can\'t update value for src/dep. Multiline strings and implicitly '
        'concatenated strings are not supported.\n'
        'Consider reformatting the DEPS file.',
        str(e.exception))

  def test_revision_implicitly_concatenated_strings(self):
    deps = [
        'deps = {',
        '  "src/dep": "https://example.com" + "/dep.git@" "deadbeef",',
        '}',
    ]
    with self.assertRaises(ValueError) as e:
      local_scope = gclient_eval.Exec('\n'.join(deps))
      gclient_eval.SetRevision(local_scope, 'src/dep', 'deadfeed')
    self.assertEqual(
        'Can\'t update value for src/dep. Multiline strings and implicitly '
        'concatenated strings are not supported.\n'
        'Consider reformatting the DEPS file.',
        str(e.exception))

  def test_revision_inside_dict(self):
    before = [
        'deps = {',
        '  "src/dep": {',
        '    "url": "https://example.com/dep.git@deadbeef",',
        '    "condition": "some_condition",',
        '  },',
        '}',
    ]
    after = [
        'deps = {',
        '  "src/dep": {',
        '    "url": "https://example.com/dep.git@deadfeed",',
        '    "condition": "some_condition",',
        '  },',
        '}',
    ]
    self.assert_gets_and_sets_revision(before, after)

  def test_follows_var_braces(self):
    before = [
        'vars = {',
        '  "dep_revision": "deadbeef",',
        '}',
        'deps = {',
        '  "src/dep": "https://example.com/dep.git@{dep_revision}",',
        '}',
    ]
    after = [
        'vars = {',
        '  "dep_revision": "deadfeed",',
        '}',
        'deps = {',
        '  "src/dep": "https://example.com/dep.git@{dep_revision}",',
        '}',
    ]
    self.assert_gets_and_sets_revision(before, after)

  def test_follows_var_braces_newline(self):
    before = [
        'vars = {',
        '  "dep_revision": "deadbeef",',
        '}',
        'deps = {',
        '  "src/dep": "https://example.com/dep.git"',
        '             + "@{dep_revision}",',
        '}',
    ]
    after = [
        'vars = {',
        '  "dep_revision": "deadfeed",',
        '}',
        'deps = {',
        '  "src/dep": "https://example.com/dep.git"',
        '             + "@{dep_revision}",',
        '}',
    ]
    self.assert_gets_and_sets_revision(before, after)

  def test_follows_var_function(self):
    before = [
        'vars = {',
        '  "dep_revision": "deadbeef",',
        '}',
        'deps = {',
        '  "src/dep": "https://example.com/dep.git@" + Var("dep_revision"),',
        '}',
    ]
    after = [
        'vars = {',
        '  "dep_revision": "deadfeed",',
        '}',
        'deps = {',
        '  "src/dep": "https://example.com/dep.git@" + Var("dep_revision"),',
        '}',
    ]
    self.assert_gets_and_sets_revision(before, after)

  def test_pins_revision(self):
    before = [
        'deps = {',
        '  "src/dep": "https://example.com/dep.git",',
        '}',
    ]
    after = [
        'deps = {',
        '  "src/dep": "https://example.com/dep.git@deadfeed",',
        '}',
    ]
    self.assert_gets_and_sets_revision(before, after, rev_before=None)

  def test_preserves_variables(self):
    before = [
        'vars = {',
        '  "src_root": "src"',
        '}',
        'deps = {',
        '  "{src_root}/dep": "https://example.com/dep.git@deadbeef",',
        '}',
    ]
    after = [
        'vars = {',
        '  "src_root": "src"',
        '}',
        'deps = {',
        '  "{src_root}/dep": "https://example.com/dep.git@deadfeed",',
        '}',
    ]
    self.assert_gets_and_sets_revision(before, after)

  def test_preserves_formatting(self):
    before = [
        'vars = {',
        ' # Some comment on deadbeef ',
        '  "dep_revision": "deadbeef",',
        '}',
        'deps = {',
        '  "src/dep": {',
        '    "url": "https://example.com/dep.git@" + Var("dep_revision"),',
        '',
        '    "condition": "some_condition",',
        ' },',
        '}',
    ]
    after = [
        'vars = {',
        ' # Some comment on deadbeef ',
        '  "dep_revision": "deadfeed",',
        '}',
        'deps = {',
        '  "src/dep": {',
        '    "url": "https://example.com/dep.git@" + Var("dep_revision"),',
        '',
        '    "condition": "some_condition",',
        ' },',
        '}',
    ]
    self.assert_gets_and_sets_revision(before, after)


class ParseTest(unittest.TestCase):
  def callParse(self, vars_override=None):
    return gclient_eval.Parse('\n'.join([
        'vars = {',
        '  "foo": "bar",',
        '}',
        'deps = {',
        '  "a_dep": "a{foo}b",',
        '}',
    ]), '<unknown>', vars_override)

  def test_supports_vars_inside_vars(self):
    deps_file = '\n'.join([
        'vars = {',
        '  "foo": "bar",',
        '  "baz": "\\"{foo}\\" == \\"bar\\"",',
        '}',
        'deps = {',
        '  "src/baz": {',
        '    "url": "baz_url",',
        '    "condition": "baz",',
        '  },',
        '}',
    ])
    local_scope = gclient_eval.Parse(deps_file, '<unknown>', None)
    self.assertEqual({
        'vars': {'foo': 'bar',
                 'baz': '"bar" == "bar"'},
        'deps': {'src/baz': {'url': 'baz_url',
                             'dep_type': 'git',
                             'condition': 'baz'}},
    }, local_scope)

  def test_has_builtin_vars(self):
    builtin_vars = {'builtin_var': 'foo'}
    deps_file = '\n'.join([
      'deps = {',
      '  "a_dep": "a{builtin_var}b",',
      '}',
    ])
    local_scope = gclient_eval.Parse(deps_file, '<unknown>', None, builtin_vars)
    self.assertEqual({
      'deps': {'a_dep': {'url': 'afoob',
                         'dep_type': 'git'}},
    }, local_scope)

  def test_declaring_builtin_var_has_no_effect(self):
    builtin_vars = {'builtin_var': 'foo'}
    deps_file = '\n'.join([
        'vars = {',
        '  "builtin_var": "bar",',
        '}',
        'deps = {',
        '  "a_dep": "a{builtin_var}b",',
        '}',
    ])
    local_scope = gclient_eval.Parse(deps_file, '<unknown>', None, builtin_vars)
    self.assertEqual({
      'vars': {'builtin_var': 'bar'},
      'deps': {'a_dep': {'url': 'afoob',
                         'dep_type': 'git'}},
    }, local_scope)

  def test_override_builtin_var(self):
    builtin_vars = {'builtin_var': 'foo'}
    vars_override = {'builtin_var': 'override'}
    deps_file = '\n'.join([
      'deps = {',
      '  "a_dep": "a{builtin_var}b",',
      '}',
    ])
    local_scope = gclient_eval.Parse(
        deps_file, '<unknown>', vars_override, builtin_vars)
    self.assertEqual({
      'deps': {'a_dep': {'url': 'aoverrideb',
                         'dep_type': 'git'}},
    }, local_scope, str(local_scope))

  def test_expands_vars(self):
    local_scope = self.callParse()
    self.assertEqual({
        'vars': {'foo': 'bar'},
        'deps': {'a_dep': {'url': 'abarb',
                           'dep_type': 'git'}},
    }, local_scope)

  def test_overrides_vars(self):
    local_scope = self.callParse(vars_override={'foo': 'baz'})
    self.assertEqual({
        'vars': {'foo': 'bar'},
        'deps': {'a_dep': {'url': 'abazb',
                           'dep_type': 'git'}},
    }, local_scope)

  def test_no_extra_vars(self):
    deps_file = '\n'.join([
        'vars = {',
        '  "foo": "bar",',
        '}',
        'deps = {',
        '  "a_dep": "a{baz}b",',
        '}',
    ])

    with self.assertRaises(KeyError) as cm:
      gclient_eval.Parse(deps_file, '<unknown>', {'baz': 'lalala'})
    self.assertIn('baz was used as a variable, but was not declared',
                  str(cm.exception))

  def test_standardizes_deps_string_dep(self):
    local_scope = gclient_eval.Parse('\n'.join([
      'deps = {',
      '  "a_dep": "a_url@a_rev",',
      '}',
    ]), '<unknown>')
    self.assertEqual({
        'deps': {'a_dep': {'url': 'a_url@a_rev',
                           'dep_type': 'git'}},
    }, local_scope)

  def test_standardizes_deps_dict_dep(self):
    local_scope = gclient_eval.Parse('\n'.join([
      'deps = {',
      '  "a_dep": {',
      '     "url": "a_url@a_rev",',
      '     "condition": "checkout_android",',
      '  },',
      '}',
    ]), '<unknown>')
    self.assertEqual({
        'deps': {'a_dep': {'url': 'a_url@a_rev',
                           'dep_type': 'git',
                           'condition': 'checkout_android'}},
    }, local_scope)

  def test_ignores_none_in_deps_os(self):
    local_scope = gclient_eval.Parse('\n'.join([
      'deps = {',
      '  "a_dep": "a_url@a_rev",',
      '}',
      'deps_os = {',
      '  "mac": {',
      '     "a_dep": None,',
      '  },',
      '}',
    ]), '<unknown>')
    self.assertEqual({
        'deps': {'a_dep': {'url': 'a_url@a_rev',
                           'dep_type': 'git'}},
    }, local_scope)

  def test_merges_deps_os_extra_dep(self):
    local_scope = gclient_eval.Parse('\n'.join([
      'deps = {',
      '  "a_dep": "a_url@a_rev",',
      '}',
      'deps_os = {',
      '  "mac": {',
      '     "b_dep": "b_url@b_rev"',
      '  },',
      '}',
    ]), '<unknown>')
    self.assertEqual({
        'deps': {'a_dep': {'url': 'a_url@a_rev',
                           'dep_type': 'git'},
                 'b_dep': {'url': 'b_url@b_rev',
                           'dep_type': 'git',
                           'condition': 'checkout_mac'}},
    }, local_scope)

  def test_merges_deps_os_existing_dep_with_no_condition(self):
    local_scope = gclient_eval.Parse('\n'.join([
      'deps = {',
      '  "a_dep": "a_url@a_rev",',
      '}',
      'deps_os = {',
      '  "mac": {',
      '     "a_dep": "a_url@a_rev"',
      '  },',
      '}',
    ]), '<unknown>')
    self.assertEqual({
        'deps': {'a_dep': {'url': 'a_url@a_rev',
                           'dep_type': 'git'}},
    }, local_scope)

  def test_merges_deps_os_existing_dep_with_condition(self):
    local_scope = gclient_eval.Parse('\n'.join([
      'deps = {',
      '  "a_dep": {',
      '    "url": "a_url@a_rev",',
      '    "condition": "some_condition",',
      '  },',
      '}',
      'deps_os = {',
      '  "mac": {',
      '     "a_dep": "a_url@a_rev"',
      '  },',
      '}',
    ]), '<unknown>')
    self.assertEqual({
        'deps': {
            'a_dep': {'url': 'a_url@a_rev',
                      'dep_type': 'git',
                      'condition': '(checkout_mac) or (some_condition)'},
        },
    }, local_scope)

  def test_merges_deps_os_multiple_os(self):
    local_scope = gclient_eval.Parse('\n'.join([
      'deps_os = {',
      '  "win": {'
      '     "a_dep": "a_url@a_rev"',
      '  },',
      '  "mac": {',
      '     "a_dep": "a_url@a_rev"',
      '  },',
      '}',
    ]), '<unknown>')
    self.assertEqual({
        'deps': {
            'a_dep': {'url': 'a_url@a_rev',
                      'dep_type': 'git',
                      'condition': '(checkout_mac) or (checkout_win)'},
        },
    }, local_scope)

  def test_fails_to_merge_same_dep_with_different_revisions(self):
    with self.assertRaises(gclient_eval.gclient_utils.Error) as cm:
      gclient_eval.Parse('\n'.join([
        'deps = {',
        '  "a_dep": {',
        '    "url": "a_url@a_rev",',
        '    "condition": "some_condition",',
        '  },',
        '}',
        'deps_os = {',
        '  "mac": {',
        '     "a_dep": "a_url@b_rev"',
        '  },',
        '}',
      ]), '<unknown>')
    self.assertIn('conflicts with existing deps', str(cm.exception))

  def test_merges_hooks_os(self):
    local_scope = gclient_eval.Parse('\n'.join([
      'hooks = [',
      '  {',
      '    "action": ["a", "action"],',
      '  },',
      ']',
      'hooks_os = {',
      '  "mac": [',
      '    {',
      '       "action": ["b", "action"]',
      '    },',
      '  ]',
      '}',
    ]), '<unknown>')
    self.assertEqual({
        "hooks": [{"action": ["a", "action"]},
                  {"action": ["b", "action"], "condition": "checkout_mac"}],
    }, local_scope)


if __name__ == '__main__':
  level = logging.DEBUG if '-v' in sys.argv else logging.FATAL
  logging.basicConfig(
      level=level,
      format='%(asctime).19s %(levelname)s %(filename)s:'
             '%(lineno)s %(message)s')
  unittest.main()
