github.com/google/osv-scalibr@v0.4.1/extractor/standalone/windows/regpatchlevel/regpatchlevel_windows_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  //go:build windows
    16  
    17  package regpatchlevel
    18  
    19  import (
    20  	"testing"
    21  
    22  	"github.com/google/go-cmp/cmp"
    23  	"github.com/google/osv-scalibr/common/windows/registry"
    24  	"github.com/google/osv-scalibr/extractor"
    25  	"github.com/google/osv-scalibr/inventory"
    26  	"github.com/google/osv-scalibr/testing/mockregistry"
    27  )
    28  
    29  func TestExtract(t *testing.T) {
    30  	tests := []struct {
    31  		name    string
    32  		reg     *mockregistry.MockRegistry
    33  		want    []*extractor.Package
    34  		wantErr bool
    35  	}{
    36  		{
    37  			name: "listOfPackages_returnsPackage",
    38  			reg: &mockregistry.MockRegistry{
    39  				Keys: map[string]registry.Key{
    40  					regPackagesRoot: &mockregistry.MockKey{
    41  						KName: "Packages",
    42  						KSubkeys: []registry.Key{
    43  							&mockregistry.MockKey{
    44  								KName: "Package_for_KB5020683~31bf3856ad364e35~amd64~~19041.2304.1.3",
    45  							},
    46  						},
    47  					},
    48  					regPackagesRoot + "\\Package_for_KB5020683~31bf3856ad364e35~amd64~~19041.2304.1.3": &mockregistry.MockKey{
    49  						KName: "Package_for_KB5020683~31bf3856ad364e35~amd64~~19041.2304.1.3",
    50  						KValues: []registry.Value{
    51  							&mockregistry.MockValue{
    52  								VName:       "CurrentState",
    53  								VDataString: "112",
    54  							},
    55  							&mockregistry.MockValue{
    56  								VName:       "Visibility",
    57  								VDataString: "1",
    58  							},
    59  						},
    60  					},
    61  				},
    62  			},
    63  			want: []*extractor.Package{
    64  				{
    65  					Name:     "Package_for_KB5020683~31bf3856ad364e35~amd64~~19041.2304.1.3",
    66  					Version:  "19041.2304.1.3",
    67  					PURLType: "windows",
    68  				},
    69  			},
    70  		},
    71  		{
    72  			name: "packageNotVisible_returnsEmpty",
    73  			reg: &mockregistry.MockRegistry{
    74  				Keys: map[string]registry.Key{
    75  					regPackagesRoot: &mockregistry.MockKey{
    76  						KName: "Packages",
    77  						KSubkeys: []registry.Key{
    78  							&mockregistry.MockKey{
    79  								KName: "Package_for_KB5020683~31bf3856ad364e35~amd64~~19041.2304.1.3",
    80  							},
    81  						},
    82  					},
    83  					regPackagesRoot + "\\Package_for_KB5020683~31bf3856ad364e35~amd64~~19041.2304.1.3": &mockregistry.MockKey{
    84  						KName: "Package_for_KB5020683~31bf3856ad364e35~amd64~~19041.2304.1.3",
    85  						KValues: []registry.Value{
    86  							&mockregistry.MockValue{
    87  								VName:       "CurrentState",
    88  								VDataString: "112",
    89  							},
    90  							&mockregistry.MockValue{
    91  								VName:       "Visibility",
    92  								VDataString: "0",
    93  							},
    94  						},
    95  					},
    96  				},
    97  			},
    98  			want: nil,
    99  		},
   100  		{
   101  			name: "packageNotInstalled_returnsEmpty",
   102  			reg: &mockregistry.MockRegistry{
   103  				Keys: map[string]registry.Key{
   104  					regPackagesRoot: &mockregistry.MockKey{
   105  						KName: "Packages",
   106  						KSubkeys: []registry.Key{
   107  							&mockregistry.MockKey{
   108  								KName: "Package_for_KB5020683~31bf3856ad364e35~amd64~~19041.2304.1.3",
   109  							},
   110  						},
   111  					},
   112  					regPackagesRoot + "\\Package_for_KB5020683~31bf3856ad364e35~amd64~~19041.2304.1.3": &mockregistry.MockKey{
   113  						KName: "Package_for_KB5020683~31bf3856ad364e35~amd64~~19041.2304.1.3",
   114  						KValues: []registry.Value{
   115  							&mockregistry.MockValue{
   116  								VName:       "CurrentState",
   117  								VDataString: "10",
   118  							},
   119  							&mockregistry.MockValue{
   120  								VName:       "Visibility",
   121  								VDataString: "1",
   122  							},
   123  						},
   124  					},
   125  				},
   126  			},
   127  			want: nil,
   128  		},
   129  	}
   130  
   131  	for _, tc := range tests {
   132  		t.Run(tc.name, func(t *testing.T) {
   133  			cfg := Configuration{mockregistry.NewOpener(tc.reg)}
   134  			e := New(cfg)
   135  			got, err := e.Extract(t.Context(), nil)
   136  			if tc.wantErr != (err != nil) {
   137  				t.Fatalf("Extract() returned an unexpected error: %v", err)
   138  			}
   139  
   140  			if tc.wantErr == true {
   141  				return
   142  			}
   143  
   144  			if diff := cmp.Diff(inventory.Inventory{Packages: tc.want}, got); diff != "" {
   145  				t.Errorf("Extract() returned an unexpected diff (-want +got): %v", diff)
   146  			}
   147  		})
   148  	}
   149  }