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

     1  // Copyright 2021 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  	"reflect"
     9  	"sort"
    10  	"strconv"
    11  	"testing"
    12  )
    13  
    14  func TestParseNtHeaderNE(t *testing.T) {
    15  
    16  	tests := []struct {
    17  		in  string
    18  		out error
    19  	}{
    20  		{
    21  			// This is an NE executable file. Extracted from Windows CE 2.0.
    22  			getAbsoluteFilePath("test/_setup.dll"),
    23  			ErrImageOS2SignatureFound,
    24  		},
    25  	}
    26  
    27  	for _, tt := range tests {
    28  		t.Run(tt.in, func(t *testing.T) {
    29  			ops := Options{Fast: true}
    30  			file, err := New(tt.in, &ops)
    31  			if err != nil {
    32  				t.Fatalf("New(%s) failed, reason: %v", tt.in, err)
    33  			}
    34  
    35  			err = file.Parse()
    36  			if err != tt.out {
    37  				t.Fatalf("parsing nt header failed, got %v, want %v", err, tt.out)
    38  			}
    39  		})
    40  	}
    41  }
    42  
    43  func TestNtHeaderMachineType(t *testing.T) {
    44  
    45  	tests := []struct {
    46  		in  ImageFileHeaderMachineType
    47  		out string
    48  	}{
    49  		{
    50  			ImageFileHeaderMachineType(0x8664), "x64",
    51  		},
    52  		{
    53  			ImageFileHeaderMachineType(0xffff), "?",
    54  		},
    55  	}
    56  
    57  	for _, tt := range tests {
    58  		name := "CaseNtHeaderMachineTypeEqualTo_" + strconv.Itoa(int(tt.in))
    59  		t.Run(name, func(t *testing.T) {
    60  
    61  			got := tt.in.String()
    62  			if got != tt.out {
    63  				t.Errorf("nt header machine type assertion failed, got %v, want %v",
    64  					got, tt.out)
    65  			}
    66  		})
    67  	}
    68  }
    69  
    70  func TestNtHeaderCharacteristicsType(t *testing.T) {
    71  
    72  	tests := []struct {
    73  		in  ImageFileHeaderCharacteristicsType
    74  		out []string
    75  	}{
    76  		{
    77  			ImageFileHeaderCharacteristicsType(0x0022), []string{"ExecutableImage", "LargeAddressAware"},
    78  		},
    79  	}
    80  
    81  	for _, tt := range tests {
    82  		name := "CaseNtHeaderCharacteristicsTypeEqualTo_" + strconv.Itoa(int(tt.in))
    83  		t.Run(name, func(t *testing.T) {
    84  			got := tt.in.String()
    85  			sort.Strings(got)
    86  			sort.Strings(tt.out)
    87  			if !reflect.DeepEqual(got, tt.out) {
    88  				t.Errorf("nt header Characteristics type assertion failed, got %v, want %v",
    89  					got, tt.out)
    90  			}
    91  		})
    92  	}
    93  }
    94  
    95  func TestOptionalHeaderSubsystemType(t *testing.T) {
    96  
    97  	tests := []struct {
    98  		in  ImageOptionalHeaderSubsystemType
    99  		out string
   100  	}{
   101  		{
   102  			ImageOptionalHeaderSubsystemType(0x2), "Windows GUI",
   103  		},
   104  		{
   105  			ImageOptionalHeaderSubsystemType(0xff), "?",
   106  		},
   107  	}
   108  
   109  	for _, tt := range tests {
   110  		name := "CaseOptionalHeaderSubsystemTypeEqualTo_" + strconv.Itoa(int(tt.in))
   111  		t.Run(name, func(t *testing.T) {
   112  			got := tt.in.String()
   113  			if got != tt.out {
   114  				t.Errorf("optional header subsystem type assertion failed, got %v, want %v",
   115  					got, tt.out)
   116  			}
   117  		})
   118  	}
   119  }
   120  
   121  func TestOptionalHeaderDllCharacteristicsType(t *testing.T) {
   122  
   123  	tests := []struct {
   124  		in  ImageOptionalHeaderDllCharacteristicsType
   125  		out []string
   126  	}{
   127  		{
   128  			ImageOptionalHeaderDllCharacteristicsType(0x8160),
   129  			[]string{"DynamicBase", "HighEntropyVA", "NXCompact", "TerminalServiceAware"},
   130  		},
   131  	}
   132  
   133  	for _, tt := range tests {
   134  		name := "CaseOptionalHeaderDllCharacteristicsTypeEqualTo_" + strconv.Itoa(int(tt.in))
   135  		t.Run(name, func(t *testing.T) {
   136  			got := tt.in.String()
   137  			sort.Strings(got)
   138  			sort.Strings(tt.out)
   139  			if !reflect.DeepEqual(got, tt.out) {
   140  				t.Errorf("optional header dll characteristics type assertion failed, got %v, want %v",
   141  					got, tt.out)
   142  			}
   143  		})
   144  	}
   145  }