OLD | NEW |
1 #!/usr/bin/python | 1 #!/usr/bin/python |
2 # Copyright (c) 2014 The Native Client Authors. All rights reserved. | 2 # Copyright (c) 2014 The Native Client Authors. All rights reserved. |
3 # Use of this source code is governed by a BSD-style license that can be | 3 # Use of this source code is governed by a BSD-style license that can be |
4 # found in the LICENSE file. | 4 # found in the LICENSE file. |
5 | 5 |
6 """Tests of the pnacl driver. | 6 """Tests of the pnacl driver. |
7 | 7 |
8 This tests that we give useful errors when paths are too long, and don't | 8 This tests that we give useful errors when paths are too long, and don't |
9 unnecessarily generate temp file names that are too long ourselves. | 9 unnecessarily generate temp file names that are too long ourselves. |
10 | 10 |
11 """ | 11 """ |
12 | 12 |
13 import driver_log | 13 import driver_log |
14 from driver_env import env | 14 from driver_env import env |
15 import driver_test_utils | 15 import driver_test_utils |
16 import driver_tools | 16 import driver_tools |
17 import filetype | 17 import filetype |
18 | 18 |
19 import cStringIO | 19 import cStringIO |
20 import os | 20 import os |
21 import shutil | 21 import shutil |
22 import sys | 22 import sys |
23 | 23 |
24 class TestPathNames(driver_test_utils.DriverTesterCommon): | 24 class TestPathNames(driver_test_utils.DriverTesterCommon): |
25 def setUp(self): | 25 def setUp(self): |
26 super(TestPathNames, self).setUp() | 26 super(TestPathNames, self).setUp() |
27 driver_test_utils.ApplyTestEnvOverrides(env) | 27 driver_test_utils.ApplyTestEnvOverrides(env) |
28 self.backup_exit = sys.exit | 28 self.backup_exit = sys.exit |
29 sys.exit = driver_test_utils.FakeExit | 29 sys.exit = driver_test_utils.FakeExit |
30 cwd_len = len(os.getcwd()) | 30 self.cwd_backup = os.getcwd() |
| 31 cwd_len = len(self.cwd_backup) |
| 32 # Create a directory whose path will be exactly 235 chars long |
| 33 assert(cwd_len < 235) |
| 34 shorter_dir_len = 235 - cwd_len - 1 |
| 35 self.ShorterTempDir = os.path.join(self.cwd_backup, 'a' * shorter_dir_len) |
| 36 assert(235 == len(self.ShorterTempDir), |
| 37 "ShorterTempDir isn't 235 chars: %d" % len(self.ShorterTempDir)) |
| 38 os.mkdir(self.ShorterTempDir) |
31 # Create a directory whose path will be exactly 240 chars long | 39 # Create a directory whose path will be exactly 240 chars long |
32 dir_len = 240 - cwd_len - 1 | 40 dir_len = 240 - cwd_len - 1 |
33 self.cwd_backup = os.getcwd() | |
34 self.LongTempDir = os.path.join(self.cwd_backup, 'a' * dir_len) | 41 self.LongTempDir = os.path.join(self.cwd_backup, 'a' * dir_len) |
| 42 assert(240 == len(self.LongTempDir), |
| 43 "LongTempDir isn't 240 chars: %d" % len(self.LongTempDir)) |
35 os.mkdir(self.LongTempDir) | 44 os.mkdir(self.LongTempDir) |
36 | 45 |
37 def tearDown(self): | 46 def tearDown(self): |
38 super(TestPathNames, self).tearDown() | 47 super(TestPathNames, self).tearDown() |
39 os.chdir(self.cwd_backup) | 48 os.chdir(self.cwd_backup) |
40 sys.exit = self.backup_exit | 49 sys.exit = self.backup_exit |
41 shutil.rmtree(self.LongTempDir) | 50 shutil.rmtree(self.LongTempDir) |
| 51 shutil.rmtree(self.ShorterTempDir) |
42 | 52 |
43 def WriteCFile(self, filename): | 53 def WriteCFile(self, filename): |
44 with open(filename, 'w') as f: | 54 with open(filename, 'w') as f: |
45 f.write('int main() { return 0; }') | 55 f.write('int main() { return 0; }') |
46 | 56 |
47 def AssertRaisesAndReturnOutput(self, exc, func, *args): | 57 def AssertRaisesAndReturnOutput(self, exc, func, *args): |
48 capture_out = cStringIO.StringIO() | 58 capture_out = cStringIO.StringIO() |
49 driver_log.Log.CaptureToStream(capture_out) | 59 driver_log.Log.CaptureToStream(capture_out) |
50 self.assertRaises(exc, func, *args) | 60 self.assertRaises(exc, func, *args) |
51 driver_log.Log.ResetStreams() | 61 driver_log.Log.ResetStreams() |
52 return capture_out.getvalue() | 62 return capture_out.getvalue() |
53 | 63 |
54 def test_PathWithSpaces(self): | 64 def test_PathWithSpaces(self): |
55 '''Test that the driver correctly handles paths containing spaces''' | 65 '''Test that the driver correctly handles paths containing spaces''' |
56 if not driver_test_utils.CanRunHost(): | 66 if not driver_test_utils.CanRunHost(): |
57 return | 67 return |
58 | 68 |
59 name = os.path.join(self.LongTempDir, 'a file') | 69 name = os.path.join(self.ShorterTempDir, 'a file') |
60 self.WriteCFile(name + '.c') | 70 self.WriteCFile(name + '.c') |
61 driver_tools.RunDriver('pnacl-clang', | 71 driver_tools.RunDriver('pnacl-clang', |
62 [name + '.c', '-c', '-o', name + '.o']) | 72 [name + '.c', '-c', '-o', name + '.o']) |
63 self.assertEqual('po', filetype.FileType(name + '.o')) | 73 self.assertEqual('po', filetype.FileType(name + '.o')) |
64 | 74 |
65 def test_InputPathTooLong(self): | 75 def test_InputPathTooLong(self): |
66 '''Test that clang and ld reject input paths that are too long | 76 '''Test that clang and ld reject input paths that are too long |
67 | 77 |
68 Test that compiling and linking paths shorter than 255 succeeds and paths | 78 Test that compiling and linking paths shorter than 255 succeeds and paths |
69 longer than 255 fails. | 79 longer than 255 fails. |
(...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
179 longname = os.path.join(longerdir, 'a' * 3) | 189 longname = os.path.join(longerdir, 'a' * 3) |
180 os.rename(shortname + '.o', longname + '.o') | 190 os.rename(shortname + '.o', longname + '.o') |
181 | 191 |
182 output = self.AssertRaisesAndReturnOutput( | 192 output = self.AssertRaisesAndReturnOutput( |
183 driver_test_utils.DriverExitException, | 193 driver_test_utils.DriverExitException, |
184 driver_tools.RunDriver, | 194 driver_tools.RunDriver, |
185 'pnacl-ld', | 195 'pnacl-ld', |
186 [longname + '.o', '-o', longname]) | 196 [longname + '.o', '-o', longname]) |
187 | 197 |
188 self.assertIn('.pexe is too long', output) | 198 self.assertIn('.pexe is too long', output) |
OLD | NEW |