blob: fa6715d96652704368e2dfef498959c0a913cb6c [file] [log] [blame]
# Copyright 2017 The ChromiumOS Authors
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
"""Test cros_generate_android_breakpad_symbols."""
import tempfile
from chromite.lib import cros_build_lib
from chromite.lib import cros_test_lib
from chromite.lib import osutils
from chromite.scripts import cros_generate_android_breakpad_symbols
from chromite.scripts import cros_generate_breakpad_symbols
# Unitests often need access to internals of the thing they test.
# pylint: disable=protected-access
class AdjustOffsetsTest(cros_test_lib.TestCase):
"""Test breakpad symbol file offset adjustments."""
def testFinaExpansionOffset(self):
"""Make sure we get the correct offset."""
output = """
INFO: Relocations : RELA
INFO: Packed : 9544 bytes
INFO: Unpacked : 66888 bytes
INFO: Relocations : 2787 entries
INFO: Expansion : 57344 bytes
"""
cmd_result = cros_build_lib.CompletedProcess(
stderr=None, stdout=output, returncode=0
)
result = cros_generate_android_breakpad_symbols.FindExpansionOffset(
cmd_result
)
self.assertEqual(result, -57344)
def testFinaExpansionOffsetNoUnpack(self):
"""Make sure we get an offset of zero, if the file wasn't unpacked."""
cmd_result = cros_build_lib.CompletedProcess(
stderr=None, stdout=None, returncode=1
)
result = cros_generate_android_breakpad_symbols.FindExpansionOffset(
cmd_result
)
self.assertEqual(result, 0)
def testFinaExpansionOffsetBadOutput(self):
"""Make sure we get an error without expected output."""
cmd_result = cros_build_lib.CompletedProcess(
stderr=None, stdout="foo", returncode=0
)
with self.assertRaises(
cros_generate_android_breakpad_symbols.OffsetDiscoveryError
):
cros_generate_android_breakpad_symbols.FindExpansionOffset(
cmd_result
)
def testAdjustLineSymbolOffset(self):
"""Test _AdjustLineSymbolOffset."""
offset = 42
line_expected = (
("", ""),
("\n", "\n"),
("noise\n", "noise\n"),
(
"MODULE Linux arm64 "
"E3D562057466309CED960047D474EBF00 libssl.so\n",
"MODULE Linux arm64 "
"E3D562057466309CED960047D474EBF00 libssl.so\n",
),
(
"FUNC dcfc a8 0 dtls1_discard_fragment_body\n",
"FUNC dd26 a8 0 dtls1_discard_fragment_body\n",
),
("dd18 c 403 1\n", "dd42 c 403 1\n"),
(
"PUBLIC f9b0 0 DTLSv1_get_timeout\n",
"PUBLIC f9da 0 DTLSv1_get_timeout\n",
),
(
"STACK CFI INIT dcfc a8 .cfa: sp 0 + .ra: x30\n",
"STACK CFI INIT dd26 a8 .cfa: sp 0 + .ra: x30\n",
),
(
"STACK CFI dd04 .cfa: x29 336 +\n",
"STACK CFI dd2e .cfa: x29 336 +\n",
),
("0 c 403 1\n", "0 c 403 1\n"),
(
"FUNC 0 a8 0 dtls1_discard_fragment_body\n",
"FUNC 0 a8 0 dtls1_discard_fragment_body\n",
),
)
for line, expected in line_expected:
result = (
cros_generate_android_breakpad_symbols._AdjustLineSymbolOffset(
line, offset
)
)
self.assertEqual(result, expected)
def testAdjustSymbolOffsetEmpty(self):
"""Test ability to adjust an empty file."""
with tempfile.NamedTemporaryFile() as sym_file:
osutils.WriteFile(sym_file.name, "")
cros_generate_android_breakpad_symbols._AdjustSymbolOffset(
sym_file.name, 42
)
self.assertEqual(osutils.ReadFile(sym_file.name), "")
def testAdjustSymbolOffset(self):
"""Test ability to adjust an empty file."""
unadjusted = """
MODULE Linux arm64 E3D562057466309CED960047D474EBF00 libssl.so
FILE 0 /testfile.h
FILE 1 /usr/testfile.c
dcfc 1c 403 1
dd18 c 403 1
dd30 10 405 1
dd4c 14 407 1
2d65c 8 1218 27
2d664 c 1226 27
FUNC dda4 140 0 dtls1_hm_fragment_new
dda4 10 151 1
PUBLIC 2c474 0 SSL_early_callback_ctx_extension_get
PUBLIC 2f0bc 0 SSL_get_shared_sigalgs
STACK CFI INIT dcfc a8 .cfa: sp 0 + .ra: x30
STACK CFI dd00 .cfa: sp 336 + .ra: .cfa -328 + ^ x29: .cfa -336 + ^
STACK CFI dd04 .cfa: x29 336 +
STACK CFI dd08 x23: .cfa -288 + ^ x24: .cfa -280 + ^
"""
expected = """
MODULE Linux arm64 E3D562057466309CED960047D474EBF00 libssl.so
FILE 0 /testfile.h
FILE 1 /usr/testfile.c
dd26 1c 403 1
dd42 c 403 1
dd5a 10 405 1
dd76 14 407 1
2d686 8 1218 27
2d68e c 1226 27
FUNC ddce 140 0 dtls1_hm_fragment_new
ddce 10 151 1
PUBLIC 2c49e 0 SSL_early_callback_ctx_extension_get
PUBLIC 2f0e6 0 SSL_get_shared_sigalgs
STACK CFI INIT dd26 a8 .cfa: sp 0 + .ra: x30
STACK CFI dd2a .cfa: sp 336 + .ra: .cfa -328 + ^ x29: .cfa -336 + ^
STACK CFI dd2e .cfa: x29 336 +
STACK CFI dd32 x23: .cfa -288 + ^ x24: .cfa -280 + ^
"""
with tempfile.NamedTemporaryFile() as sym_file:
osutils.WriteFile(sym_file.name, unadjusted)
cros_generate_android_breakpad_symbols._AdjustSymbolOffset(
sym_file.name, 42
)
after = osutils.ReadFile(sym_file.name)
self.assertEqual(after, expected)
class MockTests(cros_test_lib.RunCommandTestCase):
"""Tests that need mocks & RunCommand mocks."""
def testUnpackGenerateBreakpad(self):
"""Test UnpackGenerateBreakpad call."""
output = """
INFO: Relocations : RELA
INFO: Packed : 9544 bytes
INFO: Unpacked : 66888 bytes
INFO: Relocations : 2787 entries
INFO: Expansion : 0 bytes
"""
self.PatchObject(
cros_generate_breakpad_symbols,
"GenerateBreakpadSymbol",
return_value="/foo.sym",
)
self.rc.AddCmdResult(["relocation_packer", "-u", "/foo"], stdout=output)
cros_generate_android_breakpad_symbols._UnpackGenerateBreakpad("/foo")