github.com/google/osv-scalibr@v0.4.1/extractor/standalone/windows/dismpatch/dismparser/dism_parser_test.go (about)

     1  // Copyright 2025 Google LLC
     2  //
     3  // Licensed under the Apache License, Version 2.0 (the "License");
     4  // you may not use this file except in compliance with the License.
     5  // You may obtain a copy of the License at
     6  //
     7  //      http://www.apache.org/licenses/LICENSE-2.0
     8  //
     9  // Unless required by applicable law or agreed to in writing, software
    10  // distributed under the License is distributed on an "AS IS" BASIS,
    11  // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    12  // See the License for the specific language governing permissions and
    13  // limitations under the License.
    14  
    15  package dismparser
    16  
    17  import (
    18  	"errors"
    19  	"os"
    20  	"testing"
    21  
    22  	"github.com/google/go-cmp/cmp"
    23  )
    24  
    25  func TestParse(t *testing.T) {
    26  	content, err := os.ReadFile("testdata/dism_testdata.txt")
    27  	if err != nil {
    28  		t.Fatalf("Failed to read testdata: %v", err)
    29  	}
    30  
    31  	packages, imgVersion, err := Parse(string(content))
    32  	if err != nil {
    33  		t.Errorf("Error while parsing the output: %v", err)
    34  	}
    35  
    36  	if imgVersion != "10.0.17763.3406" {
    37  		t.Errorf("Parse, ImageVersion: Got: %v, Want: %v", imgVersion, "10.0.17763.3406")
    38  	}
    39  
    40  	want := []DismPkg{
    41  		{
    42  			PackageIdentity: "Microsoft-Windows-FodMetadata-Package~31bf3856ad364e35~amd64~~10.0.17763.1",
    43  			PackageVersion:  "10.0.17763.1",
    44  			State:           "Installed",
    45  			ReleaseType:     "Feature Pack",
    46  			InstallTime:     "9/15/2018 9:08 AM",
    47  		},
    48  		{
    49  			PackageIdentity: "Package_for_KB4470788~31bf3856ad364e35~amd64~~17763.164.1.1",
    50  			PackageVersion:  "17763.164.1.1",
    51  			State:           "Installed",
    52  			ReleaseType:     "Security Update",
    53  			InstallTime:     "3/12/2019 6:27 AM",
    54  		},
    55  		{
    56  			PackageIdentity: "Package_for_RollupFix~31bf3856ad364e35~amd64~~17763.3406.1.5",
    57  			PackageVersion:  "17763.3406.1.5",
    58  			State:           "Installed",
    59  			ReleaseType:     "Security Update",
    60  			InstallTime:     "9/13/2022 11:06 PM",
    61  		},
    62  		{
    63  			PackageIdentity: "Package_for_RollupFix~31bf3856ad364e35~amd64~~17763.379.1.11",
    64  			PackageVersion:  "17763.379.1.11",
    65  			State:           "Superseded",
    66  			ReleaseType:     "Security Update",
    67  			InstallTime:     "3/12/2019 6:31 AM",
    68  		},
    69  		{
    70  			PackageIdentity: "Package_for_ServicingStack_3232~31bf3856ad364e35~amd64~~17763.3232.1.1",
    71  			PackageVersion:  "17763.3232.1.1",
    72  			State:           "Installed",
    73  			ReleaseType:     "Update",
    74  			InstallTime:     "9/13/2022 10:46 PM",
    75  		},
    76  		{
    77  			PackageIdentity: "Microsoft-Windows-WordPad-FoD-Package~31bf3856ad364e35~wow64~en-US~10.0.19041.1",
    78  			PackageVersion:  "10.0.19041.1",
    79  			State:           "Installed",
    80  			ReleaseType:     "OnDemand Pack",
    81  			InstallTime:     "12/7/2019 9:51 AM",
    82  		},
    83  	}
    84  
    85  	if diff := cmp.Diff(want, packages); diff != "" {
    86  		t.Errorf("Parse: Diff = %v", diff)
    87  	}
    88  }
    89  
    90  func TestFindVersion(t *testing.T) {
    91  	type test struct {
    92  		input string
    93  		want  string
    94  	}
    95  
    96  	tests := []test{
    97  		{
    98  			input: "Microsoft-Windows-FodMetadata-Package~31bf3856ad364e35~amd64~~10.0.17763.1",
    99  			want:  "10.0.17763.1",
   100  		},
   101  	}
   102  
   103  	for _, tt := range tests {
   104  		t.Run(tt.input, func(t *testing.T) {
   105  			got := findVersion(tt.input)
   106  			if got != tt.want {
   107  				t.Errorf("findVersion: Got: %v, Want: %v", got, tt.want)
   108  			}
   109  		})
   110  	}
   111  }
   112  
   113  func TestParseError(t *testing.T) {
   114  	content, err := os.ReadFile("testdata/err_testdata.txt")
   115  	if err != nil {
   116  		t.Fatalf("Failed to read testdata: %v", err)
   117  	}
   118  
   119  	_, _, err = Parse(string(content))
   120  	if !errors.Is(err, ErrParsingError) {
   121  		t.Errorf("Parse: Want: %v, Got: %v", ErrParsingError, err)
   122  	}
   123  }