aboutsummaryrefslogtreecommitdiff
path: root/infra/cifuzz/filestore/git/git_test.py
diff options
context:
space:
mode:
Diffstat (limited to 'infra/cifuzz/filestore/git/git_test.py')
-rw-r--r--infra/cifuzz/filestore/git/git_test.py122
1 files changed, 122 insertions, 0 deletions
diff --git a/infra/cifuzz/filestore/git/git_test.py b/infra/cifuzz/filestore/git/git_test.py
new file mode 100644
index 000000000..56be23bac
--- /dev/null
+++ b/infra/cifuzz/filestore/git/git_test.py
@@ -0,0 +1,122 @@
+# Copyright 2021 Google LLC
+#
+# 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.
+"""Tests for git."""
+import filecmp
+import os
+import tempfile
+import subprocess
+import sys
+import unittest
+from unittest import mock
+
+# pylint: disable=wrong-import-position
+INFRA_DIR = os.path.dirname(
+ os.path.dirname(os.path.dirname(os.path.dirname(
+ os.path.abspath(__file__)))))
+sys.path.append(INFRA_DIR)
+
+from filestore import git
+import test_helpers
+
+# pylint: disable=protected-access,no-self-use
+
+
+class GitFilestoreTest(unittest.TestCase):
+ """Tests for GitFilestore."""
+
+ def setUp(self):
+ self.git_dir = tempfile.TemporaryDirectory()
+ self.addCleanup(self.git_dir.cleanup)
+
+ self.local_dir = tempfile.TemporaryDirectory()
+ self.addCleanup(self.local_dir.cleanup)
+
+ self.download_dir = tempfile.TemporaryDirectory()
+ self.addCleanup(self.download_dir.cleanup)
+
+ with open(os.path.join(self.local_dir.name, 'a'), 'w') as handle:
+ handle.write('')
+
+ os.makedirs(os.path.join(self.local_dir.name, 'b'))
+
+ with open(os.path.join(self.local_dir.name, 'b', 'c'), 'w') as handle:
+ handle.write('')
+
+ self.git_repo = git.git_runner(self.git_dir.name)
+ self.git_repo('init', '--bare')
+
+ self.config = test_helpers.create_run_config(
+ git_store_repo='file://' + self.git_dir.name,
+ git_store_branch='main',
+ git_store_branch_coverage='cov-branch')
+
+ self.mock_ci_filestore = mock.MagicMock()
+ self.git_store = git.GitFilestore(self.config, self.mock_ci_filestore)
+
+ def assert_dirs_same(self, first, second):
+ """Asserts two dirs are the same."""
+ dcmp = filecmp.dircmp(first, second)
+ if dcmp.diff_files or dcmp.left_only or dcmp.right_only:
+ return False
+
+ return all(
+ self.assert_dirs_same(os.path.join(first, subdir),
+ os.path.join(second, subdir))
+ for subdir in dcmp.common_dirs)
+
+ def get_repo_filelist(self, branch):
+ """Get files in repo."""
+ return subprocess.check_output([
+ 'git', '-C', self.git_dir.name, 'ls-tree', '-r', '--name-only', branch
+ ]).decode().splitlines()
+
+ def test_upload_download_corpus(self):
+ """Tests uploading and downloading corpus."""
+ self.git_store.upload_corpus('target', self.local_dir.name)
+ self.git_store.download_corpus('target', self.download_dir.name)
+ self.assert_dirs_same(self.local_dir.name, self.download_dir.name)
+
+ self.assertCountEqual([
+ 'corpus/target/a',
+ 'corpus/target/b/c',
+ ], self.get_repo_filelist('main'))
+
+ def test_upload_download_coverage(self):
+ """Tests uploading and downloading corpus."""
+ self.git_store.upload_coverage('latest', self.local_dir.name)
+ self.git_store.download_coverage('latest', self.download_dir.name)
+ self.assert_dirs_same(self.local_dir.name, self.download_dir.name)
+
+ self.assertCountEqual([
+ 'coverage/latest/a',
+ 'coverage/latest/b/c',
+ ], self.get_repo_filelist('cov-branch'))
+
+ def test_upload_crashes(self):
+ """Tests uploading crashes."""
+ self.git_store.upload_crashes('current', self.local_dir.name)
+ self.mock_ci_filestore.upload_crashes.assert_called_with(
+ 'current', self.local_dir.name)
+
+ def test_upload_build(self):
+ """Tests uploading build."""
+ self.git_store.upload_build('sanitizer', self.local_dir.name)
+ self.mock_ci_filestore.upload_build.assert_called_with(
+ 'sanitizer', self.local_dir.name)
+
+ def test_download_build(self):
+ """Tests downloading build."""
+ self.git_store.download_build('sanitizer', self.download_dir.name)
+ self.mock_ci_filestore.download_build.assert_called_with(
+ 'sanitizer', self.download_dir.name)