1// Copyright 2014 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
5package xcoff
6
7import (
8	"reflect"
9	"testing"
10)
11
12type fileTest struct {
13	file     string
14	hdr      FileHeader
15	sections []*SectionHeader
16	needed   []string
17}
18
19var fileTests = []fileTest{
20	{
21		"testdata/gcc-ppc32-aix-exec",
22		FileHeader{U802TOCMAGIC},
23		[]*SectionHeader{
24			{".text", 0x10000150, 0x00000bbd, STYP_TEXT},
25			{".data", 0x20000d0d, 0x0000042b, STYP_DATA},
26			{".bss", 0x20001138, 0x00000218, STYP_BSS},
27			{".loader", 0x00000000, 0x000004b3, STYP_LOADER},
28			{".debug", 0x00000000, 0x0000751e, STYP_DEBUG},
29		},
30		[]string{"libc.a"},
31	},
32	{
33		"testdata/gcc-ppc64-aix-exec",
34		FileHeader{U64_TOCMAGIC},
35		[]*SectionHeader{
36			{".text", 0x10000240, 0x00000afd, STYP_TEXT},
37			{".data", 0x20000d3d, 0x000002e3, STYP_DATA},
38			{".bss", 0x20001020, 0x00000428, STYP_BSS},
39			{".loader", 0x00000000, 0x00000535, STYP_LOADER},
40			{".debug", 0x00000000, 0x00008238, STYP_DEBUG},
41		},
42		[]string{"libc.a"},
43	},
44	{
45		"testdata/xlc-ppc32-aix-exec",
46		FileHeader{U802TOCMAGIC},
47		[]*SectionHeader{
48			{".text", 0x10000150, 0x00000372, STYP_TEXT},
49			{".data", 0x200004c2, 0x0000032e, STYP_DATA},
50			{".bss", 0x200007f0, 0x00000004, STYP_BSS},
51			{".loader", 0x00000000, 0x0000029d, STYP_LOADER},
52			{".debug", 0x00000000, 0x0000008f, STYP_DEBUG},
53		},
54		[]string{"libc.a"},
55	},
56	{
57		"testdata/xlc-ppc64-aix-exec",
58		FileHeader{U64_TOCMAGIC},
59		[]*SectionHeader{
60			{".text", 0x100000240, 0x00000326, STYP_TEXT},
61			{".data", 0x110000566, 0x00000182, STYP_DATA},
62			{".bss", 0x1100006e8, 0x00000008, STYP_BSS},
63			{".loader", 0x00000000, 0x0000029b, STYP_LOADER},
64			{".debug", 0x00000000, 0x000000ea, STYP_DEBUG},
65		},
66		[]string{"libc.a"},
67	},
68	{
69		"testdata/gcc-ppc32-aix-dwarf2-exec",
70		FileHeader{U802TOCMAGIC},
71		[]*SectionHeader{
72			{".text", 0x10000290, 0x00000bbd, STYP_TEXT},
73			{".data", 0x20000e4d, 0x00000437, STYP_DATA},
74			{".bss", 0x20001284, 0x0000021c, STYP_BSS},
75			{".loader", 0x00000000, 0x000004b3, STYP_LOADER},
76			{".dwline", 0x00000000, 0x000000df, STYP_DWARF | SSUBTYP_DWLINE},
77			{".dwinfo", 0x00000000, 0x00000314, STYP_DWARF | SSUBTYP_DWINFO},
78			{".dwabrev", 0x00000000, 0x000000d6, STYP_DWARF | SSUBTYP_DWABREV},
79			{".dwarnge", 0x00000000, 0x00000020, STYP_DWARF | SSUBTYP_DWARNGE},
80			{".dwloc", 0x00000000, 0x00000074, STYP_DWARF | SSUBTYP_DWLOC},
81			{".debug", 0x00000000, 0x00005e4f, STYP_DEBUG},
82		},
83		[]string{"libc.a"},
84	},
85	{
86		"testdata/gcc-ppc64-aix-dwarf2-exec",
87		FileHeader{U64_TOCMAGIC},
88		[]*SectionHeader{
89			{".text", 0x10000480, 0x00000afd, STYP_TEXT},
90			{".data", 0x20000f7d, 0x000002f3, STYP_DATA},
91			{".bss", 0x20001270, 0x00000428, STYP_BSS},
92			{".loader", 0x00000000, 0x00000535, STYP_LOADER},
93			{".dwline", 0x00000000, 0x000000b4, STYP_DWARF | SSUBTYP_DWLINE},
94			{".dwinfo", 0x00000000, 0x0000036a, STYP_DWARF | SSUBTYP_DWINFO},
95			{".dwabrev", 0x00000000, 0x000000b5, STYP_DWARF | SSUBTYP_DWABREV},
96			{".dwarnge", 0x00000000, 0x00000040, STYP_DWARF | SSUBTYP_DWARNGE},
97			{".dwloc", 0x00000000, 0x00000062, STYP_DWARF | SSUBTYP_DWLOC},
98			{".debug", 0x00000000, 0x00006605, STYP_DEBUG},
99		},
100		[]string{"libc.a"},
101	},
102}
103
104func TestOpen(t *testing.T) {
105	for i := range fileTests {
106		tt := &fileTests[i]
107
108		f, err := Open(tt.file)
109		if err != nil {
110			t.Error(err)
111			continue
112		}
113		if !reflect.DeepEqual(f.FileHeader, tt.hdr) {
114			t.Errorf("open %s:\n\thave %#v\n\twant %#v\n", tt.file, f.FileHeader, tt.hdr)
115			continue
116		}
117
118		for i, sh := range f.Sections {
119			if i >= len(tt.sections) {
120				break
121			}
122			have := &sh.SectionHeader
123			want := tt.sections[i]
124			if !reflect.DeepEqual(have, want) {
125				t.Errorf("open %s, section %d:\n\thave %#v\n\twant %#v\n", tt.file, i, have, want)
126			}
127		}
128		tn := len(tt.sections)
129		fn := len(f.Sections)
130		if tn != fn {
131			t.Errorf("open %s: len(Sections) = %d, want %d", tt.file, fn, tn)
132		}
133		tl := tt.needed
134		fl, err := f.ImportedLibraries()
135		if err != nil {
136			t.Error(err)
137		}
138		if !reflect.DeepEqual(tl, fl) {
139			t.Errorf("open %s: loader import = %v, want %v", tt.file, tl, fl)
140		}
141	}
142}
143
144func TestOpenFailure(t *testing.T) {
145	filename := "file.go"    // not an XCOFF object file
146	_, err := Open(filename) // don't crash
147	if err == nil {
148		t.Errorf("open %s: succeeded unexpectedly", filename)
149	}
150}
151