Merge pull request #658 from nsacyber/v3_issue_618-unittest

HIRS_Utils Unit Tests Migration from /hirs/data/persist directory
This commit is contained in:
iadgovuser26 2024-01-22 08:22:06 -05:00 committed by GitHub
commit 2efb1a98f3
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 649 additions and 0 deletions

View File

@ -0,0 +1,155 @@
package hirs.attestationca.persist.entity.userdefined;
import hirs.attestationca.persist.entity.userdefined.report.DeviceInfoReport;
import hirs.attestationca.persist.entity.userdefined.report.DeviceInfoReportTest;
import hirs.attestationca.persist.enums.AppraisalStatus;
import hirs.attestationca.persist.enums.HealthStatus;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNotNull;
import static org.junit.jupiter.api.Assertions.assertNull;
/**
* This is the test class for the <code>Device</code> class.
*
*/
public final class DeviceTest {
/**
* Utility method for getting a <code>Device</code> that can be used for
* testing.
*
* @param name name for the <code>Device</code>
*
* @return device
*/
public static Device getTestDevice(final String name) {
final DeviceInfoReport deviceInfo = DeviceInfoReportTest.getTestReport();
return new Device(name, deviceInfo, HealthStatus.UNKNOWN, AppraisalStatus.Status.UNKNOWN, null, false, null, null);
}
/**
* Tests that the device constructor can take a name.
*/
@Test
public void testDevice() {
final String name = "my-laptop";
final Device device = new Device(name, null, HealthStatus.UNKNOWN, AppraisalStatus.Status.UNKNOWN, null, false, null , null);
assertNotNull(device);
}
/**
* Tests that a name and device info report can be passed into the
* constructor.
*/
@Test
public void testDeviceNameAndInfo() {
final String name = "my-laptop";
final DeviceInfoReport deviceInfo = DeviceInfoReportTest.getTestReport();
new Device(name, deviceInfo, HealthStatus.UNKNOWN, AppraisalStatus.Status.UNKNOWN, null, false, null, null);
}
/**
* Tests that the device name can be supplied and device info be null.
*/
@Test
public void testDeviceNameAndNullInfo() {
final String name = "my-laptop";
final DeviceInfoReport deviceInfo = null;
new Device(name, deviceInfo, HealthStatus.UNKNOWN, AppraisalStatus.Status.UNKNOWN, null, false, null, null);
}
/**
* Tests that get device info report returns the device info report.
*/
@Test
public void testGetDeviceInfo() {
final String name = "my-laptop";
final DeviceInfoReport deviceInfo = DeviceInfoReportTest.getTestReport();
final Device device = new Device(name, deviceInfo, HealthStatus.UNKNOWN, AppraisalStatus.Status.UNKNOWN, null, false, null, null);
assertEquals(deviceInfo, device.getDeviceInfo());
}
/**
* Tests that device info can be set.
*/
@Test
public void testSetDeviceInfo() {
final String name = "my-laptop";
final Device device = new Device(name, null, HealthStatus.UNKNOWN, AppraisalStatus.Status.UNKNOWN, null, false, null, null);
assertNull(device.getDeviceInfo());
final DeviceInfoReport deviceInfo = DeviceInfoReportTest.getTestReport();
device.setDeviceInfo(deviceInfo);
assertEquals(deviceInfo, device.getDeviceInfo());
}
/**
* Tests that get device info report returns the device info report.
*/
@Test
public void testSetNullDeviceInfo() {
final String name = "my-laptop";
final DeviceInfoReport deviceInfo = DeviceInfoReportTest.getTestReport();
final Device device = new Device(name, deviceInfo, HealthStatus.UNKNOWN, AppraisalStatus.Status.UNKNOWN, null, false, null, null);
assertEquals(deviceInfo, device.getDeviceInfo());
device.setDeviceInfo(null);
assertNull(device.getDeviceInfo());
}
/**
* Tests that retrieving a null LastReportTimestamp will not trigger an exception.
*/
@Test
public void testNullLastReportTimeStamp() {
final String name = "my-laptop";
final DeviceInfoReport deviceInfo = DeviceInfoReportTest.getTestReport();
final Device device = new Device(name, deviceInfo, HealthStatus.UNKNOWN, AppraisalStatus.Status.UNKNOWN, null, false, null, null);
assertNull(device.getLastReportTimestamp());
}
/**
* Tests that setting and getting the health status works correctly.
*/
@Test
public void testSetHealthStatus() {
final Device device = new Device("test-device", null, HealthStatus.UNKNOWN, AppraisalStatus.Status.UNKNOWN, null, false, null, null);
device.setHealthStatus(HealthStatus.TRUSTED);
assertEquals(HealthStatus.TRUSTED, device.getHealthStatus());
}
/**
* Tests equals returns true for two devices that have the same name.
*/
@Test
public void testDeviceEquals() {
final String name = "my-laptop";
final String otherName = "my-laptop";
final DeviceInfoReport deviceInfo = DeviceInfoReportTest.getTestReport();
final Device device = new Device(name, deviceInfo, HealthStatus.UNKNOWN, AppraisalStatus.Status.UNKNOWN, null, false, null, null);
final Device other = new Device(otherName, deviceInfo, HealthStatus.UNKNOWN, AppraisalStatus.Status.UNKNOWN, null, false, null, null);
assertEquals(device, other);
}
/**
* Tests that the default setting of the supply chain validation status is unknown.
*/
@Test
public void testGetDefaultSupplyChainStatus() {
String name = "my-laptop";
DeviceInfoReport deviceInfo = DeviceInfoReportTest.getTestReport();
final Device device = new Device(name, deviceInfo, HealthStatus.UNKNOWN, AppraisalStatus.Status.UNKNOWN, null, false, null, null);
assertEquals(AppraisalStatus.Status.UNKNOWN, device.getSupplyChainValidationStatus());
}
/**
* Tests that the supply chain validation status getters and setters work.
*/
@Test
public void testSetAndGetSupplyChainStatus() {
String name = "my-laptop";
DeviceInfoReport deviceInfo = DeviceInfoReportTest.getTestReport();
final Device device = new Device(name, deviceInfo, HealthStatus.UNKNOWN, AppraisalStatus.Status.UNKNOWN, null, false, null, null);
device.setSupplyChainValidationStatus(AppraisalStatus.Status.PASS);
assertEquals(AppraisalStatus.Status.PASS, device.getSupplyChainValidationStatus());
}
}

View File

@ -0,0 +1,284 @@
package hirs.attestationca.persist.entity.userdefined.record;
import hirs.attestationca.persist.entity.userdefined.ExaminableRecord;
import hirs.utils.digest.Digest;
import hirs.utils.digest.DigestAlgorithm;
import org.apache.commons.codec.DecoderException;
import org.apache.commons.codec.binary.Hex;
import org.junit.jupiter.api.Test;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import static org.junit.jupiter.api.Assertions.assertNotNull;
import static org.junit.jupiter.api.Assertions.assertNotEquals;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertThrows;
/**
* <code>PCRMeasurementRecordTest</code> represents a unit test class for
* <code>PCRMeasurementRecord</code>.
*/
public class TPMMeasurementRecordTest {
private static final Logger LOGGER
= LogManager.getLogger(TPMMeasurementRecordTest.class);
private static final int DEFAULT_PCR_ID = 3;
private static final String DEFAULT_HASH =
"3d5f3c2f7f3003d2e4baddc46ed4763a4954f648";
private static final ExaminableRecord.ExamineState DEFAULT_STATE = ExaminableRecord.ExamineState.UNEXAMINED;
/**
* Tests instantiation of new <code>PCRMeasurementRecord</code>.
*/
@Test
public final void tpmMeasurementRecord() {
TPMMeasurementRecord pcrRecord = new TPMMeasurementRecord(0,
getDigest(DEFAULT_HASH));
assertNotNull(pcrRecord);
}
/**
* Tests that <code>PCRMeasurementRecord</code> constructor throws a
* NullPointerException with null hash.
*/
@Test
public final void tpmMeasurementRecordNullHash() {
Digest digest = null;
assertThrows(NullPointerException.class, () ->
new TPMMeasurementRecord(0, digest));
}
/**
* Tests that <code>PCRMeasurementRecord</code> constructor throws a
* IllegalArgumentException with negative value for pcr id.
*/
@Test
public final void tpmMeasurementRecordNegativePcrId() {
assertThrows(IllegalArgumentException.class, () ->
new TPMMeasurementRecord(-1, getDigest(DEFAULT_HASH)));
}
/**
* Tests that <code>PCRMeasurementRecord</code> constructor throws a
* IllegalArgumentException with pcr id greater than 23.
*/
@Test
public final void tpmMeasurementRecordInvalidPcrId() {
final int invalidPCR = 24;
assertThrows(IllegalArgumentException.class, () ->
new TPMMeasurementRecord(invalidPCR, getDigest(DEFAULT_HASH)));
}
/**
* Tests that <code>getHash()</code> returns the measurement hash.
*/
@Test
public final void getHash() {
TPMMeasurementRecord pcrRecord = new TPMMeasurementRecord(0,
getDigest(DEFAULT_HASH));
assertNotNull(pcrRecord.getHash());
}
/**
* Tests that <code>getPcrId()</code> returns the pcr id.
*/
@Test
public final void getPcrId() {
int id;
TPMMeasurementRecord pcrRecord = new TPMMeasurementRecord(0,
getDigest(DEFAULT_HASH));
id = pcrRecord.getPcrId();
assertNotNull(id);
}
/**
* Tests that <code>getExamineState</code> returns the correct state.
*/
@Test
public final void getExamineState() {
final TPMMeasurementRecord record = getDefaultRecord();
assertEquals(DEFAULT_STATE, record.getExamineState());
}
/**
* Tests that two <code>IMAMeasurementRecord</code>s are equal if they have
* the same name and the same path.
*/
@Test
public final void testEquals() {
TPMMeasurementRecord r1 = getDefaultRecord();
TPMMeasurementRecord r2 = getDefaultRecord();
assertEquals(r1, r2);
assertEquals(r2, r1);
assertEquals(r1, r1);
assertEquals(r2, r2);
}
/**
* Tests that two <code>TPMMeasurementRecord</code>s are not equal if the
* PCR IDs are different.
*/
@Test
public final void testNotEqualsPcr() {
final int pcrId = 5;
TPMMeasurementRecord r1 = getDefaultRecord();
TPMMeasurementRecord r2 = new TPMMeasurementRecord(pcrId,
getDigest(DEFAULT_HASH));
assertNotEquals(r1, r2);
assertNotEquals(r2, r1);
assertEquals(r1, r1);
assertEquals(r2, r2);
}
/**
* Tests that two <code>TPMMeasurementRecord</code>s are not equal if the
* hashes are different.
*/
@Test
public final void testNotEqualsHash() {
final String hash = "aacc3c2f7f3003d2e4baddc46ed4763a4954f648";
TPMMeasurementRecord r1 = getDefaultRecord();
TPMMeasurementRecord r2 =
new TPMMeasurementRecord(DEFAULT_PCR_ID, getDigest(hash));
assertNotEquals(r1, r2);
assertNotEquals(r2, r1);
assertEquals(r1, r1);
assertEquals(r2, r2);
}
/**
* Tests that the hash code of two <code>TPMMeasurementRecord</code>s are
* the same.
*/
@Test
public final void testHashCodeEquals() {
TPMMeasurementRecord r1 = getDefaultRecord();
TPMMeasurementRecord r2 = getDefaultRecord();
assertEquals(r1.hashCode(), r2.hashCode());
assertEquals(r2.hashCode(), r1.hashCode());
assertEquals(r1.hashCode(), r1.hashCode());
assertEquals(r2.hashCode(), r2.hashCode());
}
/**
* Tests that the hash code of two <code>TPMBaselineRecord</code>s is
* different if they have different names.
*/
@Test
public final void testHashCodeNotEqualsPcrs() {
final int pcrId = 5;
TPMMeasurementRecord r1 = getDefaultRecord();
TPMMeasurementRecord r2 = new TPMMeasurementRecord(pcrId,
getDigest(DEFAULT_HASH));
assertNotEquals(r1.hashCode(), r2.hashCode());
assertNotEquals(r2.hashCode(), r1.hashCode());
assertEquals(r1.hashCode(), r1.hashCode());
assertEquals(r2.hashCode(), r2.hashCode());
}
/**
* Tests that the hash code of two <code>TPMMeasurementRecord</code>s is
* different if they have different hashes.
*/
@Test
public final void testHashCodeNotEqualsHashes() {
final String hash = "aacc3c2f7f3003d2e4baddc46ed4763a4954f648";
TPMMeasurementRecord r1 = getDefaultRecord();
TPMMeasurementRecord r2 =
new TPMMeasurementRecord(DEFAULT_PCR_ID, getDigest(hash));
assertNotEquals(r1.hashCode(), r2.hashCode());
assertNotEquals(r2.hashCode(), r1.hashCode());
assertEquals(r1.hashCode(), r1.hashCode());
assertEquals(r2.hashCode(), r2.hashCode());
}
/**
* Tests that the expected valid PCR IDs do not throw an IllegalArgumentException.
*/
@Test
public final void testCheckForValidPcrId() {
final int minPcrId = TPMMeasurementRecord.MIN_PCR_ID;
final int maxPcrId = TPMMeasurementRecord.MAX_PCR_ID;
for (int i = minPcrId; i < maxPcrId; i++) {
TPMMeasurementRecord.checkForValidPcrId(i);
}
}
/**
* Tests that a negative PCR ID throws an IllegalArgumentException.
*/
@Test
public final void testCheckForValidPcrIdNegative() {
final int pcrId = -1;
assertThrows(IllegalArgumentException.class, () ->
TPMMeasurementRecord.checkForValidPcrId(pcrId));
}
/**
* Tests that a high invalid PCR ID throws an IllegalArgumentException.
*/
@Test
public final void testCheckForValidPcrIdInvalidId() {
final int pcrId = 35;
assertThrows(IllegalArgumentException.class, () ->
TPMMeasurementRecord.checkForValidPcrId(pcrId));
}
/**
* Tests that the ExamineState can be successfully set to EXAMINED.
*/
@Test
public final void testSetExamineStateExamined() {
final ExaminableRecord.ExamineState state = ExaminableRecord.ExamineState.EXAMINED;
TPMMeasurementRecord r1 = getDefaultRecord();
r1.setExamineState(state);
assertEquals(state, r1.getExamineState());
}
/**
* Tests that the ExamineState can be successfully set to IGNORED.
*/
@Test
public final void testSetExamineStateIgnored() {
final ExaminableRecord.ExamineState state = ExaminableRecord.ExamineState.IGNORED;
TPMMeasurementRecord r1 = getDefaultRecord();
r1.setExamineState(state);
assertEquals(state, r1.getExamineState());
}
/**
* Tests that the ExamineState is successfully initialized to UNEXAMINED.
*/
@Test
public final void testSetExamineStateInitial() {
TPMMeasurementRecord r1 = getDefaultRecord();
assertEquals(ExaminableRecord.ExamineState.UNEXAMINED, r1.getExamineState());
}
/**
* Tests that setting the ExamineState to UNEXAMINED throws an IllegalArgumentException.
*/
@Test
public final void testSetExamineStateUnexamined() {
final ExaminableRecord.ExamineState state = ExaminableRecord.ExamineState.UNEXAMINED;
TPMMeasurementRecord r1 = getDefaultRecord();
assertThrows(IllegalArgumentException.class, () ->
r1.setExamineState(state));
}
private TPMMeasurementRecord getDefaultRecord() {
return new TPMMeasurementRecord(DEFAULT_PCR_ID,
getDigest(DEFAULT_HASH));
}
private Digest getDigest(final String hash) {
try {
final byte[] bytes = Hex.decodeHex(hash.toCharArray());
return new Digest(DigestAlgorithm.SHA1, bytes);
} catch (DecoderException e) {
LOGGER.error("unable to create digest", e);
throw new RuntimeException("unable to create digest", e);
}
}
}

View File

@ -0,0 +1,209 @@
package hirs.attestationca.persist.entity.userdefined.report;
import hirs.attestationca.persist.entity.userdefined.info.OSInfo;
import hirs.attestationca.persist.entity.userdefined.info.TPMInfo;
import hirs.attestationca.persist.entity.userdefined.info.NetworkInfo;
import hirs.attestationca.persist.entity.userdefined.info.HardwareInfo;
import hirs.attestationca.persist.entity.userdefined.info.FirmwareInfo;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertThrows;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.security.cert.CertificateFactory;
import java.security.cert.X509Certificate;
/**
* DeviceInfoReportTest is a unit test class for DeviceInfoReports.
*/
public class DeviceInfoReportTest {
private final NetworkInfo networkInfo = createTestNetworkInfo();
private final OSInfo osInfo = createTestOSInfo();
private final FirmwareInfo firmwareInfo = createTestFirmwareInfo();
private final HardwareInfo hardwareInfo = createTestHardwareInfo();
private final TPMInfo tpmInfo = createTPMInfo();
private static final String TEST_IDENTITY_CERT = "/tpm/sample_identity_cert.cer";
private static final Logger LOGGER = LogManager.getLogger(DeviceInfoReportTest.class);
private static final String EXPECTED_CLIENT_VERSION = "Test.Version";
/**
* Tests instantiation of a DeviceInfoReport.
*/
@Test
public final void deviceInfoReport() {
new DeviceInfoReport(networkInfo, osInfo, firmwareInfo, hardwareInfo, tpmInfo);
}
/**
* Tests that NetworkInfo cannot be null.
*/
@Test
public final void networkInfoNull() {
assertThrows(NullPointerException.class, () ->
new DeviceInfoReport(null, osInfo, firmwareInfo, hardwareInfo, tpmInfo));
}
/**
* Tests that OSInfo cannot be null.
*/
@Test
public final void osInfoNull() {
assertThrows(NullPointerException.class, () ->
new DeviceInfoReport(networkInfo, null, firmwareInfo, hardwareInfo, tpmInfo));
}
/**
* Tests that FirmwareInfo cannot be null.
*/
@Test
public final void firmwareInfoNull() {
assertThrows(NullPointerException.class, () ->
new DeviceInfoReport(networkInfo, osInfo, null, hardwareInfo, tpmInfo));
}
/**
* Tests that HardwareInfo cannot be null.
*/
@Test
public final void hardwareInfoNull() {
assertThrows(NullPointerException.class, () ->
new DeviceInfoReport(networkInfo, osInfo, firmwareInfo, null, tpmInfo));
}
/**
* Tests that TPMInfo may be null.
*/
@Test
public final void tpmInfoNull() {
new DeviceInfoReport(networkInfo, osInfo, firmwareInfo, hardwareInfo, null);
}
/**
* Tests that the getters for DeviceInfoReport work as expected.
*/
@Test
public final void testGetters() {
DeviceInfoReport deviceInfoReport =
new DeviceInfoReport(networkInfo, osInfo, firmwareInfo, hardwareInfo, tpmInfo);
assertEquals(networkInfo, deviceInfoReport.getNetworkInfo());
assertEquals(osInfo, deviceInfoReport.getOSInfo());
assertEquals(firmwareInfo, deviceInfoReport.getFirmwareInfo());
assertEquals(hardwareInfo, deviceInfoReport.getHardwareInfo());
assertEquals(tpmInfo, deviceInfoReport.getTpmInfo());
assertEquals(EXPECTED_CLIENT_VERSION, deviceInfoReport.getClientApplicationVersion());
}
/**
* Creates a DeviceInfoReport instance usable for testing.
*
* @return a test DeviceInfoReport
*/
public static DeviceInfoReport getTestReport() {
return new DeviceInfoReport(
createTestNetworkInfo(), createTestOSInfo(), createTestFirmwareInfo(),
createTestHardwareInfo(), createTPMInfo()
);
}
/**
* Creates a test instance of NetworkInfo.
*
* @return network information for a fake device
*/
public static NetworkInfo createTestNetworkInfo() {
try {
final String hostname = "test.hostname";
final InetAddress ipAddress =
InetAddress.getByAddress(new byte[] {127, 0, 0, 1});
final byte[] macAddress = new byte[] {11, 22, 33, 44, 55, 66};
return new NetworkInfo(hostname, ipAddress, macAddress);
} catch (UnknownHostException e) {
LOGGER.error("error occurred while creating InetAddress");
return null;
}
}
/**
* Creates a test instance of OSInfo.
*
* @return OS information for a fake device
*/
public static OSInfo createTestOSInfo() {
return new OSInfo("test os name", "test os version", "test os arch",
"test distribution", "test distribution release");
}
/**
* Creates a test instance of FirmwareInfo.
*
* @return Firmware information for a fake device
*/
public static FirmwareInfo createTestFirmwareInfo() {
return new FirmwareInfo("test bios vendor", "test bios version", "test bios release date");
}
/**
* Creates a test instance of HardwareInfo.
*
* @return Hardware information for a fake device
*/
public static HardwareInfo createTestHardwareInfo() {
return new HardwareInfo("test manufacturer", "test product name", "test version",
"test really long serial number with many characters", "test really long chassis "
+ "serial number with many characters",
"test really long baseboard serial number with many characters");
}
/**
* Creates a test instance of TPMInfo.
*
* @return TPM information for a fake device
*/
public static final TPMInfo createTPMInfo() {
final short num1 = 1;
final short num2 = 2;
final short num3 = 3;
final short num4 = 4;
return new TPMInfo("test os make", num1, num2, num3, num4,
getTestIdentityCertificate());
}
private static X509Certificate getTestIdentityCertificate() {
X509Certificate certificateValue = null;
InputStream istream = null;
istream = DeviceInfoReportTest.class.getResourceAsStream(
TEST_IDENTITY_CERT
);
try {
if (istream == null) {
throw new FileNotFoundException(TEST_IDENTITY_CERT);
}
CertificateFactory cf = CertificateFactory.getInstance("X.509");
certificateValue = (X509Certificate) cf.generateCertificate(
istream);
} catch (Exception e) {
return null;
} finally {
if (istream != null) {
try {
istream.close();
} catch (IOException e) {
LOGGER.error("test certificate file could not be closed");
}
}
}
return certificateValue;
}
}

View File

@ -0,0 +1 @@
Test.Version