Throw useful error on bad docs snippets (#25389)

You can continue a test started in a previous snippet by marking the
next snippet with `// TEST[continued]`. The trouble is, if you mark the
first snippet in a file with `// TEST[continued]` you'd get difficult
to predict behavior because you'd continue the test started in another
file. This will usually create a test that fails the build but it isn't
easy to track down what you did wrong. This commit catches this
scenario up front and fails the build with a useful error message.

Similarly, if you put `// TEST[continued]` directly after a
`// TESTSETUP` section then the docs tests will fail to run but the
error message did not point you to the `// TEST[continued]` snippet.
This commit catches this scenario up front as well and fails the build
with a useful error message.
This commit is contained in:
Nik Everett 2017-06-26 11:52:16 -04:00 committed by GitHub
parent d338a09812
commit 4306315ff6
1 changed files with 19 additions and 1 deletions

View File

@ -127,6 +127,11 @@ public class RestTestsFromSnippetsTask extends SnippetsTask {
*/ */
Set<String> unconvertedCandidates = new HashSet<>() Set<String> unconvertedCandidates = new HashSet<>()
/**
* The last non-TESTRESPONSE snippet.
*/
Snippet previousTest
/** /**
* Called each time a snippet is encountered. Tracks the snippets and * Called each time a snippet is encountered. Tracks the snippets and
* calls buildTest to actually build the test. * calls buildTest to actually build the test.
@ -142,6 +147,7 @@ public class RestTestsFromSnippetsTask extends SnippetsTask {
} }
if (snippet.testSetup) { if (snippet.testSetup) {
setup(snippet) setup(snippet)
previousTest = snippet
return return
} }
if (snippet.testResponse) { if (snippet.testResponse) {
@ -150,6 +156,7 @@ public class RestTestsFromSnippetsTask extends SnippetsTask {
} }
if (snippet.test || snippet.console) { if (snippet.test || snippet.console) {
test(snippet) test(snippet)
previousTest = snippet
return return
} }
// Must be an unmarked snippet.... // Must be an unmarked snippet....
@ -158,7 +165,18 @@ public class RestTestsFromSnippetsTask extends SnippetsTask {
private void test(Snippet test) { private void test(Snippet test) {
setupCurrent(test) setupCurrent(test)
if (false == test.continued) { if (test.continued) {
/* Catch some difficult to debug errors with // TEST[continued]
* and throw a helpful error message. */
if (previousTest == null || previousTest.path != test.path) {
throw new InvalidUserDataException("// TEST[continued] " +
"cannot be on first snippet in a file: $test")
}
if (previousTest != null && previousTest.testSetup) {
throw new InvalidUserDataException("// TEST[continued] " +
"cannot immediately follow // TESTSETUP: $test")
}
} else {
current.println('---') current.println('---')
current.println("\"line_$test.start\":") current.println("\"line_$test.start\":")
/* The Elasticsearch test runner doesn't support the warnings /* The Elasticsearch test runner doesn't support the warnings