1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
|
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
from __future__ import absolute_import, print_function, unicode_literals
from StringIO import StringIO
import os
import textwrap
import unittest
from mozunit import (
main,
MockedOpen,
)
from mozbuild.configure import ConfigureError
from mozbuild.configure.lint import LintSandbox
import mozpack.path as mozpath
test_data_path = mozpath.abspath(mozpath.dirname(__file__))
test_data_path = mozpath.join(test_data_path, 'data')
class TestLint(unittest.TestCase):
def lint_test(self, options=[], env={}):
sandbox = LintSandbox(env, ['configure'] + options)
sandbox.run(mozpath.join(test_data_path, 'moz.configure'))
def moz_configure(self, source):
return MockedOpen({
os.path.join(test_data_path,
'moz.configure'): textwrap.dedent(source)
})
def test_depends_failures(self):
with self.moz_configure('''
option('--foo', help='foo')
@depends('--foo')
def foo(value):
return value
@depends('--help', foo)
def bar(help, foo):
return
'''):
self.lint_test()
with self.assertRaises(ConfigureError) as e:
with self.moz_configure('''
option('--foo', help='foo')
@depends('--foo')
@imports('os')
def foo(value):
return value
@depends('--help', foo)
def bar(help, foo):
return
'''):
self.lint_test()
self.assertEquals(e.exception.message,
"`bar` depends on '--help' and `foo`. "
"`foo` must depend on '--help'")
with self.assertRaises(ConfigureError) as e:
with self.moz_configure('''
@template
def tmpl():
qux = 42
option('--foo', help='foo')
@depends('--foo')
def foo(value):
qux
return value
@depends('--help', foo)
def bar(help, foo):
return
tmpl()
'''):
self.lint_test()
self.assertEquals(e.exception.message,
"`bar` depends on '--help' and `foo`. "
"`foo` must depend on '--help'")
with self.moz_configure('''
option('--foo', help='foo')
@depends('--foo')
def foo(value):
return value
include(foo)
'''):
self.lint_test()
with self.assertRaises(ConfigureError) as e:
with self.moz_configure('''
option('--foo', help='foo')
@depends('--foo')
@imports('os')
def foo(value):
return value
include(foo)
'''):
self.lint_test()
self.assertEquals(e.exception.message,
"Missing @depends for `foo`: '--help'")
# There is a default restricted `os` module when there is no explicit
# @imports, and it's fine to use it without a dependency on --help.
with self.moz_configure('''
option('--foo', help='foo')
@depends('--foo')
def foo(value):
os
return value
include(foo)
'''):
self.lint_test()
if __name__ == '__main__':
main()
|