150 likes | 325 Views
OOSC - JMSAssert. Design By Contract. A powerful technique for writing reliable software. Specifying the software purpose with the implementation. Key elements: Invariant Preconditions Postconditions. Design By Contract.
E N D
Design By Contract • A powerful technique for writing reliable software. • Specifying the software purpose with the implementation. • Key elements: • Invariant • Preconditions • Postconditions
Design By Contract • Precondition – The constraints under which the routine will function properly. • Postconditions – The state of the class after the routine execution • The Contract: If you call routine R() with the preconditions satisfied, R() will return satisfying the postconditions. • Invariant – Always holds
JMS Syntax - Invariant • Invariant - @inv • May access all class members or its direct/indirect bases, including private members • May appear in any JavaDoc comment • Preferable in the class comment
JMS Syntax - Preconditions • Precondition - @pre • JavaDoc preceding the respective method • May reference class members and arguments • Multiple @pre markers are conjugated (AND)
JMS Syntax - Postconditions • Postconditions - @post • JavaDoc preceding the respective method • May use $prev(expression) to access the value at the method entry. • May use $ret to denote method’s return value • Multiple @post markers are conjugated (AND)
Example Precondition /** * @pre !isEmpty() * @post (top == $prev(top- 1)) * @post $ret == elems[top] * @post !isFull */ public synchronized Object pop() { return elems[--top]; } Postconditions
JMS Syntax - General • Order has no meaning • @macro – for complicated conditions • Recursion – as expected, on every call • Inner classes can access outer classes’ members • Anonymous classes – specify invariant in one of its methods
JMSAssert Installation • Run the jmssetup-1.02.exe installation file • The following lines are added to the path: REM Next two lines are added by JMSAssert SET CLASSPATH=%CLASSPATH%;C:\PROGRA~1\JMSASS~1.0\ bin\mmsclasses.jar; SET PATH=%PATH%;C:\PROGRA~1\JMSASS~1.0\bin; • Copy the “classic” directory from “..\jdk1.3.1\jre\bin\” to the directory:“C:\Program Files\JavaSoft\JRE\1.3\bin\”
Setup (cont.) • Your JavaSoft directory should look like: • If you use jdk 1.2.2, you will have a 1.2 directory
JMSAssert – how does it work • Annotate source code with assertions • Compile your code using javac (as usual) • Preprocess the code using jmsassert: creates contract files (*.jms) and a Startup.jms file. • *.jms files contain java code for the assertions. • Execute using: jmsjava Startup <filename>to check assertions. • jmsjava makes sure method assertions are called before/after the method invocation.
JMS Execution • “jmsassert” – generates help text • “jmsassert –s <filename.java>” – generate assertions for a class file • “jmsassert –r –s .” – generate assertions for all class files in the directory and sub-dirs. (use for packages) • “javac <filename.java>” – compile • “jmsjava Startup <main>” - execute and check assertions
Execution process Stack Demo files Annotate source with assertions MyStack.java Preprocess to generate assertion files Startup.jms default_MyStack.jms Jmsassert –s <file.java> default_MyStack_StackEnum.jms Compile Java file javac <file.java> MyStack.class MyStack$StackEnum.class Execute using jmsjava MyStack$StackEnum.class StackTest.class Jmsjava Startup <file.java>
Notes • Execute these steps form the command line! • Make sure your CLASSPATH environment variable contains the current directory.Add “CLASSPATH=%CLASSPATH%;.;” to autoexec.bat.