Merge "Add VerifyUsageTimes() test."
This commit is contained in:
@@ -4415,6 +4415,22 @@ class DISABLED_UsageTableTest : public DISABLED_GenericDRMTest,
|
|||||||
s.close();
|
s.close();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void PrintDotsWhileSleep(time_t total_seconds, time_t interval_seconds) {
|
||||||
|
time_t dot_time = interval_seconds;
|
||||||
|
time_t elapsed_time = 0;
|
||||||
|
time_t start_time = time(NULL);
|
||||||
|
do {
|
||||||
|
sleep(1);
|
||||||
|
elapsed_time = time(NULL) - start_time;
|
||||||
|
if (elapsed_time >= dot_time) {
|
||||||
|
cout << ".";
|
||||||
|
cout.flush();
|
||||||
|
dot_time += interval_seconds;
|
||||||
|
}
|
||||||
|
} while (elapsed_time < total_seconds);
|
||||||
|
cout << endl;
|
||||||
|
}
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
bool new_mac_keys_;
|
bool new_mac_keys_;
|
||||||
};
|
};
|
||||||
@@ -4434,7 +4450,7 @@ TEST_P(DISABLED_UsageTableTest, OnlineLicense) {
|
|||||||
|
|
||||||
ASSERT_EQ(OEMCrypto_SUCCESS, OEMCrypto_UpdateUsageTable());
|
ASSERT_EQ(OEMCrypto_SUCCESS, OEMCrypto_UpdateUsageTable());
|
||||||
s.GenerateReport(pst);
|
s.GenerateReport(pst);
|
||||||
s.GenerateReport(pst);
|
s.GenerateReport(pst); // test repeated report generation
|
||||||
s.GenerateReport(pst);
|
s.GenerateReport(pst);
|
||||||
s.GenerateReport(pst);
|
s.GenerateReport(pst);
|
||||||
EXPECT_EQ(kUnused, s.pst_report()->status);
|
EXPECT_EQ(kUnused, s.pst_report()->status);
|
||||||
@@ -5334,6 +5350,104 @@ TEST_P(DISABLED_UsageTableTest, TimingTest) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST_P(DISABLED_UsageTableTest, VerifyUsageTimes) {
|
||||||
|
if (OEMCrypto_SupportsUsageTable()) {
|
||||||
|
std::string pst = "my_pst";
|
||||||
|
ASSERT_EQ(OEMCrypto_SUCCESS, OEMCrypto_UpdateUsageTable());
|
||||||
|
Session s;
|
||||||
|
s.open();
|
||||||
|
s.GenerateDerivedKeys();
|
||||||
|
s.FillSimpleMessage(
|
||||||
|
0, wvoec_mock::kControlNonceEnabled | wvoec_mock::kControlNonceRequired,
|
||||||
|
s.get_nonce(), pst);
|
||||||
|
s.EncryptAndSign();
|
||||||
|
s.LoadTestKeys(pst, new_mac_keys_);
|
||||||
|
|
||||||
|
const int kLicenseReceivedTimeTolerance = kSpeedMultiplier;
|
||||||
|
ASSERT_EQ(OEMCrypto_SUCCESS, OEMCrypto_UpdateUsageTable());
|
||||||
|
s.GenerateReport(pst);
|
||||||
|
EXPECT_EQ(kUnused, s.pst_report()->status);
|
||||||
|
EXPECT_NEAR(wvcdm::htonll64(s.pst_report()->seconds_since_license_received),
|
||||||
|
0, kLicenseReceivedTimeTolerance);
|
||||||
|
|
||||||
|
const time_t kDotIntervalInSeconds = 5;
|
||||||
|
const time_t kIdleInSeconds = 20;
|
||||||
|
const time_t kPlaybackLoopInSeconds = 2 * 60;
|
||||||
|
const time_t kUsageTableTimeTolerance = 10;
|
||||||
|
|
||||||
|
cout << "This test verifies the elapsed time reported in the usage table "
|
||||||
|
"for a 2 minute simulated playback." << endl;
|
||||||
|
cout << "The total time for this test is about " <<
|
||||||
|
kPlaybackLoopInSeconds + 2 * kIdleInSeconds << " seconds." << endl;
|
||||||
|
cout << "Wait " << kIdleInSeconds <<
|
||||||
|
" seconds to verify usage table time before playback." << endl;
|
||||||
|
|
||||||
|
PrintDotsWhileSleep(kIdleInSeconds, kDotIntervalInSeconds);
|
||||||
|
|
||||||
|
ASSERT_EQ(OEMCrypto_SUCCESS, OEMCrypto_UpdateUsageTable());
|
||||||
|
s.GenerateReport(pst);
|
||||||
|
EXPECT_EQ(kUnused, s.pst_report()->status);
|
||||||
|
EXPECT_NEAR(wvcdm::htonll64(s.pst_report()->seconds_since_license_received),
|
||||||
|
kIdleInSeconds, kLicenseReceivedTimeTolerance);
|
||||||
|
cout << "Start simulated playback..." << endl;
|
||||||
|
|
||||||
|
time_t dot_time = kDotIntervalInSeconds;
|
||||||
|
time_t playback_time = 0;
|
||||||
|
time_t start_time = time(NULL);
|
||||||
|
do {
|
||||||
|
s.TestDecryptCTR();
|
||||||
|
s.GenerateReport(pst);
|
||||||
|
EXPECT_EQ(kActive, s.pst_report()->status);
|
||||||
|
playback_time = time(NULL) - start_time;
|
||||||
|
ASSERT_LE(0, playback_time);
|
||||||
|
if (playback_time >= dot_time) {
|
||||||
|
cout << ".";
|
||||||
|
cout.flush();
|
||||||
|
dot_time += kDotIntervalInSeconds;
|
||||||
|
}
|
||||||
|
} while (playback_time < kPlaybackLoopInSeconds);
|
||||||
|
cout << "\nSimulated playback time = " << playback_time << " seconds.\n";
|
||||||
|
|
||||||
|
ASSERT_EQ(OEMCrypto_SUCCESS, OEMCrypto_UpdateUsageTable());
|
||||||
|
s.GenerateReport(pst);
|
||||||
|
EXPECT_NEAR(wvcdm::htonll64(s.pst_report()->seconds_since_license_received),
|
||||||
|
playback_time + kIdleInSeconds, kLicenseReceivedTimeTolerance);
|
||||||
|
EXPECT_NEAR(wvcdm::htonll64(s.pst_report()->seconds_since_first_decrypt),
|
||||||
|
playback_time, kUsageTableTimeTolerance);
|
||||||
|
EXPECT_NEAR(wvcdm::htonll64(s.pst_report()->seconds_since_last_decrypt),
|
||||||
|
0, kUsageTableTimeTolerance);
|
||||||
|
EXPECT_NEAR(
|
||||||
|
wvcdm::htonll64(s.pst_report()->seconds_since_first_decrypt) -
|
||||||
|
wvcdm::htonll64(s.pst_report()->seconds_since_last_decrypt),
|
||||||
|
playback_time, kUsageTableTimeTolerance);
|
||||||
|
|
||||||
|
cout << "Wait another " << kIdleInSeconds << " seconds "
|
||||||
|
"to verify usage table time since playback ended." << endl;
|
||||||
|
PrintDotsWhileSleep(kIdleInSeconds, kDotIntervalInSeconds);
|
||||||
|
|
||||||
|
// At this point, this is what we expect:
|
||||||
|
// idle playback loop idle
|
||||||
|
// |-----|-------------------------|-----|
|
||||||
|
// |<--->| = seconds_since_last_decrypt
|
||||||
|
// |<----------------------------->| = seconds_since_first_decrypt
|
||||||
|
// |<------------------------------------| = seconds_since_license_received
|
||||||
|
ASSERT_EQ(OEMCrypto_SUCCESS, OEMCrypto_UpdateUsageTable());
|
||||||
|
s.GenerateReport(pst);
|
||||||
|
EXPECT_NEAR(wvcdm::htonll64(s.pst_report()->seconds_since_license_received),
|
||||||
|
playback_time + 2 * kIdleInSeconds,
|
||||||
|
kLicenseReceivedTimeTolerance);
|
||||||
|
EXPECT_NEAR(wvcdm::htonll64(s.pst_report()->seconds_since_first_decrypt),
|
||||||
|
playback_time + kIdleInSeconds, kUsageTableTimeTolerance);
|
||||||
|
EXPECT_NEAR(wvcdm::htonll64(s.pst_report()->seconds_since_last_decrypt),
|
||||||
|
kIdleInSeconds, kUsageTableTimeTolerance);
|
||||||
|
|
||||||
|
DeactivatePST(pst);
|
||||||
|
s.GenerateReport(pst);
|
||||||
|
EXPECT_EQ(kInactive, s.pst_report()->status);
|
||||||
|
s.TestDecryptCTR(false, OEMCrypto_ERROR_UNKNOWN_FAILURE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
INSTANTIATE_TEST_CASE_P(TestUsageTables, DISABLED_UsageTableTest,
|
INSTANTIATE_TEST_CASE_P(TestUsageTables, DISABLED_UsageTableTest,
|
||||||
Values(true, false)); // With and without new_mac_keys.
|
Values(true, false)); // With and without new_mac_keys.
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user