145a90d82e8c974fb09788af03418fccf97e03f29sgk@chromium.org#!/usr/bin/env python
245a90d82e8c974fb09788af03418fccf97e03f29sgk@chromium.org
39be1d37a9a6561f135412db66806def9f82a29c1steveblock@chromium.org# Copyright (c) 2012 Google Inc. All rights reserved.
4df8224662e615bd36cf8bebae8e58c017201f998sgk@chromium.org# Use of this source code is governed by a BSD-style license that can be
5df8224662e615bd36cf8bebae8e58c017201f998sgk@chromium.org# found in the LICENSE file.
6df8224662e615bd36cf8bebae8e58c017201f998sgk@chromium.org
745a90d82e8c974fb09788af03418fccf97e03f29sgk@chromium.org"""
845a90d82e8c974fb09788af03418fccf97e03f29sgk@chromium.orgVerifies simple actions when using an explicit build target of 'all'.
945a90d82e8c974fb09788af03418fccf97e03f29sgk@chromium.org"""
1045a90d82e8c974fb09788af03418fccf97e03f29sgk@chromium.org
110064df5e9ec0afc53d4103d7c61c0c7f75b6c641jrg@chromium.orgimport glob
120064df5e9ec0afc53d4103d7c61c0c7f75b6c641jrg@chromium.orgimport os
1345a90d82e8c974fb09788af03418fccf97e03f29sgk@chromium.orgimport TestGyp
1445a90d82e8c974fb09788af03418fccf97e03f29sgk@chromium.org
15c55f9ca139f2900a3e612c892b4276ed4652328bjeanluc@google.comtest = TestGyp.TestGyp(workdir='workarea_all')
1645a90d82e8c974fb09788af03418fccf97e03f29sgk@chromium.org
1745a90d82e8c974fb09788af03418fccf97e03f29sgk@chromium.orgtest.run_gyp('actions.gyp', chdir='src')
1845a90d82e8c974fb09788af03418fccf97e03f29sgk@chromium.org
19fa5b46b96b21ff75d8b6b3dacc4693b69c43654csgk@chromium.orgtest.relocate('src', 'relocate/src')
2045a90d82e8c974fb09788af03418fccf97e03f29sgk@chromium.org
21f040c6194657a5972871a96cb8c3572e9296ef37evan@chromium.org# Some gyp files use an action that mentions an output but never
22f040c6194657a5972871a96cb8c3572e9296ef37evan@chromium.org# writes it as a means to making the action run on every build.  That
23f040c6194657a5972871a96cb8c3572e9296ef37evan@chromium.org# doesn't mesh well with ninja's semantics.  TODO(evan): figure out
24f040c6194657a5972871a96cb8c3572e9296ef37evan@chromium.org# how to work always-run actions in to ninja.
259be1d37a9a6561f135412db66806def9f82a29c1steveblock@chromium.org# Android also can't do this as it doesn't have order-only dependencies.
269be1d37a9a6561f135412db66806def9f82a29c1steveblock@chromium.orgif test.format in ['ninja', 'android']:
27f040c6194657a5972871a96cb8c3572e9296ef37evan@chromium.org  test.build('actions.gyp', test.ALL, chdir='relocate/src')
28f040c6194657a5972871a96cb8c3572e9296ef37evan@chromium.orgelse:
29f040c6194657a5972871a96cb8c3572e9296ef37evan@chromium.org  # Test that an "always run" action increases a counter on multiple
30f040c6194657a5972871a96cb8c3572e9296ef37evan@chromium.org  # invocations, and that a dependent action updates in step.
31f040c6194657a5972871a96cb8c3572e9296ef37evan@chromium.org  test.build('actions.gyp', test.ALL, chdir='relocate/src')
32f040c6194657a5972871a96cb8c3572e9296ef37evan@chromium.org  test.must_match('relocate/src/subdir1/actions-out/action-counter.txt', '1')
33f040c6194657a5972871a96cb8c3572e9296ef37evan@chromium.org  test.must_match('relocate/src/subdir1/actions-out/action-counter_2.txt', '1')
34f040c6194657a5972871a96cb8c3572e9296ef37evan@chromium.org  test.build('actions.gyp', test.ALL, chdir='relocate/src')
35f040c6194657a5972871a96cb8c3572e9296ef37evan@chromium.org  test.must_match('relocate/src/subdir1/actions-out/action-counter.txt', '2')
36f040c6194657a5972871a96cb8c3572e9296ef37evan@chromium.org  test.must_match('relocate/src/subdir1/actions-out/action-counter_2.txt', '2')
37f040c6194657a5972871a96cb8c3572e9296ef37evan@chromium.org
38f040c6194657a5972871a96cb8c3572e9296ef37evan@chromium.org  # The "always run" action only counts to 2, but the dependent target
39f040c6194657a5972871a96cb8c3572e9296ef37evan@chromium.org  # will count forever if it's allowed to run. This verifies that the
40f040c6194657a5972871a96cb8c3572e9296ef37evan@chromium.org  # dependent target only runs when the "always run" action generates
41f040c6194657a5972871a96cb8c3572e9296ef37evan@chromium.org  # new output, not just because the "always run" ran.
42f040c6194657a5972871a96cb8c3572e9296ef37evan@chromium.org  test.build('actions.gyp', test.ALL, chdir='relocate/src')
43f040c6194657a5972871a96cb8c3572e9296ef37evan@chromium.org  test.must_match('relocate/src/subdir1/actions-out/action-counter.txt', '2')
44f040c6194657a5972871a96cb8c3572e9296ef37evan@chromium.org  test.must_match('relocate/src/subdir1/actions-out/action-counter_2.txt', '2')
45d27ec050ed1676c69bae71faaa2b675804a2ab73sgk@chromium.org
46f187950af9c156ac83af453d63b57edfeed6b200sgk@chromium.orgexpect = """\
47f187950af9c156ac83af453d63b57edfeed6b200sgk@chromium.orgHello from program.c
48f187950af9c156ac83af453d63b57edfeed6b200sgk@chromium.orgHello from make-prog1.py
49f187950af9c156ac83af453d63b57edfeed6b200sgk@chromium.orgHello from make-prog2.py
50f187950af9c156ac83af453d63b57edfeed6b200sgk@chromium.org"""
51f187950af9c156ac83af453d63b57edfeed6b200sgk@chromium.org
5265f1cdd22ad8f73f507077d3baab38c6314f13c8mmoss@chromium.orgif test.format == 'xcode':
5345a90d82e8c974fb09788af03418fccf97e03f29sgk@chromium.org  chdir = 'relocate/src/subdir1'
5445a90d82e8c974fb09788af03418fccf97e03f29sgk@chromium.orgelse:
5545a90d82e8c974fb09788af03418fccf97e03f29sgk@chromium.org  chdir = 'relocate/src'
56f187950af9c156ac83af453d63b57edfeed6b200sgk@chromium.orgtest.run_built_executable('program', chdir=chdir, stdout=expect)
5745a90d82e8c974fb09788af03418fccf97e03f29sgk@chromium.org
58d27ec050ed1676c69bae71faaa2b675804a2ab73sgk@chromium.org
5945a90d82e8c974fb09788af03418fccf97e03f29sgk@chromium.orgtest.must_match('relocate/src/subdir2/file.out', "Hello from make-file.py\n")
6045a90d82e8c974fb09788af03418fccf97e03f29sgk@chromium.org
61d27ec050ed1676c69bae71faaa2b675804a2ab73sgk@chromium.org
62d27ec050ed1676c69bae71faaa2b675804a2ab73sgk@chromium.orgexpect = "Hello from generate_main.py\n"
63d27ec050ed1676c69bae71faaa2b675804a2ab73sgk@chromium.org
64d27ec050ed1676c69bae71faaa2b675804a2ab73sgk@chromium.orgif test.format == 'xcode':
65d27ec050ed1676c69bae71faaa2b675804a2ab73sgk@chromium.org  chdir = 'relocate/src/subdir3'
66d27ec050ed1676c69bae71faaa2b675804a2ab73sgk@chromium.orgelse:
67d27ec050ed1676c69bae71faaa2b675804a2ab73sgk@chromium.org  chdir = 'relocate/src'
68d27ec050ed1676c69bae71faaa2b675804a2ab73sgk@chromium.orgtest.run_built_executable('null_input', chdir=chdir, stdout=expect)
69d27ec050ed1676c69bae71faaa2b675804a2ab73sgk@chromium.org
70d27ec050ed1676c69bae71faaa2b675804a2ab73sgk@chromium.org
710064df5e9ec0afc53d4103d7c61c0c7f75b6c641jrg@chromium.org# Clean out files which may have been created if test.ALL was run.
720064df5e9ec0afc53d4103d7c61c0c7f75b6c641jrg@chromium.orgdef clean_dep_files():
730064df5e9ec0afc53d4103d7c61c0c7f75b6c641jrg@chromium.org  for file in (glob.glob('relocate/src/dep_*.txt') +
740064df5e9ec0afc53d4103d7c61c0c7f75b6c641jrg@chromium.org               glob.glob('relocate/src/deps_all_done_*.txt')):
750064df5e9ec0afc53d4103d7c61c0c7f75b6c641jrg@chromium.org    if os.path.exists(file):
760064df5e9ec0afc53d4103d7c61c0c7f75b6c641jrg@chromium.org      os.remove(file)
770064df5e9ec0afc53d4103d7c61c0c7f75b6c641jrg@chromium.org
780064df5e9ec0afc53d4103d7c61c0c7f75b6c641jrg@chromium.org# Confirm our clean.
790064df5e9ec0afc53d4103d7c61c0c7f75b6c641jrg@chromium.orgclean_dep_files()
800064df5e9ec0afc53d4103d7c61c0c7f75b6c641jrg@chromium.orgtest.must_not_exist('relocate/src/dep_1.txt')
810064df5e9ec0afc53d4103d7c61c0c7f75b6c641jrg@chromium.orgtest.must_not_exist('relocate/src/deps_all_done_first_123.txt')
820064df5e9ec0afc53d4103d7c61c0c7f75b6c641jrg@chromium.org
830064df5e9ec0afc53d4103d7c61c0c7f75b6c641jrg@chromium.org# Make sure all deps finish before an action is run on a 'None' target.
840064df5e9ec0afc53d4103d7c61c0c7f75b6c641jrg@chromium.org# If using the Make builder, add -j to make things more difficult.
850064df5e9ec0afc53d4103d7c61c0c7f75b6c641jrg@chromium.orgarguments = []
860064df5e9ec0afc53d4103d7c61c0c7f75b6c641jrg@chromium.orgif test.format == 'make':
870064df5e9ec0afc53d4103d7c61c0c7f75b6c641jrg@chromium.org  arguments = ['-j']
880064df5e9ec0afc53d4103d7c61c0c7f75b6c641jrg@chromium.orgtest.build('actions.gyp', 'action_with_dependencies_123', chdir='relocate/src',
890064df5e9ec0afc53d4103d7c61c0c7f75b6c641jrg@chromium.org           arguments=arguments)
900064df5e9ec0afc53d4103d7c61c0c7f75b6c641jrg@chromium.orgtest.must_exist('relocate/src/deps_all_done_first_123.txt')
910064df5e9ec0afc53d4103d7c61c0c7f75b6c641jrg@chromium.org
920064df5e9ec0afc53d4103d7c61c0c7f75b6c641jrg@chromium.org# Try again with a target that has deps in reverse.  Output files from
930064df5e9ec0afc53d4103d7c61c0c7f75b6c641jrg@chromium.org# previous tests deleted.  Confirm this execution did NOT run the ALL
940064df5e9ec0afc53d4103d7c61c0c7f75b6c641jrg@chromium.org# target which would mess up our dep tests.
950064df5e9ec0afc53d4103d7c61c0c7f75b6c641jrg@chromium.orgclean_dep_files()
960064df5e9ec0afc53d4103d7c61c0c7f75b6c641jrg@chromium.orgtest.build('actions.gyp', 'action_with_dependencies_321', chdir='relocate/src',
970064df5e9ec0afc53d4103d7c61c0c7f75b6c641jrg@chromium.org           arguments=arguments)
980064df5e9ec0afc53d4103d7c61c0c7f75b6c641jrg@chromium.orgtest.must_exist('relocate/src/deps_all_done_first_321.txt')
990064df5e9ec0afc53d4103d7c61c0c7f75b6c641jrg@chromium.orgtest.must_not_exist('relocate/src/deps_all_done_first_123.txt')
1000064df5e9ec0afc53d4103d7c61c0c7f75b6c641jrg@chromium.org
1010064df5e9ec0afc53d4103d7c61c0c7f75b6c641jrg@chromium.org
10245a90d82e8c974fb09788af03418fccf97e03f29sgk@chromium.orgtest.pass_test()
103