Breakpad STABS parser: Use a test fixture in StabsReader unit tests.

This patch factors out some of the common code in the StabsReader unit
tests into a fixture class. Pretty mechanical.

a=jimblandy, r=thestig


git-svn-id: http://google-breakpad.googlecode.com/svn/trunk@586 4c0a9323-5329-0410-9bdc-e9ce6186880e
This commit is contained in:
jimblandy 2010-05-05 17:25:47 +00:00
parent deb500f6c8
commit d3e4bbb9c7

View file

@ -51,6 +51,7 @@ using ::testing::Eq;
using ::testing::InSequence;
using ::testing::Return;
using ::testing::StrEq;
using ::testing::Test;
using ::testing::_;
using google_breakpad::StabsHandler;
using google_breakpad::StabsReader;
@ -223,32 +224,38 @@ class MockStabsReaderHandler: public StabsHandler {
MOCK_METHOD1(MockWarning, void(const char *));
};
// Create a StabsReader to parse the mock stabs data in STABS_ASSEMBLER and
// STRINGS_ASSEMBLER, and pass the parsed information to HANDLER. Use the
// endianness and value size of STABS_ASSEMBLER to parse the data. If all
// goes well, return the result of calling the reader's Process member
// function. Otherwise, return false.
static bool ApplyHandlerToMockStabsData(StabsAssembler *stabs_assembler,
StringAssembler *strings_assembler,
StabsHandler *handler) {
string stab, stabstr;
if (!stabs_assembler->GetContents(&stab) ||
!strings_assembler->GetContents(&stabstr))
return false;
struct StabsFixture {
StabsFixture() : stabs(&strings) { }
// Run the parser on the test input, passing whatever we find to HANDLER.
StabsReader reader(
reinterpret_cast<const uint8_t *>(stab.data()), stab.size(),
reinterpret_cast<const uint8_t *>(stabstr.data()), stabstr.size(),
stabs_assembler->endianness() == kBigEndian,
stabs_assembler->value_size(),
handler);
return reader.Process();
}
// Create a StabsReader to parse the mock stabs data in stabs and
// strings, and pass the parsed information to mock_handler. Use the
// endianness and value size of stabs to parse the data. If all goes
// well, return the result of calling the reader's Process member
// function. Otherwise, return false.
bool ApplyHandlerToMockStabsData() {
string stabs_contents, stabstr_contents;
if (!stabs.GetContents(&stabs_contents) ||
!strings.GetContents(&stabstr_contents))
return false;
// Run the parser on the test input, passing whatever we find to HANDLER.
StabsReader reader(
reinterpret_cast<const uint8_t *>(stabs_contents.data()),
stabs_contents.size(),
reinterpret_cast<const uint8_t *>(stabstr_contents.data()),
stabstr_contents.size(),
stabs.endianness() == kBigEndian, stabs.value_size(), &mock_handler);
return reader.Process();
}
TEST(StabsReader, MockStabsInput) {
StringAssembler strings;
StabsAssembler stabs(&strings);
StabsAssembler stabs;
MockStabsReaderHandler mock_handler;
};
class Stabs: public StabsFixture, public Test { };
TEST_F(Stabs, MockStabsInput) {
stabs.set_endianness(kLittleEndian);
stabs.set_value_size(4);
stabs
@ -275,8 +282,6 @@ TEST(StabsReader, MockStabsInput) {
.Stab(N_SO, 152, 7810, 0x11759f10U, "file3.c")
.Stab(N_SO, 218, 12447, 0x11cfe4b5U, "");
MockStabsReaderHandler mock_handler;
{
InSequence s;
@ -313,18 +318,14 @@ TEST(StabsReader, MockStabsInput) {
.WillOnce(Return(true));
}
ASSERT_TRUE(ApplyHandlerToMockStabsData(&stabs, &strings, &mock_handler));
ASSERT_TRUE(ApplyHandlerToMockStabsData());
}
TEST(StabsReader, AbruptCU) {
StringAssembler strings;
StabsAssembler stabs(&strings);
TEST_F(Stabs, AbruptCU) {
stabs.set_endianness(kBigEndian);
stabs.set_value_size(4);
stabs.Stab(N_SO, 177, 23446, 0xbf10d5e4, "file2-1.c");
MockStabsReaderHandler mock_handler;
{
InSequence s;
@ -335,13 +336,10 @@ TEST(StabsReader, AbruptCU) {
.WillOnce(Return(true));
}
ASSERT_TRUE(ApplyHandlerToMockStabsData(&stabs, &strings, &mock_handler));
ASSERT_TRUE(ApplyHandlerToMockStabsData());
}
TEST(StabsReader, AbruptFunction) {
MockStabsReaderHandler mock_handler;
StringAssembler strings;
StabsAssembler stabs(&strings);
TEST_F(Stabs, AbruptFunction) {
stabs.set_endianness(kLittleEndian);
stabs.set_value_size(8);
stabs
@ -362,37 +360,29 @@ TEST(StabsReader, AbruptFunction) {
.WillOnce(Return(true));
}
ASSERT_TRUE(ApplyHandlerToMockStabsData(&stabs, &strings, &mock_handler));
ASSERT_TRUE(ApplyHandlerToMockStabsData());
}
TEST(StabsReader, NoCU) {
StringAssembler strings;
StabsAssembler stabs(&strings);
TEST_F(Stabs, NoCU) {
stabs.set_endianness(kBigEndian);
stabs.set_value_size(8);
stabs.Stab(N_SO, 161, 25673, 0x8f676e7bU, "build-directory/");
MockStabsReaderHandler mock_handler;
EXPECT_CALL(mock_handler, StartCompilationUnit(_, _, _))
.Times(0);
EXPECT_CALL(mock_handler, StartFunction(_, _))
.Times(0);
ASSERT_TRUE(ApplyHandlerToMockStabsData(&stabs, &strings, &mock_handler));
ASSERT_TRUE(ApplyHandlerToMockStabsData());
}
TEST(StabsReader, NoCUEnd) {
StringAssembler strings;
StabsAssembler stabs(&strings);
TEST_F(Stabs, NoCUEnd) {
stabs.set_endianness(kBigEndian);
stabs.set_value_size(8);
stabs
.Stab(N_SO, 116, 58280, 0x2f7493c9U, "file5-1.c")
.Stab(N_SO, 224, 23057, 0xf9f1d50fU, "file5-2.c");
MockStabsReaderHandler mock_handler;
{
InSequence s;
@ -408,12 +398,10 @@ TEST(StabsReader, NoCUEnd) {
.WillOnce(Return(true));
}
ASSERT_TRUE(ApplyHandlerToMockStabsData(&stabs, &strings, &mock_handler));
ASSERT_TRUE(ApplyHandlerToMockStabsData());
}
TEST(StabsReader, MultipleCUs) {
StringAssembler strings;
StabsAssembler stabs(&strings);
TEST_F(Stabs, MultipleCUs) {
stabs.set_endianness(kBigEndian);
stabs.set_value_size(4);
stabs
@ -428,8 +416,6 @@ TEST(StabsReader, MultipleCUs) {
.Stab(N_SO, 178, 56949, 0xbffff983U, "")
.EndCU();
MockStabsReaderHandler mock_handler;
{
InSequence s;
EXPECT_CALL(mock_handler,
@ -452,7 +438,7 @@ TEST(StabsReader, MultipleCUs) {
.WillOnce(Return(true));
}
ASSERT_TRUE(ApplyHandlerToMockStabsData(&stabs, &strings, &mock_handler));
ASSERT_TRUE(ApplyHandlerToMockStabsData());
}
TEST_F(Stabs, FunctionEnd) {