1// Copyright 2018 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-dwarf2-exec",
22		FileHeader{U802TOCMAGIC},
23		[]*SectionHeader{
24			{".text", 0x10000290, 0x00000bbd, STYP_TEXT, 0x7ae6, 0x36},
25			{".data", 0x20000e4d, 0x00000437, STYP_DATA, 0x7d02, 0x2b},
26			{".bss", 0x20001284, 0x0000021c, STYP_BSS, 0, 0},
27			{".loader", 0x00000000, 0x000004b3, STYP_LOADER, 0, 0},
28			{".dwline", 0x00000000, 0x000000df, STYP_DWARF | SSUBTYP_DWLINE, 0x7eb0, 0x7},
29			{".dwinfo", 0x00000000, 0x00000314, STYP_DWARF | SSUBTYP_DWINFO, 0x7ef6, 0xa},
30			{".dwabrev", 0x00000000, 0x000000d6, STYP_DWARF | SSUBTYP_DWABREV, 0, 0},
31			{".dwarnge", 0x00000000, 0x00000020, STYP_DWARF | SSUBTYP_DWARNGE, 0x7f5a, 0x2},
32			{".dwloc", 0x00000000, 0x00000074, STYP_DWARF | SSUBTYP_DWLOC, 0, 0},
33			{".debug", 0x00000000, 0x00005e4f, STYP_DEBUG, 0, 0},
34		},
35		[]string{"libc.a/shr.o"},
36	},
37	{
38		"testdata/gcc-ppc64-aix-dwarf2-exec",
39		FileHeader{U64_TOCMAGIC},
40		[]*SectionHeader{
41			{".text", 0x10000480, 0x00000afd, STYP_TEXT, 0x8322, 0x34},
42			{".data", 0x20000f7d, 0x000002f3, STYP_DATA, 0x85fa, 0x25},
43			{".bss", 0x20001270, 0x00000428, STYP_BSS, 0, 0},
44			{".loader", 0x00000000, 0x00000535, STYP_LOADER, 0, 0},
45			{".dwline", 0x00000000, 0x000000b4, STYP_DWARF | SSUBTYP_DWLINE, 0x8800, 0x4},
46			{".dwinfo", 0x00000000, 0x0000036a, STYP_DWARF | SSUBTYP_DWINFO, 0x8838, 0x7},
47			{".dwabrev", 0x00000000, 0x000000b5, STYP_DWARF | SSUBTYP_DWABREV, 0, 0},
48			{".dwarnge", 0x00000000, 0x00000040, STYP_DWARF | SSUBTYP_DWARNGE, 0x889a, 0x2},
49			{".dwloc", 0x00000000, 0x00000062, STYP_DWARF | SSUBTYP_DWLOC, 0, 0},
50			{".debug", 0x00000000, 0x00006605, STYP_DEBUG, 0, 0},
51		},
52		[]string{"libc.a/shr_64.o"},
53	},
54}
55
56func TestOpen(t *testing.T) {
57	for i := range fileTests {
58		tt := &fileTests[i]
59
60		f, err := Open(tt.file)
61		if err != nil {
62			t.Error(err)
63			continue
64		}
65		if !reflect.DeepEqual(f.FileHeader, tt.hdr) {
66			t.Errorf("open %s:\n\thave %#v\n\twant %#v\n", tt.file, f.FileHeader, tt.hdr)
67			continue
68		}
69
70		for i, sh := range f.Sections {
71			if i >= len(tt.sections) {
72				break
73			}
74			have := &sh.SectionHeader
75			want := tt.sections[i]
76			if !reflect.DeepEqual(have, want) {
77				t.Errorf("open %s, section %d:\n\thave %#v\n\twant %#v\n", tt.file, i, have, want)
78			}
79		}
80		tn := len(tt.sections)
81		fn := len(f.Sections)
82		if tn != fn {
83			t.Errorf("open %s: len(Sections) = %d, want %d", tt.file, fn, tn)
84		}
85		tl := tt.needed
86		fl, err := f.ImportedLibraries()
87		if err != nil {
88			t.Error(err)
89		}
90		if !reflect.DeepEqual(tl, fl) {
91			t.Errorf("open %s: loader import = %v, want %v", tt.file, tl, fl)
92		}
93	}
94}
95
96func TestOpenFailure(t *testing.T) {
97	filename := "file.go"    // not an XCOFF object file
98	_, err := Open(filename) // don't crash
99	if err == nil {
100		t.Errorf("open %s: succeeded unexpectedly", filename)
101	}
102}
103