This is an automated email from the ASF dual-hosted git repository. gurwls223 pushed a commit to branch branch-4.0 in repository https://gitbox.apache.org/repos/asf/spark.git
The following commit(s) were added to refs/heads/branch-4.0 by this push: new 22f483f48fb9 [SPARK-51925][CONNECT][TESTS] Fix the erroneous `assume` in the `ClassFinderSuite` 22f483f48fb9 is described below commit 22f483f48fb9aecb55adbf6cafee7d8ae30a7b73 Author: yangjie01 <yangji...@baidu.com> AuthorDate: Sun Apr 27 10:15:19 2025 +0900 [SPARK-51925][CONNECT][TESTS] Fix the erroneous `assume` in the `ClassFinderSuite` ### What changes were proposed in this pull request? This pr fixes an incorrect `assume` behavior in the `ClassFinderSuite` test suite, which was introduced in SPARK-51623. The issue stems from the fact that the `expectedClassFiles` list contained file paths without their parent directories. Consequently, the assertion added in SPARK-51623 https://github.com/apache/spark/blob/b634978936499f58f8cb2e8ea16339feb02ffb52/sql/connect/client/jvm/src/test/scala/org/apache/spark/sql/connect/client/ClassFinderSuite.scala#L40 would always evaluate to `false`, causing the test case to be permanently marked as `CANCELED`. We can observe relevant test cases in the GA testing phase, for example: - https://github.com/apache/spark/actions/runs/14675551942/job/41191081107  Therefore, we should modify the check to `assume` whether the pre-defined class files exist within the source directory (`classResourcePath`). ### Why are the changes needed? Fix the `erroneous` assume in the `ClassFinderSuite`. ### Does this PR introduce _any_ user-facing change? No ### How was this patch tested? - Pass GitHub Acitons - Locally test ``` build/sbt clean "connect-client-jvm/testOnly org.apache.spark.sql.connect.client.ClassFinderSuite" ``` **Before** ``` [info] ClassFinderSuite: [info] - REPLClassDirMonitor functionality test !!! CANCELED !!! (202 milliseconds) [info] p.toFile().exists() was false (ClassFinderSuite.scala:40) [info] org.scalatest.exceptions.TestCanceledException: [info] at org.scalatest.Assertions.newTestCanceledException(Assertions.scala:475) [info] at org.scalatest.Assertions.newTestCanceledException$(Assertions.scala:474) [info] at org.scalatest.Assertions$.newTestCanceledException(Assertions.scala:1231) [info] at org.scalatest.Assertions$AssertionsHelper.macroAssume(Assertions.scala:1310) [info] at org.apache.spark.sql.connect.client.ClassFinderSuite.$anonfun$new$3(ClassFinderSuite.scala:40) [info] at scala.collection.immutable.List.foreach(List.scala:334) [info] at org.apache.spark.sql.connect.client.ClassFinderSuite.checkClasses$1(ClassFinderSuite.scala:40) [info] at org.apache.spark.sql.connect.client.ClassFinderSuite.$anonfun$new$1(ClassFinderSuite.scala:48) [info] at scala.runtime.java8.JFunction0$mcV$sp.apply(JFunction0$mcV$sp.scala:18) [info] at org.scalatest.OutcomeOf.outcomeOf(OutcomeOf.scala:85) [info] at org.scalatest.OutcomeOf.outcomeOf$(OutcomeOf.scala:83) [info] at org.scalatest.OutcomeOf$.outcomeOf(OutcomeOf.scala:104) [info] at org.scalatest.Transformer.apply(Transformer.scala:22) [info] at org.scalatest.Transformer.apply(Transformer.scala:20) [info] at org.scalatest.funsuite.AnyFunSuiteLike$$anon$1.apply(AnyFunSuiteLike.scala:226) [info] at org.scalatest.TestSuite.withFixture(TestSuite.scala:196) [info] at org.scalatest.TestSuite.withFixture$(TestSuite.scala:195) [info] at org.scalatest.funsuite.AnyFunSuite.withFixture(AnyFunSuite.scala:1564) [info] at org.scalatest.funsuite.AnyFunSuiteLike.invokeWithFixture$1(AnyFunSuiteLike.scala:224) [info] at org.scalatest.funsuite.AnyFunSuiteLike.$anonfun$runTest$1(AnyFunSuiteLike.scala:236) [info] at org.scalatest.SuperEngine.runTestImpl(Engine.scala:306) [info] at org.scalatest.funsuite.AnyFunSuiteLike.runTest(AnyFunSuiteLike.scala:236) [info] at org.scalatest.funsuite.AnyFunSuiteLike.runTest$(AnyFunSuiteLike.scala:218) [info] at org.scalatest.funsuite.AnyFunSuite.runTest(AnyFunSuite.scala:1564) [info] at org.scalatest.funsuite.AnyFunSuiteLike.$anonfun$runTests$1(AnyFunSuiteLike.scala:269) [info] at org.scalatest.SuperEngine.$anonfun$runTestsInBranch$1(Engine.scala:413) [info] at scala.collection.immutable.List.foreach(List.scala:334) [info] at org.scalatest.SuperEngine.traverseSubNodes$1(Engine.scala:401) [info] at org.scalatest.SuperEngine.runTestsInBranch(Engine.scala:396) [info] at org.scalatest.SuperEngine.runTestsImpl(Engine.scala:475) [info] at org.scalatest.funsuite.AnyFunSuiteLike.runTests(AnyFunSuiteLike.scala:269) [info] at org.scalatest.funsuite.AnyFunSuiteLike.runTests$(AnyFunSuiteLike.scala:268) [info] at org.scalatest.funsuite.AnyFunSuite.runTests(AnyFunSuite.scala:1564) [info] at org.scalatest.Suite.run(Suite.scala:1114) [info] at org.scalatest.Suite.run$(Suite.scala:1096) [info] at org.scalatest.funsuite.AnyFunSuite.org$scalatest$funsuite$AnyFunSuiteLike$$super$run(AnyFunSuite.scala:1564) [info] at org.scalatest.funsuite.AnyFunSuiteLike.$anonfun$run$1(AnyFunSuiteLike.scala:273) [info] at org.scalatest.SuperEngine.runImpl(Engine.scala:535) [info] at org.scalatest.funsuite.AnyFunSuiteLike.run(AnyFunSuiteLike.scala:273) [info] at org.scalatest.funsuite.AnyFunSuiteLike.run$(AnyFunSuiteLike.scala:272) [info] at org.scalatest.funsuite.AnyFunSuite.run(AnyFunSuite.scala:1564) [info] at org.scalatest.tools.Framework.org$scalatest$tools$Framework$$runSuite(Framework.scala:321) [info] at org.scalatest.tools.Framework$ScalaTestTask.execute(Framework.scala:517) [info] at sbt.ForkMain$Run.lambda$runTest$1(ForkMain.java:414) [info] at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264) [info] at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136) [info] at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) [info] at java.base/java.lang.Thread.run(Thread.java:840) [info] Run completed in 628 milliseconds. [info] Total number of tests run: 0 [info] Suites: completed 1, aborted 0 [info] Tests: succeeded 0, failed 0, canceled 1, ignored 0, pending 0 [info] No tests were executed. ``` **After** ``` [info] ClassFinderSuite: [info] - REPLClassDirMonitor functionality test (169 milliseconds) [info] Run completed in 530 milliseconds. [info] Total number of tests run: 1 [info] Suites: completed 1, aborted 0 [info] Tests: succeeded 1, failed 0, canceled 0, ignored 0, pending 0 [info] All tests passed. ``` Manually delete `Hello.class`, `smallClassFile.class` and `smallClassFileDup.class`, then proceed with the test, the test will be skipped. ### Was this patch authored or co-authored using generative AI tooling? No Closes #50725 from LuciferYang/SPARK-51925. Authored-by: yangjie01 <yangji...@baidu.com> Signed-off-by: Hyukjin Kwon <gurwls...@apache.org> (cherry picked from commit 08cf7024059504a905b419db0a469ec122e5193e) Signed-off-by: Hyukjin Kwon <gurwls...@apache.org> --- .../org/apache/spark/sql/connect/client/ClassFinderSuite.scala | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/sql/connect/client/jvm/src/test/scala/org/apache/spark/sql/connect/client/ClassFinderSuite.scala b/sql/connect/client/jvm/src/test/scala/org/apache/spark/sql/connect/client/ClassFinderSuite.scala index 6de37827967f..92cd1acd45d4 100644 --- a/sql/connect/client/jvm/src/test/scala/org/apache/spark/sql/connect/client/ClassFinderSuite.scala +++ b/sql/connect/client/jvm/src/test/scala/org/apache/spark/sql/connect/client/ClassFinderSuite.scala @@ -28,16 +28,15 @@ class ClassFinderSuite extends ConnectFunSuite { private val classResourcePath = commonResourcePath.resolve("artifact-tests") test("REPLClassDirMonitor functionality test") { + val requiredClasses = Seq("Hello.class", "smallClassFile.class", "smallClassFileDup.class") + requiredClasses.foreach(className => + assume(classResourcePath.resolve(className).toFile.exists)) val copyDir = SparkFileUtils.createTempDir().toPath FileUtils.copyDirectory(classResourcePath.toFile, copyDir.toFile) val monitor = new REPLClassDirMonitor(copyDir.toAbsolutePath.toString) def checkClasses(monitor: REPLClassDirMonitor, additionalClasses: Seq[String] = Nil): Unit = { - val expectedClassFiles = (Seq( - "Hello.class", - "smallClassFile.class", - "smallClassFileDup.class") ++ additionalClasses).map(name => Paths.get(name)) - expectedClassFiles.foreach(p => assume(p.toFile.exists)) + val expectedClassFiles = (requiredClasses ++ additionalClasses).map(name => Paths.get(name)) val foundArtifacts = monitor.findClasses().toSeq assert(expectedClassFiles.forall { classPath => --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@spark.apache.org For additional commands, e-mail: commits-h...@spark.apache.org