github.com/anchore/syft@v1.4.2-0.20240516191711-1bec1fc5d397/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  
    83  	var languages = strset.New()
    84  	var expectedLanguages = strset.New()
    85  	for _, ty := range AllLanguages {
    86  		expectedLanguages.Add(string(ty))
    87  	}
    88  
    89  	// we cannot determine the language from these purl ecosystems (yet?)
    90  	expectedLanguages.Remove(Elixir.String())
    91  	expectedLanguages.Remove(Erlang.String())
    92  
    93  	for _, tt := range tests {
    94  		t.Run(tt.purl, func(t *testing.T) {
    95  			actual := LanguageFromPURL(tt.purl)
    96  
    97  			if actual != "" {
    98  				languages.Add(string(actual))
    99  			}
   100  
   101  			assert.Equalf(t, tt.want, actual, "LanguageFromPURL(%v)", tt.purl)
   102  		})
   103  	}
   104  
   105  	assert.ElementsMatch(t, expectedLanguages.List(), languages.List(), "missing one or more languages to test against (maybe a package type was added?)")
   106  
   107  }
   108  
   109  func TestLanguageByName(t *testing.T) {
   110  	tests := []struct {
   111  		name     string
   112  		language Language
   113  	}{
   114  		{
   115  			name:     "maven",
   116  			language: Java,
   117  		},
   118  		{
   119  			name:     "java",
   120  			language: Java,
   121  		},
   122  		{
   123  			name:     "java-archive",
   124  			language: Java,
   125  		},
   126  		{
   127  			name:     "java",
   128  			language: Java,
   129  		},
   130  		{
   131  			name:     "composer",
   132  			language: PHP,
   133  		},
   134  		{
   135  			name:     "php-composer",
   136  			language: PHP,
   137  		},
   138  		{
   139  			name:     "php",
   140  			language: PHP,
   141  		},
   142  		{
   143  			name:     "go",
   144  			language: Go,
   145  		},
   146  		{
   147  			name:     "golang",
   148  			language: Go,
   149  		},
   150  		{
   151  			name:     "go-module",
   152  			language: Go,
   153  		},
   154  		{
   155  			name:     "npm",
   156  			language: JavaScript,
   157  		},
   158  		{
   159  			name:     "javascript",
   160  			language: JavaScript,
   161  		},
   162  		{
   163  			name:     "node.js",
   164  			language: JavaScript,
   165  		},
   166  		{
   167  			name:     "nodejs",
   168  			language: JavaScript,
   169  		},
   170  		{
   171  			name:     "pypi",
   172  			language: Python,
   173  		},
   174  		{
   175  			name:     "python",
   176  			language: Python,
   177  		},
   178  		{
   179  			name:     "gem",
   180  			language: Ruby,
   181  		},
   182  		{
   183  			name:     "ruby",
   184  			language: Ruby,
   185  		},
   186  		{
   187  			name:     "rust",
   188  			language: Rust,
   189  		},
   190  		{
   191  			name:     "rust-crate",
   192  			language: Rust,
   193  		},
   194  		{
   195  			name:     "cargo",
   196  			language: Rust,
   197  		},
   198  		{
   199  			name:     "dart",
   200  			language: Dart,
   201  		},
   202  		{
   203  			name:     "dart-pub",
   204  			language: Dart,
   205  		},
   206  		{
   207  			name:     "pub",
   208  			language: Dart,
   209  		},
   210  		{
   211  			name:     "dotnet",
   212  			language: Dotnet,
   213  		},
   214  		{
   215  			name:     "swift",
   216  			language: Swift,
   217  		},
   218  		{
   219  			name:     "pod",
   220  			language: Swift,
   221  		},
   222  		{
   223  			name:     "cocoapods",
   224  			language: Swift,
   225  		},
   226  		{
   227  			name:     "unknown",
   228  			language: UnknownLanguage,
   229  		},
   230  		{
   231  			name:     "conan",
   232  			language: CPP,
   233  		},
   234  		{
   235  			name:     "c++",
   236  			language: CPP,
   237  		},
   238  		{
   239  			name:     "hackage",
   240  			language: Haskell,
   241  		},
   242  		{
   243  			name:     "haskell",
   244  			language: Haskell,
   245  		},
   246  		{
   247  			name:     "R",
   248  			language: R,
   249  		},
   250  	}
   251  
   252  	for _, test := range tests {
   253  		assert.Equal(t, LanguageByName(test.name), test.language)
   254  	}
   255  }