blob: e6ca6cde47c11215b0511764653aa6f38646254f [file] [log] [blame]
# Copyright 2017 The Bazel Authors. All rights reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
import gzip
import io
import os
import socket
import threading
from absl.testing import absltest
from src.test.py.bazel import test_base
# pylint: disable=g-import-not-at-top,g-importing-member
try:
from BaseHTTPServer import BaseHTTPRequestHandler
except ImportError:
from http.server import BaseHTTPRequestHandler
# pylint: disable=g-import-not-at-top,g-importing-member
try:
from BaseHTTPServer import HTTPServer
except ImportError:
from http.server import HTTPServer
class MemoryStorageHandler(BaseHTTPRequestHandler):
protocol_version = 'HTTP/1.1'
def __init__(self, request, client_address, server):
BaseHTTPRequestHandler.__init__(self, request, client_address, server)
def do_PUT(self):
self.send_response(200)
self.end_headers()
self.server.storage[self.path] = self.rfile.read(
int(self.headers['Content-Length']))
self.finish()
def do_GET(self):
if self.path in self.server.storage and 'gzip' in self.headers[
'Accept-Encoding']:
out = io.BytesIO()
with gzip.GzipFile(fileobj=out, mode='w') as f:
f.write(self.server.storage[self.path])
self.send_response(200)
self.send_header('Content-Length', str(len(out.getvalue())))
self.send_header('Content-Encoding', 'gzip')
self.end_headers()
self.wfile.write(out.getvalue())
else:
self.send_response(404)
self.end_headers()
self.finish()
class HTTPServerV6(HTTPServer):
address_family = socket.AF_INET6
class CacheDecompressionTest(test_base.TestBase):
def setUp(self):
test_base.TestBase.setUp(self)
server_port = self.GetFreeTCPPort()
if self.IsDarwin():
self.httpd = HTTPServerV6(
('localhost', server_port), MemoryStorageHandler
)
else:
self.httpd = HTTPServer(('localhost', server_port), MemoryStorageHandler)
self.httpd.storage = {}
self.url = 'http://localhost:{}'.format(server_port)
self.background = threading.Thread(target=self.httpd.serve_forever)
self.background.start()
def tearDown(self):
self.httpd.shutdown()
self.background.join()
test_base.TestBase.tearDown(self)
def testDecompressionWorks(self):
content = ['Hello HTTP']
self.ScratchFile('WORKSPACE')
self.ScratchFile('input.txt', content)
self.ScratchFile('BUILD', [
'genrule(',
' name = "genrule",',
' cmd = "cp \\"$<\\" \\"$@\\"",',
' srcs = ["//:input.txt"],',
' outs = ["genrule.txt"],',
')',
])
_, _, stderr = self.RunBazel(
['build', '//:genrule.txt', '--remote_cache', self.url]
)
self.assertNotIn('INFO: 2 processes: 1 remote cache hit, 1 internal',
stderr)
self.assertNotIn('HTTP version 1.1 is required', stderr)
self.RunBazel(['clean', '--expunge'])
_, _, stderr = self.RunBazel(
['build', '//:genrule.txt', '--remote_cache', self.url]
)
self.assertIn('INFO: 2 processes: 1 remote cache hit, 1 internal.', stderr)
self.assertNotIn('HTTP version 1.1 is required', stderr)
_, stdout, _ = self.RunBazel(['info', 'bazel-genfiles'])
bazel_genfiles = stdout[0]
self.AssertFileContentEqual(
os.path.join(bazel_genfiles, 'genrule.txt'), content)
def GetFreeTCPPort(self):
tcp = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
tcp.bind(('localhost', 0))
_, port = tcp.getsockname()
tcp.close()
return port
def AssertFileContentEqual(self, file_path, entry):
with open(file_path, 'r') as f:
self.assertEqual(f.read().splitlines(), entry)
if __name__ == '__main__':
absltest.main()