blob: 0b128a731845a6bd3b792f54eb5ca56ef735f7b5 [file] [log] [blame]
#!/usr/bin/env python3
# Copyright 2022 The Pigweed Authors
#
# 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
#
# https://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.
"""Tests for gitmodules."""
from pathlib import Path
import tempfile
import unittest
from unittest.mock import MagicMock
from pw_presubmit import gitmodules, PresubmitFailure
def dotgitmodules(
name: str = 'foo',
url: str | None = None,
host: str | None = None,
branch: str | None = 'main',
):
cfg = f'[submodule "{name}"]\n'
cfg += f'path = {name}\n'
if url is None and host is None:
host = 'host'
if host:
cfg += f'url = https://{host}.googlesource.com/{name}\n'
else:
assert url
cfg += f'url = {url}\n'
if branch:
cfg += f'branch = {branch}\n'
return cfg
class TestGitmodules(unittest.TestCase):
"""Test gitmodules check."""
def setUp(self):
self.ctx: MagicMock = None
def _run(self, config: gitmodules.Config, contents: str) -> None:
self.ctx = MagicMock()
self.ctx.fail = MagicMock()
with tempfile.TemporaryDirectory() as tempdir:
path = Path(tempdir) / '.gitmodules'
with path.open('w') as outs:
outs.write(contents)
gitmodules.process_gitmodules(self.ctx, config, path)
def test_ok_no_submodules(self) -> None:
self._run(gitmodules.Config(), '')
self.ctx.fail.assert_not_called()
def test_no_submodules_allowed(self) -> None:
self._run(
gitmodules.Config(allow_submodules=False),
dotgitmodules(url='../foo'),
)
self.ctx.fail.assert_called()
def test_ok_default(self) -> None:
self._run(gitmodules.Config(), dotgitmodules(url='../foo'))
self.ctx.fail.assert_not_called()
def test_ok_restrictive(self) -> None:
cfg: gitmodules.Config = gitmodules.Config(
allow_non_googlesource_hosts=False,
allowed_googlesource_hosts=('host',),
require_relative_urls=True,
allow_sso=False,
allow_git_corp_google_com=False,
require_branch=True,
)
self._run(cfg, dotgitmodules(url='../foo'))
self.ctx.fail.assert_not_called()
def test_validate_ok(self) -> None:
def validator(ctx, path, name, props) -> None:
_ = name
if 'bad' in props['url']:
ctx.fail('bad', path)
cfg: gitmodules.Config = gitmodules.Config(validator=validator)
self._run(cfg, dotgitmodules(host='host'))
self.ctx.fail.assert_not_called()
def test_validate_fail(self) -> None:
def validator(ctx, path, name, props) -> None:
_ = name
if 'bad' in props['url']:
ctx.fail('bad', path)
cfg: gitmodules.Config = gitmodules.Config(validator=validator)
self._run(cfg, dotgitmodules(host='badhost'))
self.ctx.fail.assert_called()
def test_non_google_ok(self) -> None:
cfg: gitmodules.Config = gitmodules.Config(
allow_non_googlesource_hosts=True
)
self._run(cfg, dotgitmodules(url='https://github.com/foo/bar'))
self.ctx.fail.assert_not_called()
def test_non_google_fail(self) -> None:
cfg: gitmodules.Config = gitmodules.Config(
allow_non_googlesource_hosts=False
)
self._run(cfg, dotgitmodules(url='https://github.com/foo/bar'))
self.ctx.fail.assert_called()
def test_bad_allowed_googlesource_hosts(self) -> None:
with self.assertRaises(PresubmitFailure):
cfg: gitmodules.Config = gitmodules.Config(
allowed_googlesource_hosts=('pigweed-review',)
)
self._run(cfg, dotgitmodules())
def test_bad_type_allowed_googlesource_hosts(self) -> None:
with self.assertRaises(AssertionError):
cfg: gitmodules.Config = gitmodules.Config(
allowed_googlesource_hosts=('pigweed')
)
self._run(cfg, dotgitmodules())
def test_allowed_googlesource_hosts_ok(self) -> None:
cfg: gitmodules.Config = gitmodules.Config(
allowed_googlesource_hosts=(
'pigweed',
'pigweed-internal',
)
)
self._run(cfg, dotgitmodules(host='pigweed-internal'))
self.ctx.fail.assert_not_called()
def test_allowed_googlesource_hosts_fail(self) -> None:
cfg: gitmodules.Config = gitmodules.Config(
allowed_googlesource_hosts=('pigweed-internal',)
)
self._run(cfg, dotgitmodules(host='pigweed'))
self.ctx.fail.assert_called()
def test_require_relative_urls_ok(self) -> None:
cfg: gitmodules.Config = gitmodules.Config(require_relative_urls=False)
self._run(cfg, dotgitmodules(host='foo'))
self.ctx.fail.assert_not_called()
def test_require_relative_urls_fail(self) -> None:
cfg: gitmodules.Config = gitmodules.Config(require_relative_urls=True)
self._run(cfg, dotgitmodules(host='foo'))
self.ctx.fail.assert_called()
def test_allow_sso_ok(self) -> None:
cfg: gitmodules.Config = gitmodules.Config(allow_sso=True)
self._run(cfg, dotgitmodules(url='sso://host/foo'))
self.ctx.fail.assert_not_called()
def test_allow_sso_fail(self) -> None:
cfg: gitmodules.Config = gitmodules.Config(allow_sso=False)
self._run(cfg, dotgitmodules(url='sso://host/foo'))
self.ctx.fail.assert_called()
def test_allow_git_corp_google_com_ok(self) -> None:
cfg: gitmodules.Config = gitmodules.Config(
allow_git_corp_google_com=True
)
self._run(cfg, dotgitmodules(url='https://foo.git.corp.google.com/bar'))
self.ctx.fail.assert_not_called()
def test_allow_git_corp_google_com_fail(self) -> None:
cfg: gitmodules.Config = gitmodules.Config(
allow_git_corp_google_com=False
)
self._run(cfg, dotgitmodules(url='https://foo.git.corp.google.com/bar'))
self.ctx.fail.assert_called()
def test_require_branch_ok(self) -> None:
cfg: gitmodules.Config = gitmodules.Config(require_branch=False)
self._run(cfg, dotgitmodules(branch=None))
self.ctx.fail.assert_not_called()
def test_require_branch_fail(self) -> None:
cfg: gitmodules.Config = gitmodules.Config(require_branch=True)
self._run(cfg, dotgitmodules(branch=None))
self.ctx.fail.assert_called()
if __name__ == '__main__':
unittest.main()