| #!/usr/bin/env python |
| |
| # Copyright 2017 Red Hat, Inc. |
| # |
| # 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 urllib |
| |
| from bs4 import BeautifulSoup |
| |
| from tests.base import ZuulTestCase, WebProxyFixture |
| from tests.base import ZuulWebFixture |
| |
| |
| class TestWebURLs(object): |
| tenant_config_file = 'config/single-tenant/main.yaml' |
| |
| def setUp(self): |
| super(TestWebURLs, self).setUp() |
| self.web = self.useFixture( |
| ZuulWebFixture(self.gearman_server.port)) |
| |
| def _get(self, port, uri): |
| url = "http://localhost:{}{}".format(port, uri) |
| self.log.debug("GET {}".format(url)) |
| req = urllib.request.Request(url) |
| try: |
| f = urllib.request.urlopen(req) |
| except urllib.error.HTTPError as e: |
| raise Exception("Error on URL {}".format(url)) |
| return f.read() |
| |
| def _crawl(self, url): |
| page = self._get(self.port, url) |
| page = BeautifulSoup(page, 'html.parser') |
| for (tag, attr) in [ |
| ('script', 'src'), |
| ('link', 'href'), |
| ('a', 'href'), |
| ('img', 'src'), |
| ]: |
| for item in page.find_all(tag): |
| suburl = item.get(attr) |
| # Skip empty urls. Also skip the navbar relative link for now. |
| # TODO(mordred) Remove when we have the top navbar link sorted. |
| if suburl is None or suburl == "../": |
| continue |
| link = urllib.parse.urljoin(url, suburl) |
| self._get(self.port, link) |
| |
| |
| class TestDirect(TestWebURLs, ZuulTestCase): |
| # Test directly accessing the zuul-web server with no proxy |
| def setUp(self): |
| super(TestDirect, self).setUp() |
| self.port = self.web.port |
| |
| def test_status_page(self): |
| self._crawl('/tenant-one/status.html') |
| |
| |
| class TestWhiteLabel(TestWebURLs, ZuulTestCase): |
| # Test a zuul-web behind a whitelabel proxy (i.e., what |
| # zuul.openstack.org does). |
| def setUp(self): |
| super(TestWhiteLabel, self).setUp() |
| rules = [ |
| ('^/(.*)$', 'http://localhost:{}/tenant-one/\\1'.format( |
| self.web.port)), |
| ] |
| self.proxy = self.useFixture(WebProxyFixture(rules)) |
| self.port = self.proxy.port |
| |
| def test_status_page(self): |
| self._crawl('/status.html') |
| |
| |
| class TestSuburl(TestWebURLs, ZuulTestCase): |
| # Test a zuul-web mounted on a suburl (i.e., what software factory |
| # does). |
| def setUp(self): |
| super(TestSuburl, self).setUp() |
| rules = [ |
| ('^/zuul3/(.*)$', 'http://localhost:{}/\\1'.format( |
| self.web.port)), |
| ] |
| self.proxy = self.useFixture(WebProxyFixture(rules)) |
| self.port = self.proxy.port |
| |
| def test_status_page(self): |
| self._crawl('/zuul3/tenant-one/status.html') |