Changeset View
Changeset View
Standalone View
Standalone View
contrib/buildbot/test/test_persist_database.py
- This file was added.
Property | Old Value | New Value |
---|---|---|
File Mode | null | 100755 |
#!/usr/bin/env python3 | |||||
# | |||||
# Copyright (c) 2020 The Bitcoin developers | |||||
# Distributed under the MIT software license, see the accompanying | |||||
# file COPYING or http://www.opensource.org/licenses/mit-license.php. | |||||
import json | |||||
import mock | |||||
import os | |||||
import server | |||||
import shelve | |||||
import unittest | |||||
from build import BuildStatus | |||||
from teamcity_wrapper import BuildInfo | |||||
from test.abcbot_fixture import ABCBotFixture | |||||
import test.mocks.teamcity | |||||
from test.mocks.teamcity import DEFAULT_BUILD_ID | |||||
from test.test_endpoint_build import buildRequestQuery | |||||
from test.test_endpoint_status import statusRequestData | |||||
DB_FILE_NO_EXT = "test_database" | |||||
DB_FILE = DB_FILE_NO_EXT + '.db' | |||||
BUILD_NAME = 'build-name' | |||||
BUILD_TYPE_ID = 'build-type-id' | |||||
BUILD_TARGET_PHID = 'build-target-PHID' | |||||
class PersistDataTestCase(ABCBotFixture): | |||||
def setUp(self): | |||||
self.db_file_no_ext = DB_FILE_NO_EXT | |||||
super().setUp() | |||||
self.phab.get_file_content_from_master = mock.Mock() | |||||
self.phab.get_file_content_from_master.return_value = json.dumps({}) | |||||
self.phab.set_text_panel_content = mock.Mock() | |||||
self.teamcity.get_coverage_summary = mock.Mock() | |||||
self.teamcity.get_coverage_summary.return_value = None | |||||
self.teamcity.getBuildInfo = mock.Mock() | |||||
self.teamcity.getBuildInfo.return_value = BuildInfo.fromSingleBuildResponse( | |||||
json.loads(test.mocks.teamcity.buildInfo().content) | |||||
) | |||||
self.travis.get_branch_status = mock.Mock() | |||||
self.travis.get_branch_status.return_value = BuildStatus.Success | |||||
def tearDown(self): | |||||
if os.path.exists(DB_FILE): | |||||
os.remove(DB_FILE) | |||||
def test_persist_diff_targets(self): | |||||
queryData = buildRequestQuery() | |||||
queryData.abcBuildName = BUILD_NAME | |||||
queryData.buildTypeId = BUILD_TYPE_ID | |||||
queryData.PHID = BUILD_TARGET_PHID | |||||
triggerBuildResponse = test.mocks.teamcity.buildInfo( | |||||
test.mocks.teamcity.buildInfo_changes( | |||||
['test-change']), buildqueue=True) | |||||
self.teamcity.session.send.return_value = triggerBuildResponse | |||||
response = self.app.post( | |||||
'/build{}'.format(queryData), | |||||
headers=self.headers) | |||||
assert response.status_code == 200 | |||||
# Check the diff target state was persisted | |||||
assert os.path.exists(DB_FILE) | |||||
with shelve.open(DB_FILE_NO_EXT, flag='r') as db: | |||||
assert 'diff_targets' in db | |||||
assert BUILD_TARGET_PHID in db['diff_targets'] | |||||
assert DEFAULT_BUILD_ID in db['diff_targets'][BUILD_TARGET_PHID].builds | |||||
assert db['diff_targets'][BUILD_TARGET_PHID].builds[DEFAULT_BUILD_ID].build_id == DEFAULT_BUILD_ID | |||||
assert db['diff_targets'][BUILD_TARGET_PHID].builds[DEFAULT_BUILD_ID].status == BuildStatus.Queued | |||||
assert db['diff_targets'][BUILD_TARGET_PHID].builds[DEFAULT_BUILD_ID].name == BUILD_NAME | |||||
# Restart the server, which we expect to restore the persisted state | |||||
del self.app | |||||
self.app = server.create_server( | |||||
self.teamcity, | |||||
self.phab, | |||||
self.slackbot, | |||||
self.travis, | |||||
db_file_no_ext=DB_FILE_NO_EXT, | |||||
jsonEncoder=test.mocks.fixture.MockJSONEncoder).test_client() | |||||
data = statusRequestData() | |||||
data.buildName = BUILD_NAME | |||||
data.buildId = DEFAULT_BUILD_ID | |||||
data.buildTypeId = BUILD_TYPE_ID | |||||
data.buildTargetPHID = BUILD_TARGET_PHID | |||||
statusResponse = self.app.post( | |||||
'/status', headers=self.headers, json=data) | |||||
assert statusResponse.status_code == 200 | |||||
self.phab.harbormaster.createartifact.assert_called_with( | |||||
buildTargetPHID=BUILD_TARGET_PHID, | |||||
artifactKey="{}-{}".format(BUILD_NAME, BUILD_TARGET_PHID), | |||||
artifactType="uri", | |||||
artifactData={ | |||||
"uri": self.teamcity.build_url( | |||||
"viewLog.html", | |||||
{ | |||||
"buildTypeId": BUILD_TYPE_ID, | |||||
"buildId": DEFAULT_BUILD_ID, | |||||
}, | |||||
), | |||||
"name": BUILD_NAME, | |||||
"ui.external": True, | |||||
}, | |||||
) | |||||
# Check the diff target was cleared from persisted state | |||||
with shelve.open(DB_FILE_NO_EXT, flag='r') as db: | |||||
assert BUILD_TARGET_PHID not in db['diff_targets'] | |||||
if __name__ == '__main__': | |||||
unittest.main() |