github.com/saferwall/pe@v1.5.2/dosheader_test.go (about)

     1  // Copyright 2022 Saferwall. All rights reserved.
     2  // Use of this source code is governed by Apache v2 license
     3  // license that can be found in the LICENSE file.
     4  
     5  package pe
     6  
     7  import (
     8  	"testing"
     9  )
    10  
    11  type TestDOSHeader struct {
    12  	imageDOSHeader ImageDOSHeader
    13  }
    14  
    15  func TestParseDOSHeader(t *testing.T) {
    16  
    17  	tests := []struct {
    18  		in  string
    19  		out TestDOSHeader
    20  	}{
    21  		{
    22  			getAbsoluteFilePath("test/putty.exe"),
    23  			TestDOSHeader{
    24  				imageDOSHeader: ImageDOSHeader{
    25  					Magic:                    0x5a4d,
    26  					BytesOnLastPageOfFile:    0x78,
    27  					PagesInFile:              0x1,
    28  					Relocations:              0x0,
    29  					SizeOfHeader:             0x4,
    30  					MinExtraParagraphsNeeded: 0x0,
    31  					MaxExtraParagraphsNeeded: 0x0,
    32  					InitialSS:                0x0,
    33  					InitialSP:                0x0,
    34  					Checksum:                 0x0,
    35  					InitialIP:                0x0,
    36  					InitialCS:                0x0,
    37  					AddressOfRelocationTable: 0x40,
    38  					OverlayNumber:            0x0,
    39  					ReservedWords1:           [4]uint16{},
    40  					OEMIdentifier:            0x0,
    41  					OEMInformation:           0x0,
    42  					ReservedWords2:           [10]uint16{},
    43  					AddressOfNewEXEHeader:    0x78,
    44  				},
    45  			},
    46  		},
    47  	}
    48  
    49  	for _, tt := range tests {
    50  		t.Run(tt.in, func(t *testing.T) {
    51  			ops := Options{Fast: true}
    52  			file, err := New(tt.in, &ops)
    53  			if err != nil {
    54  				t.Fatalf("New(%s) failed, reason: %v", tt.in, err)
    55  			}
    56  
    57  			err = file.ParseDOSHeader()
    58  			if err != nil {
    59  				t.Fatalf("Parse(%s) failed, reason: %v", tt.in, err)
    60  			}
    61  
    62  			got := file.DOSHeader
    63  			if got != tt.out.imageDOSHeader {
    64  				t.Errorf("parse DOS header assertion failed, got %v, want %v", got,
    65  					tt.out.imageDOSHeader)
    66  			}
    67  
    68  		})
    69  	}
    70  }
    71  
    72  func TestParseDOSHeaderNonMZ(t *testing.T) {
    73  
    74  	tests := []struct {
    75  		in  string
    76  		out error
    77  	}{
    78  		{
    79  			// This is an ELF file.
    80  			getAbsoluteFilePath("test/look"),
    81  			ErrDOSMagicNotFound,
    82  		},
    83  	}
    84  
    85  	for _, tt := range tests {
    86  		t.Run(tt.in, func(t *testing.T) {
    87  			ops := Options{Fast: true}
    88  			file, err := New(tt.in, &ops)
    89  			if err != nil {
    90  				t.Fatalf("New(%s) failed, reason: %v", tt.in, err)
    91  			}
    92  
    93  			err = file.ParseDOSHeader()
    94  			if err != tt.out {
    95  				t.Fatalf("parsing DOS header failed, got %v, want %v", err, tt.out)
    96  			}
    97  		})
    98  	}
    99  }