You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

141 lines
4.6 KiB

#!/usr/bin/env python3
#
# Copyright 2019, The Android Open Source Project
#
# 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.
"""Unittests for bug_detector."""
# pylint: disable=line-too-long
import datetime
import json
import os
import unittest
from unittest import mock
import bug_detector
import constants
import unittest_constants as uc
TEST_DICT = {
'test1': {
'latest_exit_code': 5,
'updated_at': ''
},
'test2': {
'latest_exit_code': 0,
'updated_at': ''
}
}
class BugDetectorUnittest(unittest.TestCase):
"""Unit test for bug_detector.py"""
def setUp(self):
"""Set up stuff for testing."""
self.history_file = os.path.join(uc.TEST_DATA_DIR, 'bug_detector.json')
self.detector = bug_detector.BugDetector(['test1'], 5, self.history_file)
self._reset_history_file()
self.history_file2 = os.path.join(uc.TEST_DATA_DIR, 'bug_detector2.json')
def tearDown(self):
"""Run after execution of every test"""
if os.path.isfile(self.history_file):
os.remove(self.history_file)
if os.path.isfile(self.history_file2):
os.remove(self.history_file2)
def _reset_history_file(self):
"""Reset test history file."""
with open(self.history_file, 'w') as outfile:
json.dump(TEST_DICT, outfile)
def _make_test_file(self, file_size):
temp_history = {}
for i in range(file_size):
latest_bug = {
i: {
'latest_exit_code': i,
'updated_at': datetime.datetime.now().isoformat()
}
}
temp_history.update(latest_bug)
with open(self.history_file2, 'w') as outfile:
json.dump(temp_history, outfile, indent=0)
@mock.patch.object(bug_detector.BugDetector, 'update_history')
def test_get_detect_key(self, _):
"""Test get_detect_key."""
# argv without -v
argv = ['test2', 'test1']
want_key = 'test1 test2'
dtr = bug_detector.BugDetector(argv, 0)
self.assertEqual(dtr.get_detect_key(argv), want_key)
# argv with -v
argv = ['-v', 'test2', 'test1']
want_key = 'test1 test2'
dtr = bug_detector.BugDetector(argv, 0)
self.assertEqual(dtr.get_detect_key(argv), want_key)
# argv with --verbose
argv = ['--verbose', 'test2', 'test3', 'test1']
want_key = 'test1 test2 test3'
dtr = bug_detector.BugDetector(argv, 0)
self.assertEqual(dtr.get_detect_key(argv), want_key)
def test_get_history(self):
"""Test get_history."""
self.assertEqual(self.detector.get_history(), TEST_DICT)
@mock.patch.object(bug_detector.BugDetector, 'update_history')
def test_detect_bug_caught(self, _):
"""Test detect_bug_caught."""
self._reset_history_file()
dtr = bug_detector.BugDetector(['test1'], 0, self.history_file)
success = 1
self.assertEqual(dtr.detect_bug_caught(), success)
def test_update_history(self):
"""Test update_history."""
constants.UPPER_LIMIT = 10
constants.TRIM_TO_SIZE = 3
mock_file_size = 0
self._make_test_file(mock_file_size)
dtr = bug_detector.BugDetector(['test1'], 0, self.history_file2)
self.assertTrue('test1' in dtr.history)
# History is larger than constants.UPPER_LIMIT. Trim to size.
mock_file_size = 10
self._make_test_file(mock_file_size)
dtr = bug_detector.BugDetector(['test1'], 0, self.history_file2)
self.assertEqual(len(dtr.history), constants.TRIM_TO_SIZE)
keys = ['test1', '9', '8']
for key in keys:
self.assertTrue(key in dtr.history)
# History is not larger than constants.UPPER_LIMIT.
mock_file_size = 5
self._make_test_file(mock_file_size)
dtr = bug_detector.BugDetector(['test1'], 0, self.history_file2)
self.assertEqual(len(dtr.history), mock_file_size+1)
keys = ['test1', '4', '3', '2', '1', '0']
for key in keys:
self.assertTrue(key in dtr.history)
if __name__ == '__main__':
unittest.main()