diff options
author | pcloudy <pcloudy@google.com> | 2018-06-13 00:18:43 -0700 |
---|---|---|
committer | Copybara-Service <copybara-piper@google.com> | 2018-06-13 00:20:20 -0700 |
commit | 053bedecdbf046c385b24a22bb708f095bebfd72 (patch) | |
tree | 1bdd4627110ee4bc45b4280ebc91591448a73d01 /src/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')
-rw-r--r-- | src/test/py/bazel/BUILD | 2 | ||||
-rw-r--r-- | src/test/py/bazel/bazel_external_repository_test.py | 72 | ||||
-rw-r--r-- | src/test/py/bazel/test_base.py | 4 | ||||
-rw-r--r-- | src/test/py/bazel/testdata/bazel_external_repository_test/archive_with_symlink.zip | bin | 0 -> 297 bytes | |||
-rw-r--r-- | src/test/py/bazel/testdata/bazel_external_repository_test/six-1.10.0.tar.gz | bin | 0 -> 29630 bytes |
5 files changed, 69 insertions, 9 deletions
diff --git a/src/test/py/bazel/BUILD b/src/test/py/bazel/BUILD index 200bf78d45..3763e6bef9 100644 --- a/src/test/py/bazel/BUILD +++ b/src/test/py/bazel/BUILD @@ -64,7 +64,7 @@ py_test( name = "bazel_external_repository_test", size = "medium", srcs = ["bazel_external_repository_test.py"], - tags = ["requires_internet"], + data = glob(["testdata/bazel_external_repository_test/**"]), deps = [":test_base"], ) 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() diff --git a/src/test/py/bazel/test_base.py b/src/test/py/bazel/test_base.py index 7f0f705bce..ea95f5bac2 100644 --- a/src/test/py/bazel/test_base.py +++ b/src/test/py/bazel/test_base.py @@ -215,8 +215,8 @@ class TestBase(unittest.TestCase): if os.path.exists(abspath) and not os.path.isfile(abspath): raise IOError('"%s" (%s) exists and is not a file' % (dst_path, abspath)) self.ScratchDir(os.path.dirname(dst_path)) - with open(src_path, 'r') as s: - with open(abspath, 'w') as d: + with open(src_path, 'rb') as s: + with open(abspath, 'wb') as d: d.write(s.read()) if executable: os.chmod(abspath, stat.S_IRWXU) diff --git a/src/test/py/bazel/testdata/bazel_external_repository_test/archive_with_symlink.zip b/src/test/py/bazel/testdata/bazel_external_repository_test/archive_with_symlink.zip Binary files differnew file mode 100644 index 0000000000..dcd42a9772 --- /dev/null +++ b/src/test/py/bazel/testdata/bazel_external_repository_test/archive_with_symlink.zip diff --git a/src/test/py/bazel/testdata/bazel_external_repository_test/six-1.10.0.tar.gz b/src/test/py/bazel/testdata/bazel_external_repository_test/six-1.10.0.tar.gz Binary files differnew file mode 100644 index 0000000000..ac8eec53db --- /dev/null +++ b/src/test/py/bazel/testdata/bazel_external_repository_test/six-1.10.0.tar.gz |