From 390e7e4b5e13d9222c7fce2734018dea3e378071 Mon Sep 17 00:00:00 2001 From: Kiko Fernandez-Reyes Date: Fri, 15 Nov 2024 18:20:33 +0100 Subject: [PATCH] =?UTF-8?q?=E2=9C=A8=20Adds=20Elixir=20and=20Gleam=20as=20?= =?UTF-8?q?languages=20(#4408)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Add Elixir as a language Signed-off-by: Kiko Fernandez-Reyes * Adds Gleam as a language Signed-off-by: Kiko Fernandez-Reyes * fixes typo in client Co-authored-by: Bram Verburg Signed-off-by: Kiko Fernandez-Reyes * fix tests Signed-off-by: Kiko Fernandez-Reyes --------- Signed-off-by: Kiko Fernandez-Reyes Signed-off-by: Kiko Fernandez-Reyes Co-authored-by: Bram Verburg --- checks/raw/fuzzing.go | 18 +++++++++++ checks/raw/fuzzing_test.go | 61 ++++++++++++++++++++++++++++++++++++- clients/languages.go | 6 ++++ internal/fuzzers/fuzzers.go | 2 ++ 4 files changed, 86 insertions(+), 1 deletion(-) diff --git a/checks/raw/fuzzing.go b/checks/raw/fuzzing.go index 3d2f3f71d2f..f4475e729d4 100644 --- a/checks/raw/fuzzing.go +++ b/checks/raw/fuzzing.go @@ -85,6 +85,24 @@ var languageFuzzSpecs = map[clients.LanguageName]languageFuzzConfig{ Name: fuzzers.PropertyBasedHaskell, Desc: propertyBasedDescription("Haskell"), }, + + // Fuzz patterns for Elixir based on property-based testing. + clients.Elixir: { + filePatterns: []string{"*.ex", "*.exs"}, + // Look for direct imports of PropCheck, and StreamData. + funcPattern: `use\s+(PropCheck|ExUnitProperties)`, + Name: fuzzers.PropertyBasedElixir, + Desc: propertyBasedDescription("Elixir"), + }, + + // Fuzz patterns for Gleam based on property-based testing. + clients.Gleam: { + filePatterns: []string{"*.gleam"}, + // Look for direct imports of PropCheck, and StreamData. + funcPattern: `import\s+qcheck`, // Gleam library + Name: fuzzers.PropertyBasedGleam, + Desc: propertyBasedDescription("Gleam"), + }, // Fuzz patterns for JavaScript and TypeScript based on property-based testing. // // Based on the import of one of these packages: diff --git a/checks/raw/fuzzing_test.go b/checks/raw/fuzzing_test.go index 9708fecbc68..efff451ae18 100644 --- a/checks/raw/fuzzing_test.go +++ b/checks/raw/fuzzing_test.go @@ -288,7 +288,6 @@ func Test_checkFuzzFunc(t *testing.T) { name: "Erlang with no property-based testing", want: false, fileName: []string{"erlang-ct.erl"}, - wantErr: true, langs: []clients.Language{ { Name: clients.Erlang, @@ -394,6 +393,66 @@ func Test_checkFuzzFunc(t *testing.T) { }, fileContent: "import Test.Hspec", }, + { + name: "Elixir QuickCheck through PropCheck", + want: true, + fileName: []string{"Test.exs"}, + langs: []clients.Language{ + { + Name: clients.Elixir, + NumLines: 50, + }, + }, + fileContent: "use PropCheck, default_opts: &PropCheck.TestHelpers.config/0", + }, + { + name: "Elixir QuickCheck through StreamData", + want: true, + fileName: []string{"Test.exs"}, + langs: []clients.Language{ + { + Name: clients.Elixir, + NumLines: 50, + }, + }, + fileContent: "use ExUnitProperties", + }, + { + name: "Elixir with no property-based testing", + want: false, + fileName: []string{"NoPropTest.exs"}, + langs: []clients.Language{ + { + Name: clients.Elixir, + NumLines: 50, + }, + }, + fileContent: "use ExUnit.Case, async: true", + }, + { + name: "Gleam with no property-based testing", + want: false, + fileName: []string{"test.gleam"}, + langs: []clients.Language{ + { + Name: clients.Gleam, + NumLines: 50, + }, + }, + fileContent: "import gleeunit", + }, + { + name: "Gleam QCheck", + want: true, + fileName: []string{"gleam-qcheck.gleam"}, + langs: []clients.Language{ + { + Name: clients.Gleam, + NumLines: 50, + }, + }, + fileContent: "import qcheck", + }, { name: "JavaScript fast-check via require", want: true, diff --git a/clients/languages.go b/clients/languages.go index d8090f3b95c..f761925b5a2 100644 --- a/clients/languages.go +++ b/clients/languages.go @@ -80,6 +80,12 @@ const ( // Haskell: https://www.haskell.org/ Haskell LanguageName = "haskell" + // Elixir: https://www.elixir.org/ + Elixir LanguageName = "elixir" + + // Gleam: https://www.gleam.org/ + Gleam LanguageName = "gleam" + // Other indicates other languages not listed by the GitHub API. Other LanguageName = "other" diff --git a/internal/fuzzers/fuzzers.go b/internal/fuzzers/fuzzers.go index 8904936f00f..30924ddc1f4 100644 --- a/internal/fuzzers/fuzzers.go +++ b/internal/fuzzers/fuzzers.go @@ -21,6 +21,8 @@ const ( BuiltInGo = "GoBuiltInFuzzer" PropertyBasedErlang = "ErlangPropertyBasedTesting" PropertyBasedHaskell = "HaskellPropertyBasedTesting" + PropertyBasedElixir = "ElixirPropertyBasedTesting" + PropertyBasedGleam = "GleamPropertyBasedTesting" PropertyBasedJavaScript = "JavaScriptPropertyBasedTesting" PropertyBasedTypeScript = "TypeScriptPropertyBasedTesting" PythonAtheris = "PythonAtherisFuzzer"