import edu.berkeley.fleet.api.Predicate;
import edu.berkeley.fleet.api.Instruction.Set.SetDest;
import edu.berkeley.fleet.api.Instruction.Set.SetSource;
+import edu.berkeley.fleet.marina.MarinaFleet;
+import edu.berkeley.fleet.marina.MarinaPath;
/**
* Tests for Marina
Infrastructure.exit(2);
}
}
+ public static void fatalIfBitVectorsDoNotMatch(BitVector bv1, BitVector bv2) {
+ // FIXME: better error reporting needed here
+
+ fatal(bv1.getNumBits()!=bv2.getNumBits(), "lengths do not match");
+
+ boolean mismatch = false;
+ String err = "";
+ for(int i=0; i<bv1.getNumBits(); i++) {
+ if (bv1.get(i) != bv2.get(i)) {
+ mismatch = true;
+ err += ""+i+", ";
+ }
+ }
+ fatal(mismatch, "bit vectors do not match on bits " + err);
+ }
+
private static void printTestTime() {
long endTime = System.currentTimeMillis();
System.out.println("Test took: "+(endTime-startTime)/1000.0+" sec");
prln("End testFlagC");
}
+ private void sendDataWithPath(Marina marina) {
+ prln("Begin sendDataWithPath");
+ adjustIndent(2);
+
+ getCtrsFlags(marina);
+
+ edu.berkeley.fleet.api.BitVector bv = new edu.berkeley.fleet.api.BitVector(13);
+
+ // alternating ones and zeroes, and then ones in the lower
+ // four bits so it's not symmetric
+ for(int i=0; i<bv.length(); i+=2)
+ bv.set(i, true);
+ for(int i=0; i<4; i++)
+ bv.set(i, true);
+
+ MarinaPath path = new MarinaPath((MarinaFleet)DOCK.getShip().getFleet(), bv);
+
+ prln("send data with path="+bv);
+ marina.instrIn.fill(new Instruction.Move(DOCK,
+ false, /* requeueing */
+ Predicate.IgnoreOLC, /* predicate */
+ false, /* torpedoable */
+ path, /* path */
+ false, /* tokenIn */
+ false, /* dataIn */
+ false, /* latchData */
+ false, /* latchPath */
+ true, /* dataOut */
+ false /* tokenOut */
+ ));
+
+ List<BitVector> dataItems = marina.data.drainMany();
+ fatal(dataItems.size()!=1, "Expected one data item to emerge but got: "+dataItems.size()+" data items");
+ MarinaPacket mp = new MarinaPacket(dataItems.get(0));
+
+ // the 14th bit of the outbound address cannot be set by the
+ // ship, so we don't care about it
+ fatalIfBitVectorsDoNotMatch(MarinaUtils.berkToSun(bv), mp.path.get(0,13));
+
+ adjustIndent(-2);
+ prln("End sendDataWithPath");
+ }
+
+
private void sendTorpedo(Marina marina) {
prln("Begin sendTorpedo");
adjustIndent(2);
case 3015: testSendAndRecvToken(marina); break;
case 3016: sendDataIlcInfinite(marina); break;
case 3017: testFlagTruthTable(marina); break;
+ case 3018: sendDataWithPath(marina); break;
default:
fatal(true, "Test number: "+testNum+" doesn't exist.");
return dataTokAddr.get(0, 37);
}
+ public static BitVector berkToSun(edu.berkeley.fleet.api.BitVector berkBits) {
+ BitVector sunBits = new BitVector(berkBits.length(), "berkToSun()");
+ for(int i=0; i<sunBits.getNumBits(); i++) sunBits.set(i, berkBits.get(i));
+ return sunBits;
+ }
+ public static edu.berkeley.fleet.api.BitVector sunToBerk(BitVector sunBits) {
+ edu.berkeley.fleet.api.BitVector berkBits =
+ new edu.berkeley.fleet.api.BitVector(sunBits.getNumBits());
+ for(int i=0; i<sunBits.getNumBits(); i++) berkBits.set(i, sunBits.get(i));
+ return berkBits;
+ }
+
}
\ No newline at end of file