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 plan9obj
6
7import (
8	"reflect"
9	"testing"
10)
11
12type fileTest struct {
13	file     string
14	hdr      FileHeader
15	sections []*SectionHeader
16}
17
18var fileTests = []fileTest{
19	{
20		"testdata/386-plan9-exec",
21		FileHeader{Magic386, 0x324, 0x14, 4, 0x1000, 32},
22		[]*SectionHeader{
23			{"text", 0x4c5f, 0x20},
24			{"data", 0x94c, 0x4c7f},
25			{"syms", 0x2c2b, 0x55cb},
26			{"spsz", 0x0, 0x81f6},
27			{"pcsz", 0xf7a, 0x81f6},
28		},
29	},
30	{
31		"testdata/amd64-plan9-exec",
32		FileHeader{MagicAMD64, 0x618, 0x13, 8, 0x200000, 40},
33		[]*SectionHeader{
34			{"text", 0x4213, 0x28},
35			{"data", 0xa80, 0x423b},
36			{"syms", 0x2c8c, 0x4cbb},
37			{"spsz", 0x0, 0x7947},
38			{"pcsz", 0xca0, 0x7947},
39		},
40	},
41}
42
43func TestOpen(t *testing.T) {
44	for i := range fileTests {
45		tt := &fileTests[i]
46
47		f, err := Open(tt.file)
48		if err != nil {
49			t.Error(err)
50			continue
51		}
52		if !reflect.DeepEqual(f.FileHeader, tt.hdr) {
53			t.Errorf("open %s:\n\thave %#v\n\twant %#v\n", tt.file, f.FileHeader, tt.hdr)
54			continue
55		}
56
57		for i, sh := range f.Sections {
58			if i >= len(tt.sections) {
59				break
60			}
61			have := &sh.SectionHeader
62			want := tt.sections[i]
63			if !reflect.DeepEqual(have, want) {
64				t.Errorf("open %s, section %d:\n\thave %#v\n\twant %#v\n", tt.file, i, have, want)
65			}
66		}
67		tn := len(tt.sections)
68		fn := len(f.Sections)
69		if tn != fn {
70			t.Errorf("open %s: len(Sections) = %d, want %d", tt.file, fn, tn)
71		}
72	}
73}
74
75func TestOpenFailure(t *testing.T) {
76	filename := "file.go"    // not a Plan 9 a.out file
77	_, err := Open(filename) // don't crash
78	if err == nil {
79		t.Errorf("open %s: succeeded unexpectedly", filename)
80	}
81}
82