1e604b70501586dd3396720641f652da55e5930aftschmelcher@chromium.org#!/usr/bin/env python
2e604b70501586dd3396720641f652da55e5930aftschmelcher@chromium.org
3e604b70501586dd3396720641f652da55e5930aftschmelcher@chromium.org# Copyright (c) 2010 Google Inc. All rights reserved.
4e604b70501586dd3396720641f652da55e5930aftschmelcher@chromium.org# Use of this source code is governed by a BSD-style license that can be
5e604b70501586dd3396720641f652da55e5930aftschmelcher@chromium.org# found in the LICENSE file.
6e604b70501586dd3396720641f652da55e5930aftschmelcher@chromium.org
7e604b70501586dd3396720641f652da55e5930aftschmelcher@chromium.org"""
8e604b70501586dd3396720641f652da55e5930aftschmelcher@chromium.orgVerifies build of an executable with C++ define specified by a gyp define using
9e604b70501586dd3396720641f652da55e5930aftschmelcher@chromium.orgvarious special characters such as quotes, commas, etc.
10e604b70501586dd3396720641f652da55e5930aftschmelcher@chromium.org"""
11e604b70501586dd3396720641f652da55e5930aftschmelcher@chromium.org
12e604b70501586dd3396720641f652da55e5930aftschmelcher@chromium.orgimport os
13e604b70501586dd3396720641f652da55e5930aftschmelcher@chromium.orgimport TestGyp
14e604b70501586dd3396720641f652da55e5930aftschmelcher@chromium.org
15e604b70501586dd3396720641f652da55e5930aftschmelcher@chromium.orgtest = TestGyp.TestGyp()
16e604b70501586dd3396720641f652da55e5930aftschmelcher@chromium.org
17e604b70501586dd3396720641f652da55e5930aftschmelcher@chromium.org# Tests string literals, percents, and backslash escapes.
18e604b70501586dd3396720641f652da55e5930aftschmelcher@chromium.orgtry:
19a64f7dcadb23b8f9538ce9822594e604d883bc0fjeanluc@google.com  os.environ['GYP_DEFINES'] = (
20a64f7dcadb23b8f9538ce9822594e604d883bc0fjeanluc@google.com      r"""test_format='\n%s\n' """
21a64f7dcadb23b8f9538ce9822594e604d883bc0fjeanluc@google.com      r"""test_args='"Simple test of %s with a literal"'""")
22e604b70501586dd3396720641f652da55e5930aftschmelcher@chromium.org  test.run_gyp('defines-escaping.gyp')
23e604b70501586dd3396720641f652da55e5930aftschmelcher@chromium.orgfinally:
24e604b70501586dd3396720641f652da55e5930aftschmelcher@chromium.org  del os.environ['GYP_DEFINES']
25e604b70501586dd3396720641f652da55e5930aftschmelcher@chromium.org
26e604b70501586dd3396720641f652da55e5930aftschmelcher@chromium.orgtest.build('defines-escaping.gyp')
27e604b70501586dd3396720641f652da55e5930aftschmelcher@chromium.org
28a64f7dcadb23b8f9538ce9822594e604d883bc0fjeanluc@google.comexpect = """
29e604b70501586dd3396720641f652da55e5930aftschmelcher@chromium.orgSimple test of %s with a literal
30e604b70501586dd3396720641f652da55e5930aftschmelcher@chromium.org"""
31e604b70501586dd3396720641f652da55e5930aftschmelcher@chromium.orgtest.run_built_executable('defines_escaping', stdout=expect)
32e604b70501586dd3396720641f652da55e5930aftschmelcher@chromium.org
33e604b70501586dd3396720641f652da55e5930aftschmelcher@chromium.org
34e604b70501586dd3396720641f652da55e5930aftschmelcher@chromium.org# Test multiple comma-and-space-separated string literals.
35e604b70501586dd3396720641f652da55e5930aftschmelcher@chromium.orgtry:
36e604b70501586dd3396720641f652da55e5930aftschmelcher@chromium.org  os.environ['GYP_DEFINES'] = \
37a64f7dcadb23b8f9538ce9822594e604d883bc0fjeanluc@google.com      r"""test_format='\n%s and %s\n' test_args='"foo", "bar"'"""
38e604b70501586dd3396720641f652da55e5930aftschmelcher@chromium.org  test.run_gyp('defines-escaping.gyp')
39e604b70501586dd3396720641f652da55e5930aftschmelcher@chromium.orgfinally:
40e604b70501586dd3396720641f652da55e5930aftschmelcher@chromium.org  del os.environ['GYP_DEFINES']
41e604b70501586dd3396720641f652da55e5930aftschmelcher@chromium.org
42e604b70501586dd3396720641f652da55e5930aftschmelcher@chromium.orgtest.sleep()
43e604b70501586dd3396720641f652da55e5930aftschmelcher@chromium.orgtest.touch('defines-escaping.c')
44e604b70501586dd3396720641f652da55e5930aftschmelcher@chromium.orgtest.build('defines-escaping.gyp')
45e604b70501586dd3396720641f652da55e5930aftschmelcher@chromium.org
46a64f7dcadb23b8f9538ce9822594e604d883bc0fjeanluc@google.comexpect = """
47e604b70501586dd3396720641f652da55e5930aftschmelcher@chromium.orgfoo and bar
48e604b70501586dd3396720641f652da55e5930aftschmelcher@chromium.org"""
49e604b70501586dd3396720641f652da55e5930aftschmelcher@chromium.orgtest.run_built_executable('defines_escaping', stdout=expect)
50e604b70501586dd3396720641f652da55e5930aftschmelcher@chromium.org
51e604b70501586dd3396720641f652da55e5930aftschmelcher@chromium.org
52e604b70501586dd3396720641f652da55e5930aftschmelcher@chromium.org# Test string literals containing quotes.
53e604b70501586dd3396720641f652da55e5930aftschmelcher@chromium.orgtry:
54a64f7dcadb23b8f9538ce9822594e604d883bc0fjeanluc@google.com  os.environ['GYP_DEFINES'] = (
55a64f7dcadb23b8f9538ce9822594e604d883bc0fjeanluc@google.com      r"""test_format='\n%s %s %s %s %s\n' """
56a64f7dcadb23b8f9538ce9822594e604d883bc0fjeanluc@google.com      r"""test_args='"\"These,\"","""
57a64f7dcadb23b8f9538ce9822594e604d883bc0fjeanluc@google.com                r""" "\"words,\"","""
58a64f7dcadb23b8f9538ce9822594e604d883bc0fjeanluc@google.com                r""" "\"are,\"","""
59a64f7dcadb23b8f9538ce9822594e604d883bc0fjeanluc@google.com                r""" "\"in,\"","""
60a64f7dcadb23b8f9538ce9822594e604d883bc0fjeanluc@google.com                r""" "\"quotes.\""'""")
61e604b70501586dd3396720641f652da55e5930aftschmelcher@chromium.org  test.run_gyp('defines-escaping.gyp')
62e604b70501586dd3396720641f652da55e5930aftschmelcher@chromium.orgfinally:
63e604b70501586dd3396720641f652da55e5930aftschmelcher@chromium.org  del os.environ['GYP_DEFINES']
64e604b70501586dd3396720641f652da55e5930aftschmelcher@chromium.org
65e604b70501586dd3396720641f652da55e5930aftschmelcher@chromium.orgtest.sleep()
66e604b70501586dd3396720641f652da55e5930aftschmelcher@chromium.orgtest.touch('defines-escaping.c')
67e604b70501586dd3396720641f652da55e5930aftschmelcher@chromium.orgtest.build('defines-escaping.gyp')
68e604b70501586dd3396720641f652da55e5930aftschmelcher@chromium.org
69a64f7dcadb23b8f9538ce9822594e604d883bc0fjeanluc@google.comexpect = """
70e604b70501586dd3396720641f652da55e5930aftschmelcher@chromium.org"These," "words," "are," "in," "quotes."
71e604b70501586dd3396720641f652da55e5930aftschmelcher@chromium.org"""
72e604b70501586dd3396720641f652da55e5930aftschmelcher@chromium.orgtest.run_built_executable('defines_escaping', stdout=expect)
73e604b70501586dd3396720641f652da55e5930aftschmelcher@chromium.org
74e604b70501586dd3396720641f652da55e5930aftschmelcher@chromium.org
75e604b70501586dd3396720641f652da55e5930aftschmelcher@chromium.org# Test string literals containing single quotes.
76e604b70501586dd3396720641f652da55e5930aftschmelcher@chromium.orgtry:
77a64f7dcadb23b8f9538ce9822594e604d883bc0fjeanluc@google.com  os.environ['GYP_DEFINES'] = (
78a64f7dcadb23b8f9538ce9822594e604d883bc0fjeanluc@google.com      r"""test_format='\n%s %s %s %s %s\n' """
79a64f7dcadb23b8f9538ce9822594e604d883bc0fjeanluc@google.com      r"""test_args="\"'These,'\","""
80a64f7dcadb23b8f9538ce9822594e604d883bc0fjeanluc@google.com                r""" \"'words,'\","""
81a64f7dcadb23b8f9538ce9822594e604d883bc0fjeanluc@google.com                r""" \"'are,'\","""
82a64f7dcadb23b8f9538ce9822594e604d883bc0fjeanluc@google.com                r""" \"'in,'\","""
83a64f7dcadb23b8f9538ce9822594e604d883bc0fjeanluc@google.com                r""" \"'quotes.'\"" """)
84e604b70501586dd3396720641f652da55e5930aftschmelcher@chromium.org  test.run_gyp('defines-escaping.gyp')
85e604b70501586dd3396720641f652da55e5930aftschmelcher@chromium.orgfinally:
86e604b70501586dd3396720641f652da55e5930aftschmelcher@chromium.org  del os.environ['GYP_DEFINES']
87e604b70501586dd3396720641f652da55e5930aftschmelcher@chromium.org
88e604b70501586dd3396720641f652da55e5930aftschmelcher@chromium.orgtest.sleep()
89e604b70501586dd3396720641f652da55e5930aftschmelcher@chromium.orgtest.touch('defines-escaping.c')
90e604b70501586dd3396720641f652da55e5930aftschmelcher@chromium.orgtest.build('defines-escaping.gyp')
91e604b70501586dd3396720641f652da55e5930aftschmelcher@chromium.org
92a64f7dcadb23b8f9538ce9822594e604d883bc0fjeanluc@google.comexpect = """
93e604b70501586dd3396720641f652da55e5930aftschmelcher@chromium.org'These,' 'words,' 'are,' 'in,' 'quotes.'
94e604b70501586dd3396720641f652da55e5930aftschmelcher@chromium.org"""
95e604b70501586dd3396720641f652da55e5930aftschmelcher@chromium.orgtest.run_built_executable('defines_escaping', stdout=expect)
96e604b70501586dd3396720641f652da55e5930aftschmelcher@chromium.org
97e604b70501586dd3396720641f652da55e5930aftschmelcher@chromium.org
98e604b70501586dd3396720641f652da55e5930aftschmelcher@chromium.org# Test string literals containing different numbers of backslashes before quotes
99e604b70501586dd3396720641f652da55e5930aftschmelcher@chromium.org# (to exercise Windows' quoting behaviour).
100e604b70501586dd3396720641f652da55e5930aftschmelcher@chromium.orgtry:
101a64f7dcadb23b8f9538ce9822594e604d883bc0fjeanluc@google.com  os.environ['GYP_DEFINES'] = (
102a64f7dcadb23b8f9538ce9822594e604d883bc0fjeanluc@google.com      r"""test_format='\n%s\n%s\n%s\n' """
103a64f7dcadb23b8f9538ce9822594e604d883bc0fjeanluc@google.com      r"""test_args='"\\\"1 visible slash\\\"","""
104a64f7dcadb23b8f9538ce9822594e604d883bc0fjeanluc@google.com                r""" "\\\\\"2 visible slashes\\\\\"","""
105a64f7dcadb23b8f9538ce9822594e604d883bc0fjeanluc@google.com                r""" "\\\\\\\"3 visible slashes\\\\\\\""'""")
106e604b70501586dd3396720641f652da55e5930aftschmelcher@chromium.org  test.run_gyp('defines-escaping.gyp')
107e604b70501586dd3396720641f652da55e5930aftschmelcher@chromium.orgfinally:
108e604b70501586dd3396720641f652da55e5930aftschmelcher@chromium.org  del os.environ['GYP_DEFINES']
109e604b70501586dd3396720641f652da55e5930aftschmelcher@chromium.org
110e604b70501586dd3396720641f652da55e5930aftschmelcher@chromium.orgtest.sleep()
111e604b70501586dd3396720641f652da55e5930aftschmelcher@chromium.orgtest.touch('defines-escaping.c')
112e604b70501586dd3396720641f652da55e5930aftschmelcher@chromium.orgtest.build('defines-escaping.gyp')
113e604b70501586dd3396720641f652da55e5930aftschmelcher@chromium.org
114a64f7dcadb23b8f9538ce9822594e604d883bc0fjeanluc@google.comexpect = r"""
115a64f7dcadb23b8f9538ce9822594e604d883bc0fjeanluc@google.com\"1 visible slash\"
116a64f7dcadb23b8f9538ce9822594e604d883bc0fjeanluc@google.com\\"2 visible slashes\\"
117a64f7dcadb23b8f9538ce9822594e604d883bc0fjeanluc@google.com\\\"3 visible slashes\\\"
118e604b70501586dd3396720641f652da55e5930aftschmelcher@chromium.org"""
119e604b70501586dd3396720641f652da55e5930aftschmelcher@chromium.orgtest.run_built_executable('defines_escaping', stdout=expect)
120e604b70501586dd3396720641f652da55e5930aftschmelcher@chromium.org
121e604b70501586dd3396720641f652da55e5930aftschmelcher@chromium.org
122e604b70501586dd3396720641f652da55e5930aftschmelcher@chromium.org# Test that various scary sequences are passed unfettered.
123e604b70501586dd3396720641f652da55e5930aftschmelcher@chromium.orgtry:
124a64f7dcadb23b8f9538ce9822594e604d883bc0fjeanluc@google.com  os.environ['GYP_DEFINES'] = (
125a64f7dcadb23b8f9538ce9822594e604d883bc0fjeanluc@google.com      r"""test_format='\n%s\n' """
126a64f7dcadb23b8f9538ce9822594e604d883bc0fjeanluc@google.com      r"""test_args='"$foo, " `foo`;"'""")
127e604b70501586dd3396720641f652da55e5930aftschmelcher@chromium.org  test.run_gyp('defines-escaping.gyp')
128e604b70501586dd3396720641f652da55e5930aftschmelcher@chromium.orgfinally:
129e604b70501586dd3396720641f652da55e5930aftschmelcher@chromium.org  del os.environ['GYP_DEFINES']
130e604b70501586dd3396720641f652da55e5930aftschmelcher@chromium.org
131e604b70501586dd3396720641f652da55e5930aftschmelcher@chromium.orgtest.sleep()
132e604b70501586dd3396720641f652da55e5930aftschmelcher@chromium.orgtest.touch('defines-escaping.c')
133e604b70501586dd3396720641f652da55e5930aftschmelcher@chromium.orgtest.build('defines-escaping.gyp')
134e604b70501586dd3396720641f652da55e5930aftschmelcher@chromium.org
135a64f7dcadb23b8f9538ce9822594e604d883bc0fjeanluc@google.comexpect = """
136a64f7dcadb23b8f9538ce9822594e604d883bc0fjeanluc@google.com$foo, " `foo`;
137e604b70501586dd3396720641f652da55e5930aftschmelcher@chromium.org"""
138e604b70501586dd3396720641f652da55e5930aftschmelcher@chromium.orgtest.run_built_executable('defines_escaping', stdout=expect)
139e604b70501586dd3396720641f652da55e5930aftschmelcher@chromium.org
140e604b70501586dd3396720641f652da55e5930aftschmelcher@chromium.org
141a64f7dcadb23b8f9538ce9822594e604d883bc0fjeanluc@google.com# VisualStudio 2010 can't handle passing %PATH%
142a64f7dcadb23b8f9538ce9822594e604d883bc0fjeanluc@google.comif not (test.format == 'msvs' and test.uses_msbuild):
143a64f7dcadb23b8f9538ce9822594e604d883bc0fjeanluc@google.com  try:
144a64f7dcadb23b8f9538ce9822594e604d883bc0fjeanluc@google.com    os.environ['GYP_DEFINES'] = (
145a64f7dcadb23b8f9538ce9822594e604d883bc0fjeanluc@google.com        """test_format='%s' """
146a64f7dcadb23b8f9538ce9822594e604d883bc0fjeanluc@google.com        """test_args='"%PATH%"'""")
147a64f7dcadb23b8f9538ce9822594e604d883bc0fjeanluc@google.com    test.run_gyp('defines-escaping.gyp')
148a64f7dcadb23b8f9538ce9822594e604d883bc0fjeanluc@google.com  finally:
149a64f7dcadb23b8f9538ce9822594e604d883bc0fjeanluc@google.com    del os.environ['GYP_DEFINES']
150a64f7dcadb23b8f9538ce9822594e604d883bc0fjeanluc@google.com
151a64f7dcadb23b8f9538ce9822594e604d883bc0fjeanluc@google.com  test.sleep()
152a64f7dcadb23b8f9538ce9822594e604d883bc0fjeanluc@google.com  test.touch('defines-escaping.c')
153a64f7dcadb23b8f9538ce9822594e604d883bc0fjeanluc@google.com  test.build('defines-escaping.gyp')
154a64f7dcadb23b8f9538ce9822594e604d883bc0fjeanluc@google.com
155a64f7dcadb23b8f9538ce9822594e604d883bc0fjeanluc@google.com  expect = "%PATH%"
156a64f7dcadb23b8f9538ce9822594e604d883bc0fjeanluc@google.com  test.run_built_executable('defines_escaping', stdout=expect)
157a64f7dcadb23b8f9538ce9822594e604d883bc0fjeanluc@google.com
158a64f7dcadb23b8f9538ce9822594e604d883bc0fjeanluc@google.com
159e604b70501586dd3396720641f652da55e5930aftschmelcher@chromium.org# Test commas and semi-colons preceded by backslashes (to exercise Windows'
160e604b70501586dd3396720641f652da55e5930aftschmelcher@chromium.org# quoting behaviour).
161e604b70501586dd3396720641f652da55e5930aftschmelcher@chromium.orgtry:
162a64f7dcadb23b8f9538ce9822594e604d883bc0fjeanluc@google.com  os.environ['GYP_DEFINES'] = (
163a64f7dcadb23b8f9538ce9822594e604d883bc0fjeanluc@google.com      r"""test_format='\n%s\n%s\n' """
164a64f7dcadb23b8f9538ce9822594e604d883bc0fjeanluc@google.com      r"""test_args='"\\, \\\\;","""
165e604b70501586dd3396720641f652da55e5930aftschmelcher@chromium.org                # Same thing again, but enclosed in visible quotes.
166a64f7dcadb23b8f9538ce9822594e604d883bc0fjeanluc@google.com                r""" "\"\\, \\\\;\""'""")
167e604b70501586dd3396720641f652da55e5930aftschmelcher@chromium.org  test.run_gyp('defines-escaping.gyp')
168e604b70501586dd3396720641f652da55e5930aftschmelcher@chromium.orgfinally:
169e604b70501586dd3396720641f652da55e5930aftschmelcher@chromium.org  del os.environ['GYP_DEFINES']
170e604b70501586dd3396720641f652da55e5930aftschmelcher@chromium.org
171e604b70501586dd3396720641f652da55e5930aftschmelcher@chromium.orgtest.sleep()
172e604b70501586dd3396720641f652da55e5930aftschmelcher@chromium.orgtest.touch('defines-escaping.c')
173e604b70501586dd3396720641f652da55e5930aftschmelcher@chromium.orgtest.build('defines-escaping.gyp')
174e604b70501586dd3396720641f652da55e5930aftschmelcher@chromium.org
175a64f7dcadb23b8f9538ce9822594e604d883bc0fjeanluc@google.comexpect = r"""
176a64f7dcadb23b8f9538ce9822594e604d883bc0fjeanluc@google.com\, \\;
177a64f7dcadb23b8f9538ce9822594e604d883bc0fjeanluc@google.com"\, \\;"
178e604b70501586dd3396720641f652da55e5930aftschmelcher@chromium.org"""
179e604b70501586dd3396720641f652da55e5930aftschmelcher@chromium.orgtest.run_built_executable('defines_escaping', stdout=expect)
180e604b70501586dd3396720641f652da55e5930aftschmelcher@chromium.org
181e604b70501586dd3396720641f652da55e5930aftschmelcher@chromium.org# We deliberately do not test having an odd number of quotes in a string
182e604b70501586dd3396720641f652da55e5930aftschmelcher@chromium.org# literal because that isn't feasible in MSVS.
183ee7a1c8d402bdc8a8e7043070464b9f753082bc2evan@chromium.org
184ee7a1c8d402bdc8a8e7043070464b9f753082bc2evan@chromium.orgtest.pass_test()
185