Github user nkronenfeld commented on a diff in the pull request:

    https://github.com/apache/spark/pull/19529#discussion_r146885926
  
    --- Diff: 
sql/core/src/test/scala/org/apache/spark/sql/test/SQLTestUtils.scala ---
    @@ -52,17 +55,142 @@ import org.apache.spark.util.{UninterruptibleThread, 
Utils}
      * Subclasses should *not* create `SQLContext`s in the test suite 
constructor, which is
      * prone to leaving multiple overlapping 
[[org.apache.spark.SparkContext]]s in the same JVM.
      */
    -private[sql] trait SQLTestUtils
    -  extends SparkFunSuite with Eventually
    +private[sql] trait SQLTestUtils extends SparkFunSuite with 
SQLTestUtilsBase with PlanTest {
    +  // Whether to materialize all test data before the first test is run
    +  private var loadTestDataBeforeTests = false
    +
    +  protected override def beforeAll(): Unit = {
    +    super.beforeAll()
    +    if (loadTestDataBeforeTests) {
    +      loadTestData()
    +    }
    +  }
    +
    +  /**
    +   * Materialize the test data immediately after the `SQLContext` is set 
up.
    +   * This is necessary if the data is accessed by name but not through 
direct reference.
    +   */
    +  protected def setupTestData(): Unit = {
    +    loadTestDataBeforeTests = true
    +  }
    +
    +  /**
    +   * Disable stdout and stderr when running the test. To not output the 
logs to the console,
    +   * ConsoleAppender's `follow` should be set to `true` so that it will 
honors reassignments of
    +   * System.out or System.err. Otherwise, ConsoleAppender will still 
output to the console even if
    +   * we change System.out and System.err.
    +   */
    +  protected def testQuietly(name: String)(f: => Unit): Unit = {
    +    test(name) {
    +      quietly {
    +        f
    +      }
    +    }
    +  }
    +
    +  /**
    +   * Run a test on a separate `UninterruptibleThread`.
    +   */
    +  protected def testWithUninterruptibleThread(name: String, quietly: 
Boolean = false)
    +    (body: => Unit): Unit = {
    +    val timeoutMillis = 10000
    +    @transient var ex: Throwable = null
    +
    +    def runOnThread(): Unit = {
    +      val thread = new UninterruptibleThread(s"Testing thread for test 
$name") {
    +        override def run(): Unit = {
    +          try {
    +            body
    +          } catch {
    +            case NonFatal(e) =>
    +              ex = e
    +          }
    +        }
    +      }
    +      thread.setDaemon(true)
    +      thread.start()
    +      thread.join(timeoutMillis)
    +      if (thread.isAlive) {
    +        thread.interrupt()
    +        // If this interrupt does not work, then this thread is most 
likely running something that
    +        // is not interruptible. There is not much point to wait for the 
thread to termniate, and
    +        // we rather let the JVM terminate the thread on exit.
    +        fail(
    +          s"Test '$name' running on o.a.s.util.UninterruptibleThread timed 
out after" +
    +            s" $timeoutMillis ms")
    +      } else if (ex != null) {
    +        throw ex
    +      }
    +    }
    +
    +    if (quietly) {
    +      testQuietly(name) { runOnThread() }
    +    } else {
    +      test(name) { runOnThread() }
    +    }
    +  }
    +}
    +
    +private[sql] object SQLTestUtils {
    --- End diff --
    
    done


---

---------------------------------------------------------------------
To unsubscribe, e-mail: reviews-unsubscr...@spark.apache.org
For additional commands, e-mail: reviews-h...@spark.apache.org

Reply via email to