From 4c39c138fe2a68206c2143d7401a113a1c4b130b Mon Sep 17 00:00:00 2001 From: nealsid Date: Fri, 25 Apr 2008 00:37:19 +0000 Subject: Issue 258: Added test cases for ReadTaskMemory, reorganized project file, renamed filenames inside comments git-svn-id: http://google-breakpad.googlecode.com/svn/trunk@263 4c0a9323-5329-0410-9bdc-e9ce6186880e --- .../mac/handler/testcases/DynamicImagesTests.cc | 48 +++++++++++++ .../mac/handler/testcases/DynamicImagesTests.h | 19 +++++ .../mac/handler/testcases/breakpad_nlist_test.cc | 81 ++++++++++++++++++++++ .../mac/handler/testcases/breakpad_nlist_test.h | 29 ++++++++ 4 files changed, 177 insertions(+) create mode 100644 src/client/mac/handler/testcases/DynamicImagesTests.cc create mode 100644 src/client/mac/handler/testcases/DynamicImagesTests.h create mode 100644 src/client/mac/handler/testcases/breakpad_nlist_test.cc create mode 100644 src/client/mac/handler/testcases/breakpad_nlist_test.h (limited to 'src/client/mac/handler/testcases') diff --git a/src/client/mac/handler/testcases/DynamicImagesTests.cc b/src/client/mac/handler/testcases/DynamicImagesTests.cc new file mode 100644 index 00000000..15976a25 --- /dev/null +++ b/src/client/mac/handler/testcases/DynamicImagesTests.cc @@ -0,0 +1,48 @@ +/* + * DynamicImagesTests.cpp + * minidump_test + * + * Created by Neal Sidhwaney on 4/17/08. + * Copyright 2008 Google Inc. All rights reserved. + * + */ + +#include "DynamicImagesTests.h" +#include "dynamic_images.h" + +DynamicImagesTests test2(TEST_INVOCATION(DynamicImagesTests, ReadTaskMemoryTest)); + +DynamicImagesTests::DynamicImagesTests(TestInvocation *invocation) + : TestCase(invocation) +{ +} + + +DynamicImagesTests::~DynamicImagesTests() +{ +} + +void DynamicImagesTests::ReadTaskMemoryTest() +{ + kern_return_t kr; + + // pick test2 as a symbol we know to be valid to read + // anything will work, really + void *addr = (void*)&test2; + + void *buf; + fprintf(stderr, "reading 0x%p\n",addr); + buf = google_breakpad::ReadTaskMemory(mach_task_self(), + addr, + getpagesize(), + &kr); + + CPTAssert(kr == KERN_SUCCESS); + + CPTAssert(buf != NULL); + + CPTAssert(0 == memcmp(buf,(const void*)addr,getpagesize())); + + free(buf); + +} diff --git a/src/client/mac/handler/testcases/DynamicImagesTests.h b/src/client/mac/handler/testcases/DynamicImagesTests.h new file mode 100644 index 00000000..fd88fad8 --- /dev/null +++ b/src/client/mac/handler/testcases/DynamicImagesTests.h @@ -0,0 +1,19 @@ +/* + * DynamicImagesTests.h + * minidump_test + * + * Created by Neal Sidhwaney on 4/17/08. + * Copyright 2008 Google Inc. All rights reserved. + * + */ + +#include + + +class DynamicImagesTests : public TestCase { +public: + DynamicImagesTests(TestInvocation* invocation); + virtual ~DynamicImagesTests(); + + void ReadTaskMemoryTest(); +}; diff --git a/src/client/mac/handler/testcases/breakpad_nlist_test.cc b/src/client/mac/handler/testcases/breakpad_nlist_test.cc new file mode 100644 index 00000000..990739dc --- /dev/null +++ b/src/client/mac/handler/testcases/breakpad_nlist_test.cc @@ -0,0 +1,81 @@ +/* + * breakpad_nlist_test.cc + * minidump_test + * + * Created by Neal Sidhwaney on 4/13/08. + * Copyright 2008 Google Inc. All rights reserved. + * + */ + +#include "breakpad_nlist_test.h" +#include +#include "breakpad_nlist_64.h" + +BreakpadNlistTest test1(TEST_INVOCATION(BreakpadNlistTest, CompareToNM)); + +BreakpadNlistTest::BreakpadNlistTest(TestInvocation *invocation) + : TestCase(invocation) { +} + + +BreakpadNlistTest::~BreakpadNlistTest() { +} + +void BreakpadNlistTest::CompareToNM() { +#if TARGET_CPU_X86_64 + system("/usr/bin/nm -arch x86_64 /usr/lib/dyld > /tmp/dyld-namelist.txt"); +#elif TARGET_CPU_PPC64 + system("/usr/bin/nm -arch ppc64 /usr/lib/dyld > /tmp/dyld-namelist.txt"); +#endif + + FILE *fd = fopen("/tmp/dyld-namelist.txt","rt"); + + char oneNMAddr[30]; + char symbolType; + char symbolName[500]; + while(!feof(fd)) { + fscanf(fd,"%s %c %s",oneNMAddr, &symbolType, symbolName); + breakpad_nlist symbolList[2]; + breakpad_nlist &list = symbolList[0]; + + memset(symbolList,0, sizeof(breakpad_nlist)*2); + const char *symbolNames[2]; + symbolNames[0] = (const char*)symbolName; + symbolNames[1] = "\0"; + breakpad_nlist_64("/usr/lib/dyld",&list, symbolNames); + uint64_t nmAddr = strtol(oneNMAddr,NULL,16); + if(!IsSymbolMoreThanOnceInDyld(symbolName)) { + CPTAssert(nmAddr == symbolList[0].n_value); + } + } + + fclose(fd); +} + +bool BreakpadNlistTest::IsSymbolMoreThanOnceInDyld(const char *symbolName) { + //These are the symbols that occur more than once when nm dumps + // the symbol table of /usr/lib/dyld. Our nlist program returns + // the first address because it's doing a search so we need to exclude + // these from causing the test to fail + const char *multipleSymbols[] = { + "__Z41__static_initialization_and_destruction_0ii", + "___tcf_0", + "___tcf_1", + "_read_encoded_value_with_base", + "_read_sleb128", + "_read_uleb128", + "\0"}; + + bool found = false; + + for(int i = 0; multipleSymbols[i][0]; i++) { + if(!strcmp(multipleSymbols[i],symbolName)) { + found = true; + break; + } + + } + + return found; + +} diff --git a/src/client/mac/handler/testcases/breakpad_nlist_test.h b/src/client/mac/handler/testcases/breakpad_nlist_test.h new file mode 100644 index 00000000..f2416e38 --- /dev/null +++ b/src/client/mac/handler/testcases/breakpad_nlist_test.h @@ -0,0 +1,29 @@ +/* + * breakpad_nlist_test.h + * minidump_test + * + * Created by Neal Sidhwaney on 4/13/08. + * Copyright 2008 Google Inc. All rights reserved. + * + */ + +#include + +class BreakpadNlistTest : public TestCase { +private: + + // nm dumps multiple addresses for the same symbol in + // /usr/lib/dyld. So we track those so we don't report failures + // in mismatches between what our nlist returns and what nm has + // for the duplicate symbols. + bool IsSymbolMoreThanOnceInDyld(const char *symbolName); + +public: + BreakpadNlistTest(TestInvocation* invocation); + virtual ~BreakpadNlistTest(); + + + /* This test case runs nm on /usr/lib/dyld and then compares the + output of every symbol to what our nlist implementation returns */ + void CompareToNM(); +}; -- cgit v1.2.1