#!/usr/bin/env python

# Copyright (c) 2012 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 LD_DYLIB_INSTALL_NAME and DYLIB_INSTALL_NAME_BASE are handled
correctly.
"""

import TestGyp

import re
import subprocess
import sys

if sys.platform == 'darwin':
  test = TestGyp.TestGyp(formats=['ninja', 'make', 'xcode'])

  CHDIR = 'installname'
  test.run_gyp('test.gyp', chdir=CHDIR)
  test.build('test.gyp', test.ALL, chdir=CHDIR)

  def GetInstallname(p):
    p = test.built_file_path(p, chdir=CHDIR)
    r = re.compile(r'cmd LC_ID_DYLIB.*?name (.*?) \(offset \d+\)', re.DOTALL)
    proc = subprocess.Popen(['otool', '-l', p], stdout=subprocess.PIPE)
    o = proc.communicate()[0]
    assert not proc.returncode
    m = r.search(o)
    assert m
    return m.group(1)

  if (GetInstallname('libdefault_installname.dylib') !=
      '/usr/local/lib/libdefault_installname.dylib'):
    test.fail_test()

  if (GetInstallname('My Framework.framework/My Framework') !=
      '/Library/Frameworks/My Framework.framework/'
      'Versions/A/My Framework'):
    test.fail_test()

  if (GetInstallname('libexplicit_installname.dylib') !=
      'Trapped in a dynamiclib factory'):
    test.fail_test()

  if (GetInstallname('libexplicit_installname_base.dylib') !=
      '@executable_path/../../../libexplicit_installname_base.dylib'):
    test.fail_test()

  if (GetInstallname('My Other Framework.framework/My Other Framework') !=
      '@executable_path/../../../My Other Framework.framework/'
      'Versions/A/My Other Framework'):
    test.fail_test()

  if (GetInstallname('libexplicit_installname_with_base.dylib') !=
      '/usr/local/lib/libexplicit_installname_with_base.dylib'):
    test.fail_test()

  if (GetInstallname('libexplicit_installname_with_explicit_base.dylib') !=
      '@executable_path/../libexplicit_installname_with_explicit_base.dylib'):
    test.fail_test()

  if (GetInstallname('libboth_base_and_installname.dylib') !=
      'Still trapped in a dynamiclib factory'):
    test.fail_test()

  if (GetInstallname('install_name_with_info_plist.framework/'
                     'install_name_with_info_plist') !=
      '/Library/Frameworks/install_name_with_info_plist.framework/'
      'Versions/A/install_name_with_info_plist'):
    test.fail_test()

  if ('DYLIB_INSTALL_NAME_BASE:standardizepath: command not found' in
          test.stdout()):
    test.fail_test()

  test.pass_test()
