#!/usr/bin/env python

# Copyright (c) 2011 Google Inc. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

"""
Verifies that a failing postbuild step lets the build fail.
"""

import TestGyp

import sys

if sys.platform == 'darwin':
  # set |match| to ignore build stderr output.
  test = TestGyp.TestGyp(formats=['ninja', 'make', 'xcode'],
                         match = lambda a, b: True)

  test.run_gyp('test.gyp', chdir='postbuild-fail')

  build_error_code = {
    'xcode': [1, 65],  # 1 for xcode 3, 65 for xcode 4 (see `man sysexits`)
    'make': 2,
    'ninja': 1,
  }[test.format]


  # If a postbuild fails, all postbuilds should be re-run on the next build.
  # In Xcode 3, even if the first postbuild fails the other postbuilds were
  # still executed. In Xcode 4, postbuilds are stopped after the first
  # failing postbuild. This test checks for the Xcode 4 behavior.

  # Ignore this test on Xcode 3.
  import subprocess
  job = subprocess.Popen(['xcodebuild', '-version'],
                         stdout=subprocess.PIPE,
                         stderr=subprocess.STDOUT)
  out, err = job.communicate()
  if job.returncode != 0:
    print out
    raise Exception('Error %d running xcodebuild' % job.returncode)
  if out.startswith('Xcode 3.'):
    test.pass_test()

  # Non-bundles
  test.build('test.gyp', 'nonbundle', chdir='postbuild-fail',
             status=build_error_code)
  test.built_file_must_not_exist('static_touch',
                                 chdir='postbuild-fail')
  # Check for non-up-to-date-ness by checking if building again produces an
  # error.
  test.build('test.gyp', 'nonbundle', chdir='postbuild-fail',
             status=build_error_code)


  # Bundles
  test.build('test.gyp', 'bundle', chdir='postbuild-fail',
             status=build_error_code)
  test.built_file_must_not_exist('dynamic_touch',
                                 chdir='postbuild-fail')
  # Check for non-up-to-date-ness by checking if building again produces an
  # error.
  test.build('test.gyp', 'bundle', chdir='postbuild-fail',
             status=build_error_code)

  test.pass_test()
