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 { ...@@ -61,6 +61,7 @@ class OmahaService {
FRIEND_TEST_ALL_PREFIXES(OmahaServiceTest, InstallEventMessageTest); FRIEND_TEST_ALL_PREFIXES(OmahaServiceTest, InstallEventMessageTest);
FRIEND_TEST_ALL_PREFIXES(OmahaServiceTest, SendPingFailure); FRIEND_TEST_ALL_PREFIXES(OmahaServiceTest, SendPingFailure);
FRIEND_TEST_ALL_PREFIXES(OmahaServiceTest, SendPingSuccess); FRIEND_TEST_ALL_PREFIXES(OmahaServiceTest, SendPingSuccess);
FRIEND_TEST_ALL_PREFIXES(OmahaServiceTest, ParseAndEchoLastServerDate);
FRIEND_TEST_ALL_PREFIXES(OmahaServiceTest, SendInstallEventSuccess); FRIEND_TEST_ALL_PREFIXES(OmahaServiceTest, SendInstallEventSuccess);
FRIEND_TEST_ALL_PREFIXES(OmahaServiceTest, SendPingReceiveUpdate); FRIEND_TEST_ALL_PREFIXES(OmahaServiceTest, SendPingReceiveUpdate);
FRIEND_TEST_ALL_PREFIXES(OmahaServiceTest, PersistStatesTest); FRIEND_TEST_ALL_PREFIXES(OmahaServiceTest, PersistStatesTest);
...@@ -193,6 +194,9 @@ class OmahaService { ...@@ -193,6 +194,9 @@ class OmahaService {
// Last version for which an installation ping has been sent. // Last version for which an installation ping has been sent.
base::Version last_sent_version_; base::Version last_sent_version_;
// Last received server date.
int last_server_date_;
// The language in use at start up. // The language in use at start up.
std::string locale_lang_; std::string locale_lang_;
......
...@@ -70,6 +70,7 @@ NSString* const kNumberTriesKey = @"ChromeOmahaServiceNumberTries"; ...@@ -70,6 +70,7 @@ NSString* const kNumberTriesKey = @"ChromeOmahaServiceNumberTries";
NSString* const kLastSentVersionKey = @"ChromeOmahaServiceLastSentVersion"; NSString* const kLastSentVersionKey = @"ChromeOmahaServiceLastSentVersion";
NSString* const kLastSentTimeKey = @"ChromeOmahaServiceLastSentTime"; NSString* const kLastSentTimeKey = @"ChromeOmahaServiceLastSentTime";
NSString* const kRetryRequestIdKey = @"ChromeOmahaServiceRetryRequestId"; NSString* const kRetryRequestIdKey = @"ChromeOmahaServiceRetryRequestId";
NSString* const kLastServerDateKey = @"ChromeOmahaServiceLastServerDate";
class XmlWrapper : public OmahaXmlWriter { class XmlWrapper : public OmahaXmlWriter {
public: public:
...@@ -123,7 +124,9 @@ class XmlWrapper : public OmahaXmlWriter { ...@@ -123,7 +124,9 @@ class XmlWrapper : public OmahaXmlWriter {
BOOL _manifestIsParsed; BOOL _manifestIsParsed;
BOOL _pingIsParsed; BOOL _pingIsParsed;
BOOL _eventIsParsed; BOOL _eventIsParsed;
BOOL _dayStartIsParsed;
NSString* _appId; NSString* _appId;
int _serverDate;
std::unique_ptr<UpgradeRecommendedDetails> _updateInformation; std::unique_ptr<UpgradeRecommendedDetails> _updateInformation;
} }
...@@ -138,6 +141,10 @@ class XmlWrapper : public OmahaXmlWriter { ...@@ -138,6 +141,10 @@ class XmlWrapper : public OmahaXmlWriter {
// Otherwise, return NULL. // Otherwise, return NULL.
- (UpgradeRecommendedDetails*)upgradeRecommendedDetails; - (UpgradeRecommendedDetails*)upgradeRecommendedDetails;
// If the response was successfully parsed, returns the date according to the
// server.
- (int)serverDate;
@end @end
@implementation ResponseParser @implementation ResponseParser
...@@ -159,9 +166,13 @@ class XmlWrapper : public OmahaXmlWriter { ...@@ -159,9 +166,13 @@ class XmlWrapper : public OmahaXmlWriter {
return _updateInformation.get(); return _updateInformation.get();
} }
- (int)serverDate {
return _serverDate;
}
// This method is parsing a message with the following type: // This method is parsing a message with the following type:
// <response...> // <response...>
// <daystart.../> // <daystart elapsed_days="???" .../>
// <app...> // <app...>
// <updatecheck status="ok"> // <updatecheck status="ok">
// <urls> // <urls>
...@@ -198,7 +209,7 @@ class XmlWrapper : public OmahaXmlWriter { ...@@ -198,7 +209,7 @@ class XmlWrapper : public OmahaXmlWriter {
// Array of uninteresting tags in the Omaha xml response. // Array of uninteresting tags in the Omaha xml response.
NSArray* ignoredTagNames = NSArray* ignoredTagNames =
@[ @"action", @"actions", @"daystart", @"package", @"packages", @"urls" ]; @[ @"action", @"actions", @"package", @"packages", @"urls" ];
if ([ignoredTagNames containsObject:elementName]) if ([ignoredTagNames containsObject:elementName])
return; return;
...@@ -210,6 +221,13 @@ class XmlWrapper : public OmahaXmlWriter { ...@@ -210,6 +221,13 @@ class XmlWrapper : public OmahaXmlWriter {
} else { } else {
_hasError = YES; _hasError = YES;
} }
} else if (!_dayStartIsParsed) {
if ([elementName isEqualToString:@"daystart"]) {
_dayStartIsParsed = YES;
_serverDate = [[attributeDict valueForKey:@"elapsed_days"] integerValue];
} else {
_hasError = YES;
}
} else if (!_appIsParsed) { } else if (!_appIsParsed) {
if ([elementName isEqualToString:@"app"] && if ([elementName isEqualToString:@"app"] &&
[[attributeDict valueForKey:@"status"] isEqualToString:@"ok"] && [[attributeDict valueForKey:@"status"] isEqualToString:@"ok"] &&
...@@ -363,6 +381,10 @@ void OmahaService::StartInternal() { ...@@ -363,6 +381,10 @@ void OmahaService::StartInternal() {
number_of_tries_ = [defaults integerForKey:kNumberTriesKey]; number_of_tries_ = [defaults integerForKey:kNumberTriesKey];
last_sent_time_ = last_sent_time_ =
base::Time::FromCFAbsoluteTime([defaults doubleForKey:kLastSentTimeKey]); 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]; NSString* lastSentVersion = [defaults stringForKey:kLastSentVersionKey];
if (lastSentVersion) { if (lastSentVersion) {
last_sent_version_ = last_sent_version_ =
...@@ -529,8 +551,11 @@ std::string OmahaService::GetPingContent(const std::string& requestId, ...@@ -529,8 +551,11 @@ std::string OmahaService::GetPingContent(const std::string& requestId,
xml_wrapper.EndElement(); xml_wrapper.EndElement();
// Set up <ping active=1/> // Set up <ping active=1/>
std::string last_server_date = base::StringPrintf("%d", last_server_date_);
xml_wrapper.StartElement("ping"); xml_wrapper.StartElement("ping");
xml_wrapper.WriteAttribute("active", "1"); 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(); xml_wrapper.EndElement();
} }
...@@ -634,6 +659,7 @@ void OmahaService::PersistStates() { ...@@ -634,6 +659,7 @@ void OmahaService::PersistStates() {
[defaults setInteger:number_of_tries_ forKey:kNumberTriesKey]; [defaults setInteger:number_of_tries_ forKey:kNumberTriesKey];
[defaults setObject:base::SysUTF8ToNSString(last_sent_version_.GetString()) [defaults setObject:base::SysUTF8ToNSString(last_sent_version_.GetString())
forKey:kLastSentVersionKey]; forKey:kLastSentVersionKey];
[defaults setInteger:last_server_date_ forKey:kLastServerDateKey];
// Save critical state information for usage reporting. // Save critical state information for usage reporting.
[defaults synchronize]; [defaults synchronize];
...@@ -677,6 +703,7 @@ void OmahaService::OnURLLoadComplete( ...@@ -677,6 +703,7 @@ void OmahaService::OnURLLoadComplete(
last_sent_time_ = base::Time::Now(); last_sent_time_ = base::Time::Now();
last_sent_version_ = version_info::GetVersion(); last_sent_version_ = version_info::GetVersion();
sending_install_event_ = false; sending_install_event_ = false;
last_server_date_ = [delegate serverDate];
ClearInstallRetryRequestId(); ClearInstallRetryRequestId();
PersistStates(); PersistStates();
SendOrScheduleNextPing(); SendOrScheduleNextPing();
...@@ -765,4 +792,5 @@ void OmahaService::ClearPersistentStateForTests() { ...@@ -765,4 +792,5 @@ void OmahaService::ClearPersistentStateForTests() {
[defaults removeObjectForKey:kLastSentVersionKey]; [defaults removeObjectForKey:kLastSentVersionKey];
[defaults removeObjectForKey:kLastSentTimeKey]; [defaults removeObjectForKey:kLastSentTimeKey];
[defaults removeObjectForKey:kRetryRequestIdKey]; [defaults removeObjectForKey:kRetryRequestIdKey];
[defaults removeObjectForKey:kLastServerDateKey];
} }
...@@ -112,7 +112,7 @@ TEST_F(OmahaServiceTest, PingMessageTest) { ...@@ -112,7 +112,7 @@ TEST_F(OmahaServiceTest, PingMessageTest) {
" brand=\"[A-Z][A-Z][A-Z][A-Z]\" client=\"\" appid=\"{[^}]*}\"" " brand=\"[A-Z][A-Z][A-Z][A-Z]\" client=\"\" appid=\"{[^}]*}\""
" installage=\"0\">" " installage=\"0\">"
"<updatecheck tag=\"[^\"]*\"/>" "<updatecheck tag=\"[^\"]*\"/>"
"<ping active=\"1\"/></app></request>"; "<ping active=\"1\" ad=\"-2\" rd=\"-2\"/></app></request>";
OmahaService service(false); OmahaService service(false);
service.set_upgrade_recommended_callback( service.set_upgrade_recommended_callback(
...@@ -138,7 +138,7 @@ TEST_F(OmahaServiceTest, PingMessageTestWithUnknownInstallDate) { ...@@ -138,7 +138,7 @@ TEST_F(OmahaServiceTest, PingMessageTestWithUnknownInstallDate) {
"<app version=\"[^\"]*\" nextversion=\"\" lang=\"[^\"]*\"" "<app version=\"[^\"]*\" nextversion=\"\" lang=\"[^\"]*\""
" brand=\"[A-Z][A-Z][A-Z][A-Z]\" client=\"\" appid=\"{[^}]*}\">" " brand=\"[A-Z][A-Z][A-Z][A-Z]\" client=\"\" appid=\"{[^}]*}\">"
"<updatecheck tag=\"[^\"]*\"/>" "<updatecheck tag=\"[^\"]*\"/>"
"<ping active=\"1\"/></app></request>"; "<ping active=\"1\" ad=\"-2\" rd=\"-2\"/></app></request>";
OmahaService service(false); OmahaService service(false);
service.set_upgrade_recommended_callback( service.set_upgrade_recommended_callback(
...@@ -222,7 +222,7 @@ TEST_F(OmahaServiceTest, SendPingSuccess) { ...@@ -222,7 +222,7 @@ TEST_F(OmahaServiceTest, SendPingSuccess) {
std::string response = std::string response =
std::string( std::string(
"<?xml version=\"1.0\"?><response protocol=\"3.0\" server=\"prod\">" "<?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() + test_application_id() +
"\" status=\"ok\">" "\" status=\"ok\">"
"<updatecheck status=\"noupdate\"/><ping status=\"ok\"/>" "<updatecheck status=\"noupdate\"/><ping status=\"ok\"/>"
...@@ -235,9 +235,56 @@ TEST_F(OmahaServiceTest, SendPingSuccess) { ...@@ -235,9 +235,56 @@ TEST_F(OmahaServiceTest, SendPingSuccess) {
EXPECT_FALSE(service.current_ping_time_.is_null()); EXPECT_FALSE(service.current_ping_time_.is_null());
EXPECT_EQ(service.current_ping_time_, service.next_tries_time_); EXPECT_EQ(service.current_ping_time_, service.next_tries_time_);
EXPECT_GT(service.last_sent_time_, now); EXPECT_GT(service.last_sent_time_, now);
EXPECT_EQ(4088, service.last_server_date_);
EXPECT_FALSE(NeedUpdate()); 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) { TEST_F(OmahaServiceTest, SendInstallEventSuccess) {
base::Time now = base::Time::Now(); base::Time now = base::Time::Now();
OmahaService service(false); 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