Commit af6af29d authored by Joshua Pawlicki's avatar Joshua Pawlicki Committed by Commit Bot

dlrc/dla for ios Omaha client

Bug: 1056621
Change-Id: I8b711ae0142d42abd3bf79ac18d900b48bb82bc1
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2078651
Commit-Queue: Joshua Pawlicki <waffles@chromium.org>
Auto-Submit: Joshua Pawlicki <waffles@chromium.org>
Reviewed-by: default avatarRohit Rao <rohitrao@chromium.org>
Cr-Commit-Position: refs/heads/master@{#748310}
parent a191dbdf
......@@ -61,6 +61,7 @@ class OmahaService {
FRIEND_TEST_ALL_PREFIXES(OmahaServiceTest, InstallEventMessageTest);
FRIEND_TEST_ALL_PREFIXES(OmahaServiceTest, SendPingFailure);
FRIEND_TEST_ALL_PREFIXES(OmahaServiceTest, SendPingSuccess);
FRIEND_TEST_ALL_PREFIXES(OmahaServiceTest, ParseAndEchoLastServerDate);
FRIEND_TEST_ALL_PREFIXES(OmahaServiceTest, SendInstallEventSuccess);
FRIEND_TEST_ALL_PREFIXES(OmahaServiceTest, SendPingReceiveUpdate);
FRIEND_TEST_ALL_PREFIXES(OmahaServiceTest, PersistStatesTest);
......@@ -193,6 +194,9 @@ class OmahaService {
// Last version for which an installation ping has been sent.
base::Version last_sent_version_;
// Last received server date.
int last_server_date_;
// The language in use at start up.
std::string locale_lang_;
......
......@@ -70,6 +70,7 @@ NSString* const kNumberTriesKey = @"ChromeOmahaServiceNumberTries";
NSString* const kLastSentVersionKey = @"ChromeOmahaServiceLastSentVersion";
NSString* const kLastSentTimeKey = @"ChromeOmahaServiceLastSentTime";
NSString* const kRetryRequestIdKey = @"ChromeOmahaServiceRetryRequestId";
NSString* const kLastServerDateKey = @"ChromeOmahaServiceLastServerDate";
class XmlWrapper : public OmahaXmlWriter {
public:
......@@ -123,7 +124,9 @@ class XmlWrapper : public OmahaXmlWriter {
BOOL _manifestIsParsed;
BOOL _pingIsParsed;
BOOL _eventIsParsed;
BOOL _dayStartIsParsed;
NSString* _appId;
int _serverDate;
std::unique_ptr<UpgradeRecommendedDetails> _updateInformation;
}
......@@ -138,6 +141,10 @@ class XmlWrapper : public OmahaXmlWriter {
// Otherwise, return NULL.
- (UpgradeRecommendedDetails*)upgradeRecommendedDetails;
// If the response was successfully parsed, returns the date according to the
// server.
- (int)serverDate;
@end
@implementation ResponseParser
......@@ -159,9 +166,13 @@ class XmlWrapper : public OmahaXmlWriter {
return _updateInformation.get();
}
- (int)serverDate {
return _serverDate;
}
// This method is parsing a message with the following type:
// <response...>
// <daystart.../>
// <daystart elapsed_days="???" .../>
// <app...>
// <updatecheck status="ok">
// <urls>
......@@ -198,7 +209,7 @@ class XmlWrapper : public OmahaXmlWriter {
// Array of uninteresting tags in the Omaha xml response.
NSArray* ignoredTagNames =
@[ @"action", @"actions", @"daystart", @"package", @"packages", @"urls" ];
@[ @"action", @"actions", @"package", @"packages", @"urls" ];
if ([ignoredTagNames containsObject:elementName])
return;
......@@ -210,6 +221,13 @@ class XmlWrapper : public OmahaXmlWriter {
} else {
_hasError = YES;
}
} else if (!_dayStartIsParsed) {
if ([elementName isEqualToString:@"daystart"]) {
_dayStartIsParsed = YES;
_serverDate = [[attributeDict valueForKey:@"elapsed_days"] integerValue];
} else {
_hasError = YES;
}
} else if (!_appIsParsed) {
if ([elementName isEqualToString:@"app"] &&
[[attributeDict valueForKey:@"status"] isEqualToString:@"ok"] &&
......@@ -363,6 +381,10 @@ void OmahaService::StartInternal() {
number_of_tries_ = [defaults integerForKey:kNumberTriesKey];
last_sent_time_ =
base::Time::FromCFAbsoluteTime([defaults doubleForKey:kLastSentTimeKey]);
last_server_date_ = [defaults integerForKey:kLastServerDateKey];
if (last_server_date_ == 0) {
last_server_date_ = -2; // -2 indicates "unknown" to the Omaha Server.
}
NSString* lastSentVersion = [defaults stringForKey:kLastSentVersionKey];
if (lastSentVersion) {
last_sent_version_ =
......@@ -529,8 +551,11 @@ std::string OmahaService::GetPingContent(const std::string& requestId,
xml_wrapper.EndElement();
// Set up <ping active=1/>
std::string last_server_date = base::StringPrintf("%d", last_server_date_);
xml_wrapper.StartElement("ping");
xml_wrapper.WriteAttribute("active", "1");
xml_wrapper.WriteAttribute("ad", last_server_date.c_str());
xml_wrapper.WriteAttribute("rd", last_server_date.c_str());
xml_wrapper.EndElement();
}
......@@ -634,6 +659,7 @@ void OmahaService::PersistStates() {
[defaults setInteger:number_of_tries_ forKey:kNumberTriesKey];
[defaults setObject:base::SysUTF8ToNSString(last_sent_version_.GetString())
forKey:kLastSentVersionKey];
[defaults setInteger:last_server_date_ forKey:kLastServerDateKey];
// Save critical state information for usage reporting.
[defaults synchronize];
......@@ -677,6 +703,7 @@ void OmahaService::OnURLLoadComplete(
last_sent_time_ = base::Time::Now();
last_sent_version_ = version_info::GetVersion();
sending_install_event_ = false;
last_server_date_ = [delegate serverDate];
ClearInstallRetryRequestId();
PersistStates();
SendOrScheduleNextPing();
......@@ -765,4 +792,5 @@ void OmahaService::ClearPersistentStateForTests() {
[defaults removeObjectForKey:kLastSentVersionKey];
[defaults removeObjectForKey:kLastSentTimeKey];
[defaults removeObjectForKey:kRetryRequestIdKey];
[defaults removeObjectForKey:kLastServerDateKey];
}
......@@ -112,7 +112,7 @@ TEST_F(OmahaServiceTest, PingMessageTest) {
" brand=\"[A-Z][A-Z][A-Z][A-Z]\" client=\"\" appid=\"{[^}]*}\""
" installage=\"0\">"
"<updatecheck tag=\"[^\"]*\"/>"
"<ping active=\"1\"/></app></request>";
"<ping active=\"1\" ad=\"-2\" rd=\"-2\"/></app></request>";
OmahaService service(false);
service.set_upgrade_recommended_callback(
......@@ -138,7 +138,7 @@ TEST_F(OmahaServiceTest, PingMessageTestWithUnknownInstallDate) {
"<app version=\"[^\"]*\" nextversion=\"\" lang=\"[^\"]*\""
" brand=\"[A-Z][A-Z][A-Z][A-Z]\" client=\"\" appid=\"{[^}]*}\">"
"<updatecheck tag=\"[^\"]*\"/>"
"<ping active=\"1\"/></app></request>";
"<ping active=\"1\" ad=\"-2\" rd=\"-2\"/></app></request>";
OmahaService service(false);
service.set_upgrade_recommended_callback(
......@@ -222,7 +222,7 @@ TEST_F(OmahaServiceTest, SendPingSuccess) {
std::string response =
std::string(
"<?xml version=\"1.0\"?><response protocol=\"3.0\" server=\"prod\">"
"<daystart elapsed_seconds=\"56754\"/><app appid=\"") +
"<daystart elapsed_days=\"4088\"/><app appid=\"") +
test_application_id() +
"\" status=\"ok\">"
"<updatecheck status=\"noupdate\"/><ping status=\"ok\"/>"
......@@ -235,9 +235,56 @@ TEST_F(OmahaServiceTest, SendPingSuccess) {
EXPECT_FALSE(service.current_ping_time_.is_null());
EXPECT_EQ(service.current_ping_time_, service.next_tries_time_);
EXPECT_GT(service.last_sent_time_, now);
EXPECT_EQ(4088, service.last_server_date_);
EXPECT_FALSE(NeedUpdate());
}
TEST_F(OmahaServiceTest, ParseAndEchoLastServerDate) {
OmahaService service(false);
service.set_upgrade_recommended_callback(
base::Bind(&OmahaServiceTest::OnNeedUpdate, base::Unretained(this)));
service.InitializeURLLoaderFactory(test_shared_url_loader_factory_);
CleanService(&service, version_info::GetVersionNumber());
service.SendPing();
std::string response =
std::string(
"<?xml version=\"1.0\"?><response protocol=\"3.0\" server=\"prod\">"
"<daystart elapsed_days=\"4088\"/><app appid=\"") +
test_application_id() +
"\" status=\"ok\">"
"<updatecheck status=\"noupdate\"/><ping status=\"ok\"/>"
"</app></response>";
auto* pending_request = test_url_loader_factory_.GetPendingRequest(0);
test_url_loader_factory_.SimulateResponseForPendingRequest(
pending_request->request.url.spec(), response);
EXPECT_EQ(4088, service.last_server_date_);
const char* expectedResult =
"<request protocol=\"3.0\" version=\"iOS-1.0.0.0\" ismachine=\"1\" "
"requestid=\"requestId\" sessionid=\"sessionId\""
" hardware_class=\"[^\"]*\">"
"<os platform=\"ios\" version=\"[0-9][0-9]*\\(\\.[0-9][0-9]*\\)*\""
" arch=\"[^\"]*\"/>"
"<app version=\"[^\"]*\" nextversion=\"\" lang=\"[^\"]*\""
" brand=\"[A-Z][A-Z][A-Z][A-Z]\" client=\"\" appid=\"{[^}]*}\">"
"<updatecheck tag=\"[^\"]*\"/>"
"<ping active=\"1\" ad=\"4088\" rd=\"4088\"/></app></request>";
std::string content = service.GetPingContent(
"requestId", "sessionId", version_info::GetVersionNumber(),
GetChannelString(),
base::Time::FromTimeT(install_time_util::kUnknownInstallDate),
OmahaService::USAGE_PING);
regex_t regex;
regcomp(&regex, expectedResult, REG_NOSUB);
int result = regexec(&regex, content.c_str(), 0, nullptr, 0);
regfree(&regex);
EXPECT_EQ(0, result);
}
TEST_F(OmahaServiceTest, SendInstallEventSuccess) {
base::Time now = base::Time::Now();
OmahaService service(false);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment