@@ -32,10 +32,31 @@ class UISeleniumSuite extends SparkFunSuite with WebBrowser {
32
32
33
33
private var spark : SparkSession = _
34
34
35
+ private def creatSparkSessionWithUI : SparkSession = SparkSession .builder()
36
+ .master(" local[1,1]" )
37
+ .appName(" sql ui test" )
38
+ .config(" spark.ui.enabled" , " true" )
39
+ .config(" spark.ui.port" , " 0" )
40
+ .getOrCreate()
41
+
35
42
implicit val webDriver : HtmlUnitDriver = new HtmlUnitDriver {
36
43
getWebClient.setCssErrorHandler(new SparkUICssErrorHandler )
37
44
}
38
45
46
+ private def findErrorMessageOnSQLUI (): List [String ] = {
47
+ val webUrl = spark.sparkContext.uiWebUrl
48
+ assert(webUrl.isDefined, " please turn on spark.ui.enabled" )
49
+ go to s " ${webUrl.get}/SQL "
50
+ findAll(cssSelector(""" #failed-table td .stacktrace-details""" )).map(_.text).toList
51
+ }
52
+
53
+ private def findExecutionIDOnSQLUI (): Int = {
54
+ val webUrl = spark.sparkContext.uiWebUrl
55
+ assert(webUrl.isDefined, " please turn on spark.ui.enabled" )
56
+ go to s " ${webUrl.get}/SQL "
57
+ findAll(cssSelector(""" #failed-table td""" )).map(_.text).toList.head.toInt
58
+ }
59
+
39
60
override def afterAll (): Unit = {
40
61
try {
41
62
webDriver.quit()
@@ -54,21 +75,32 @@ class UISeleniumSuite extends SparkFunSuite with WebBrowser {
54
75
}
55
76
56
77
test(" SPARK-44737: Should not display json format errors on SQL page for non-SparkThrowables" ) {
57
- spark = SparkSession .builder()
58
- .master(" local[1,1]" )
59
- .appName(" sql ui test" )
60
- .config(" spark.ui.enabled" , " true" )
61
- .config(" spark.ui.port" , " 0" )
62
- .getOrCreate()
78
+ spark = creatSparkSessionWithUI
63
79
64
80
intercept[Exception ](spark.sql(" SET mapreduce.job.reduces = 0" ).isEmpty)
65
81
eventually(timeout(10 .seconds), interval(100 .milliseconds)) {
66
- val webUrl = spark.sparkContext.uiWebUrl
67
- assert(webUrl.isDefined, " please turn on spark.ui.enabled" )
68
- go to s " ${webUrl.get}/SQL "
69
- val sd = findAll(cssSelector(""" #failed-table td .stacktrace-details""" )).map(_.text).toList
82
+ val sd = findErrorMessageOnSQLUI()
70
83
assert(sd.size === 1 , " SET mapreduce.job.reduces = 0 shall fail" )
71
84
assert(sd.head.startsWith(" java.lang.IllegalArgumentException:" ))
72
85
}
73
86
}
87
+
88
+ test(" SPARK-44801: Analyzer failure shall show the query in failed table" ) {
89
+ spark = creatSparkSessionWithUI
90
+
91
+ intercept[Exception ](spark.sql(" SELECT * FROM I_AM_A_INVISIBLE_TABLE" ).isEmpty)
92
+ eventually(timeout(10 .seconds), interval(100 .milliseconds)) {
93
+ val sd = findErrorMessageOnSQLUI()
94
+ assert(sd.size === 1 , " Analyze fail shall show the query in failed table" )
95
+ assert(sd.head.startsWith(" [TABLE_OR_VIEW_NOT_FOUND]" ))
96
+
97
+ val id = findExecutionIDOnSQLUI()
98
+ // check query detail page
99
+ go to s " ${spark.sparkContext.uiWebUrl.get}/SQL/execution/?id= $id"
100
+ val planDot = findAll(cssSelector(""" .dot-file""" )).map(_.text).toList
101
+ assert(planDot.head.startsWith(" digraph G {" ))
102
+ val planDetails = findAll(cssSelector(""" #physical-plan-details""" )).map(_.text).toList
103
+ assert(planDetails.head.contains(" TABLE_OR_VIEW_NOT_FOUND" ))
104
+ }
105
+ }
74
106
}
0 commit comments