Index: util/mac/mach_o_image_segment_reader_test.cc |
diff --git a/util/mac/mach_o_image_segment_reader_test.cc b/util/mac/mach_o_image_segment_reader_test.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..226eaa0715f15b7f14c575c2f0183b3cb0b1b467 |
--- /dev/null |
+++ b/util/mac/mach_o_image_segment_reader_test.cc |
@@ -0,0 +1,186 @@ |
+// Copyright 2014 The Crashpad Authors. All rights reserved. |
+// |
+// 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. |
+ |
+#include "util/mac/mach_o_image_segment_reader.h" |
+ |
+#include <mach-o/loader.h> |
+ |
+#include "base/basictypes.h" |
+#include "base/strings/stringprintf.h" |
+#include "gtest/gtest.h" |
+ |
+namespace { |
+ |
+using namespace crashpad; |
+ |
+// Most of MachOImageSegmentReader is tested as part of MachOImageReader, which |
+// depends on MachOImageSegmentReader to provide major portions of its |
+// functionality. Because MachOImageSegmentReader is difficult to use except by |
+// a Mach-O load command reader such as MachOImageReader, these portions |
+// of MachOImageSegmentReader are not tested independently. |
+// |
+// The tests here exercise the portions of MachOImageSegmentReader that are |
+// exposed and independently useful. |
+ |
+TEST(MachOImageSegmentReader, SegmentNameString) { |
+ // The output value should be a string of up to 16 characters, even if the |
+ // input value is not NUL-terminated within 16 characters. |
+ EXPECT_EQ("__TEXT", MachOImageSegmentReader::SegmentNameString("__TEXT")); |
+ EXPECT_EQ("__OVER", MachOImageSegmentReader::SegmentNameString("__OVER")); |
+ EXPECT_EQ("", MachOImageSegmentReader::SegmentNameString("")); |
+ EXPECT_EQ("p", MachOImageSegmentReader::SegmentNameString("p")); |
+ EXPECT_EQ("NoUnderChar", |
+ MachOImageSegmentReader::SegmentNameString("NoUnderChar")); |
+ EXPECT_EQ("0123456789abcde", |
+ MachOImageSegmentReader::SegmentNameString("0123456789abcde")); |
+ EXPECT_EQ("0123456789abcdef", |
+ MachOImageSegmentReader::SegmentNameString("0123456789abcdef")); |
+ EXPECT_EQ("gfedcba987654321", |
+ MachOImageSegmentReader::SegmentNameString("gfedcba9876543210")); |
+ EXPECT_EQ("hgfedcba98765432", |
+ MachOImageSegmentReader::SegmentNameString("hgfedcba9876543210")); |
+ |
+ // Segment names defined in <mach-o/loader.h>. All of these should come |
+ // through SegmentNameString() cleanly and without truncation. |
+ const char* kSegmentTestData[] = { |
+ SEG_TEXT, |
+ SEG_DATA, |
+ SEG_OBJC, |
+ SEG_ICON, |
+ SEG_LINKEDIT, |
+ SEG_UNIXSTACK, |
+ SEG_IMPORT, |
+ }; |
+ |
+ for (size_t index = 0; index < arraysize(kSegmentTestData); ++index) { |
+ EXPECT_EQ( |
+ kSegmentTestData[index], |
+ MachOImageSegmentReader::SegmentNameString(kSegmentTestData[index])) |
+ << base::StringPrintf("index %zu", index); |
+ } |
+} |
+ |
+TEST(MachOImageSegmentReader, SectionNameString) { |
+ // The output value should be a string of up to 16 characters, even if the |
+ // input value is not NUL-terminated within 16 characters. |
+ EXPECT_EQ("__text", MachOImageSegmentReader::SectionNameString("__text")); |
+ EXPECT_EQ("__over", MachOImageSegmentReader::SectionNameString("__over")); |
+ EXPECT_EQ("", MachOImageSegmentReader::SectionNameString("")); |
+ EXPECT_EQ("p", MachOImageSegmentReader::SectionNameString("p")); |
+ EXPECT_EQ("NoUnderChar", |
+ MachOImageSegmentReader::SectionNameString("NoUnderChar")); |
+ EXPECT_EQ("0123456789abcde", |
+ MachOImageSegmentReader::SectionNameString("0123456789abcde")); |
+ EXPECT_EQ("0123456789abcdef", |
+ MachOImageSegmentReader::SectionNameString("0123456789abcdef")); |
+ EXPECT_EQ("gfedcba987654321", |
+ MachOImageSegmentReader::SectionNameString("gfedcba9876543210")); |
+ EXPECT_EQ("hgfedcba98765432", |
+ MachOImageSegmentReader::SectionNameString("hgfedcba9876543210")); |
+ |
+ // Section names defined in <mach-o/loader.h>. All of these should come |
+ // through SectionNameString() cleanly and without truncation. |
+ const char* kSectionTestData[] = { |
+ SECT_TEXT, |
+ SECT_FVMLIB_INIT0, |
+ SECT_FVMLIB_INIT1, |
+ SECT_DATA, |
+ SECT_BSS, |
+ SECT_COMMON, |
+ SECT_OBJC_SYMBOLS, |
+ SECT_OBJC_MODULES, |
+ SECT_OBJC_STRINGS, |
+ SECT_OBJC_REFS, |
+ SECT_ICON_HEADER, |
+ SECT_ICON_TIFF, |
+ }; |
+ |
+ for (size_t index = 0; index < arraysize(kSectionTestData); ++index) { |
+ EXPECT_EQ( |
+ kSectionTestData[index], |
+ MachOImageSegmentReader::SectionNameString(kSectionTestData[index])) |
+ << base::StringPrintf("index %zu", index); |
+ } |
+} |
+ |
+TEST(MachOImageSegmentReader, SegmentAndSectionNameString) { |
+ struct SegmentAndSectionTestData { |
+ const char* segment; |
+ const char* section; |
+ const char* output; |
+ }; |
+ const SegmentAndSectionTestData kSegmentAndSectionTestData[] = { |
+ {"segment", "section", "segment,section"}, |
+ {"Segment", "Section", "Segment,Section"}, |
+ {"SEGMENT", "SECTION", "SEGMENT,SECTION"}, |
+ {"__TEXT", "__plain", "__TEXT,__plain"}, |
+ {"__TEXT", "poetry", "__TEXT,poetry"}, |
+ {"__TEXT", "Prose", "__TEXT,Prose"}, |
+ {"__PLAIN", "__text", "__PLAIN,__text"}, |
+ {"rich", "__text", "rich,__text"}, |
+ {"segment", "", "segment,"}, |
+ {"", "section", ",section"}, |
+ {"", "", ","}, |
+ {"0123456789abcdef", "section", "0123456789abcdef,section"}, |
+ {"gfedcba9876543210", "section", "gfedcba987654321,section"}, |
+ {"0123456789abcdef", "", "0123456789abcdef,"}, |
+ {"gfedcba9876543210", "", "gfedcba987654321,"}, |
+ {"segment", "0123456789abcdef", "segment,0123456789abcdef"}, |
+ {"segment", "gfedcba9876543210", "segment,gfedcba987654321"}, |
+ {"", "0123456789abcdef", ",0123456789abcdef"}, |
+ {"", "gfedcba9876543210", ",gfedcba987654321"}, |
+ {"0123456789abcdef", |
+ "0123456789abcdef", |
+ "0123456789abcdef,0123456789abcdef"}, |
+ {"gfedcba9876543210", |
+ "gfedcba9876543210", |
+ "gfedcba987654321,gfedcba987654321"}, |
+ |
+ // Sections defined in <mach-o/loader.h>. All of these should come through |
+ // SegmentAndSectionNameString() cleanly and without truncation. |
+ {SEG_TEXT, SECT_TEXT, "__TEXT,__text"}, |
+ {SEG_TEXT, SECT_FVMLIB_INIT0, "__TEXT,__fvmlib_init0"}, |
+ {SEG_TEXT, SECT_FVMLIB_INIT1, "__TEXT,__fvmlib_init1"}, |
+ {SEG_DATA, SECT_DATA, "__DATA,__data"}, |
+ {SEG_DATA, SECT_BSS, "__DATA,__bss"}, |
+ {SEG_DATA, SECT_COMMON, "__DATA,__common"}, |
+ {SEG_OBJC, SECT_OBJC_SYMBOLS, "__OBJC,__symbol_table"}, |
+ {SEG_OBJC, SECT_OBJC_MODULES, "__OBJC,__module_info"}, |
+ {SEG_OBJC, SECT_OBJC_STRINGS, "__OBJC,__selector_strs"}, |
+ {SEG_OBJC, SECT_OBJC_REFS, "__OBJC,__selector_refs"}, |
+ {SEG_ICON, SECT_ICON_HEADER, "__ICON,__header"}, |
+ {SEG_ICON, SECT_ICON_TIFF, "__ICON,__tiff"}, |
+ |
+ // These segments don’t normally have sections, but the above group tested |
+ // the known segment names for segments that do normally have sections. |
+ // This group does the same for segments that normally don’t. |
+ {SEG_LINKEDIT, "", "__LINKEDIT,"}, |
+ {SEG_UNIXSTACK, "", "__UNIXSTACK,"}, |
+ {SEG_IMPORT, "", "__IMPORT,"}, |
+ }; |
+ |
+ for (size_t index = 0; index < arraysize(kSegmentAndSectionTestData); |
+ ++index) { |
+ const SegmentAndSectionTestData& test = kSegmentAndSectionTestData[index]; |
+ EXPECT_EQ(test.output, |
+ MachOImageSegmentReader::SegmentAndSectionNameString( |
+ test.segment, test.section)) |
+ << base::StringPrintf("index %zu, segment %s, section %s", |
Robert Sesek
2014/09/02 18:00:13
Not SCOPED_TRACE?
Mark Mentovai
2014/09/02 18:01:05
rsesek wrote:
|
+ index, |
+ test.segment, |
+ test.section); |
+ } |
+} |
+ |
+} // namespace |