blob: 58141645d916e48b973a40f720590e89b2672280 [file] [log] [blame]
# Copyright (C) 2019 Apple Inc. All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
# 1. Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
# 2. Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in the
# documentation and/or other materials provided with the distribution.
#
# THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS "AS IS" AND
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
# DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR
# ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
from redis import StrictRedis
from fakeredis import FakeStrictRedis
from resultsdbpy.model.cassandra_context import CassandraContext
from resultsdbpy.model.commit_context import CommitContext
from resultsdbpy.model.mock_cassandra_context import MockCassandraContext
from resultsdbpy.model.mock_repository import MockStashRepository, MockSVNRepository
from resultsdbpy.model.wait_for_docker_test_case import WaitForDockerTestCase
class CommitContextTest(WaitForDockerTestCase):
KEYSPACE = 'commit_mapping_test_keyspace'
def init_database(self, redis=StrictRedis, cassandra=CassandraContext):
redis_instance = redis()
self.stash_repository = MockStashRepository.safari(redis_instance)
self.svn_repository = MockSVNRepository.webkit(redis_instance)
cassandra.drop_keyspace(keyspace=self.KEYSPACE)
self.database = CommitContext(
redis=redis_instance,
cassandra=cassandra(keyspace=self.KEYSPACE, create_keyspace=True),
)
self.database.register_repository(self.stash_repository)
self.database.register_repository(self.svn_repository)
def add_all_commits_to_database(self):
for mock_repository in [self.stash_repository, self.svn_repository]:
for commit_list in mock_repository.commits.values():
for commit in commit_list:
self.database.register_commit(commit)
@WaitForDockerTestCase.mock_if_no_docker(mock_redis=FakeStrictRedis, mock_cassandra=MockCassandraContext)
def test_verify_table(self, redis=StrictRedis, cassandra=CassandraContext):
self.init_database(redis=redis, cassandra=cassandra)
CommitContext(redis=redis(), cassandra=cassandra(keyspace=self.KEYSPACE))
@WaitForDockerTestCase.mock_if_no_docker(mock_redis=FakeStrictRedis, mock_cassandra=MockCassandraContext)
def test_commit_by_id(self, redis=StrictRedis, cassandra=CassandraContext):
self.init_database(redis=redis, cassandra=cassandra)
self.add_all_commits_to_database()
self.assertEqual(
[self.stash_repository.commit_for_id(id='bb6bda5f44', branch='master')],
self.database.find_commits_by_id(repository_id='safari', branch='master', commit_id='bb6bda5f44'),
)
self.assertEqual(2, len(self.database.find_commits_by_id(repository_id='safari', branch='master', commit_id='336610a')))
self.assertEqual(
[self.svn_repository.commit_for_id(id=236544, branch='trunk')],
self.database.find_commits_by_id(repository_id='webkit', branch='trunk', commit_id=236544),
)
self.assertEqual(0, len(self.database.find_commits_by_id(repository_id='webkit', branch='trunk', commit_id='23654')))
@WaitForDockerTestCase.mock_if_no_docker(mock_redis=FakeStrictRedis, mock_cassandra=MockCassandraContext)
def test_commit_by_uuid(self, redis=StrictRedis, cassandra=CassandraContext):
self.init_database(redis=redis, cassandra=cassandra)
self.add_all_commits_to_database()
self.assertEqual(
[self.stash_repository.commit_for_id(id='7be4084258', branch='master')],
self.database.find_commits_by_uuid(repository_id='safari', branch='master', uuid=153755068501),
)
self.assertEqual(
[self.svn_repository.commit_for_id(id=236540, branch='trunk')],
self.database.find_commits_by_uuid(repository_id='webkit', branch='trunk', uuid=153802947900),
)
@WaitForDockerTestCase.mock_if_no_docker(mock_redis=FakeStrictRedis, mock_cassandra=MockCassandraContext)
def test_commit_by_timestamp(self, redis=StrictRedis, cassandra=CassandraContext):
self.init_database(redis=redis, cassandra=cassandra)
self.add_all_commits_to_database()
self.assertEqual(
[self.stash_repository.commit_for_id(id='336610a84f', branch='master')],
self.database.find_commits_by_timestamp(repository_id='safari', branch='master', timestamp=1537809818),
)
self.assertEqual(
[self.svn_repository.commit_for_id(id=236540, branch='trunk')],
self.database.find_commits_by_timestamp(repository_id='webkit', branch='trunk', timestamp=1538029479),
)
self.assertEqual(2, len(self.database.find_commits_by_timestamp(repository_id='safari', branch='master', timestamp=1537550685)))
@WaitForDockerTestCase.mock_if_no_docker(mock_redis=FakeStrictRedis, mock_cassandra=MockCassandraContext)
def test_all_commits_stash(self, redis=StrictRedis, cassandra=CassandraContext):
self.init_database(redis=redis, cassandra=cassandra)
self.add_all_commits_to_database()
self.assertEqual(5, len(self.database.find_commits_in_range(repository_id='safari', branch='master')))
self.assertEqual(
[self.stash_repository.commit_for_id(id='bb6bda5f44', branch='master'), self.stash_repository.commit_for_id(id='336610a84f', branch='master')],
self.database.find_commits_in_range(repository_id='safari', branch='master', limit=2),
)
@WaitForDockerTestCase.mock_if_no_docker(mock_redis=FakeStrictRedis, mock_cassandra=MockCassandraContext)
def test_all_commits_svn(self, redis=StrictRedis, cassandra=CassandraContext):
self.init_database(redis=redis, cassandra=cassandra)
self.add_all_commits_to_database()
self.assertEqual(5, len(self.database.find_commits_in_range(repository_id='webkit', branch='trunk')))
self.assertEqual(
[self.svn_repository.commit_for_id(id=236544, branch='trunk'), self.svn_repository.commit_for_id(id=236543, branch='trunk')],
self.database.find_commits_in_range(repository_id='webkit', branch='trunk', limit=2),
)
@WaitForDockerTestCase.mock_if_no_docker(mock_redis=FakeStrictRedis, mock_cassandra=MockCassandraContext)
def test_stash_commits_in_range(self, redis=StrictRedis, cassandra=CassandraContext):
self.init_database(redis=redis, cassandra=cassandra)
self.add_all_commits_to_database()
self.assertEqual(
[self.stash_repository.commit_for_id(id='bb6bda5f44', branch='master'), self.stash_repository.commit_for_id(id='336610a84f', branch='master')],
self.database.find_commits_in_range(repository_id='safari', branch='master', begin=1537809818, end=1537810281),
)
@WaitForDockerTestCase.mock_if_no_docker(mock_redis=FakeStrictRedis, mock_cassandra=MockCassandraContext)
def test_svn_commits_in_range(self, redis=StrictRedis, cassandra=CassandraContext):
self.init_database(redis=redis, cassandra=cassandra)
self.add_all_commits_to_database()
self.assertEqual(
[self.svn_repository.commit_for_id(id=236544, branch='trunk'), self.svn_repository.commit_for_id(id=236543, branch='trunk')],
self.database.find_commits_in_range(repository_id='webkit', branch='trunk', begin=1538050458, end=1538052408),
)
@WaitForDockerTestCase.mock_if_no_docker(mock_redis=FakeStrictRedis, mock_cassandra=MockCassandraContext)
def test_stash_commits_between(self, redis=StrictRedis, cassandra=CassandraContext):
self.init_database(redis=redis, cassandra=cassandra)
self.add_all_commits_to_database()
commits = [
self.stash_repository.commit_for_id(id='bb6bda5f', branch='master'),
self.stash_repository.commit_for_id(id='336610a8', branch='master'),
self.stash_repository.commit_for_id(id='336610a4', branch='master'),
]
self.assertEqual(commits, self.database.find_commits_in_range(repository_id='safari', branch='master', begin=commits[-1], end=commits[0]))
@WaitForDockerTestCase.mock_if_no_docker(mock_redis=FakeStrictRedis, mock_cassandra=MockCassandraContext)
def test_svn_commits_between(self, redis=StrictRedis, cassandra=CassandraContext):
self.init_database(redis=redis, cassandra=cassandra)
self.add_all_commits_to_database()
commits = [
self.svn_repository.commit_for_id(id=236544, branch='trunk'),
self.svn_repository.commit_for_id(id=236543, branch='trunk'),
self.svn_repository.commit_for_id(id=236542, branch='trunk'),
]
self.assertEqual(commits, self.database.find_commits_in_range(repository_id='webkit', branch='trunk', begin=commits[-1], end=commits[0]))
@WaitForDockerTestCase.mock_if_no_docker(mock_redis=FakeStrictRedis, mock_cassandra=MockCassandraContext)
def test_commit_from_stash_repo(self, redis=StrictRedis, cassandra=CassandraContext):
self.init_database(redis=redis, cassandra=cassandra)
self.database.register_commit_with_repo_and_id('safari', 'master', 'bb6bda5f44')
self.assertEqual(
[self.stash_repository.commit_for_id(id='bb6bda5f44', branch='master')],
self.database.find_commits_by_id(repository_id='safari', branch='master', commit_id='bb6bda5f44'),
)
@WaitForDockerTestCase.mock_if_no_docker(mock_redis=FakeStrictRedis, mock_cassandra=MockCassandraContext)
def test_commit_from_svn_repo(self, redis=StrictRedis, cassandra=CassandraContext):
self.init_database(redis=redis, cassandra=cassandra)
self.database.register_commit_with_repo_and_id('webkit', 'trunk', 236544)
self.assertEqual(
[self.svn_repository.commit_for_id(id=236544, branch='trunk')],
self.database.find_commits_by_id(repository_id='webkit', branch='trunk', commit_id=236544),
)
@WaitForDockerTestCase.mock_if_no_docker(mock_redis=FakeStrictRedis, mock_cassandra=MockCassandraContext)
def test_branches(self, redis=StrictRedis, cassandra=CassandraContext):
self.init_database(redis=redis, cassandra=cassandra)
self.add_all_commits_to_database()
self.assertEqual(['master', 'safari-606-branch'], self.database.branches(repository_id='safari'))
self.assertEqual(['safari-606-branch', 'trunk'], self.database.branches(repository_id='webkit'))
self.assertEqual(['safari-606-branch'], self.database.branches(repository_id='safari', branch='safari'))
self.assertEqual(['safari-606-branch'], self.database.branches(repository_id='webkit', branch='safari-606-branch'))
@WaitForDockerTestCase.mock_if_no_docker(mock_redis=FakeStrictRedis, mock_cassandra=MockCassandraContext)
def test_next_commit(self, redis=StrictRedis, cassandra=CassandraContext):
self.init_database(redis=redis, cassandra=cassandra)
self.add_all_commits_to_database()
self.assertEqual(
self.database.next_commit(self.svn_repository.commit_for_id(id=236542)),
self.svn_repository.commit_for_id(id=236543),
)
self.assertEqual(
self.database.next_commit(self.stash_repository.commit_for_id(id='336610a40c3fecb728871e12ca31482ca715b383')),
self.stash_repository.commit_for_id(id='336610a84fdcf14ddcf1db65075af95480516fda'),
)
@WaitForDockerTestCase.mock_if_no_docker(mock_redis=FakeStrictRedis, mock_cassandra=MockCassandraContext)
def test_previous_commit(self, redis=StrictRedis, cassandra=CassandraContext):
self.init_database(redis=redis, cassandra=cassandra)
self.add_all_commits_to_database()
self.assertEqual(
self.svn_repository.commit_for_id(id=236542),
self.database.previous_commit(self.svn_repository.commit_for_id(id=236543)),
)
self.assertEqual(
self.stash_repository.commit_for_id(id='336610a40c3fecb728871e12ca31482ca715b383'),
self.database.previous_commit(self.stash_repository.commit_for_id(id='336610a84fdcf14ddcf1db65075af95480516fda')),
)
@WaitForDockerTestCase.mock_if_no_docker(mock_redis=FakeStrictRedis, mock_cassandra=MockCassandraContext)
def test_sibling_commits(self, redis=StrictRedis, cassandra=CassandraContext):
self.init_database(redis=redis, cassandra=cassandra)
self.add_all_commits_to_database()
self.assertEqual(
self.database.sibling_commits(self.svn_repository.commit_for_id(id=236542), ['safari']),
{'safari': [self.stash_repository.commit_for_id(id='bb6bda5f44dd24d0b54539b8ff6e8c17f519249a')]},
)
self.assertEqual(
self.database.sibling_commits(self.stash_repository.commit_for_id(id='bb6bda5f44dd24d0b54539b8ff6e8c17f519249a'), ['webkit']),
{'webkit': [
self.svn_repository.commit_for_id(id=236544),
self.svn_repository.commit_for_id(id=236543),
self.svn_repository.commit_for_id(id=236542),
self.svn_repository.commit_for_id(id=236541),
self.svn_repository.commit_for_id(id=236540),
]},
)
self.assertEqual(
self.database.sibling_commits(self.stash_repository.commit_for_id(id='336610a84fdcf14ddcf1db65075af95480516fda'), ['webkit']),
{'webkit': []},
)
def test_uuid_for_commits(self):
uuid = CommitContext.uuid_for_commits([MockStashRepository.safari().commit_for_id(id='bb6bda5f'), MockSVNRepository.webkit().commit_for_id(id=236544)])
self.assertEqual(uuid, 153805240800)
@WaitForDockerTestCase.mock_if_no_docker(mock_redis=FakeStrictRedis, mock_cassandra=MockCassandraContext)
def test_branch_keys_for_commits(self, redis=StrictRedis, cassandra=CassandraContext):
self.init_database(redis=redis, cassandra=cassandra)
branches = self.database.branch_keys_for_commits([
MockStashRepository.safari().commit_for_id(id='bb6bda5f'),
MockSVNRepository.webkit().commit_for_id(id=236544),
])
self.assertEqual(branches, ['default'])
branches = self.database.branch_keys_for_commits([
MockStashRepository.safari().commit_for_id(id='79256c32', branch='safari-606-branch'),
MockSVNRepository.webkit().commit_for_id(id=236544),
])
self.assertEqual(branches, ['safari-606-branch'])
branches = self.database.branch_keys_for_commits([
MockStashRepository.safari().commit_for_id(id='79256c32', branch='safari-606-branch'),
MockSVNRepository.webkit().commit_for_id(id=236335, branch='safari-606-branch'),
])
self.assertEqual(branches, ['safari-606-branch'])
@WaitForDockerTestCase.mock_if_no_docker(mock_redis=FakeStrictRedis, mock_cassandra=MockCassandraContext)
def test_commit_url(self, redis=StrictRedis, cassandra=CassandraContext):
self.init_database(redis=redis, cassandra=cassandra)
self.assertEqual(
'https://fake-stash-instance.apple.com/projects/BROWSER/repos/safari/commits/bb6bda5f44dd24d0b54539b8ff6e8c17f519249a',
self.database.url(MockStashRepository.safari().commit_for_id(id='bb6bda5f')),
)
self.assertEqual(
'https://trac.webkit.org/changeset/236544/webkit',
self.database.url(MockSVNRepository.webkit().commit_for_id(id=236544)),
)