build: Check that all Scala test suites run in PR builds (#2304) (#2366)
diff --git a/.github/workflows/pr_build_macos.yml b/.github/workflows/pr_build_macos.yml
index 36b2db5..6c71006 100644
--- a/.github/workflows/pr_build_macos.yml
+++ b/.github/workflows/pr_build_macos.yml
@@ -112,6 +112,7 @@
org.apache.spark.sql.comet.CometTaskMetricsSuite
org.apache.comet.CometBitwiseExpressionSuite
org.apache.comet.CometMapExpressionSuite
+ org.apache.comet.objectstore.NativeConfigSuite
fail-fast: false
name: ${{ matrix.os }}/${{ matrix.profile.name }} [${{ matrix.suite.name }}]
runs-on: ${{ matrix.os }}
diff --git a/.github/workflows/pr_missing_suites.yml b/.github/workflows/pr_missing_suites.yml
new file mode 100644
index 0000000..0966e8c
--- /dev/null
+++ b/.github/workflows/pr_missing_suites.yml
@@ -0,0 +1,30 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+
+name: Check that all test suites are added to PR workflows
+
+on:
+ pull_request:
+ types: [opened, edited, reopened]
+
+jobs:
+ check-missing-suites:
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v5
+ - name: Check Missing Suites
+ run: python3 dev/ci/check-suites.py
diff --git a/dev/ci/check-suites.py b/dev/ci/check-suites.py
new file mode 100644
index 0000000..62bcd77
--- /dev/null
+++ b/dev/ci/check-suites.py
@@ -0,0 +1,59 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+
+import sys
+from pathlib import Path
+
+def file_to_class_name(path: Path) -> str | None:
+ parts = path.parts
+ if "org" not in parts or "apache" not in parts:
+ return None
+ org_index = parts.index("org")
+ package_parts = parts[org_index:]
+ class_name = ".".join(package_parts)
+ class_name = class_name.replace(".scala", "")
+ return class_name
+
+if __name__ == "__main__":
+
+ # ignore traits, abstract classes, and intentionally skipped test suites
+ ignore_list = [
+ "org.apache.comet.parquet.ParquetReadSuite", # abstract
+ "org.apache.comet.parquet.ParquetReadFromS3Suite", # manual test suite
+ "org.apache.spark.sql.comet.CometPlanStabilitySuite", # abstract
+ "org.apache.spark.sql.comet.ParquetDatetimeRebaseSuite", # abstract
+ "org.apache.comet.exec.CometColumnarShuffleSuite", # abstract
+ # TODO add CometToPrettyStringSuite to PR worklows
+ # https://github.com/apache/datafusion-comet/issues/2307
+ "org.apache.spark.sql.CometToPrettyStringSuite"
+ ]
+
+ for workflow_filename in [".github/workflows/pr_build_linux.yml", ".github/workflows/pr_build_macos.yml"]:
+ workflow = open(workflow_filename, encoding="utf-8").read()
+
+ root = Path(".")
+ for path in root.rglob("*Suite.scala"):
+ class_name = file_to_class_name(path)
+ if class_name:
+ if "Shim" in class_name:
+ continue
+ if class_name in ignore_list:
+ continue
+ if class_name not in workflow:
+ print(f"Suite not found in workflow {workflow_filename}: {class_name}")
+ sys.exit(-1)
+ print(f"Found {class_name} in {workflow_filename}")