DragonOS/tools/test-upload/test_parse_and_upload.py

171 lines
6.7 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/usr/bin/env python3
"""
单元测试:测试日志解析功能
"""
import unittest
from parse_and_upload import GoogleTestParser, GenericParser
class TestGoogleTestParser(unittest.TestCase):
"""Google Test解析器测试"""
def setUp(self):
self.parser = GoogleTestParser()
def test_simple_pass(self):
"""测试简单的通过用例"""
log = """[ RUN ] TestName
[ OK ] TestName (4 ms)"""
result = self.parser.parse(log)
self.assertEqual(len(result), 1)
self.assertEqual(result[0]['name'], 'TestName')
self.assertEqual(result[0]['status'], 'passed')
self.assertEqual(result[0]['duration_ms'], 4)
def test_simple_fail(self):
"""测试简单的失败用例场景2"""
log = """[ RUN ] TestName
test/syscalls/linux/test.cc:42: Failure
Value of: x
Expected: is equal to 1
Actual: 2
[ FAILED ] TestName (4 ms)"""
result = self.parser.parse(log)
self.assertEqual(len(result), 1)
self.assertEqual(result[0]['name'], 'TestName')
self.assertEqual(result[0]['status'], 'failed')
self.assertEqual(result[0]['duration_ms'], 4)
self.assertIn('error_log', result[0])
self.assertIn('test/syscalls/linux/test.cc:42', result[0]['error_log'])
def test_fail_without_failed_marker(self):
"""测试失败场景1只有RUN没有结果但有错误信息"""
log = """[ RUN ] TestName
test/syscalls/linux/test.cc:425: Failure
Value of: futex_wake_op(IsPrivate(), &a, &b, 1, 1, (((1 & 0xf) << 28) | ((0 & 0xf) << 24) | ((1 & 0xfff) << 12) | ((kInitialValue + 1) & 0xfff)))
Expected: is equal to 2
Actual: 1 (of type int)
[ RUN ] NextTest"""
result = self.parser.parse(log)
self.assertEqual(len(result), 2)
self.assertEqual(result[0]['name'], 'TestName')
self.assertEqual(result[0]['status'], 'failed')
self.assertIn('error_log', result[0])
self.assertIn('test/syscalls/linux/test.cc:425', result[0]['error_log'])
def test_multiple_tests(self):
"""测试多个测试用例"""
log = """[ RUN ] Test1
[ OK ] Test1 (4 ms)
[ RUN ] Test2
[ OK ] Test2 (8 ms)
[ RUN ] Test3
[ FAILED ] Test3 (12 ms)"""
result = self.parser.parse(log)
self.assertEqual(len(result), 3)
self.assertEqual(result[0]['name'], 'Test1')
self.assertEqual(result[0]['status'], 'passed')
self.assertEqual(result[1]['name'], 'Test2')
self.assertEqual(result[1]['status'], 'passed')
self.assertEqual(result[2]['name'], 'Test3')
self.assertEqual(result[2]['status'], 'failed')
def test_run_not_at_line_start(self):
"""测试[ RUN ]不在行首的情况"""
log = """[DEBUG] some debug info
[ RUN ] TestName
[ OK ] TestName (4 ms)"""
result = self.parser.parse(log)
self.assertEqual(len(result), 1)
self.assertEqual(result[0]['name'], 'TestName')
self.assertEqual(result[0]['status'], 'passed')
def test_failed_not_at_line_start(self):
"""测试[ FAILED ]不在行首的情况"""
log = """[ RUN ] TestName
[DEBUG] some debug info
[ FAILED ] TestName (4 ms)"""
result = self.parser.parse(log)
self.assertEqual(len(result), 1)
self.assertEqual(result[0]['name'], 'TestName')
self.assertEqual(result[0]['status'], 'failed')
def test_complex_test_name(self):
"""测试复杂的测试用例名称(包含斜杠、点等)"""
log = """[ RUN ] Waiters/WaitAnyChildTest.Fork/0
[ OK ] Waiters/WaitAnyChildTest.Fork/0 (4 ms)"""
result = self.parser.parse(log)
self.assertEqual(len(result), 1)
self.assertEqual(result[0]['name'], 'Waiters/WaitAnyChildTest.Fork/0')
self.assertEqual(result[0]['status'], 'passed')
def test_error_log_extraction(self):
"""测试错误日志提取"""
log = """[ RUN ] LseekTest.SeekDataAndSeekHole
test/syscalls/linux/lseek.cc:208: Failure
Value of: lseek(fd.get(), mid, 3)
Expected: is equal to 4
Actual: 8 (of type long)
[ FAILED ] LseekTest.SeekDataAndSeekHole (4 ms)"""
result = self.parser.parse(log)
self.assertEqual(len(result), 1)
self.assertEqual(result[0]['status'], 'failed')
self.assertIn('error_log', result[0])
error_log = result[0]['error_log']
self.assertIn('test/syscalls/linux/lseek.cc:208', error_log)
self.assertIn('Expected: is equal to 4', error_log)
self.assertIn('Actual: 8', error_log)
def test_futx_example(self):
"""测试用户提供的futex示例"""
log = """[ RUN ] SharedPrivate/PrivateAndSharedFutexTest.WakeOpCondSuccess/0
test/syscalls/linux/futex.cc:425: Failure
Value of: futex_wake_op(IsPrivate(), &a, &b, 1, 1, (((1 & 0xf) << 28) | ((0 & 0xf) << 24) | ((1 & 0xfff) << 12) | ((kInitialValue + 1) & 0xfff)))
Expected: is equal to 2
Actual: 1 (of type int)"""
result = self.parser.parse(log)
self.assertEqual(len(result), 1)
self.assertEqual(result[0]['name'], 'SharedPrivate/PrivateAndSharedFutexTest.WakeOpCondSuccess/0')
self.assertEqual(result[0]['status'], 'failed')
self.assertIn('error_log', result[0])
error_log = result[0]['error_log']
self.assertIn('test/syscalls/linux/futex.cc:425', error_log)
self.assertIn('Expected: is equal to 2', error_log)
def test_real_world_example(self):
"""测试真实世界的例子从serial_opt.txt"""
log = """[ RUN ] Waiters/WaitAnyChildTest.Fork/0
[ OK ] Waiters/WaitAnyChildTest.Fork/0 (4 ms)
[ RUN ] Waiters/WaitAnyChildTest.Fork/1
[ OK ] Waiters/WaitAnyChildTest.Fork/1 (4 ms)"""
result = self.parser.parse(log)
self.assertEqual(len(result), 2)
self.assertEqual(result[0]['name'], 'Waiters/WaitAnyChildTest.Fork/0')
self.assertEqual(result[0]['status'], 'passed')
self.assertEqual(result[0]['duration_ms'], 4)
self.assertEqual(result[1]['name'], 'Waiters/WaitAnyChildTest.Fork/1')
self.assertEqual(result[1]['status'], 'passed')
self.assertEqual(result[1]['duration_ms'], 4)
class TestGenericParser(unittest.TestCase):
"""通用解析器测试"""
def setUp(self):
self.parser = GenericParser()
def test_google_test_format(self):
"""测试Google Test格式"""
log = """[ RUN ] TestName
[ OK ] TestName (4 ms)"""
result = self.parser.parse(log)
self.assertEqual(len(result), 1)
self.assertEqual(result[0]['name'], 'TestName')
self.assertEqual(result[0]['status'], 'passed')
if __name__ == '__main__':
unittest.main()