github.com/google/osv-scalibr@v0.4.1/extractor/filesystem/os/cos/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/cos/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_CosMetadata{ 58 CosMetadata: &pb.COSPackageMetadata{ 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_CosMetadata{ 72 CosMetadata: &pb.COSPackageMetadata{ 73 Name: "name", 74 }, 75 }, 76 }, 77 want: &pb.Package{ 78 Name: "some-package", 79 Metadata: &pb.Package_CosMetadata{ 80 CosMetadata: &pb.COSPackageMetadata{ 81 Name: "another-name", 82 }, 83 }, 84 }, 85 }, 86 { 87 desc: "set_all_fields", 88 m: &metadata.Metadata{ 89 Name: "name", 90 Version: "1.0", 91 Category: "category", 92 OSVersion: "os-version", 93 OSVersionID: "os-version-id", 94 EbuildVersion: "ebuild-version", 95 }, 96 p: &pb.Package{Name: "some-package"}, 97 want: &pb.Package{ 98 Name: "some-package", 99 Metadata: &pb.Package_CosMetadata{ 100 CosMetadata: &pb.COSPackageMetadata{ 101 Name: "name", 102 Version: "1.0", 103 Category: "category", 104 OsVersion: "os-version", 105 OsVersionId: "os-version-id", 106 EbuildVersion: "ebuild-version", 107 }, 108 }, 109 }, 110 }, 111 } 112 113 for _, tc := range testCases { 114 t.Run(tc.desc, func(t *testing.T) { 115 p := proto.Clone(tc.p).(*pb.Package) 116 tc.m.SetProto(p) 117 opts := []cmp.Option{ 118 protocmp.Transform(), 119 } 120 if diff := cmp.Diff(tc.want, p, opts...); diff != "" { 121 t.Errorf("Metatadata{%+v}.SetProto(%+v): (-want +got):\n%s", tc.m, tc.p, diff) 122 } 123 124 // Test the reverse conversion for completeness. 125 126 if tc.p == nil && tc.want == nil { 127 return 128 } 129 130 got := metadata.ToStruct(p.GetCosMetadata()) 131 if diff := cmp.Diff(tc.m, got); diff != "" { 132 t.Errorf("ToStruct(%+v): (-want +got):\n%s", p.GetCosMetadata(), diff) 133 } 134 }) 135 } 136 } 137 138 func TestToStruct(t *testing.T) { 139 testCases := []struct { 140 desc string 141 m *pb.COSPackageMetadata 142 want *metadata.Metadata 143 }{ 144 { 145 desc: "nil", 146 m: nil, 147 want: nil, 148 }, 149 { 150 desc: "some_fields", 151 m: &pb.COSPackageMetadata{ 152 Name: "name", 153 }, 154 want: &metadata.Metadata{ 155 Name: "name", 156 }, 157 }, 158 { 159 desc: "all_fields", 160 m: &pb.COSPackageMetadata{ 161 Name: "name", 162 Version: "1.0", 163 Category: "category", 164 OsVersion: "os-version", 165 OsVersionId: "os-version-id", 166 EbuildVersion: "ebuild-version", 167 }, 168 want: &metadata.Metadata{ 169 Name: "name", 170 Version: "1.0", 171 Category: "category", 172 OSVersion: "os-version", 173 OSVersionID: "os-version-id", 174 EbuildVersion: "ebuild-version", 175 }, 176 }, 177 } 178 179 for _, tc := range testCases { 180 t.Run(tc.desc, func(t *testing.T) { 181 got := metadata.ToStruct(tc.m) 182 if diff := cmp.Diff(tc.want, got); diff != "" { 183 t.Errorf("ToStruct(%+v): (-want +got):\n%s", tc.m, diff) 184 } 185 186 if tc.m == nil { 187 return 188 } 189 190 // Test the reverse conversion for completeness. 191 192 gotP := &pb.Package{} 193 wantP := &pb.Package{ 194 Metadata: &pb.Package_CosMetadata{ 195 CosMetadata: tc.m, 196 }, 197 } 198 got.SetProto(gotP) 199 opts := []cmp.Option{ 200 protocmp.Transform(), 201 } 202 if diff := cmp.Diff(wantP, gotP, opts...); diff != "" { 203 t.Errorf("Metatadata{%+v}.SetProto(%+v): (-want +got):\n%s", got, wantP, diff) 204 } 205 }) 206 } 207 }