github.com/google/osv-scalibr@v0.4.1/extractor/filesystem/os/snap/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/snap/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: "name", 45 }, 46 p: nil, 47 want: nil, 48 }, 49 { 50 desc: "set_metadata", 51 m: &metadata.Metadata{ 52 Name: "name", 53 }, 54 p: &pb.Package{Name: "some-package"}, 55 want: &pb.Package{ 56 Name: "some-package", 57 Metadata: &pb.Package_SnapMetadata{ 58 SnapMetadata: &pb.SNAPPackageMetadata{ 59 Name: "name", 60 }, 61 }, 62 }, 63 }, 64 { 65 desc: "override_metadata", 66 m: &metadata.Metadata{ 67 Name: "another-name", 68 }, 69 p: &pb.Package{ 70 Name: "some-package", 71 Metadata: &pb.Package_SnapMetadata{ 72 SnapMetadata: &pb.SNAPPackageMetadata{ 73 Name: "name", 74 }, 75 }, 76 }, 77 want: &pb.Package{ 78 Name: "some-package", 79 Metadata: &pb.Package_SnapMetadata{ 80 SnapMetadata: &pb.SNAPPackageMetadata{ 81 Name: "another-name", 82 }, 83 }, 84 }, 85 }, 86 { 87 desc: "set_all_fields", 88 m: &metadata.Metadata{ 89 Name: "name", 90 Version: "version", 91 Grade: "grade", 92 Type: "type", 93 Architectures: []string{"arch1", "arch2"}, 94 OSID: "osid", 95 OSVersionCodename: "os-version-codename", 96 OSVersionID: "os-version-id", 97 }, 98 p: &pb.Package{Name: "some-package"}, 99 want: &pb.Package{ 100 Name: "some-package", 101 Metadata: &pb.Package_SnapMetadata{ 102 SnapMetadata: &pb.SNAPPackageMetadata{ 103 Name: "name", 104 Version: "version", 105 Grade: "grade", 106 Type: "type", 107 Architectures: []string{"arch1", "arch2"}, 108 OsId: "osid", 109 OsVersionCodename: "os-version-codename", 110 OsVersionId: "os-version-id", 111 }, 112 }, 113 }, 114 }, 115 } 116 117 for _, tc := range testCases { 118 t.Run(tc.desc, func(t *testing.T) { 119 p := proto.Clone(tc.p).(*pb.Package) 120 tc.m.SetProto(p) 121 opts := []cmp.Option{ 122 protocmp.Transform(), 123 } 124 if diff := cmp.Diff(tc.want, p, opts...); diff != "" { 125 t.Errorf("Metatadata{%+v}.SetProto(%+v): (-want +got):\n%s", tc.m, tc.p, diff) 126 } 127 128 // Test the reverse conversion for completeness. 129 130 if tc.p == nil && tc.want == nil { 131 return 132 } 133 134 got := metadata.ToStruct(p.GetSnapMetadata()) 135 if diff := cmp.Diff(tc.m, got); diff != "" { 136 t.Errorf("ToStruct(%+v): (-want +got):\n%s", p.GetSnapMetadata(), diff) 137 } 138 }) 139 } 140 } 141 142 func TestToStruct(t *testing.T) { 143 testCases := []struct { 144 desc string 145 m *pb.SNAPPackageMetadata 146 want *metadata.Metadata 147 }{ 148 { 149 desc: "nil", 150 m: nil, 151 want: nil, 152 }, 153 { 154 desc: "some_fields", 155 m: &pb.SNAPPackageMetadata{ 156 Name: "name", 157 }, 158 want: &metadata.Metadata{ 159 Name: "name", 160 }, 161 }, 162 { 163 desc: "all_fields", 164 m: &pb.SNAPPackageMetadata{ 165 Name: "name", 166 Version: "version", 167 Grade: "grade", 168 Type: "type", 169 Architectures: []string{"arch1", "arch2"}, 170 OsId: "osid", 171 OsVersionCodename: "os-version-codename", 172 OsVersionId: "os-version-id", 173 }, 174 want: &metadata.Metadata{ 175 Name: "name", 176 Version: "version", 177 Grade: "grade", 178 Type: "type", 179 Architectures: []string{"arch1", "arch2"}, 180 OSID: "osid", 181 OSVersionCodename: "os-version-codename", 182 OSVersionID: "os-version-id", 183 }, 184 }, 185 } 186 187 for _, tc := range testCases { 188 t.Run(tc.desc, func(t *testing.T) { 189 got := metadata.ToStruct(tc.m) 190 if diff := cmp.Diff(tc.want, got); diff != "" { 191 t.Errorf("ToStruct(%+v): (-want +got):\n%s", tc.m, diff) 192 } 193 194 if tc.m == nil { 195 return 196 } 197 198 // Test the reverse conversion for completeness. 199 200 gotP := &pb.Package{} 201 wantP := &pb.Package{ 202 Metadata: &pb.Package_SnapMetadata{ 203 SnapMetadata: tc.m, 204 }, 205 } 206 got.SetProto(gotP) 207 opts := []cmp.Option{ 208 protocmp.Transform(), 209 } 210 if diff := cmp.Diff(wantP, gotP, opts...); diff != "" { 211 t.Errorf("Metatadata{%+v}.SetProto(%+v): (-want +got):\n%s", got, wantP, diff) 212 } 213 }) 214 } 215 }