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