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 }