github.com/google/osv-scalibr@v0.4.1/extractor/filesystem/os/winget/metadata/metadata_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 metadata_test 16 17 import ( 18 "testing" 19 20 "github.com/google/go-cmp/cmp" 21 "github.com/google/osv-scalibr/extractor/filesystem/os/winget/metadata" 22 "google.golang.org/protobuf/proto" 23 "google.golang.org/protobuf/testing/protocmp" 24 25 pb "github.com/google/osv-scalibr/binary/proto/scan_result_go_proto" 26 ) 27 28 func TestSetProto(t *testing.T) { 29 testCases := []struct { 30 desc string 31 m *metadata.Metadata 32 p *pb.Package 33 want *pb.Package 34 }{ 35 { 36 desc: "nil_metadata", 37 m: nil, 38 p: &pb.Package{Name: "some-package"}, 39 want: &pb.Package{Name: "some-package"}, 40 }, 41 { 42 desc: "nil_package", 43 m: &metadata.Metadata{ 44 Name: "Git", 45 }, 46 p: nil, 47 want: nil, 48 }, 49 { 50 desc: "set_metadata", 51 m: &metadata.Metadata{ 52 Name: "Git", 53 ID: "Git.Git", 54 }, 55 p: &pb.Package{Name: "some-package"}, 56 want: &pb.Package{ 57 Name: "some-package", 58 Metadata: &pb.Package_WingetMetadata{ 59 WingetMetadata: &pb.WingetPackageMetadata{ 60 Name: "Git", 61 Id: "Git.Git", 62 }, 63 }, 64 }, 65 }, 66 { 67 desc: "override_metadata", 68 m: &metadata.Metadata{ 69 Name: "Visual Studio Code", 70 ID: "Microsoft.VisualStudioCode", 71 }, 72 p: &pb.Package{ 73 Name: "some-package", 74 Metadata: &pb.Package_WingetMetadata{ 75 WingetMetadata: &pb.WingetPackageMetadata{ 76 Name: "Git", 77 Id: "Git.Git", 78 }, 79 }, 80 }, 81 want: &pb.Package{ 82 Name: "some-package", 83 Metadata: &pb.Package_WingetMetadata{ 84 WingetMetadata: &pb.WingetPackageMetadata{ 85 Name: "Visual Studio Code", 86 Id: "Microsoft.VisualStudioCode", 87 }, 88 }, 89 }, 90 }, 91 { 92 desc: "set_all_fields", 93 m: &metadata.Metadata{ 94 Name: "Git", 95 ID: "Git.Git", 96 Version: "2.50.1", 97 Moniker: "git", 98 Channel: "stable", 99 Tags: []string{"git", "vcs"}, 100 Commands: []string{"git"}, 101 }, 102 p: &pb.Package{Name: "some-package"}, 103 want: &pb.Package{ 104 Name: "some-package", 105 Metadata: &pb.Package_WingetMetadata{ 106 WingetMetadata: &pb.WingetPackageMetadata{ 107 Name: "Git", 108 Id: "Git.Git", 109 Version: "2.50.1", 110 Moniker: "git", 111 Channel: "stable", 112 Tags: []string{"git", "vcs"}, 113 Commands: []string{"git"}, 114 }, 115 }, 116 }, 117 }, 118 } 119 120 for _, tc := range testCases { 121 t.Run(tc.desc, func(t *testing.T) { 122 p := proto.Clone(tc.p).(*pb.Package) 123 tc.m.SetProto(p) 124 opts := []cmp.Option{ 125 protocmp.Transform(), 126 } 127 if diff := cmp.Diff(tc.want, p, opts...); diff != "" { 128 t.Errorf("Metadata{%+v}.SetProto(%+v): (-want +got):\n%s", tc.m, tc.p, diff) 129 } 130 131 // Test the reverse conversion for completeness. 132 133 if tc.p == nil && tc.want == nil { 134 return 135 } 136 137 got := metadata.ToStruct(p.GetWingetMetadata()) 138 if diff := cmp.Diff(tc.m, got); diff != "" { 139 t.Errorf("ToStruct(%+v): (-want +got):\n%s", p.GetWingetMetadata(), diff) 140 } 141 }) 142 } 143 } 144 145 func TestToStruct(t *testing.T) { 146 testCases := []struct { 147 desc string 148 m *pb.WingetPackageMetadata 149 want *metadata.Metadata 150 }{ 151 { 152 desc: "nil", 153 m: nil, 154 want: nil, 155 }, 156 { 157 desc: "some_fields", 158 m: &pb.WingetPackageMetadata{ 159 Name: "Git", 160 Id: "Git.Git", 161 }, 162 want: &metadata.Metadata{ 163 Name: "Git", 164 ID: "Git.Git", 165 }, 166 }, 167 { 168 desc: "all_fields", 169 m: &pb.WingetPackageMetadata{ 170 Name: "Git", 171 Id: "Git.Git", 172 Version: "2.50.1", 173 Moniker: "git", 174 Channel: "stable", 175 Tags: []string{"git", "vcs"}, 176 Commands: []string{"git"}, 177 }, 178 want: &metadata.Metadata{ 179 Name: "Git", 180 ID: "Git.Git", 181 Version: "2.50.1", 182 Moniker: "git", 183 Channel: "stable", 184 Tags: []string{"git", "vcs"}, 185 Commands: []string{"git"}, 186 }, 187 }, 188 } 189 190 for _, tc := range testCases { 191 t.Run(tc.desc, func(t *testing.T) { 192 got := metadata.ToStruct(tc.m) 193 if diff := cmp.Diff(tc.want, got); diff != "" { 194 t.Errorf("ToStruct(%+v): (-want +got):\n%s", tc.m, diff) 195 } 196 197 if tc.m == nil { 198 return 199 } 200 201 // Test the reverse conversion for completeness. 202 203 gotP := &pb.Package{} 204 wantP := &pb.Package{ 205 Metadata: &pb.Package_WingetMetadata{ 206 WingetMetadata: tc.m, 207 }, 208 } 209 210 tc.want.SetProto(gotP) 211 opts := []cmp.Option{ 212 protocmp.Transform(), 213 } 214 if diff := cmp.Diff(wantP, gotP, opts...); diff != "" { 215 t.Errorf("Metadata{%+v}.SetProto(): (-want +got):\n%s", tc.want, diff) 216 } 217 }) 218 } 219 }