github.com/varialus/godfly@v0.0.0-20130904042352-1934f9f095ab/src/pkg/debug/pe/file_test.go (about)

     1  // Copyright 2009 The Go Authors.  All rights reserved.
     2  // Use of this source code is governed by a BSD-style
     3  // license that can be found in the LICENSE file.
     4  
     5  package pe
     6  
     7  import (
     8  	"reflect"
     9  	"testing"
    10  )
    11  
    12  type fileTest struct {
    13  	file     string
    14  	hdr      FileHeader
    15  	sections []*SectionHeader
    16  	symbols  []*Symbol
    17  }
    18  
    19  var fileTests = []fileTest{
    20  	{
    21  		"testdata/gcc-386-mingw-obj",
    22  		FileHeader{0x014c, 0x000c, 0x0, 0x64a, 0x1e, 0x0, 0x104},
    23  		[]*SectionHeader{
    24  			{".text", 0, 0, 36, 500, 1440, 0, 3, 0, 0x60300020},
    25  			{".data", 0, 0, 0, 0, 0, 0, 0, 0, 3224371264},
    26  			{".bss", 0, 0, 0, 0, 0, 0, 0, 0, 3224371328},
    27  			{".debug_abbrev", 0, 0, 137, 536, 0, 0, 0, 0, 0x42100000},
    28  			{".debug_info", 0, 0, 418, 673, 1470, 0, 7, 0, 1108344832},
    29  			{".debug_line", 0, 0, 128, 1091, 1540, 0, 1, 0, 1108344832},
    30  			{".rdata", 0, 0, 16, 1219, 0, 0, 0, 0, 1076887616},
    31  			{".debug_frame", 0, 0, 52, 1235, 1550, 0, 2, 0, 1110441984},
    32  			{".debug_loc", 0, 0, 56, 1287, 0, 0, 0, 0, 1108344832},
    33  			{".debug_pubnames", 0, 0, 27, 1343, 1570, 0, 1, 0, 1108344832},
    34  			{".debug_pubtypes", 0, 0, 38, 1370, 1580, 0, 1, 0, 1108344832},
    35  			{".debug_aranges", 0, 0, 32, 1408, 1590, 0, 2, 0, 1108344832},
    36  		},
    37  		[]*Symbol{
    38  			{".file", 0x0, -2, 0x0, 0x67},
    39  			{"_main", 0x0, 1, 0x20, 0x2},
    40  			{".text", 0x0, 1, 0x0, 0x3},
    41  			{".data", 0x0, 2, 0x0, 0x3},
    42  			{".bss", 0x0, 3, 0x0, 0x3},
    43  			{".debug_abbrev", 0x0, 4, 0x0, 0x3},
    44  			{".debug_info", 0x0, 5, 0x0, 0x3},
    45  			{".debug_line", 0x0, 6, 0x0, 0x3},
    46  			{".rdata", 0x0, 7, 0x0, 0x3},
    47  			{".debug_frame", 0x0, 8, 0x0, 0x3},
    48  			{".debug_loc", 0x0, 9, 0x0, 0x3},
    49  			{".debug_pubnames", 0x0, 10, 0x0, 0x3},
    50  			{".debug_pubtypes", 0x0, 11, 0x0, 0x3},
    51  			{".debug_aranges", 0x0, 12, 0x0, 0x3},
    52  			{"___main", 0x0, 0, 0x20, 0x2},
    53  			{"_puts", 0x0, 0, 0x20, 0x2},
    54  		},
    55  	},
    56  	{
    57  		"testdata/gcc-386-mingw-exec",
    58  		FileHeader{0x014c, 0x000f, 0x4c6a1b60, 0x3c00, 0x282, 0xe0, 0x107},
    59  		[]*SectionHeader{
    60  			{Name: ".text", VirtualSize: 0xcd8, VirtualAddress: 0x1000, Size: 0xe00, Offset: 0x400, PointerToRelocations: 0x0, PointerToLineNumbers: 0x0, NumberOfRelocations: 0x0, NumberOfLineNumbers: 0x0, Characteristics: 0x60500060},
    61  			{Name: ".data", VirtualSize: 0x10, VirtualAddress: 0x2000, Size: 0x200, Offset: 0x1200, PointerToRelocations: 0x0, PointerToLineNumbers: 0x0, NumberOfRelocations: 0x0, NumberOfLineNumbers: 0x0, Characteristics: 0xc0300040},
    62  			{Name: ".rdata", VirtualSize: 0x120, VirtualAddress: 0x3000, Size: 0x200, Offset: 0x1400, PointerToRelocations: 0x0, PointerToLineNumbers: 0x0, NumberOfRelocations: 0x0, NumberOfLineNumbers: 0x0, Characteristics: 0x40300040},
    63  			{Name: ".bss", VirtualSize: 0xdc, VirtualAddress: 0x4000, Size: 0x0, Offset: 0x0, PointerToRelocations: 0x0, PointerToLineNumbers: 0x0, NumberOfRelocations: 0x0, NumberOfLineNumbers: 0x0, Characteristics: 0xc0400080},
    64  			{Name: ".idata", VirtualSize: 0x3c8, VirtualAddress: 0x5000, Size: 0x400, Offset: 0x1600, PointerToRelocations: 0x0, PointerToLineNumbers: 0x0, NumberOfRelocations: 0x0, NumberOfLineNumbers: 0x0, Characteristics: 0xc0300040},
    65  			{Name: ".CRT", VirtualSize: 0x18, VirtualAddress: 0x6000, Size: 0x200, Offset: 0x1a00, PointerToRelocations: 0x0, PointerToLineNumbers: 0x0, NumberOfRelocations: 0x0, NumberOfLineNumbers: 0x0, Characteristics: 0xc0300040},
    66  			{Name: ".tls", VirtualSize: 0x20, VirtualAddress: 0x7000, Size: 0x200, Offset: 0x1c00, PointerToRelocations: 0x0, PointerToLineNumbers: 0x0, NumberOfRelocations: 0x0, NumberOfLineNumbers: 0x0, Characteristics: 0xc0300040},
    67  			{Name: ".debug_aranges", VirtualSize: 0x20, VirtualAddress: 0x8000, Size: 0x200, Offset: 0x1e00, PointerToRelocations: 0x0, PointerToLineNumbers: 0x0, NumberOfRelocations: 0x0, NumberOfLineNumbers: 0x0, Characteristics: 0x42100000},
    68  			{Name: ".debug_pubnames", VirtualSize: 0x51, VirtualAddress: 0x9000, Size: 0x200, Offset: 0x2000, PointerToRelocations: 0x0, PointerToLineNumbers: 0x0, NumberOfRelocations: 0x0, NumberOfLineNumbers: 0x0, Characteristics: 0x42100000},
    69  			{Name: ".debug_pubtypes", VirtualSize: 0x91, VirtualAddress: 0xa000, Size: 0x200, Offset: 0x2200, PointerToRelocations: 0x0, PointerToLineNumbers: 0x0, NumberOfRelocations: 0x0, NumberOfLineNumbers: 0x0, Characteristics: 0x42100000},
    70  			{Name: ".debug_info", VirtualSize: 0xe22, VirtualAddress: 0xb000, Size: 0x1000, Offset: 0x2400, PointerToRelocations: 0x0, PointerToLineNumbers: 0x0, NumberOfRelocations: 0x0, NumberOfLineNumbers: 0x0, Characteristics: 0x42100000},
    71  			{Name: ".debug_abbrev", VirtualSize: 0x157, VirtualAddress: 0xc000, Size: 0x200, Offset: 0x3400, PointerToRelocations: 0x0, PointerToLineNumbers: 0x0, NumberOfRelocations: 0x0, NumberOfLineNumbers: 0x0, Characteristics: 0x42100000},
    72  			{Name: ".debug_line", VirtualSize: 0x144, VirtualAddress: 0xd000, Size: 0x200, Offset: 0x3600, PointerToRelocations: 0x0, PointerToLineNumbers: 0x0, NumberOfRelocations: 0x0, NumberOfLineNumbers: 0x0, Characteristics: 0x42100000},
    73  			{Name: ".debug_frame", VirtualSize: 0x34, VirtualAddress: 0xe000, Size: 0x200, Offset: 0x3800, PointerToRelocations: 0x0, PointerToLineNumbers: 0x0, NumberOfRelocations: 0x0, NumberOfLineNumbers: 0x0, Characteristics: 0x42300000},
    74  			{Name: ".debug_loc", VirtualSize: 0x38, VirtualAddress: 0xf000, Size: 0x200, Offset: 0x3a00, PointerToRelocations: 0x0, PointerToLineNumbers: 0x0, NumberOfRelocations: 0x0, NumberOfLineNumbers: 0x0, Characteristics: 0x42100000},
    75  		},
    76  		[]*Symbol{},
    77  	},
    78  }
    79  
    80  func TestOpen(t *testing.T) {
    81  	for i := range fileTests {
    82  		tt := &fileTests[i]
    83  
    84  		f, err := Open(tt.file)
    85  		if err != nil {
    86  			t.Error(err)
    87  			continue
    88  		}
    89  		if !reflect.DeepEqual(f.FileHeader, tt.hdr) {
    90  			t.Errorf("open %s:\n\thave %#v\n\twant %#v\n", tt.file, f.FileHeader, tt.hdr)
    91  			continue
    92  		}
    93  
    94  		for i, sh := range f.Sections {
    95  			if i >= len(tt.sections) {
    96  				break
    97  			}
    98  			have := &sh.SectionHeader
    99  			want := tt.sections[i]
   100  			if !reflect.DeepEqual(have, want) {
   101  				t.Errorf("open %s, section %d:\n\thave %#v\n\twant %#v\n", tt.file, i, have, want)
   102  			}
   103  		}
   104  		tn := len(tt.sections)
   105  		fn := len(f.Sections)
   106  		if tn != fn {
   107  			t.Errorf("open %s: len(Sections) = %d, want %d", tt.file, fn, tn)
   108  		}
   109  		for i, have := range f.Symbols {
   110  			if i >= len(tt.symbols) {
   111  				break
   112  			}
   113  			want := tt.symbols[i]
   114  			if !reflect.DeepEqual(have, want) {
   115  				t.Errorf("open %s, symbol %d:\n\thave %#v\n\twant %#v\n", tt.file, i, have, want)
   116  			}
   117  		}
   118  	}
   119  }
   120  
   121  func TestOpenFailure(t *testing.T) {
   122  	filename := "file.go"    // not a PE file
   123  	_, err := Open(filename) // don't crash
   124  	if err == nil {
   125  		t.Errorf("open %s: succeeded unexpectedly", filename)
   126  	}
   127  }