aboutsummaryrefslogtreecommitdiffstats
path: root/docs/sandbox/inoculated/src/Injection.java
diff options
context:
space:
mode:
Diffstat (limited to 'docs/sandbox/inoculated/src/Injection.java')
-rw-r--r--docs/sandbox/inoculated/src/Injection.java123
1 files changed, 123 insertions, 0 deletions
diff --git a/docs/sandbox/inoculated/src/Injection.java b/docs/sandbox/inoculated/src/Injection.java
new file mode 100644
index 000000000..6a857ef7a
--- /dev/null
+++ b/docs/sandbox/inoculated/src/Injection.java
@@ -0,0 +1,123 @@
+/*
+ * Copyright (c) 1998-2002 PARC Inc. All rights reserved.
+ *
+ * Use and copying of this software and preparation of derivative works based
+ * upon this software are permitted. Any distribution of this software or
+ * derivative works must comply with all applicable United States export
+ * control laws.
+ *
+ * This software is made available AS IS, and PARC Inc. makes no
+ * warranty about the software, its performance or its conformity to any
+ * specification.
+ */
+
+import java.io.*;
+
+/**
+ * Demonstrate technique of fault-injection
+ * as coordinated by test driver.
+ * @author Wes Isberg
+ */
+aspect InjectingIOException {
+
+ // article page 43 - fault injection
+ // START-SAMPLE testing-inoculated-injectIOException Inject IOException on test driver command
+ /** the test starts when the driver starts executing */
+ pointcut testEntryPoint(TestDriver driver) :
+ target(driver) && execution(* TestDriver.startTest());
+
+ /**
+ * The fault may be injected at the execution of any
+ * (non-static) PrinterStream method that throws an IOException
+ */
+ pointcut testCheckPoint(PrinterStream stream) : target(stream)
+ && execution(public * PrinterStream+.*(..) throws IOException);
+
+ /**
+ * After the method returns normally, query the
+ * test driver to see if we should instead throw
+ * an exception ("inject" the fault).
+ */
+ after (TestDriver driver, PrinterStream stream) returning
+ throws IOException :
+ cflowbelow(testEntryPoint(driver))
+ && testCheckPoint(stream) {
+ IOException e = driver.createException(stream);
+ if (null != e) {
+ System.out.println("InjectingIOException - injecting " + e);
+ throw e;
+ }
+ }
+ /* Comment on the after advice IOException declaration:
+
+ "throws IOException" is a declaration of the advice,
+ not the pointcut.
+
+ Since the advice might throw the injected fault, it
+ must declare that it throws IOException. When advice declares
+ exceptions thrown, the compiler will emit an error if any
+ join point is not also declared to throw an IOException.
+
+ In this case, the testCheckPoint pointcut only picks out
+ methods that throw IOException, so the compile will not
+ signal any errors.
+ */
+ // END-SAMPLE testing-inoculated-injectIOException
+}
+
+/** this runs the test case */
+public class Injection {
+ /** Run three print jobs, two as a test and one normally */
+ public static void main(String[] args) throws Exception {
+ Runnable r = new Runnable() {
+ public void run() {
+ try { new TestDriver().startTest(); }
+ catch (IOException e) {
+ System.err.println("got expected injected error " + e.getMessage());
+ }
+ }
+ };
+
+ System.out.println("Injection.main() - starting separate test thread");
+ Thread t = new Thread(r);
+ t.start();
+
+ System.out.println("Injection.main() - running test in this thread");
+ r.run();
+ t.join();
+
+ System.out.println("Injection.main() - running job normally, not by TestDriver");
+ new PrintJob().runPrintJob();
+ }
+}
+
+/** handle starting of test and determining whether to inject failure */
+class TestDriver {
+
+ /** start a new test */
+ public void startTest() throws IOException {
+ new PrintJob().runPrintJob();
+ }
+
+ /** this implementation always injects a failure */
+ public IOException createException(PrinterStream p) {
+ return new IOException(""+p);
+ }
+}
+
+//--------------------------------------- target classes
+
+class PrintJob {
+ /** this job writes to the printer stream */
+ void runPrintJob() throws IOException {
+ new PrinterStream().write();
+ }
+}
+
+class PrinterStream {
+ /** this printer stream writes without exception */
+ public void write() throws IOException {
+ System.err.println("PrinterStream.write() - not throwing exception");
+ }
+}
+