#!/usr/bin/env python

# Copyright 2015 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.

"""
Verifies that iOS XCTests can be built correctly.
"""

import TestGyp

import os
import subprocess
import sys

def HasCerts():
  # Because the bots do not have certs, don't check them if there are no
  # certs available.
  proc = subprocess.Popen(['security','find-identity','-p', 'codesigning',
                           '-v'], stdout=subprocess.PIPE)
  return "0 valid identities found" not in proc.communicate()[0].strip()

if sys.platform == "darwin":
  test = TestGyp.TestGyp(formats=['xcode', 'ninja'])
  test.run_gyp('xctests.gyp')
  test_configs = ['Default']
  # TODO(crbug.com/557418): Enable this once xcodebuild works for iOS devices.
  #if HasCerts() and test.format == 'xcode':
  #  test_configs.append('Default-iphoneos')
  for config in test_configs:
    test.set_configuration(config)
    test.build('xctests.gyp', test.ALL)
    test.built_file_must_exist('app_under_test.app/app_under_test')
    test.built_file_must_exist('app_tests.xctest/app_tests')
    if 'ninja' in test.format:
      test.built_file_must_exist('obj/AppTests/app_tests.AppTests.i386.o')
      test.built_file_must_exist('obj/AppTests/app_tests.AppTests.x86_64.o')
    elif test.format == 'xcode':
      xcode_object_path = os.path.join('..', 'xctests.build',
                                       'Default-iphonesimulator',
                                       'app_tests.build', 'Objects-normal',
                                       '%s', 'AppTests.o')
      test.built_file_must_exist(xcode_object_path % 'i386')
      test.built_file_must_exist(xcode_object_path % 'x86_64')
  test.pass_test()
