feature: Adding unset method for messages and elements
This method will clear the data for the element or message as well
as zeroize the masking bits appropriately.
Change-Id: I7e93f3605558b22b5850cd4912d705b2cd268f8d
diff --git a/org.eclipse.osee.ote.core.test/src/org/eclipse/osee/ote/message/data/MemoryResourceTest.java b/org.eclipse.osee.ote.core.test/src/org/eclipse/osee/ote/message/data/MemoryResourceTest.java
index 468c390..03617f9 100644
--- a/org.eclipse.osee.ote.core.test/src/org/eclipse/osee/ote/message/data/MemoryResourceTest.java
+++ b/org.eclipse.osee.ote.core.test/src/org/eclipse/osee/ote/message/data/MemoryResourceTest.java
@@ -2,6 +2,7 @@
import java.math.BigInteger;
import java.nio.ByteBuffer;
+
import org.junit.Assert;
import org.junit.Test;
@@ -110,7 +111,6 @@
mem.setLong(-100, 0, 0, 63);
val = mem.getUnsigned64(0, 0, 63);
hex = val.toString(16).toUpperCase();
- System.out.println(hex);
String expected = "FFFFFFFFFFFFFF9C";
Assert.assertEquals(expected, hex);
}
@@ -228,7 +228,122 @@
for (int i = 0; i < mem.getLength(); i++) {
sb.append(String.format("%02x ", mem.getMask()[i]));
}
- expected = "00 00 00 00 ff ff ff ff ff ff ff 00 00 00 00 00 ff ff ff ff ff ff ff ff ";
+ expected = "00 00 00 00 ff ff ff ff ff ff ff 00 00 00 00 00 ff ff ff ff ff ff 00 00 ";
+ Assert.assertEquals(expected, sb.toString());
+ sb.setLength(0);
+
+ // test for element less than a byte
+ mem = new MemoryResource(new byte[24], 0, 1);
+
+ mem.setInt(2, 0, 2, 3);
+ for (int i = 0; i < mem.getLength(); i++) {
+ sb.append(String.format("%02x ", mem.getMask()[i]));
+ }
+ expected = "30 ";
+ Assert.assertEquals(expected, sb.toString());
+ sb.setLength(0);
+
+ mem.setInt(2, 0, 4, 6);
+ for (int i = 0; i < mem.getLength(); i++) {
+ sb.append(String.format("%02x ", mem.getMask()[i]));
+ }
+ expected = "3e ";
+ Assert.assertEquals(expected, sb.toString());
+ sb.setLength(0);
+
+
+ // Test element partially across multiple bytes
+ mem = new MemoryResource(new byte[24], 0, 4);
+
+ mem.setInt(2, 0, 7, 16);
+ for (int i = 0; i < mem.getLength(); i++) {
+ sb.append(String.format("%02x ", mem.getMask()[i]));
+ }
+ expected = "01 ff 80 00 ";
+ Assert.assertEquals(expected, sb.toString());
+ sb.setLength(0);
+ }
+
+ @Test
+ public void testElementMaskZeroize() {
+ StringBuilder sb = new StringBuilder();
+ MemoryResource mem = new MemoryResource(new byte[24], 0, 24);
+ String expected;
+
+ // setup
+ mem.setInt(0x22334455, 13, 0, 31);
+ for (int i = 0; i < mem.getLength(); i++) {
+ sb.append(String.format("%02x ", mem.getMask()[i]));
+ }
+ expected = "00 00 00 00 00 00 00 00 00 00 00 00 00 ff ff ff ff 00 00 00 00 00 00 00 ";
+ Assert.assertEquals(expected, sb.toString());
+ sb.setLength(0);
+
+ mem.zeroizeMask(13, 2, 2);
+ for (int i = 0; i < mem.getLength(); i++) {
+ sb.append(String.format("%02x ", mem.getMask()[i]));
+ }
+ expected = "00 00 00 00 00 00 00 00 00 00 00 00 00 df ff ff ff 00 00 00 00 00 00 00 ";
+ Assert.assertEquals(expected, sb.toString());
+ sb.setLength(0);
+
+ mem.zeroizeMask(13, 7, 16);
+ for (int i = 0; i < mem.getLength(); i++) {
+ sb.append(String.format("%02x ", mem.getMask()[i]));
+ }
+ expected = "00 00 00 00 00 00 00 00 00 00 00 00 00 de 00 7f ff 00 00 00 00 00 00 00 ";
+ Assert.assertEquals(expected, sb.toString());
+ sb.setLength(0);
+
+ // add more mask for next part
+ mem.setInt(0x22334455, 13, 0, 31);
+ for (int i = 0; i < mem.getLength(); i++) {
+ sb.append(String.format("%02x ", mem.getMask()[i]));
+ }
+ expected = "00 00 00 00 00 00 00 00 00 00 00 00 00 ff ff ff ff 00 00 00 00 00 00 00 ";
+ Assert.assertEquals(expected, sb.toString());
+ sb.setLength(0);
+
+ mem.zeroizeMask(14, 0, 2);
+ for (int i = 0; i < mem.getLength(); i++) {
+ sb.append(String.format("%02x ", mem.getMask()[i]));
+ }
+ expected = "00 00 00 00 00 00 00 00 00 00 00 00 00 ff 1f ff ff 00 00 00 00 00 00 00 ";
+ Assert.assertEquals(expected, sb.toString());
+ sb.setLength(0);
+
+ mem.zeroizeMask(15, 0, 15);
+ for (int i = 0; i < mem.getLength(); i++) {
+ sb.append(String.format("%02x ", mem.getMask()[i]));
+ }
+ expected = "00 00 00 00 00 00 00 00 00 00 00 00 00 ff 1f 00 00 00 00 00 00 00 00 00 ";
+ Assert.assertEquals(expected, sb.toString());
+ sb.setLength(0);
+
+ }
+
+ @Test
+ public void testWholeMaskZeroize() {
+ StringBuilder sb = new StringBuilder();
+ MemoryResource mem = new MemoryResource(new byte[10], 0, 10);
+ String expected;
+
+ // setup
+ mem.setASCIIString("01", 0);
+ mem.setInt(0x0, 4, 3, 12);
+ mem.setInt(0x0, 7, 5, 5);
+ for (int i = 0; i < mem.getLength(); i++) {
+ sb.append(String.format("%02x ", mem.getMask()[i]));
+ }
+ expected = "ff ff 00 00 1f f8 00 04 00 00 ";
+ Assert.assertEquals(expected, sb.toString());
+ sb.setLength(0);
+
+ mem.zeroizeMask();
+ for (int i = 0; i < mem.getLength(); i++) {
+ sb.append(String.format("%02x ", mem.getMask()[i]));
+ }
+ expected = "00 00 00 00 00 00 00 00 00 00 ";
Assert.assertEquals(expected, sb.toString());
sb.setLength(0);
}
diff --git a/org.eclipse.osee.ote.core.test/src/org/eclipse/osee/ote/message/elements/IntegerElementTest.java b/org.eclipse.osee.ote.core.test/src/org/eclipse/osee/ote/message/elements/IntegerElementTest.java
index aae1865..9709287 100644
--- a/org.eclipse.osee.ote.core.test/src/org/eclipse/osee/ote/message/elements/IntegerElementTest.java
+++ b/org.eclipse.osee.ote.core.test/src/org/eclipse/osee/ote/message/elements/IntegerElementTest.java
@@ -14,9 +14,9 @@
package org.eclipse.osee.ote.message.elements;
import java.util.Random;
+
import org.eclipse.osee.ote.message.data.HeaderData;
import org.eclipse.osee.ote.message.data.MemoryResource;
-import org.eclipse.osee.ote.message.elements.IntegerElement;
import org.junit.Assert;
import org.junit.Test;
@@ -36,26 +36,6 @@
}
@Test
- public void test3BitInts() {
- createTest(3);
- }
-
- @Test
- public void test4BitInts() {
- createTest(4);
- }
-
- @Test
- public void test5BitInts() {
- createTest(5);
- }
-
- @Test
- public void test6BitInts() {
- createTest(6);
- }
-
- @Test
public void test7BitInts() {
createTest(7);
}
@@ -71,31 +51,6 @@
}
@Test
- public void test10BitInts() {
- createTest(10);
- }
-
- @Test
- public void test11BitInts() {
- createTest(11);
- }
-
- @Test
- public void test12BitInts() {
- createTest(12);
- }
-
- @Test
- public void test13BitInts() {
- createTest(13);
- }
-
- @Test
- public void test14BitInts() {
- createTest(14);
- }
-
- @Test
public void test15BitInts() {
createTest(15);
}
@@ -111,75 +66,11 @@
}
@Test
- public void test18BitInts() {
- createTest(18);
- }
-
- @Test
- public void test19BitInts() {
- createTest(19);
- }
-
- @Test
- public void test20BitInts() {
- createTest(20);
- }
-
- @Test
- public void test21BitInts() {
- createTest(21);
- }
-
- @Test
- public void test22BitInts() {
- createTest(22);
- }
-
- @Test
- public void test23BitInts() {
- createTest(23);
- }
-
- @Test
- public void test24BitInts() {
- createTest(24);
- }
-
- @Test
- public void test25BitInts() {
- createTest(25);
- }
-
- @Test
- public void test26BitInts() {
- createTest(26);
- }
-
- @Test
- public void test27BitInts() {
- createTest(27);
- }
-
- @Test
- public void test28BitInts() {
- createTest(28);
- }
-
- @Test
- public void test29BitInts() {
- createTest(29);
- }
-
- @Test
- public void test30BitInts() {
- createTest(30);
- }
-
- @Test
public void test32BitInts() {
createTest(32);
}
+ @SuppressWarnings("deprecation")
private void createTest(int width) {
final HeaderData hd = new HeaderData("test_data", new MemoryResource(new byte[64], 2, 64));
IntegerElement[] e = new IntegerElement[32];
@@ -201,7 +92,7 @@
int[] expectedVals = new int[count];
Random r = new Random(System.currentTimeMillis());
- for (int l = 0; l <= 255; l++) {
+ for (int l = 0; l <= 128; l++) {
/*
* perform sets going through the array. We do this so that we can catch sets that modified bits before
* the element
@@ -228,6 +119,7 @@
}
}
+ @SuppressWarnings("deprecation")
private void generateAscending(Random r, IntegerElement[] e, int[] expectedVals, int length) {
for (int i = 0; i < length; i++) {
int val = r.nextInt();
@@ -245,6 +137,7 @@
}
}
+ @SuppressWarnings("deprecation")
private void generateDescending(Random r, IntegerElement[] e, int[] expectedVals, int length) {
for (int i = length - 1; i >= 0; i--) {
int val = r.nextInt();
@@ -262,6 +155,7 @@
}
}
+ @SuppressWarnings("deprecation")
private void check(IntegerElement[] e, int[] expectedVals, int length) {
for (int i = 0; i < length; i++) {
IntegerElement el = e[i];
diff --git a/org.eclipse.osee.ote.core.test/src/org/eclipse/osee/ote/message/elements/LongIntegerElementTest.java b/org.eclipse.osee.ote.core.test/src/org/eclipse/osee/ote/message/elements/LongIntegerElementTest.java
index faafa19..b9958f4 100644
--- a/org.eclipse.osee.ote.core.test/src/org/eclipse/osee/ote/message/elements/LongIntegerElementTest.java
+++ b/org.eclipse.osee.ote.core.test/src/org/eclipse/osee/ote/message/elements/LongIntegerElementTest.java
@@ -38,70 +38,25 @@
public void test3BitInts() {
createLongIntTest(3);
}
-
- @Test
- public void test4BitInts() {
- createLongIntTest(4);
- }
-
- @Test
- public void test5BitInts() {
- createLongIntTest(5);
- }
-
+
@Test
public void test8BitInts() {
createLongIntTest(8);
}
@Test
- public void test10BitInts() {
- createLongIntTest(10);
- }
-
- @Test
- public void test12BitInts() {
- createLongIntTest(12);
+ public void test9BitInts() {
+ createLongIntTest(9);
}
@Test
public void test16BitInts() {
createLongIntTest(16);
}
-
+
@Test
- public void test20BitInts() {
- createLongIntTest(20);
- }
-
- @Test
- public void test22BitInts() {
- createLongIntTest(22);
- }
-
- @Test
- public void test24BitInts() {
- createLongIntTest(24);
- }
-
- @Test
- public void test25BitInts() {
- createLongIntTest(25);
- }
-
- @Test
- public void test26BitInts() {
- createLongIntTest(26);
- }
-
- @Test
- public void test27BitInts() {
- createLongIntTest(27);
- }
-
- @Test
- public void test30BitInts() {
- createLongIntTest(30);
+ public void test17BitInts() {
+ createLongIntTest(17);
}
@Test
@@ -115,21 +70,6 @@
}
@Test
- public void test40BitInts() {
- createLongIntTest(40);
- }
-
- @Test
- public void test48BitInts() {
- createLongIntTest(48);
- }
-
- @Test
- public void test50BitInts() {
- createLongIntTest(50);
- }
-
- @Test
public void test64BitInts() {
createLongIntTest(64);
}
@@ -154,7 +94,7 @@
long[] expectedVals = new long[count];
Random r = new Random(System.currentTimeMillis());
- for (int l = 0; l <= 256; l++) {
+ for (int l = 0; l <= 128; l++) {
/*
* perform sets going through the array. We do this so that we can catch sets that modified bits before
* the element
diff --git a/org.eclipse.osee.ote.core.test/src/org/eclipse/osee/ote/message/elements/UnsignedBigInteger64ElementTest.java b/org.eclipse.osee.ote.core.test/src/org/eclipse/osee/ote/message/elements/UnsignedBigInteger64ElementTest.java
index c6fc0e8..156d905 100644
--- a/org.eclipse.osee.ote.core.test/src/org/eclipse/osee/ote/message/elements/UnsignedBigInteger64ElementTest.java
+++ b/org.eclipse.osee.ote.core.test/src/org/eclipse/osee/ote/message/elements/UnsignedBigInteger64ElementTest.java
@@ -119,7 +119,7 @@
long[] expectedVals = new long[count];
Random r = new Random(System.currentTimeMillis());
- for (int l = 0; l <= 256; l++) {
+ for (int l = 0; l <= 128; l++) {
/*
* perform sets going through the array. We do this so that we can catch sets that modified bits before
* the element
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/Message.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/Message.java
index 2cf64f9..68243b5 100644
--- a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/Message.java
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/Message.java
@@ -33,7 +33,6 @@
import javax.xml.stream.XMLStreamException;
import javax.xml.stream.XMLStreamWriter;
-import com.fasterxml.jackson.annotation.JsonProperty;
import org.eclipse.osee.framework.jdk.core.persistence.Xmlizable;
import org.eclipse.osee.framework.jdk.core.persistence.XmlizableStream;
import org.eclipse.osee.framework.jdk.core.util.xml.Jaxp;
@@ -60,6 +59,8 @@
import org.eclipse.osee.ote.message.tool.MessageMode;
import org.w3c.dom.Document;
+import com.fasterxml.jackson.annotation.JsonProperty;
+
/**
* @author Andrew M. Finkbeiner
*/
@@ -778,6 +779,9 @@
return getMemType().name();
}
+ /**
+ * Zeroize the entire body of this message. Notice that the header and mask will not be affected.
+ */
public void zeroize() {
checkState();
for (DataType memType : memToDataMap.keySet()) {
@@ -786,6 +790,16 @@
}
}
}
+
+ /**
+ * Clears/zeroes out the entire mask for this message.
+ */
+ public void clearMask() {
+ Collection<MessageData> sources = getMemSource(currentMemType);
+ for (MessageData source : sources) {
+ source.getMem().zeroizeMask();
+ }
+ }
/**
* Verifies that the message is sent at least once using the default message timeout. DO NOT override this method in
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/OteMessage.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/OteMessage.java
index 9ae15cf..60384b3 100644
--- a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/OteMessage.java
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/OteMessage.java
@@ -15,6 +15,7 @@
import java.nio.ByteBuffer;
import java.util.ArrayList;
import java.util.Collection;
+
import org.eclipse.osee.ote.core.environment.interfaces.ITestEnvironmentAccessor;
import org.eclipse.osee.ote.message.condition.ICondition;
import org.eclipse.osee.ote.message.data.MessageData;
@@ -222,9 +223,19 @@
return getMessageToRead().getMessageName();
}
+ /**
+ * Zeroize the entire body of this message. Notice that the header and mask will not be affected.
+ */
public void zeroize() {
getMessageToWrite().zeroize();
}
+
+ /**
+ * Clears/zeroes out the entire mask for this message.
+ */
+ public void clearMask() {
+ getMessageToWrite().clearMask();
+ }
/**
* Verifies that the message is sent at least once using the default message timeout. DO NOT override this method in
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/data/MemoryResource.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/data/MemoryResource.java
index e26535e..7ffd56d 100644
--- a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/data/MemoryResource.java
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/data/MemoryResource.java
@@ -18,6 +18,7 @@
import java.nio.charset.Charset;
import java.util.Arrays;
import java.util.logging.Level;
+
import org.eclipse.osee.ote.message.MessageSystemException;
/**
@@ -438,7 +439,8 @@
}
public final void setASCIIString(String s, int offset) {
- updateMask(offset, 0, 63);
+ int bitLength = 8 * s.length() - 1;
+ updateMask(offset, 0, bitLength);
System.arraycopy(s.getBytes(US_ASCII_CHARSET), 0, byteArray.get(), _offset + offset, s.length());
_dataHasChanged = true;
}
@@ -550,14 +552,15 @@
endByte = endByte < length ? endByte : length - 1;
final int lsbMod = (lsb % 8) + 1;
final int msbMod = msb % 8;
+ int bitLength = lsb - msb;
int shift;
for (int i = endByte; i >= beginByte; i--) {
if (endByte == beginByte) { // MSB and LSB in same byte; shift accordingly
- mask[i] |= 0xFF >>> msbMod; // Push ones
- mask[i] |= mask[i] <<= lsbMod; // Pull zeros
+ byte littleMask = (byte) (0xFF << (8 - bitLength - 1)); // N bits all the way to the left
+ littleMask = (byte) ((littleMask & 0xFF) >>> (msbMod)); // shift bits to match element
+ mask[i] |= littleMask;
} else if (i == endByte) { // Shift based on LSB
- shift = lsbMod;
- shift = shift > 0 ? 8 - shift : shift;
+ shift = 8 - lsbMod;
mask[i] |= (byte) (0xFF << shift);
} else if (i == beginByte) { // Shift based on MSB
mask[i] |= (byte) (0xFF >>> msbMod);
@@ -576,16 +579,57 @@
public void updateMask(int offset) {
getMask()[offset] |= 0xFF;
}
+
+ /**
+ * Removes all the mask bits in the current buffer addressed by the arguments
+ *
+ * @param offset
+ * @param msb
+ * @param lsb
+ */
+ public void zeroizeMask(int offset, int msb, int lsb) {
+ offset += _offset;
+ byte[] mask = getMask();
+ final int length = byteArray.get().length;
+ final int beginByte = offset + msb / 8;
+ int endByte = offset + lsb / 8;
+ endByte = endByte < length ? endByte : length - 1;
+ final int lsbMod = (lsb % 8) + 1;
+ final int msbMod = msb % 8;
+ int bitLength = lsb - msb;
+ int shift;
+ byte littleMask;
+ for (int i = endByte; i >= beginByte; i--) {
+ if (endByte == beginByte) { // MSB and LSB in same byte; shift accordingly
+ littleMask = (byte) (0xFF << (8 - bitLength - 1)); // N bits all the way to the left
+ littleMask = (byte) ((littleMask & 0xFF) >>> (msbMod)); // shift bits to match element
+ mask[i] &= ~littleMask;
+ } else if (i == endByte) { // Shift based on LSB
+ shift = 8 - lsbMod;
+ littleMask = (byte) (0xFF << shift);
+ mask[i] &= ~littleMask;
+ } else if (i == beginByte) { // Shift based on MSB
+ littleMask = (byte) (0xFF >>> msbMod);
+ mask[i] &= ~littleMask;
+ } else { // Unmask all eight bits
+ mask[i] = 0;
+ }
+ }
+ }
+
public byte[] getMask() {
return byteArray.getMask();
}
+ /**
+ * Zero out all of the mask bits for this buffer
+ */
public void zeroizeMask() {
Arrays.fill(byteArray.getMask(), (byte) 0x00);
}
- public void printBinary(byte b, String label) {
+ public static void printBinary(byte b, String label) {
System.out.print(label);
String bits;
bits = String.format("%8s", Integer.toBinaryString(b & 0xFF)).replace(' ', '0');
@@ -593,7 +637,7 @@
System.out.println("");
}
- public void printBinary(byte[] byteArray, String label) {
+ public static void printBinary(byte[] byteArray, String label) {
System.out.print(label);
String bits;
for (int i = 0; i < byteArray.length; i++) {
@@ -727,4 +771,5 @@
}
System.out.println("\n");
}
+
}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/element/MsgElementDiscrete.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/element/MsgElementDiscrete.java
index 9be0494..f4cac51 100644
--- a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/element/MsgElementDiscrete.java
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/element/MsgElementDiscrete.java
@@ -43,6 +43,13 @@
public void setNoLog(T obj) {
getElementToWrite().setNoLog(obj);
}
+
+ /**
+ * Zeroize this element's data and mask.
+ */
+ public void unset() {
+ getElementToWrite().unset();
+ }
@SuppressWarnings("unchecked")
protected DiscreteElement<T> getElementToWrite() {
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/DiscreteElement.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/DiscreteElement.java
index d6aa38c..f2a4b06 100644
--- a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/DiscreteElement.java
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/DiscreteElement.java
@@ -51,6 +51,14 @@
public abstract T getValue();
public abstract String toString(T obj);
+
+ /**
+ * Zeroize both the data and mask for this element
+ */
+ public void unset() {
+ zeroize();
+ getMsgData().getMem().zeroizeMask(byteOffset, msb, lsb);
+ }
public String valueOf() {
return getValue().toString();
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/Element.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/Element.java
index 99e8c57..ec3a5f2 100644
--- a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/Element.java
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/Element.java
@@ -283,6 +283,9 @@
return elementName;
}
+ /**
+ * Zeroize the data for this element (not the mask).
+ */
public void zeroize() {
getMsgData().getMem().setLong(0L, byteOffset, msb, lsb);