aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/test/py
diff options
context:
space:
mode:
authorGravatar pcloudy <pcloudy@google.com>2018-06-13 00:18:43 -0700
committerGravatar Copybara-Service <copybara-piper@google.com>2018-06-13 00:20:20 -0700
commit053bedecdbf046c385b24a22bb708f095bebfd72 (patch)
tree1bdd4627110ee4bc45b4280ebc91591448a73d01 /src/test/py
parentcb1af4ee0915fc294f61a97dc9ef84c4f246dd78 (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/BUILD2
-rw-r--r--src/test/py/bazel/bazel_external_repository_test.py72
-rw-r--r--src/test/py/bazel/test_base.py4
-rw-r--r--src/test/py/bazel/testdata/bazel_external_repository_test/archive_with_symlink.zipbin0 -> 297 bytes
-rw-r--r--src/test/py/bazel/testdata/bazel_external_repository_test/six-1.10.0.tar.gzbin0 -> 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
new file mode 100644
index 0000000000..dcd42a9772
--- /dev/null
+++ b/src/test/py/bazel/testdata/bazel_external_repository_test/archive_with_symlink.zip
Binary files differ
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
new file mode 100644
index 0000000000..ac8eec53db
--- /dev/null
+++ b/src/test/py/bazel/testdata/bazel_external_repository_test/six-1.10.0.tar.gz
Binary files differ