github.com/anchore/syft@v1.38.2/syft/pkg/language_test.go (about)

     1  package pkg
     2  
     3  import (
     4  	"testing"
     5  
     6  	"github.com/scylladb/go-set/strset"
     7  	"github.com/stretchr/testify/assert"
     8  )
     9  
    10  func TestLanguageFromPURL(t *testing.T) {
    11  
    12  	tests := []struct {
    13  		purl string
    14  		want Language
    15  	}{
    16  
    17  		{
    18  			purl: "pkg:npm/util@2.32",
    19  			want: JavaScript,
    20  		},
    21  		{
    22  			purl: "pkg:pypi/util-linux@2.32.1-27.el8",
    23  			want: Python,
    24  		},
    25  		{
    26  			purl: "pkg:gem/ruby-advisory-db-check@0.12.4",
    27  			want: Ruby,
    28  		},
    29  		{
    30  			purl: "pkg:golang/github.com/gorilla/context@234fd47e07d1004f0aed9c",
    31  			want: Go,
    32  		},
    33  		{
    34  			purl: "pkg:pub/util@1.2.34",
    35  			want: Dart,
    36  		},
    37  		{
    38  			purl: "pkg:dotnet/Microsoft.CodeAnalysis.Razor@2.2.0",
    39  			want: Dotnet,
    40  		},
    41  		{
    42  			purl: "pkg:nuget/Newtonsoft.Json@13.0.0",
    43  			want: Dotnet,
    44  		},
    45  		{
    46  			purl: "pkg:cargo/clap@2.33.0",
    47  			want: Rust,
    48  		},
    49  		{
    50  			purl: "pkg:composer/laravel/laravel@5.5.0",
    51  			want: PHP,
    52  		},
    53  		{
    54  			purl: "pkg:maven/org.apache.xmlgraphics/batik-anim@1.9.1?type=zip&classifier=dist",
    55  			want: Java,
    56  		},
    57  		{
    58  			purl: "pkg:cocoapods/GlossButtonNode@3.1.2",
    59  			want: Swift,
    60  		},
    61  		{
    62  			purl: "pkg:conan/catch2@2.13.8",
    63  			want: CPP,
    64  		},
    65  		{
    66  			purl: "pkg:hackage/HTTP@4000.3.16",
    67  			want: Haskell,
    68  		},
    69  		{
    70  			purl: "pkg:hex/hpax/hpax@0.1.1",
    71  			want: UnknownLanguage,
    72  		},
    73  		{
    74  			purl: "pkg:cran/base@4.3.0",
    75  			want: R,
    76  		},
    77  		{
    78  			purl: "pkg:swift/github.com/apple/swift-numerics/swift-numerics@1.0.2",
    79  			want: Swift,
    80  		},
    81  		{
    82  			purl: "pkg:swiplpack/conditon@0.1.1",
    83  			want: Swipl,
    84  		},
    85  		{
    86  			purl: "pkg:luarocks/kong@3.7.0",
    87  			want: Lua,
    88  		},
    89  		{
    90  			purl: "pkg:opam/ocaml-base-compiler@5.2.0",
    91  			want: OCaml,
    92  		},
    93  	}
    94  
    95  	var languages = strset.New()
    96  	var expectedLanguages = strset.New()
    97  	for _, ty := range AllLanguages {
    98  		expectedLanguages.Add(string(ty))
    99  	}
   100  
   101  	// we cannot determine the language from these purl ecosystems (yet?)
   102  	expectedLanguages.Remove(Elixir.String())
   103  	expectedLanguages.Remove(Erlang.String())
   104  
   105  	for _, tt := range tests {
   106  		t.Run(tt.purl, func(t *testing.T) {
   107  			actual := LanguageFromPURL(tt.purl)
   108  
   109  			if actual != "" {
   110  				languages.Add(string(actual))
   111  			}
   112  
   113  			assert.Equalf(t, tt.want, actual, "LanguageFromPURL(%v)", tt.purl)
   114  		})
   115  	}
   116  
   117  	assert.ElementsMatch(t, expectedLanguages.List(), languages.List(), "missing one or more languages to test against (maybe a package type was added?)")
   118  
   119  }
   120  
   121  func TestLanguageByName(t *testing.T) {
   122  	tests := []struct {
   123  		name     string
   124  		language Language
   125  	}{
   126  		{
   127  			name:     "maven",
   128  			language: Java,
   129  		},
   130  		{
   131  			name:     "java",
   132  			language: Java,
   133  		},
   134  		{
   135  			name:     "java-archive",
   136  			language: Java,
   137  		},
   138  		{
   139  			name:     "java",
   140  			language: Java,
   141  		},
   142  		{
   143  			name:     "composer",
   144  			language: PHP,
   145  		},
   146  		{
   147  			name:     "php-composer",
   148  			language: PHP,
   149  		},
   150  		{
   151  			name:     "php",
   152  			language: PHP,
   153  		},
   154  		{
   155  			name:     "go",
   156  			language: Go,
   157  		},
   158  		{
   159  			name:     "golang",
   160  			language: Go,
   161  		},
   162  		{
   163  			name:     "go-module",
   164  			language: Go,
   165  		},
   166  		{
   167  			name:     "npm",
   168  			language: JavaScript,
   169  		},
   170  		{
   171  			name:     "javascript",
   172  			language: JavaScript,
   173  		},
   174  		{
   175  			name:     "node.js",
   176  			language: JavaScript,
   177  		},
   178  		{
   179  			name:     "nodejs",
   180  			language: JavaScript,
   181  		},
   182  		{
   183  			name:     "pypi",
   184  			language: Python,
   185  		},
   186  		{
   187  			name:     "python",
   188  			language: Python,
   189  		},
   190  		{
   191  			name:     "gem",
   192  			language: Ruby,
   193  		},
   194  		{
   195  			name:     "ruby",
   196  			language: Ruby,
   197  		},
   198  		{
   199  			name:     "rust",
   200  			language: Rust,
   201  		},
   202  		{
   203  			name:     "rust-crate",
   204  			language: Rust,
   205  		},
   206  		{
   207  			name:     "cargo",
   208  			language: Rust,
   209  		},
   210  		{
   211  			name:     "dart",
   212  			language: Dart,
   213  		},
   214  		{
   215  			name:     "dart-pub",
   216  			language: Dart,
   217  		},
   218  		{
   219  			name:     "pub",
   220  			language: Dart,
   221  		},
   222  		{
   223  			name:     "dotnet",
   224  			language: Dotnet,
   225  		},
   226  		{
   227  			name:     "swift",
   228  			language: Swift,
   229  		},
   230  		{
   231  			name:     "swiplpack",
   232  			language: Swipl,
   233  		},
   234  		{
   235  			name:     "opam",
   236  			language: OCaml,
   237  		},
   238  		{
   239  			name:     "pod",
   240  			language: Swift,
   241  		},
   242  		{
   243  			name:     "cocoapods",
   244  			language: Swift,
   245  		},
   246  		{
   247  			name:     "unknown",
   248  			language: UnknownLanguage,
   249  		},
   250  		{
   251  			name:     "conan",
   252  			language: CPP,
   253  		},
   254  		{
   255  			name:     "c++",
   256  			language: CPP,
   257  		},
   258  		{
   259  			name:     "hackage",
   260  			language: Haskell,
   261  		},
   262  		{
   263  			name:     "haskell",
   264  			language: Haskell,
   265  		},
   266  		{
   267  			name:     "R",
   268  			language: R,
   269  		},
   270  	}
   271  
   272  	for _, test := range tests {
   273  		assert.Equal(t, LanguageByName(test.name), test.language)
   274  	}
   275  }