package javax.safetycritical.test.safelet; import javax.realtime.PeriodicParameters; import javax.realtime.PriorityParameters; import javax.realtime.RelativeTime; import javax.safetycritical.Launcher; import javax.safetycritical.Mission; import javax.safetycritical.MissionSequencer; import javax.safetycritical.PeriodicEventHandler; import javax.safetycritical.PriorityScheduler; import javax.safetycritical.Safelet; import javax.safetycritical.StorageParameters; import javax.scj.util.Const; import test.BasicJMLTest; import unitTest.TestCase; import unitTest.TestResult; import unitTest.TestSuite; /* * OpenJML call: * * cd /home/hso/java/SCJ_Workspace/OpenJMLTest * * Safelet: * * java -jar /home/hso/java/SCJ_Workspace/OpenJMLTest/lib/openjml.jar -cp /home/hso/git/hvm-scj/icecapSDK/bin/ -d /home/hso/git/hvm-scj/icecapSDK/bin/ -noInternalSpecs -rac -racCheckAssumptions -racJavaChecks -nullableByDefault -showNotImplemented -specspath ./specs /home/hso/git/hvm-scj/icecapSDK/src/javax/safetycritical/Safelet.java * * TckTestSafelet2: * * java -jar /home/hso/java/SCJ_Workspace/OpenJMLTest/lib/openjml.jar -cp ./bin/:/home/hso/git/hvm-scj/icecapSDK/bin/ -d /home/hso/java/SCJ_Workspace/OpenJMLTest/bin/ -noInternalSpecs -rac -racCheckAssumptions -racJavaChecks -nullableByDefault -showNotImplemented -specspath ./specs ./src/javax/safetycritical/test/safelet/TckTestSafelet2.java * * * SafeletStub2 and SequencerStub2: * * java -jar /home/hso/java/SCJ_Workspace/OpenJMLTest/lib/openjml.jar -cp ./bin/:/home/hso/git/hvm-scj/icecapSDK/bin/ -d /home/hso/java/SCJ_Workspace/OpenJMLTest/bin/ -noInternalSpecs -rac -racCheckAssumptions -racJavaChecks -nullableByDefault -showNotImplemented -specspath ./specs ./src/javax/safetycritical/test/safelet/SafeletStub2.java * * java -jar /home/hso/java/SCJ_Workspace/OpenJMLTest/lib/openjml.jar -cp ./bin/:/home/hso/git/hvm-scj/icecapSDK/bin/ -d /home/hso/java/SCJ_Workspace/OpenJMLTest/bin/ -noInternalSpecs -rac -racCheckAssumptions -racJavaChecks -nullableByDefault -showNotImplemented -specspath ./specs ./src/javax/safetycritical/test/safelet/SequencerStub2.java * */ public class TckTestSafelet2 extends BasicJMLTest { public static void main(String[] args) { Const.setDefaultErrorReporter(); TestSuite suite = new TestSuite(); TestResult result = new TestResult(); int numberOfCases = TestSafelet2.testCount; TestCase test = new TestSafelet2(result, numberOfCases); suite.addTest(test); suite.run(result); result.print(test.getClass().getName(), numberOfCases); if (result.JMLerrorCount() + result.errorCount() == 0) { args = null; } } @Override public String getJMLAnnotationCommand() { return "java -jar WORKSPACE/OpenJMLTest/lib/openjml.jar -cp ICECAPSDK/bin/ -d ICECAPSDK/bin/ -noInternalSpecs -rac -racCheckAssumptions -racJavaChecks -nullableByDefault -showNotImplemented -specspath ./specs ICECAPSDK/src/javax/safetycritical/Safelet.java WORKSPACE/OpenJMLTest/src/javax/safetycritical/test/TckTestSafelet2.java"; } } ////--- Stub classes ---------------------------------- // // class SafeletStub2 implements Safelet<MissionStub2> // { // /*@ // also // requires true; // ensures true; // @*/ // public MissionSequencer<MissionStub2> getSequencer() // { // MissionSequencer<MissionStub2> seq = new SequencerStub2(); // return seq; // } // // public long immortalMemorySize() // { // return Const.IMMORTAL_MEM; // } // // public void initializeApplication() // { // } // } // // class SequencerStub2 extends MissionSequencer<MissionStub2> { // public static MissionStub2[] missions; // private int active = 2; // private MissionStub2 miss; // private int activation = 0; // // SequencerStub2() // { // super (new PriorityParameters ( // PriorityScheduler.instance().getMinPriority()+1), // TestSafelet2.storageParameters_Sequencer); // missions = new MissionStub2[3]; // missions[0] = new MissionStub2 (0); // missions[1] = new MissionStub2 (1); // missions[2] = new MissionStub2 (2); // // miss = missions[0]; // } // // public MissionStub2 getNextMission() // { // if (missions[active].terminationPending() && activation > TestSafelet2.SIZE) // { // return null; // } // else // { // active = (active + 1) % missions.length; // miss = missions[active]; // TestSafelet2.activationOrder[activation] = miss; // // System.out.println("SeqStub2.getNextMission: " + active + "; activation: " + activation); // // activation++; // return miss; // } // } // // /*@ // public behaviour // requires true; // // ensures // (\forall int i; 0 <= i && i < TestSafelet2.SIZE; // TestSafelet2.activationOrder[i].missionNo == i % SequencerStub2.missions.length); // @*/ // public void cleanUp() { // System.out.println("\nSequencerStub2.cleanUp: ... "); // // for (int i = 0; i < TestSafelet2.SIZE; i++) { // System.out.println("Mission " + TestSafelet2.activationOrder[i].missionNo); // } // System.out.println(); // // // } // } // // class MissionStub2 extends Mission // { // public int missionNo; // // public MissionStub2 (int missionNo) // { // this.missionNo = missionNo; // } // // public void initialize() // { // int MAX_PRIORITY = PriorityScheduler.instance().getMaxPriority(); // int MIN_PRIORITY = PriorityScheduler.instance().getMinPriority(); // // int NOR_PRIORITY = (MAX_PRIORITY + MIN_PRIORITY)/2; // // PriorityParameters priority = new PriorityParameters(NOR_PRIORITY); // // new PeriodicEvhStub2( // priority, // new PeriodicParameters(new RelativeTime (0L, 0), // start // new RelativeTime (500, 0)), // period // TestSafelet2.storageParameters_Handlers, // missionNo).register(); // } // // public long missionMemorySize () // { // return Const.MISSION_MEM; // } // // public boolean cleanUp() // { // System.out.println("\nMissionStub2.cleanUp: ... \n"); // return super.cleanUp(); // } // // } // // class PeriodicEvhStub2 extends PeriodicEventHandler // { // int number; // int count = 0; // // protected PeriodicEvhStub2 (PriorityParameters priority, // PeriodicParameters periodic, // StorageParameters storage, // int number) // { // super(priority, periodic, storage); // this.number = number; // } // // public void handleAsyncEvent() // { // devices.Console.println("pevh" + number); // count++; // if (count == 2) // Mission.getMission().requestTermination(); // } // } // class TestSafelet2 extends TestCase { //--- Stub classes ---------------------------------- class SafeletStub2 implements Safelet<MissionStub2> { /*@ also requires true; ensures true; @*/ public MissionSequencer<MissionStub2> getSequencer() { MissionSequencer<MissionStub2> seq = new SequencerStub2(); return seq; } public long immortalMemorySize() { return Const.IMMORTAL_MEM; } public void initializeApplication() { } } class SequencerStub2 extends MissionSequencer<MissionStub2> { public /*static*/ MissionStub2[] missions; private int active = 2; private MissionStub2 miss; private int activation = 0; SequencerStub2() { super (new PriorityParameters ( PriorityScheduler.instance().getMinPriority()+1), TestSafelet2.storageParameters_Sequencer); missions = new MissionStub2[3]; missions[0] = new MissionStub2 (0); missions[1] = new MissionStub2 (1); missions[2] = new MissionStub2 (2); miss = missions[0]; } public MissionStub2 getNextMission() { if (missions[active].terminationPending() && activation > TestSafelet2.SIZE) { return null; } else { active = (active + 1) % missions.length; miss = missions[active]; TestSafelet2.activationOrder[activation] = miss; System.out.println("SeqStub2.getNextMission: " + active + "; activation: " + activation); activation++; return miss; } } /*@ also requires true; // ensures // (\forall int i; 0 <= i && i < TestSafelet2.SIZE; // TestSafelet2.activationOrder[i].missionNo == i % missions.length); @*/ public void cleanUp() { System.out.println("\nSequencerStub2.cleanUp: ... "); for (int i = 0; i < TestSafelet2.SIZE; i++) { System.out.println("Mission " + TestSafelet2.activationOrder[i].missionNo); } System.out.println(); } } class MissionStub2 extends Mission { public int missionNo; public MissionStub2 (int missionNo) { this.missionNo = missionNo; } public void initialize() { int MAX_PRIORITY = PriorityScheduler.instance().getMaxPriority(); int MIN_PRIORITY = PriorityScheduler.instance().getMinPriority(); int NOR_PRIORITY = (MAX_PRIORITY + MIN_PRIORITY)/2; PriorityParameters priority = new PriorityParameters(NOR_PRIORITY); new PeriodicEvhStub2( priority, new PeriodicParameters(new RelativeTime (0L, 0), // start new RelativeTime (500, 0)), // period TestSafelet2.storageParameters_Handlers, missionNo).register(); } public long missionMemorySize () { return Const.MISSION_MEM; } public boolean cleanUp() { System.out.println("\nMissionStub2.cleanUp: ... \n"); return super.cleanUp(); } } class PeriodicEvhStub2 extends PeriodicEventHandler { int number; int count = 0; protected PeriodicEvhStub2 (PriorityParameters priority, PeriodicParameters periodic, StorageParameters storage, int number) { super(priority, periodic, storage); this.number = number; } public void handleAsyncEvent() { devices.Console.println("pevh" + number); count++; if (count == 2) Mission.getMission().requestTermination(); } } // --- TestSafelet2 --------------------------------- public static StorageParameters storageParameters_Sequencer = new StorageParameters( Const.OUTERMOST_SEQ_BACKING_STORE, new long[] { Const.HANDLER_STACK_SIZE }, Const.PRIVATE_MEM, Const.IMMORTAL_MEM, Const.MISSION_MEM); public static StorageParameters storageParameters_Handlers = new StorageParameters( Const.PRIVATE_BACKING_STORE, new long[] { Const.HANDLER_STACK_SIZE }, Const.PRIVATE_MEM, 0, 0); // Activation of missions should be: 0,1,2,0,1,2 public static final int SIZE = 6; public static MissionStub2[] activationOrder = new MissionStub2[SIZE+1]; static final int testCount = 1; public TestSafelet2 (TestResult result,int testCount) { //super (result, testCount); super (); } public void test (int i) { switch (i) { case 1: devices.Console.println("\nTestSafelet2: serialization of missions begin"); new Launcher(new SafeletStub2(), 1); devices.Console.println("TestSafelet2: serialization of missions end \n"); break; default: break; } } }