Merge of the widevine change: https://widevine-internal-review.googlesource.com/#/c/11632 Several unit tests in cdm_engine_test.cpp and request_license_test.cpp were failing regularly. These were caused by either: 1) The device was not provisioned. This has been fixed by adding a certificate provisioning step in the test setup for the cdm engine tests and changing the existing provision steop in the request license tests to provision for both security levels. 2) The device was hitting a flaky server. This has been fixed by switching from the GooglePlayServer to the Widevine server. 3) A null pointer introduced when testing secure stops with an app id. This has been fixed by directly injecting the app id in the unit tests. 4) Flaky network connections. The unit tests were requesting data from the server and were timing out after 3 seconds. I changed that to 12 seconds. 5) The tests were searching for an end-of-line marker to find the GLS header in the license response message. The end-of-line marker was present in a valid DRM message for almost 1% of the test cases. This code has been replaced by searching for the string "GLS/1" at the begining of the HTML body. I also added test_printers.cpp that defines functions used by GTest to print error codes by name instead of numeric value. This CL changes unit tests only. It does not change any production code. bug: 18316036 Change-Id: I3398580059a03114e782ac7ac59e6b0944012df4
84 lines
2.9 KiB
C++
84 lines
2.9 KiB
C++
// Copyright 2013 Google Inc. All Rights Reserved.
|
|
|
|
#include "license_request.h"
|
|
#include "log.h"
|
|
|
|
namespace wvcdm {
|
|
|
|
static const std::string kTwoBlankLines("\r\n\r\n");
|
|
|
|
size_t LicenseRequest::FindHeaderEndPosition(
|
|
const std::string& response) const {
|
|
return(response.find(kTwoBlankLines));
|
|
}
|
|
|
|
// This routine parses the license server's response message and
|
|
// extracts the drm message from the response header.
|
|
void LicenseRequest::GetDrmMessage(const std::string& response,
|
|
std::string& drm_msg) {
|
|
if (response.empty()) {
|
|
drm_msg.clear();
|
|
return;
|
|
}
|
|
|
|
// Extracts DRM message.
|
|
// Content-Length = GLS line + Header(s) + empty line + drm message;
|
|
// we use the empty line to locate the drm message, and compute
|
|
// the drm message length as below instead of using Content-Length
|
|
size_t header_end_pos = FindHeaderEndPosition(response);
|
|
if (header_end_pos != std::string::npos) {
|
|
header_end_pos += kTwoBlankLines.size(); // points to response body
|
|
|
|
drm_msg.clear();
|
|
// Messages from Google Play server add a GLS wrapper. These start
|
|
// with "GLS/1.0 <status>".
|
|
if (response.find("GLS/1.", header_end_pos) == header_end_pos) {
|
|
// For GLS messages, we should skip past the next blank line, and use
|
|
// what's left of the message.
|
|
size_t drm_msg_pos = response.find(kTwoBlankLines, header_end_pos);
|
|
if (drm_msg_pos != std::string::npos) {
|
|
drm_msg_pos += kTwoBlankLines.size(); // points to drm message
|
|
drm_msg = response.substr(drm_msg_pos);
|
|
} else {
|
|
LOGE("Message had GLS marker, but did not have extra blank line.");
|
|
drm_msg = response.substr(header_end_pos);
|
|
}
|
|
} else {
|
|
// For servers that do not use the GLS wrapper, we should just strip of
|
|
// the headers, and use the rest of the message.
|
|
drm_msg = response.substr(header_end_pos);
|
|
}
|
|
} else {
|
|
LOGE("response body not found");
|
|
}
|
|
}
|
|
|
|
// Returns heartbeat url in heartbeat_url.
|
|
// The heartbeat url is stored as meta data in the response message.
|
|
void LicenseRequest::GetHeartbeatUrl(const std::string& response,
|
|
std::string& heartbeat_url) {
|
|
if (response.empty()) {
|
|
heartbeat_url.clear();
|
|
return;
|
|
}
|
|
|
|
size_t header_end_pos = FindHeaderEndPosition(response);
|
|
if (header_end_pos != std::string::npos) {
|
|
header_end_pos += kTwoBlankLines.size(); // points to response body
|
|
|
|
heartbeat_url.clear();
|
|
size_t heartbeat_url_pos = response.find("Heartbeat-Url: ",
|
|
header_end_pos);
|
|
if (heartbeat_url_pos != std::string::npos) {
|
|
heartbeat_url_pos += sizeof("Heartbeat-Url: ");
|
|
heartbeat_url.assign(response.substr(heartbeat_url_pos));
|
|
} else {
|
|
LOGE("heartbeat url not found");
|
|
}
|
|
} else {
|
|
LOGE("response body not found");
|
|
}
|
|
}
|
|
|
|
} // namespace wvcdm
|