From b976fd557104ee1bc7f364215a5ae7917ff98c23 Mon Sep 17 00:00:00 2001 From: Matthew Hague <matthew.hague@rhul.ac.uk> Date: Thu, 11 Nov 2021 11:46:37 +0000 Subject: [PATCH] Fail if too much output Add "expectFinished" method to SubmissionWrapper, use it in the scriptedInteraction convenience method defined in BaseTester. --- .../uk/ac/rhul/cs/javatester/BaseTester.java | 11 +++++++- .../rhul/cs/javatester/SubmissionWrapper.java | 26 ++++++++++++++++++- .../uk/ac/rhul/cs/javatester/UnitTests.java | 18 +++++++++++++ 3 files changed, 53 insertions(+), 2 deletions(-) diff --git a/src/main/java/uk/ac/rhul/cs/javatester/BaseTester.java b/src/main/java/uk/ac/rhul/cs/javatester/BaseTester.java index 7a2ec70..d19933f 100644 --- a/src/main/java/uk/ac/rhul/cs/javatester/BaseTester.java +++ b/src/main/java/uk/ac/rhul/cs/javatester/BaseTester.java @@ -14,6 +14,7 @@ import java.nio.file.Path; import java.nio.file.Paths; import java.nio.file.StandardCopyOption; +import java.util.ArrayList; import java.util.Arrays; import java.util.Comparator; import java.util.List; @@ -206,7 +207,8 @@ public abstract class BaseTester { * Create a wrapper and run wrapper.scriptedInteraction then output * the result to the user * - * Convenience method + * Convenience method. Will error if more output occurs than is + * expected. * * @return true if the test passed */ @@ -216,6 +218,13 @@ public abstract class BaseTester { SubmissionWrapper wrapper = getNewSubmissionWrapper(); try { msgs = wrapper.scriptedInteraction(interaction); + String closedError = wrapper.expectFinished(); + if (closedError != null) { + if (msgs == null) { + msgs = new ArrayList<String>(); + msgs.add(closedError); + } + } } finally { wrapper.close(); } diff --git a/src/main/java/uk/ac/rhul/cs/javatester/SubmissionWrapper.java b/src/main/java/uk/ac/rhul/cs/javatester/SubmissionWrapper.java index f62ad6b..4560d11 100644 --- a/src/main/java/uk/ac/rhul/cs/javatester/SubmissionWrapper.java +++ b/src/main/java/uk/ac/rhul/cs/javatester/SubmissionWrapper.java @@ -358,7 +358,8 @@ public class SubmissionWrapper implements AutoCloseable { } /** - * Get any output that has not been used in an interaction + * Get any output that has been read but has not been used in an + * interaction */ public String getRemainingOutput() { return lineBuilder.toString(); @@ -415,6 +416,9 @@ public class SubmissionWrapper implements AutoCloseable { * the program then outputs "You like music?" the input "Yep" will * be provided. Else the input is not provided. * + * Note: does not care if there is output after the script finishes. + * Calls to scriptedInteraction may be chained together. + * * After each expected output, a message is given to identify the * failure. * @@ -486,6 +490,26 @@ public class SubmissionWrapper implements AutoCloseable { return null; } + /** + * The program is expected to have finished with no further output + * + * @return null if no problem, a failure message if failed + */ + public String expectFinished() { + try { + String line = getLine(); + if (line == null) + return line; + else + return String.format( + "Expected the end of the program, but received the ouput '%s'", + line + ); + } catch (TimeoutException e) { + return "Expected the end of the program, but it continued to run without producing any standard output."; + } + } + /** * Concatenates the given string arrays * diff --git a/src/test/java/uk/ac/rhul/cs/javatester/UnitTests.java b/src/test/java/uk/ac/rhul/cs/javatester/UnitTests.java index ea885a3..8606639 100644 --- a/src/test/java/uk/ac/rhul/cs/javatester/UnitTests.java +++ b/src/test/java/uk/ac/rhul/cs/javatester/UnitTests.java @@ -145,6 +145,24 @@ public class UnitTests { } } + @Test + public void testUnfinishedInteractionFail() { + BaseTester tester = new BaseTester(SIMPLE_IN_OUT) { + @SuppressWarnings("unused") + public boolean testUnfinished() throws IOException { + return scriptedInteraction( + "> .*Hello.*", "Expected Hello", + "< Matt", + "> .*Matt.*", "Expected Matt", + "! .*band.*", + "< High Rise", + "The band question was malformed." + ); + } + }; + assertFalse(tester.runTests()); + } + @Test public void testLoadClass() { BaseTester tester = new BaseTester(STORAGE) { -- GitLab