diff options
author | 2018-06-13 00:18:43 -0700 | |
---|---|---|
committer | 2018-06-13 00:20:20 -0700 | |
commit | 053bedecdbf046c385b24a22bb708f095bebfd72 (patch) | |
tree | 1bdd4627110ee4bc45b4280ebc91591448a73d01 /src/test/py/bazel/bazel_external_repository_test.py | |
parent | cb1af4ee0915fc294f61a97dc9ef84c4f246dd78 (diff) |
Fix archive decompression with symlink on Windows
On Windows, extracting file symlink in an archive would be performed as copy. To ensure the copy will be successful, we defer all symlink creation after all regular files are extracted.
Fix https://github.com/bazelbuild/bazel/issues/5367
RELNOTES: None.
PiperOrigin-RevId: 200345463
Diffstat (limited to 'src/test/py/bazel/bazel_external_repository_test.py')
-rw-r--r-- | src/test/py/bazel/bazel_external_repository_test.py | 72 |
1 files changed, 66 insertions, 6 deletions
diff --git a/src/test/py/bazel/bazel_external_repository_test.py b/src/test/py/bazel/bazel_external_repository_test.py index 86da68e91d..528a0c4ef7 100644 --- a/src/test/py/bazel/bazel_external_repository_test.py +++ b/src/test/py/bazel/bazel_external_repository_test.py @@ -14,22 +14,60 @@ # limitations under the License. import os +import threading import unittest +from six.moves import SimpleHTTPServer +from six.moves import socketserver from src.test.py.bazel import test_base +class ThreadedTCPServer(socketserver.ThreadingMixIn, socketserver.TCPServer): + """A helper class to launcher a threaded http server.""" + pass + + class BazelExternalRepositoryTest(test_base.TestBase): + _http_server = None + + def StartHttpServer(self): + """Runs a simple http server to serve files under current directory. + + Returns: + ThreadedTCPServer: a reference to the server started. + """ + # Port 0 means to select an arbitrary unused port + host, port = 'localhost', 0 + http_handler = SimpleHTTPServer.SimpleHTTPRequestHandler + server = ThreadedTCPServer((host, port), http_handler) + server_thread = threading.Thread(target=server.serve_forever) + server_thread.daemon = True + server_thread.start() + self._http_server = server + + def StopHttpServer(self): + """Shutdown and clean up the http server.""" + if self._http_server: + self._http_server.shutdown() + self._http_server.server_close() + + def setUp(self): + test_base.TestBase.setUp(self) + for f in ['six-1.10.0.tar.gz', 'archive_with_symlink.zip']: + self.CopyFile(self.Rlocation('io_bazel/src/test/py/bazel/testdata/' + 'bazel_external_repository_test/' + f), f) + self.StartHttpServer() + + def tearDown(self): + test_base.TestBase.tearDown(self) + self.StopHttpServer() + def testNewHttpArchive(self): + ip, port = self._http_server.server_address rule_definition = [ 'new_http_archive(', ' name = "six_archive",', - ' urls = [', - ' "https://mirror.bazel.build/pypi.python.org/%s' % - 'packages/source/s/six/six-1.10.0.tar.gz",', - ' "https://pypi.python.org/packages/%s' % - 'source/s/six/six-1.10.0.tar.gz",', - ' ],', + ' urls = ["http://%s:%s/six-1.10.0.tar.gz"],' % (ip, port), ' sha256 = ' '"105f8d68616f8248e24bf0e9372ef04d3cc10104f1980f54d57b2ce73a5ad56a",', ' strip_prefix = "six-1.10.0",', @@ -80,6 +118,28 @@ class BazelExternalRepositoryTest(test_base.TestBase): self.assertEqual(exit_code, 1, os.linesep.join(stderr)) self.assertIn('name \'foobar\' is not defined', os.linesep.join(stderr)) + def testNewHttpArchiveWithSymlinks(self): + ip, port = self._http_server.server_address + self.ScratchFile('WORKSPACE', [ + 'new_http_archive(', + ' name = "archive_with_symlink",', + ' urls = ["http://%s:%s/archive_with_symlink.zip"],' % (ip, port), + ' build_file = "archive_with_symlink.BUILD",', + ')', + ]) + # In the archive, A is a symlink pointing to B + self.ScratchFile('archive_with_symlink.BUILD', [ + 'filegroup(', + ' name = "file-A",', + ' srcs = ["A"],', + ')', + ]) + self.ScratchFile('BUILD') + exit_code, _, stderr = self.RunBazel([ + 'build', + '@archive_with_symlink//:file-A', + ]) + self.assertEqual(exit_code, 0, os.linesep.join(stderr)) if __name__ == '__main__': unittest.main() |