123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147 |
- //
- // Copyright (C) 2012 The Android Open Source Project
- //
- // Licensed under the Apache License, Version 2.0 (the "License");
- // you may not use this file except in compliance with the License.
- // You may obtain a copy of the License at
- //
- // http://www.apache.org/licenses/LICENSE-2.0
- //
- // Unless required by applicable law or agreed to in writing, software
- // distributed under the License is distributed on an "AS IS" BASIS,
- // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- // See the License for the specific language governing permissions and
- // limitations under the License.
- //
- #include "update_engine/omaha_request_action.h"
- #include <stdint.h>
- #include <memory>
- #include <string>
- #include <utility>
- #include <vector>
- #include <base/bind.h>
- #include <base/files/file_util.h>
- #include <base/files/scoped_temp_dir.h>
- #include <base/memory/ptr_util.h>
- #include <base/strings/string_number_conversions.h>
- #include <base/strings/string_util.h>
- #include <base/strings/stringprintf.h>
- #include <base/time/time.h>
- #include <brillo/message_loops/fake_message_loop.h>
- #include <brillo/message_loops/message_loop.h>
- #include <brillo/message_loops/message_loop_utils.h>
- #include <gtest/gtest.h>
- #include <policy/libpolicy.h>
- #include <policy/mock_libpolicy.h>
- #include "update_engine/common/action_pipe.h"
- #include "update_engine/common/constants.h"
- #include "update_engine/common/fake_prefs.h"
- #include "update_engine/common/hash_calculator.h"
- #include "update_engine/common/mock_http_fetcher.h"
- #include "update_engine/common/platform_constants.h"
- #include "update_engine/common/prefs.h"
- #include "update_engine/common/test_utils.h"
- #include "update_engine/fake_system_state.h"
- #include "update_engine/metrics_reporter_interface.h"
- #include "update_engine/mock_connection_manager.h"
- #include "update_engine/mock_payload_state.h"
- #include "update_engine/omaha_request_params.h"
- #include "update_engine/update_manager/rollback_prefs.h"
- using base::Time;
- using base::TimeDelta;
- using chromeos_update_manager::kRollforwardInfinity;
- using std::string;
- using std::vector;
- using testing::_;
- using testing::AllOf;
- using testing::AnyNumber;
- using testing::DoAll;
- using testing::Ge;
- using testing::Le;
- using testing::NiceMock;
- using testing::Return;
- using testing::ReturnPointee;
- using testing::ReturnRef;
- using testing::SaveArg;
- using testing::SetArgPointee;
- namespace {
- static_assert(kRollforwardInfinity == 0xfffffffe,
- "Don't change the value of kRollforward infinity unless its "
- "size has been changed in firmware.");
- const char kCurrentVersion[] = "0.1.0.0";
- const char kTestAppId[] = "test-app-id";
- const char kTestAppId2[] = "test-app2-id";
- const char kTestAppIdSkipUpdatecheck[] = "test-app-id-skip-updatecheck";
- // This is a helper struct to allow unit tests build an update response with the
- // values they care about.
- struct FakeUpdateResponse {
- string GetRollbackVersionAttributes() const {
- return (rollback ? " _rollback=\"true\"" : "") +
- (!rollback_firmware_version.empty()
- ? " _firmware_version=\"" + rollback_firmware_version + "\""
- : "") +
- (!rollback_kernel_version.empty()
- ? " _kernel_version=\"" + rollback_kernel_version + "\""
- : "");
- }
- string GetNoUpdateResponse() const {
- string entity_str;
- if (include_entity)
- entity_str = "<!DOCTYPE response [<!ENTITY CrOS \"ChromeOS\">]>";
- return "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" + entity_str +
- "<response protocol=\"3.0\">"
- "<daystart elapsed_seconds=\"100\"/>"
- "<app appid=\"" +
- app_id + "\" " +
- (include_cohorts
- ? "cohort=\"" + cohort + "\" cohorthint=\"" + cohorthint +
- "\" cohortname=\"" + cohortname + "\" "
- : "") +
- " status=\"ok\">"
- "<ping status=\"ok\"/>"
- "<updatecheck status=\"noupdate\"/></app>" +
- (multi_app_no_update
- ? "<app appid=\"" + app_id2 +
- "\"><updatecheck status=\"noupdate\"/></app>"
- : "") +
- "</response>";
- }
- string GetUpdateResponse() const {
- return "<?xml version=\"1.0\" encoding=\"UTF-8\"?><response "
- "protocol=\"3.0\">"
- "<daystart elapsed_seconds=\"100\"" +
- (elapsed_days.empty() ? ""
- : (" elapsed_days=\"" + elapsed_days + "\"")) +
- "/>"
- "<app appid=\"" +
- app_id + "\" " +
- (include_cohorts
- ? "cohort=\"" + cohort + "\" cohorthint=\"" + cohorthint +
- "\" cohortname=\"" + cohortname + "\" "
- : "") +
- " status=\"ok\">"
- "<ping status=\"ok\"/><updatecheck status=\"ok\"" +
- GetRollbackVersionAttributes() + ">" + "<urls><url codebase=\"" +
- codebase +
- "\"/></urls>"
- "<manifest version=\"" +
- version +
- "\">"
- "<packages><package hash=\"not-used\" name=\"" +
- filename + "\" size=\"" + base::Int64ToString(size) +
- "\" hash_sha256=\"" + hash + "\"/>" +
- (multi_package ? "<package name=\"package2\" size=\"222\" "
- "hash_sha256=\"hash2\"/>"
- : "") +
- "</packages>"
- "<actions><action event=\"postinstall\" MetadataSize=\"11" +
- (multi_package ? ":22" : "") + "\" MoreInfo=\"" + more_info_url +
- "\" Prompt=\"" + prompt +
- "\" "
- "IsDeltaPayload=\"true" +
- (multi_package ? ":false" : "") +
- "\" "
- "MaxDaysToScatter=\"" +
- max_days_to_scatter +
- "\" "
- "sha256=\"not-used\" " +
- (deadline.empty() ? "" : ("deadline=\"" + deadline + "\" ")) +
- (disable_p2p_for_downloading ? "DisableP2PForDownloading=\"true\" "
- : "") +
- (disable_p2p_for_sharing ? "DisableP2PForSharing=\"true\" " : "") +
- (powerwash ? "Powerwash=\"true\" " : "") +
- "/></actions></manifest></updatecheck></app>" +
- (multi_app
- ? "<app appid=\"" + app_id2 + "\"" +
- (include_cohorts ? " cohort=\"cohort2\"" : "") +
- "><updatecheck status=\"ok\"><urls><url codebase=\"" +
- codebase2 + "\"/></urls><manifest version=\"" + version2 +
- "\"><packages>"
- "<package name=\"package3\" size=\"333\" "
- "hash_sha256=\"hash3\"/></packages>"
- "<actions><action event=\"postinstall\" " +
- (multi_app_self_update
- ? "noupdate=\"true\" IsDeltaPayload=\"true\" "
- : "IsDeltaPayload=\"false\" ") +
- "MetadataSize=\"33\"/></actions>"
- "</manifest></updatecheck></app>"
- : "") +
- (multi_app_no_update
- ? "<app><updatecheck status=\"noupdate\"/></app>"
- : "") +
- (multi_app_skip_updatecheck
- ? "<app appid=\"" + app_id_skip_updatecheck + "\"></app>"
- : "") +
- "</response>";
- }
- // Return the payload URL, which is split in two fields in the XML response.
- string GetPayloadUrl() { return codebase + filename; }
- string app_id = kTestAppId;
- string app_id2 = kTestAppId2;
- string app_id_skip_updatecheck = kTestAppIdSkipUpdatecheck;
- string current_version = kCurrentVersion;
- string version = "1.2.3.4";
- string version2 = "2.3.4.5";
- string more_info_url = "http://more/info";
- string prompt = "true";
- string codebase = "http://code/base/";
- string codebase2 = "http://code/base/2/";
- string filename = "file.signed";
- string hash = "4841534831323334";
- uint64_t size = 123;
- string deadline = "";
- string max_days_to_scatter = "7";
- string elapsed_days = "42";
- // P2P setting defaults to allowed.
- bool disable_p2p_for_downloading = false;
- bool disable_p2p_for_sharing = false;
- bool powerwash = false;
- // Omaha cohorts settings.
- bool include_cohorts = false;
- string cohort = "";
- string cohorthint = "";
- string cohortname = "";
- // Whether to include the CrOS <!ENTITY> in the XML response.
- bool include_entity = false;
- // Whether to include more than one app.
- bool multi_app = false;
- // Whether to include an app with noupdate="true".
- bool multi_app_self_update = false;
- // Whether to include an additional app with status="noupdate".
- bool multi_app_no_update = false;
- // Whether to include an additional app with no updatecheck tag.
- bool multi_app_skip_updatecheck = false;
- // Whether to include more than one package in an app.
- bool multi_package = false;
- // Whether the payload is a rollback.
- bool rollback = false;
- // The verified boot firmware key version for the rollback image.
- string rollback_firmware_version = "";
- // The verified boot kernel key version for the rollback image.
- string rollback_kernel_version = "";
- };
- } // namespace
- namespace chromeos_update_engine {
- class OmahaRequestActionTestProcessorDelegate : public ActionProcessorDelegate {
- public:
- OmahaRequestActionTestProcessorDelegate()
- : expected_code_(ErrorCode::kSuccess),
- interactive_(false),
- test_http_fetcher_headers_(false) {}
- ~OmahaRequestActionTestProcessorDelegate() override = default;
- void ProcessingDone(const ActionProcessor* processor,
- ErrorCode code) override {
- brillo::MessageLoop::current()->BreakLoop();
- }
- void ActionCompleted(ActionProcessor* processor,
- AbstractAction* action,
- ErrorCode code) override {
- // Make sure actions always succeed.
- if (action->Type() == OmahaRequestAction::StaticType()) {
- EXPECT_EQ(expected_code_, code);
- // Check that the headers were set in the fetcher during the action. Note
- // that we set this request as "interactive".
- auto fetcher = static_cast<const MockHttpFetcher*>(
- static_cast<OmahaRequestAction*>(action)->http_fetcher_.get());
- if (test_http_fetcher_headers_) {
- EXPECT_EQ(interactive_ ? "fg" : "bg",
- fetcher->GetHeader("X-Goog-Update-Interactivity"));
- EXPECT_EQ(kTestAppId, fetcher->GetHeader("X-Goog-Update-AppId"));
- EXPECT_NE("", fetcher->GetHeader("X-Goog-Update-Updater"));
- }
- post_data_ = fetcher->post_data();
- } else if (action->Type() ==
- ObjectCollectorAction<OmahaResponse>::StaticType()) {
- EXPECT_EQ(ErrorCode::kSuccess, code);
- auto collector_action =
- static_cast<ObjectCollectorAction<OmahaResponse>*>(action);
- omaha_response_.reset(new OmahaResponse(collector_action->object()));
- EXPECT_TRUE(omaha_response_);
- } else {
- EXPECT_EQ(ErrorCode::kSuccess, code);
- }
- }
- ErrorCode expected_code_;
- brillo::Blob post_data_;
- bool interactive_;
- bool test_http_fetcher_headers_;
- std::unique_ptr<OmahaResponse> omaha_response_;
- };
- class OmahaRequestActionTest : public ::testing::Test {
- protected:
- void SetUp() override {
- request_params_.set_os_sp("service_pack");
- request_params_.set_os_board("x86-generic");
- request_params_.set_app_id(kTestAppId);
- request_params_.set_app_version(kCurrentVersion);
- request_params_.set_app_lang("en-US");
- request_params_.set_current_channel("unittest");
- request_params_.set_target_channel("unittest");
- request_params_.set_hwid("OEM MODEL 09235 7471");
- request_params_.set_fw_version("ChromeOSFirmware.1.0");
- request_params_.set_ec_version("0X0A1");
- request_params_.set_delta_okay(true);
- request_params_.set_interactive(false);
- request_params_.set_update_url("http://url");
- request_params_.set_target_version_prefix("");
- request_params_.set_rollback_allowed(false);
- request_params_.set_is_powerwash_allowed(false);
- request_params_.set_is_install(false);
- request_params_.set_dlc_module_ids({});
- fake_system_state_.set_request_params(&request_params_);
- fake_system_state_.set_prefs(&fake_prefs_);
- }
- // Returns true iff an output response was obtained from the
- // OmahaRequestAction. |prefs| may be null, in which case a local MockPrefs
- // is used. |payload_state| may be null, in which case a local mock is used.
- // |p2p_manager| may be null, in which case a local mock is used.
- // |connection_manager| may be null, in which case a local mock is used.
- // out_response may be null. If |fail_http_response_code| is non-negative,
- // the transfer will fail with that code. |ping_only| is passed through to the
- // OmahaRequestAction constructor. out_post_data may be null; if non-null, the
- // post-data received by the mock HttpFetcher is returned.
- //
- // The |expected_check_result|, |expected_check_reaction| and
- // |expected_error_code| parameters are for checking expectations
- // about reporting UpdateEngine.Check.{Result,Reaction,DownloadError}
- // UMA statistics. Use the appropriate ::kUnset value to specify that
- // the given metric should not be reported.
- bool TestUpdateCheck(const string& http_response,
- int fail_http_response_code,
- bool ping_only,
- bool is_consumer_device,
- int rollback_allowed_milestones,
- bool is_policy_loaded,
- ErrorCode expected_code,
- metrics::CheckResult expected_check_result,
- metrics::CheckReaction expected_check_reaction,
- metrics::DownloadErrorCode expected_download_error_code,
- OmahaResponse* out_response,
- brillo::Blob* out_post_data);
- // Overload of TestUpdateCheck that does not supply |is_consumer_device| or
- // |rollback_allowed_milestones| which are only required for rollback tests.
- bool TestUpdateCheck(const string& http_response,
- int fail_http_response_code,
- bool ping_only,
- ErrorCode expected_code,
- metrics::CheckResult expected_check_result,
- metrics::CheckReaction expected_check_reaction,
- metrics::DownloadErrorCode expected_download_error_code,
- OmahaResponse* out_response,
- brillo::Blob* out_post_data);
- void TestRollbackCheck(bool is_consumer_device,
- int rollback_allowed_milestones,
- bool is_policy_loaded,
- OmahaResponse* out_response);
- void TestEvent(OmahaEvent* event,
- const string& http_response,
- brillo::Blob* out_post_data);
- // Runs and checks a ping test. |ping_only| indicates whether it should send
- // only a ping or also an updatecheck.
- void PingTest(bool ping_only);
- // InstallDate test helper function.
- bool InstallDateParseHelper(const string& elapsed_days,
- OmahaResponse* response);
- // P2P test helper function.
- void P2PTest(bool initial_allow_p2p_for_downloading,
- bool initial_allow_p2p_for_sharing,
- bool omaha_disable_p2p_for_downloading,
- bool omaha_disable_p2p_for_sharing,
- bool payload_state_allow_p2p_attempt,
- bool expect_p2p_client_lookup,
- const string& p2p_client_result_url,
- bool expected_allow_p2p_for_downloading,
- bool expected_allow_p2p_for_sharing,
- const string& expected_p2p_url);
- FakeSystemState fake_system_state_;
- FakeUpdateResponse fake_update_response_;
- // Used by all tests.
- OmahaRequestParams request_params_{&fake_system_state_};
- FakePrefs fake_prefs_;
- OmahaRequestActionTestProcessorDelegate delegate_;
- bool test_http_fetcher_headers_{false};
- };
- bool OmahaRequestActionTest::TestUpdateCheck(
- const string& http_response,
- int fail_http_response_code,
- bool ping_only,
- bool is_consumer_device,
- int rollback_allowed_milestones,
- bool is_policy_loaded,
- ErrorCode expected_code,
- metrics::CheckResult expected_check_result,
- metrics::CheckReaction expected_check_reaction,
- metrics::DownloadErrorCode expected_download_error_code,
- OmahaResponse* out_response,
- brillo::Blob* out_post_data) {
- brillo::FakeMessageLoop loop(nullptr);
- loop.SetAsCurrent();
- auto fetcher = std::make_unique<MockHttpFetcher>(
- http_response.data(), http_response.size(), nullptr);
- if (fail_http_response_code >= 0) {
- fetcher->FailTransfer(fail_http_response_code);
- }
- // This ensures the tests didn't forget to update fake_system_state_ if they
- // are not using the default request_params_.
- EXPECT_EQ(&request_params_, fake_system_state_.request_params());
- auto omaha_request_action = std::make_unique<OmahaRequestAction>(
- &fake_system_state_, nullptr, std::move(fetcher), ping_only);
- auto mock_policy_provider =
- std::make_unique<NiceMock<policy::MockPolicyProvider>>();
- EXPECT_CALL(*mock_policy_provider, IsConsumerDevice())
- .WillRepeatedly(Return(is_consumer_device));
- EXPECT_CALL(*mock_policy_provider, device_policy_is_loaded())
- .WillRepeatedly(Return(is_policy_loaded));
- const policy::MockDevicePolicy device_policy;
- const bool get_allowed_milestone_succeeds = rollback_allowed_milestones >= 0;
- EXPECT_CALL(device_policy, GetRollbackAllowedMilestones(_))
- .WillRepeatedly(DoAll(SetArgPointee<0>(rollback_allowed_milestones),
- Return(get_allowed_milestone_succeeds)));
- EXPECT_CALL(*mock_policy_provider, GetDevicePolicy())
- .WillRepeatedly(ReturnRef(device_policy));
- omaha_request_action->policy_provider_ = std::move(mock_policy_provider);
- delegate_.expected_code_ = expected_code;
- delegate_.interactive_ = request_params_.interactive();
- delegate_.test_http_fetcher_headers_ = test_http_fetcher_headers_;
- ActionProcessor processor;
- processor.set_delegate(&delegate_);
- auto collector_action =
- std::make_unique<ObjectCollectorAction<OmahaResponse>>();
- BondActions(omaha_request_action.get(), collector_action.get());
- processor.EnqueueAction(std::move(omaha_request_action));
- processor.EnqueueAction(std::move(collector_action));
- EXPECT_CALL(*fake_system_state_.mock_metrics_reporter(),
- ReportUpdateCheckMetrics(_, _, _, _))
- .Times(AnyNumber());
- EXPECT_CALL(*fake_system_state_.mock_metrics_reporter(),
- ReportUpdateCheckMetrics(_,
- expected_check_result,
- expected_check_reaction,
- expected_download_error_code))
- .Times(ping_only ? 0 : 1);
- loop.PostTask(base::Bind(
- [](ActionProcessor* processor) { processor->StartProcessing(); },
- base::Unretained(&processor)));
- loop.Run();
- EXPECT_FALSE(loop.PendingTasks());
- if (delegate_.omaha_response_ && out_response)
- *out_response = *delegate_.omaha_response_;
- if (out_post_data)
- *out_post_data = delegate_.post_data_;
- return delegate_.omaha_response_ != nullptr;
- }
- bool OmahaRequestActionTest::TestUpdateCheck(
- const string& http_response,
- int fail_http_response_code,
- bool ping_only,
- ErrorCode expected_code,
- metrics::CheckResult expected_check_result,
- metrics::CheckReaction expected_check_reaction,
- metrics::DownloadErrorCode expected_download_error_code,
- OmahaResponse* out_response,
- brillo::Blob* out_post_data) {
- return TestUpdateCheck(http_response,
- fail_http_response_code,
- ping_only,
- true, // is_consumer_device
- 0, // rollback_allowed_milestones
- false, // is_policy_loaded
- expected_code,
- expected_check_result,
- expected_check_reaction,
- expected_download_error_code,
- out_response,
- out_post_data);
- }
- void OmahaRequestActionTest::TestRollbackCheck(bool is_consumer_device,
- int rollback_allowed_milestones,
- bool is_policy_loaded,
- OmahaResponse* out_response) {
- fake_update_response_.deadline = "20101020";
- ASSERT_TRUE(TestUpdateCheck(fake_update_response_.GetUpdateResponse(),
- -1,
- false, // ping_only
- is_consumer_device,
- rollback_allowed_milestones,
- is_policy_loaded,
- ErrorCode::kSuccess,
- metrics::CheckResult::kUpdateAvailable,
- metrics::CheckReaction::kUpdating,
- metrics::DownloadErrorCode::kUnset,
- out_response,
- nullptr));
- ASSERT_TRUE(out_response->update_exists);
- }
- // Tests Event requests -- they should always succeed. |out_post_data| may be
- // null; if non-null, the post-data received by the mock HttpFetcher is
- // returned.
- void OmahaRequestActionTest::TestEvent(OmahaEvent* event,
- const string& http_response,
- brillo::Blob* out_post_data) {
- brillo::FakeMessageLoop loop(nullptr);
- loop.SetAsCurrent();
- auto action = std::make_unique<OmahaRequestAction>(
- &fake_system_state_,
- event,
- std::make_unique<MockHttpFetcher>(
- http_response.data(), http_response.size(), nullptr),
- false);
- ActionProcessor processor;
- processor.set_delegate(&delegate_);
- processor.EnqueueAction(std::move(action));
- loop.PostTask(base::Bind(
- [](ActionProcessor* processor) { processor->StartProcessing(); },
- base::Unretained(&processor)));
- loop.Run();
- EXPECT_FALSE(loop.PendingTasks());
- if (out_post_data)
- *out_post_data = delegate_.post_data_;
- }
- TEST_F(OmahaRequestActionTest, RejectEntities) {
- OmahaResponse response;
- fake_update_response_.include_entity = true;
- ASSERT_FALSE(TestUpdateCheck(fake_update_response_.GetNoUpdateResponse(),
- -1,
- false, // ping_only
- ErrorCode::kOmahaRequestXMLHasEntityDecl,
- metrics::CheckResult::kParsingError,
- metrics::CheckReaction::kUnset,
- metrics::DownloadErrorCode::kUnset,
- &response,
- nullptr));
- EXPECT_FALSE(response.update_exists);
- }
- TEST_F(OmahaRequestActionTest, NoUpdateTest) {
- OmahaResponse response;
- ASSERT_TRUE(TestUpdateCheck(fake_update_response_.GetNoUpdateResponse(),
- -1,
- false, // ping_only
- ErrorCode::kSuccess,
- metrics::CheckResult::kNoUpdateAvailable,
- metrics::CheckReaction::kUnset,
- metrics::DownloadErrorCode::kUnset,
- &response,
- nullptr));
- EXPECT_FALSE(response.update_exists);
- }
- TEST_F(OmahaRequestActionTest, MultiAppNoUpdateTest) {
- OmahaResponse response;
- fake_update_response_.multi_app_no_update = true;
- ASSERT_TRUE(TestUpdateCheck(fake_update_response_.GetNoUpdateResponse(),
- -1,
- false, // ping_only
- ErrorCode::kSuccess,
- metrics::CheckResult::kNoUpdateAvailable,
- metrics::CheckReaction::kUnset,
- metrics::DownloadErrorCode::kUnset,
- &response,
- nullptr));
- EXPECT_FALSE(response.update_exists);
- }
- TEST_F(OmahaRequestActionTest, MultiAppNoPartialUpdateTest) {
- OmahaResponse response;
- fake_update_response_.multi_app_no_update = true;
- ASSERT_TRUE(TestUpdateCheck(fake_update_response_.GetUpdateResponse(),
- -1,
- false, // ping_only
- ErrorCode::kSuccess,
- metrics::CheckResult::kNoUpdateAvailable,
- metrics::CheckReaction::kUnset,
- metrics::DownloadErrorCode::kUnset,
- &response,
- nullptr));
- EXPECT_FALSE(response.update_exists);
- }
- TEST_F(OmahaRequestActionTest, NoSelfUpdateTest) {
- OmahaResponse response;
- ASSERT_TRUE(TestUpdateCheck(
- "<response><app><updatecheck status=\"ok\"><manifest><actions><action "
- "event=\"postinstall\" noupdate=\"true\"/></actions>"
- "</manifest></updatecheck></app></response>",
- -1,
- false, // ping_only
- ErrorCode::kSuccess,
- metrics::CheckResult::kNoUpdateAvailable,
- metrics::CheckReaction::kUnset,
- metrics::DownloadErrorCode::kUnset,
- &response,
- nullptr));
- EXPECT_FALSE(response.update_exists);
- }
- // Test that all the values in the response are parsed in a normal update
- // response.
- TEST_F(OmahaRequestActionTest, ValidUpdateTest) {
- OmahaResponse response;
- fake_update_response_.deadline = "20101020";
- ASSERT_TRUE(TestUpdateCheck(fake_update_response_.GetUpdateResponse(),
- -1,
- false, // ping_only
- ErrorCode::kSuccess,
- metrics::CheckResult::kUpdateAvailable,
- metrics::CheckReaction::kUpdating,
- metrics::DownloadErrorCode::kUnset,
- &response,
- nullptr));
- EXPECT_TRUE(response.update_exists);
- EXPECT_EQ(fake_update_response_.version, response.version);
- EXPECT_EQ("", response.system_version);
- EXPECT_EQ(fake_update_response_.GetPayloadUrl(),
- response.packages[0].payload_urls[0]);
- EXPECT_EQ(fake_update_response_.more_info_url, response.more_info_url);
- EXPECT_EQ(fake_update_response_.hash, response.packages[0].hash);
- EXPECT_EQ(fake_update_response_.size, response.packages[0].size);
- EXPECT_EQ(true, response.packages[0].is_delta);
- EXPECT_EQ(fake_update_response_.prompt == "true", response.prompt);
- EXPECT_EQ(fake_update_response_.deadline, response.deadline);
- EXPECT_FALSE(response.powerwash_required);
- // Omaha cohort attributes are not set in the response, so they should not be
- // persisted.
- EXPECT_FALSE(fake_prefs_.Exists(kPrefsOmahaCohort));
- EXPECT_FALSE(fake_prefs_.Exists(kPrefsOmahaCohortHint));
- EXPECT_FALSE(fake_prefs_.Exists(kPrefsOmahaCohortName));
- }
- TEST_F(OmahaRequestActionTest, MultiPackageUpdateTest) {
- OmahaResponse response;
- fake_update_response_.multi_package = true;
- ASSERT_TRUE(TestUpdateCheck(fake_update_response_.GetUpdateResponse(),
- -1,
- false, // ping_only
- ErrorCode::kSuccess,
- metrics::CheckResult::kUpdateAvailable,
- metrics::CheckReaction::kUpdating,
- metrics::DownloadErrorCode::kUnset,
- &response,
- nullptr));
- EXPECT_TRUE(response.update_exists);
- EXPECT_EQ(fake_update_response_.version, response.version);
- EXPECT_EQ(fake_update_response_.GetPayloadUrl(),
- response.packages[0].payload_urls[0]);
- EXPECT_EQ(fake_update_response_.codebase + "package2",
- response.packages[1].payload_urls[0]);
- EXPECT_EQ(fake_update_response_.hash, response.packages[0].hash);
- EXPECT_EQ(fake_update_response_.size, response.packages[0].size);
- EXPECT_EQ(true, response.packages[0].is_delta);
- EXPECT_EQ(11u, response.packages[0].metadata_size);
- ASSERT_EQ(2u, response.packages.size());
- EXPECT_EQ(string("hash2"), response.packages[1].hash);
- EXPECT_EQ(222u, response.packages[1].size);
- EXPECT_EQ(22u, response.packages[1].metadata_size);
- EXPECT_EQ(false, response.packages[1].is_delta);
- }
- TEST_F(OmahaRequestActionTest, MultiAppUpdateTest) {
- OmahaResponse response;
- fake_update_response_.multi_app = true;
- ASSERT_TRUE(TestUpdateCheck(fake_update_response_.GetUpdateResponse(),
- -1,
- false, // ping_only
- ErrorCode::kSuccess,
- metrics::CheckResult::kUpdateAvailable,
- metrics::CheckReaction::kUpdating,
- metrics::DownloadErrorCode::kUnset,
- &response,
- nullptr));
- EXPECT_TRUE(response.update_exists);
- EXPECT_EQ(fake_update_response_.version, response.version);
- EXPECT_EQ(fake_update_response_.GetPayloadUrl(),
- response.packages[0].payload_urls[0]);
- EXPECT_EQ(fake_update_response_.codebase2 + "package3",
- response.packages[1].payload_urls[0]);
- EXPECT_EQ(fake_update_response_.hash, response.packages[0].hash);
- EXPECT_EQ(fake_update_response_.size, response.packages[0].size);
- EXPECT_EQ(11u, response.packages[0].metadata_size);
- EXPECT_EQ(true, response.packages[0].is_delta);
- ASSERT_EQ(2u, response.packages.size());
- EXPECT_EQ(string("hash3"), response.packages[1].hash);
- EXPECT_EQ(333u, response.packages[1].size);
- EXPECT_EQ(33u, response.packages[1].metadata_size);
- EXPECT_EQ(false, response.packages[1].is_delta);
- }
- TEST_F(OmahaRequestActionTest, MultiAppAndSystemUpdateTest) {
- OmahaResponse response;
- fake_update_response_.multi_app = true;
- // trigger the lining up of the app and system versions
- request_params_.set_system_app_id(fake_update_response_.app_id2);
- ASSERT_TRUE(TestUpdateCheck(fake_update_response_.GetUpdateResponse(),
- -1,
- false, // ping_only
- ErrorCode::kSuccess,
- metrics::CheckResult::kUpdateAvailable,
- metrics::CheckReaction::kUpdating,
- metrics::DownloadErrorCode::kUnset,
- &response,
- nullptr));
- EXPECT_TRUE(response.update_exists);
- EXPECT_EQ(fake_update_response_.version, response.version);
- EXPECT_EQ(fake_update_response_.version2, response.system_version);
- EXPECT_EQ(fake_update_response_.GetPayloadUrl(),
- response.packages[0].payload_urls[0]);
- EXPECT_EQ(fake_update_response_.codebase2 + "package3",
- response.packages[1].payload_urls[0]);
- EXPECT_EQ(fake_update_response_.hash, response.packages[0].hash);
- EXPECT_EQ(fake_update_response_.size, response.packages[0].size);
- EXPECT_EQ(11u, response.packages[0].metadata_size);
- EXPECT_EQ(true, response.packages[0].is_delta);
- ASSERT_EQ(2u, response.packages.size());
- EXPECT_EQ(string("hash3"), response.packages[1].hash);
- EXPECT_EQ(333u, response.packages[1].size);
- EXPECT_EQ(33u, response.packages[1].metadata_size);
- EXPECT_EQ(false, response.packages[1].is_delta);
- }
- TEST_F(OmahaRequestActionTest, MultiAppPartialUpdateTest) {
- OmahaResponse response;
- fake_update_response_.multi_app = true;
- fake_update_response_.multi_app_self_update = true;
- ASSERT_TRUE(TestUpdateCheck(fake_update_response_.GetUpdateResponse(),
- -1,
- false, // ping_only
- ErrorCode::kSuccess,
- metrics::CheckResult::kUpdateAvailable,
- metrics::CheckReaction::kUpdating,
- metrics::DownloadErrorCode::kUnset,
- &response,
- nullptr));
- EXPECT_TRUE(response.update_exists);
- EXPECT_EQ(fake_update_response_.version, response.version);
- EXPECT_EQ("", response.system_version);
- EXPECT_EQ(fake_update_response_.GetPayloadUrl(),
- response.packages[0].payload_urls[0]);
- EXPECT_EQ(fake_update_response_.hash, response.packages[0].hash);
- EXPECT_EQ(fake_update_response_.size, response.packages[0].size);
- EXPECT_EQ(11u, response.packages[0].metadata_size);
- ASSERT_EQ(2u, response.packages.size());
- EXPECT_EQ(string("hash3"), response.packages[1].hash);
- EXPECT_EQ(333u, response.packages[1].size);
- EXPECT_EQ(33u, response.packages[1].metadata_size);
- EXPECT_EQ(true, response.packages[1].is_delta);
- }
- TEST_F(OmahaRequestActionTest, MultiAppMultiPackageUpdateTest) {
- OmahaResponse response;
- fake_update_response_.multi_app = true;
- fake_update_response_.multi_package = true;
- ASSERT_TRUE(TestUpdateCheck(fake_update_response_.GetUpdateResponse(),
- -1,
- false, // ping_only
- ErrorCode::kSuccess,
- metrics::CheckResult::kUpdateAvailable,
- metrics::CheckReaction::kUpdating,
- metrics::DownloadErrorCode::kUnset,
- &response,
- nullptr));
- EXPECT_TRUE(response.update_exists);
- EXPECT_EQ(fake_update_response_.version, response.version);
- EXPECT_EQ("", response.system_version);
- EXPECT_EQ(fake_update_response_.GetPayloadUrl(),
- response.packages[0].payload_urls[0]);
- EXPECT_EQ(fake_update_response_.codebase + "package2",
- response.packages[1].payload_urls[0]);
- EXPECT_EQ(fake_update_response_.codebase2 + "package3",
- response.packages[2].payload_urls[0]);
- EXPECT_EQ(fake_update_response_.hash, response.packages[0].hash);
- EXPECT_EQ(fake_update_response_.size, response.packages[0].size);
- EXPECT_EQ(11u, response.packages[0].metadata_size);
- EXPECT_EQ(true, response.packages[0].is_delta);
- ASSERT_EQ(3u, response.packages.size());
- EXPECT_EQ(string("hash2"), response.packages[1].hash);
- EXPECT_EQ(222u, response.packages[1].size);
- EXPECT_EQ(22u, response.packages[1].metadata_size);
- EXPECT_EQ(false, response.packages[1].is_delta);
- EXPECT_EQ(string("hash3"), response.packages[2].hash);
- EXPECT_EQ(333u, response.packages[2].size);
- EXPECT_EQ(33u, response.packages[2].metadata_size);
- EXPECT_EQ(false, response.packages[2].is_delta);
- }
- TEST_F(OmahaRequestActionTest, PowerwashTest) {
- OmahaResponse response;
- fake_update_response_.powerwash = true;
- ASSERT_TRUE(TestUpdateCheck(fake_update_response_.GetUpdateResponse(),
- -1,
- false, // ping_only
- ErrorCode::kSuccess,
- metrics::CheckResult::kUpdateAvailable,
- metrics::CheckReaction::kUpdating,
- metrics::DownloadErrorCode::kUnset,
- &response,
- nullptr));
- EXPECT_TRUE(response.update_exists);
- EXPECT_TRUE(response.powerwash_required);
- }
- TEST_F(OmahaRequestActionTest, ExtraHeadersSentInteractiveTest) {
- OmahaResponse response;
- request_params_.set_interactive(true);
- test_http_fetcher_headers_ = true;
- ASSERT_FALSE(TestUpdateCheck("invalid xml>",
- -1,
- false, // ping_only
- ErrorCode::kOmahaRequestXMLParseError,
- metrics::CheckResult::kParsingError,
- metrics::CheckReaction::kUnset,
- metrics::DownloadErrorCode::kUnset,
- &response,
- nullptr));
- EXPECT_FALSE(response.update_exists);
- }
- TEST_F(OmahaRequestActionTest, ExtraHeadersSentNoInteractiveTest) {
- OmahaResponse response;
- request_params_.set_interactive(false);
- test_http_fetcher_headers_ = true;
- ASSERT_FALSE(TestUpdateCheck("invalid xml>",
- -1,
- false, // ping_only
- ErrorCode::kOmahaRequestXMLParseError,
- metrics::CheckResult::kParsingError,
- metrics::CheckReaction::kUnset,
- metrics::DownloadErrorCode::kUnset,
- &response,
- nullptr));
- EXPECT_FALSE(response.update_exists);
- }
- TEST_F(OmahaRequestActionTest, ValidUpdateBlockedByConnection) {
- OmahaResponse response;
- // Set up a connection manager that doesn't allow a valid update over
- // the current ethernet connection.
- MockConnectionManager mock_cm;
- fake_system_state_.set_connection_manager(&mock_cm);
- EXPECT_CALL(mock_cm, GetConnectionProperties(_, _))
- .WillRepeatedly(DoAll(SetArgPointee<0>(ConnectionType::kEthernet),
- SetArgPointee<1>(ConnectionTethering::kUnknown),
- Return(true)));
- EXPECT_CALL(mock_cm, IsUpdateAllowedOver(ConnectionType::kEthernet, _))
- .WillRepeatedly(Return(false));
- ASSERT_FALSE(TestUpdateCheck(fake_update_response_.GetUpdateResponse(),
- -1,
- false, // ping_only
- ErrorCode::kOmahaUpdateIgnoredPerPolicy,
- metrics::CheckResult::kUpdateAvailable,
- metrics::CheckReaction::kIgnored,
- metrics::DownloadErrorCode::kUnset,
- &response,
- nullptr));
- EXPECT_FALSE(response.update_exists);
- }
- TEST_F(OmahaRequestActionTest, ValidUpdateOverCellularAllowedByDevicePolicy) {
- // This test tests that update over cellular is allowed as device policy
- // says yes.
- OmahaResponse response;
- MockConnectionManager mock_cm;
- fake_system_state_.set_connection_manager(&mock_cm);
- EXPECT_CALL(mock_cm, GetConnectionProperties(_, _))
- .WillRepeatedly(DoAll(SetArgPointee<0>(ConnectionType::kCellular),
- SetArgPointee<1>(ConnectionTethering::kUnknown),
- Return(true)));
- EXPECT_CALL(mock_cm, IsAllowedConnectionTypesForUpdateSet())
- .WillRepeatedly(Return(true));
- EXPECT_CALL(mock_cm, IsUpdateAllowedOver(ConnectionType::kCellular, _))
- .WillRepeatedly(Return(true));
- ASSERT_TRUE(TestUpdateCheck(fake_update_response_.GetUpdateResponse(),
- -1,
- false, // ping_only
- ErrorCode::kSuccess,
- metrics::CheckResult::kUpdateAvailable,
- metrics::CheckReaction::kUpdating,
- metrics::DownloadErrorCode::kUnset,
- &response,
- nullptr));
- EXPECT_TRUE(response.update_exists);
- }
- TEST_F(OmahaRequestActionTest, ValidUpdateOverCellularBlockedByDevicePolicy) {
- // This test tests that update over cellular is blocked as device policy
- // says no.
- OmahaResponse response;
- MockConnectionManager mock_cm;
- fake_system_state_.set_connection_manager(&mock_cm);
- EXPECT_CALL(mock_cm, GetConnectionProperties(_, _))
- .WillRepeatedly(DoAll(SetArgPointee<0>(ConnectionType::kCellular),
- SetArgPointee<1>(ConnectionTethering::kUnknown),
- Return(true)));
- EXPECT_CALL(mock_cm, IsAllowedConnectionTypesForUpdateSet())
- .WillRepeatedly(Return(true));
- EXPECT_CALL(mock_cm, IsUpdateAllowedOver(ConnectionType::kCellular, _))
- .WillRepeatedly(Return(false));
- ASSERT_FALSE(TestUpdateCheck(fake_update_response_.GetUpdateResponse(),
- -1,
- false, // ping_only
- ErrorCode::kOmahaUpdateIgnoredPerPolicy,
- metrics::CheckResult::kUpdateAvailable,
- metrics::CheckReaction::kIgnored,
- metrics::DownloadErrorCode::kUnset,
- &response,
- nullptr));
- EXPECT_FALSE(response.update_exists);
- }
- TEST_F(OmahaRequestActionTest,
- ValidUpdateOverCellularAllowedByUserPermissionTrue) {
- // This test tests that, when device policy is not set, update over cellular
- // is allowed as permission for update over cellular is set to true.
- OmahaResponse response;
- MockConnectionManager mock_cm;
- fake_prefs_.SetBoolean(kPrefsUpdateOverCellularPermission, true);
- fake_system_state_.set_connection_manager(&mock_cm);
- EXPECT_CALL(mock_cm, GetConnectionProperties(_, _))
- .WillRepeatedly(DoAll(SetArgPointee<0>(ConnectionType::kCellular),
- SetArgPointee<1>(ConnectionTethering::kUnknown),
- Return(true)));
- EXPECT_CALL(mock_cm, IsAllowedConnectionTypesForUpdateSet())
- .WillRepeatedly(Return(false));
- EXPECT_CALL(mock_cm, IsUpdateAllowedOver(ConnectionType::kCellular, _))
- .WillRepeatedly(Return(true));
- ASSERT_TRUE(TestUpdateCheck(fake_update_response_.GetUpdateResponse(),
- -1,
- false, // ping_only
- ErrorCode::kSuccess,
- metrics::CheckResult::kUpdateAvailable,
- metrics::CheckReaction::kUpdating,
- metrics::DownloadErrorCode::kUnset,
- &response,
- nullptr));
- EXPECT_TRUE(response.update_exists);
- }
- TEST_F(OmahaRequestActionTest,
- ValidUpdateOverCellularBlockedByUpdateTargetNotMatch) {
- // This test tests that, when device policy is not set and permission for
- // update over cellular is set to false or does not exist, update over
- // cellular is blocked as update target does not match the omaha response.
- OmahaResponse response;
- MockConnectionManager mock_cm;
- // A version different from the version in omaha response.
- string diff_version = "99.99.99";
- // A size different from the size in omaha response.
- int64_t diff_size = 999;
- fake_prefs_.SetString(kPrefsUpdateOverCellularTargetVersion, diff_version);
- fake_prefs_.SetInt64(kPrefsUpdateOverCellularTargetSize, diff_size);
- // This test tests cellular (3G) being the only connection type being allowed.
- fake_system_state_.set_connection_manager(&mock_cm);
- EXPECT_CALL(mock_cm, GetConnectionProperties(_, _))
- .WillRepeatedly(DoAll(SetArgPointee<0>(ConnectionType::kCellular),
- SetArgPointee<1>(ConnectionTethering::kUnknown),
- Return(true)));
- EXPECT_CALL(mock_cm, IsAllowedConnectionTypesForUpdateSet())
- .WillRepeatedly(Return(false));
- EXPECT_CALL(mock_cm, IsUpdateAllowedOver(ConnectionType::kCellular, _))
- .WillRepeatedly(Return(true));
- ASSERT_FALSE(TestUpdateCheck(fake_update_response_.GetUpdateResponse(),
- -1,
- false, // ping_only
- ErrorCode::kOmahaUpdateIgnoredOverCellular,
- metrics::CheckResult::kUpdateAvailable,
- metrics::CheckReaction::kIgnored,
- metrics::DownloadErrorCode::kUnset,
- &response,
- nullptr));
- EXPECT_FALSE(response.update_exists);
- }
- TEST_F(OmahaRequestActionTest,
- ValidUpdateOverCellularAllowedByUpdateTargetMatch) {
- // This test tests that, when device policy is not set and permission for
- // update over cellular is set to false or does not exist, update over
- // cellular is allowed as update target matches the omaha response.
- OmahaResponse response;
- MockConnectionManager mock_cm;
- // A version same as the version in omaha response.
- string new_version = fake_update_response_.version;
- // A size same as the size in omaha response.
- int64_t new_size = fake_update_response_.size;
- fake_prefs_.SetString(kPrefsUpdateOverCellularTargetVersion, new_version);
- fake_prefs_.SetInt64(kPrefsUpdateOverCellularTargetSize, new_size);
- fake_system_state_.set_connection_manager(&mock_cm);
- EXPECT_CALL(mock_cm, GetConnectionProperties(_, _))
- .WillRepeatedly(DoAll(SetArgPointee<0>(ConnectionType::kCellular),
- SetArgPointee<1>(ConnectionTethering::kUnknown),
- Return(true)));
- EXPECT_CALL(mock_cm, IsAllowedConnectionTypesForUpdateSet())
- .WillRepeatedly(Return(false));
- EXPECT_CALL(mock_cm, IsUpdateAllowedOver(ConnectionType::kCellular, _))
- .WillRepeatedly(Return(true));
- ASSERT_TRUE(TestUpdateCheck(fake_update_response_.GetUpdateResponse(),
- -1,
- false, // ping_only
- ErrorCode::kSuccess,
- metrics::CheckResult::kUpdateAvailable,
- metrics::CheckReaction::kUpdating,
- metrics::DownloadErrorCode::kUnset,
- &response,
- nullptr));
- EXPECT_TRUE(response.update_exists);
- }
- TEST_F(OmahaRequestActionTest, ValidUpdateBlockedByRollback) {
- string rollback_version = "1234.0.0";
- OmahaResponse response;
- MockPayloadState mock_payload_state;
- fake_system_state_.set_payload_state(&mock_payload_state);
- EXPECT_CALL(mock_payload_state, GetRollbackVersion())
- .WillRepeatedly(Return(rollback_version));
- fake_update_response_.version = rollback_version;
- ASSERT_FALSE(TestUpdateCheck(fake_update_response_.GetUpdateResponse(),
- -1,
- false, // ping_only
- ErrorCode::kOmahaUpdateIgnoredPerPolicy,
- metrics::CheckResult::kUpdateAvailable,
- metrics::CheckReaction::kIgnored,
- metrics::DownloadErrorCode::kUnset,
- &response,
- nullptr));
- EXPECT_FALSE(response.update_exists);
- }
- // Verify that update checks called during OOBE will not try to download an
- // update if the response doesn't include the deadline field.
- TEST_F(OmahaRequestActionTest, SkipNonCriticalUpdatesBeforeOOBE) {
- OmahaResponse response;
- fake_system_state_.fake_hardware()->UnsetIsOOBEComplete();
- // TODO(senj): set better default value for metrics::checkresult in
- // OmahaRequestAction::ActionCompleted.
- ASSERT_FALSE(TestUpdateCheck(fake_update_response_.GetUpdateResponse(),
- -1,
- false, // ping_only
- ErrorCode::kNonCriticalUpdateInOOBE,
- metrics::CheckResult::kParsingError,
- metrics::CheckReaction::kUnset,
- metrics::DownloadErrorCode::kUnset,
- &response,
- nullptr));
- EXPECT_FALSE(response.update_exists);
- }
- // Verify that the IsOOBEComplete() value is ignored when the OOBE flow is not
- // enabled.
- TEST_F(OmahaRequestActionTest, SkipNonCriticalUpdatesBeforeOOBEDisabled) {
- OmahaResponse response;
- fake_system_state_.fake_hardware()->UnsetIsOOBEComplete();
- fake_system_state_.fake_hardware()->SetIsOOBEEnabled(false);
- ASSERT_TRUE(TestUpdateCheck(fake_update_response_.GetUpdateResponse(),
- -1,
- false, // ping_only
- ErrorCode::kSuccess,
- metrics::CheckResult::kUpdateAvailable,
- metrics::CheckReaction::kUpdating,
- metrics::DownloadErrorCode::kUnset,
- &response,
- nullptr));
- EXPECT_TRUE(response.update_exists);
- }
- // Verify that update checks called during OOBE will still try to download an
- // update if the response includes the deadline field.
- TEST_F(OmahaRequestActionTest, SkipNonCriticalUpdatesBeforeOOBEDeadlineSet) {
- OmahaResponse response;
- fake_system_state_.fake_hardware()->UnsetIsOOBEComplete();
- fake_update_response_.deadline = "20101020";
- ASSERT_TRUE(TestUpdateCheck(fake_update_response_.GetUpdateResponse(),
- -1,
- false, // ping_only
- ErrorCode::kSuccess,
- metrics::CheckResult::kUpdateAvailable,
- metrics::CheckReaction::kUpdating,
- metrics::DownloadErrorCode::kUnset,
- &response,
- nullptr));
- EXPECT_TRUE(response.update_exists);
- }
- // Verify that update checks called during OOBE will not try to download an
- // update if a rollback happened, even when the response includes the deadline
- // field.
- TEST_F(OmahaRequestActionTest, SkipNonCriticalUpdatesBeforeOOBERollback) {
- OmahaResponse response;
- fake_system_state_.fake_hardware()->UnsetIsOOBEComplete();
- fake_update_response_.deadline = "20101020";
- EXPECT_CALL(*(fake_system_state_.mock_payload_state()), GetRollbackHappened())
- .WillOnce(Return(true));
- ASSERT_FALSE(TestUpdateCheck(fake_update_response_.GetUpdateResponse(),
- -1,
- false, // ping_only
- ErrorCode::kNonCriticalUpdateInOOBE,
- metrics::CheckResult::kParsingError,
- metrics::CheckReaction::kUnset,
- metrics::DownloadErrorCode::kUnset,
- &response,
- nullptr));
- EXPECT_FALSE(response.update_exists);
- }
- // Verify that non-critical updates are skipped by reporting the
- // kNonCriticalUpdateInOOBE error code when attempted over cellular network -
- // i.e. when the update would need user permission. Note that reporting
- // kOmahaUpdateIgnoredOverCellular error in this case might cause undesired UX
- // in OOBE (warning the user about an update that will be skipped).
- TEST_F(OmahaRequestActionTest, SkipNonCriticalUpdatesInOOBEOverCellular) {
- OmahaResponse response;
- fake_system_state_.fake_hardware()->UnsetIsOOBEComplete();
- MockConnectionManager mock_cm;
- fake_system_state_.set_connection_manager(&mock_cm);
- EXPECT_CALL(mock_cm, GetConnectionProperties(_, _))
- .WillRepeatedly(DoAll(SetArgPointee<0>(ConnectionType::kCellular),
- SetArgPointee<1>(ConnectionTethering::kUnknown),
- Return(true)));
- EXPECT_CALL(mock_cm, IsAllowedConnectionTypesForUpdateSet())
- .WillRepeatedly(Return(false));
- ASSERT_FALSE(TestUpdateCheck(fake_update_response_.GetUpdateResponse(),
- -1,
- false, // ping_only
- ErrorCode::kNonCriticalUpdateInOOBE,
- metrics::CheckResult::kParsingError,
- metrics::CheckReaction::kUnset,
- metrics::DownloadErrorCode::kUnset,
- &response,
- nullptr));
- EXPECT_FALSE(response.update_exists);
- }
- TEST_F(OmahaRequestActionTest, WallClockBasedWaitAloneCausesScattering) {
- OmahaResponse response;
- request_params_.set_wall_clock_based_wait_enabled(true);
- request_params_.set_update_check_count_wait_enabled(false);
- request_params_.set_waiting_period(TimeDelta::FromDays(2));
- fake_system_state_.fake_clock()->SetWallclockTime(Time::Now());
- ASSERT_FALSE(TestUpdateCheck(fake_update_response_.GetUpdateResponse(),
- -1,
- false, // ping_only
- ErrorCode::kOmahaUpdateDeferredPerPolicy,
- metrics::CheckResult::kUpdateAvailable,
- metrics::CheckReaction::kDeferring,
- metrics::DownloadErrorCode::kUnset,
- &response,
- nullptr));
- EXPECT_FALSE(response.update_exists);
- // Verify if we are interactive check we don't defer.
- request_params_.set_interactive(true);
- ASSERT_TRUE(TestUpdateCheck(fake_update_response_.GetUpdateResponse(),
- -1,
- false, // ping_only
- ErrorCode::kSuccess,
- metrics::CheckResult::kUpdateAvailable,
- metrics::CheckReaction::kUpdating,
- metrics::DownloadErrorCode::kUnset,
- &response,
- nullptr));
- EXPECT_TRUE(response.update_exists);
- }
- TEST_F(OmahaRequestActionTest, NoWallClockBasedWaitCausesNoScattering) {
- OmahaResponse response;
- request_params_.set_wall_clock_based_wait_enabled(false);
- request_params_.set_waiting_period(TimeDelta::FromDays(2));
- request_params_.set_update_check_count_wait_enabled(true);
- request_params_.set_min_update_checks_needed(1);
- request_params_.set_max_update_checks_allowed(8);
- ASSERT_TRUE(TestUpdateCheck(fake_update_response_.GetUpdateResponse(),
- -1,
- false, // ping_only
- ErrorCode::kSuccess,
- metrics::CheckResult::kUpdateAvailable,
- metrics::CheckReaction::kUpdating,
- metrics::DownloadErrorCode::kUnset,
- &response,
- nullptr));
- EXPECT_TRUE(response.update_exists);
- }
- TEST_F(OmahaRequestActionTest, ZeroMaxDaysToScatterCausesNoScattering) {
- OmahaResponse response;
- request_params_.set_wall_clock_based_wait_enabled(true);
- request_params_.set_waiting_period(TimeDelta::FromDays(2));
- request_params_.set_update_check_count_wait_enabled(true);
- request_params_.set_min_update_checks_needed(1);
- request_params_.set_max_update_checks_allowed(8);
- fake_update_response_.max_days_to_scatter = "0";
- ASSERT_TRUE(TestUpdateCheck(fake_update_response_.GetUpdateResponse(),
- -1,
- false, // ping_only
- ErrorCode::kSuccess,
- metrics::CheckResult::kUpdateAvailable,
- metrics::CheckReaction::kUpdating,
- metrics::DownloadErrorCode::kUnset,
- &response,
- nullptr));
- EXPECT_TRUE(response.update_exists);
- }
- TEST_F(OmahaRequestActionTest, ZeroUpdateCheckCountCausesNoScattering) {
- OmahaResponse response;
- request_params_.set_wall_clock_based_wait_enabled(true);
- request_params_.set_waiting_period(TimeDelta());
- request_params_.set_update_check_count_wait_enabled(true);
- request_params_.set_min_update_checks_needed(0);
- request_params_.set_max_update_checks_allowed(0);
- fake_system_state_.fake_clock()->SetWallclockTime(Time::Now());
- ASSERT_TRUE(TestUpdateCheck(fake_update_response_.GetUpdateResponse(),
- -1,
- false, // ping_only
- ErrorCode::kSuccess,
- metrics::CheckResult::kUpdateAvailable,
- metrics::CheckReaction::kUpdating,
- metrics::DownloadErrorCode::kUnset,
- &response,
- nullptr));
- int64_t count;
- ASSERT_TRUE(fake_prefs_.GetInt64(kPrefsUpdateCheckCount, &count));
- ASSERT_EQ(count, 0);
- EXPECT_TRUE(response.update_exists);
- }
- TEST_F(OmahaRequestActionTest, NonZeroUpdateCheckCountCausesScattering) {
- OmahaResponse response;
- request_params_.set_wall_clock_based_wait_enabled(true);
- request_params_.set_waiting_period(TimeDelta());
- request_params_.set_update_check_count_wait_enabled(true);
- request_params_.set_min_update_checks_needed(1);
- request_params_.set_max_update_checks_allowed(8);
- fake_system_state_.fake_clock()->SetWallclockTime(Time::Now());
- ASSERT_FALSE(TestUpdateCheck(fake_update_response_.GetUpdateResponse(),
- -1,
- false, // ping_only
- ErrorCode::kOmahaUpdateDeferredPerPolicy,
- metrics::CheckResult::kUpdateAvailable,
- metrics::CheckReaction::kDeferring,
- metrics::DownloadErrorCode::kUnset,
- &response,
- nullptr));
- int64_t count;
- ASSERT_TRUE(fake_prefs_.GetInt64(kPrefsUpdateCheckCount, &count));
- ASSERT_GT(count, 0);
- EXPECT_FALSE(response.update_exists);
- // Verify if we are interactive check we don't defer.
- request_params_.set_interactive(true);
- ASSERT_TRUE(TestUpdateCheck(fake_update_response_.GetUpdateResponse(),
- -1,
- false, // ping_only
- ErrorCode::kSuccess,
- metrics::CheckResult::kUpdateAvailable,
- metrics::CheckReaction::kUpdating,
- metrics::DownloadErrorCode::kUnset,
- &response,
- nullptr));
- EXPECT_TRUE(response.update_exists);
- }
- TEST_F(OmahaRequestActionTest, ExistingUpdateCheckCountCausesScattering) {
- OmahaResponse response;
- request_params_.set_wall_clock_based_wait_enabled(true);
- request_params_.set_waiting_period(TimeDelta());
- request_params_.set_update_check_count_wait_enabled(true);
- request_params_.set_min_update_checks_needed(1);
- request_params_.set_max_update_checks_allowed(8);
- fake_system_state_.fake_clock()->SetWallclockTime(Time::Now());
- ASSERT_TRUE(fake_prefs_.SetInt64(kPrefsUpdateCheckCount, 5));
- ASSERT_FALSE(TestUpdateCheck(fake_update_response_.GetUpdateResponse(),
- -1,
- false, // ping_only
- ErrorCode::kOmahaUpdateDeferredPerPolicy,
- metrics::CheckResult::kUpdateAvailable,
- metrics::CheckReaction::kDeferring,
- metrics::DownloadErrorCode::kUnset,
- &response,
- nullptr));
- int64_t count;
- ASSERT_TRUE(fake_prefs_.GetInt64(kPrefsUpdateCheckCount, &count));
- // count remains the same, as the decrementing happens in update_attempter
- // which this test doesn't exercise.
- ASSERT_EQ(count, 5);
- EXPECT_FALSE(response.update_exists);
- // Verify if we are interactive check we don't defer.
- request_params_.set_interactive(true);
- ASSERT_TRUE(TestUpdateCheck(fake_update_response_.GetUpdateResponse(),
- -1,
- false, // ping_only
- ErrorCode::kSuccess,
- metrics::CheckResult::kUpdateAvailable,
- metrics::CheckReaction::kUpdating,
- metrics::DownloadErrorCode::kUnset,
- &response,
- nullptr));
- EXPECT_TRUE(response.update_exists);
- }
- TEST_F(OmahaRequestActionTest, StagingTurnedOnCausesScattering) {
- // If staging is on, the value for max days to scatter should be ignored, and
- // staging's scatter value should be used.
- OmahaResponse response;
- request_params_.set_wall_clock_based_wait_enabled(true);
- request_params_.set_waiting_period(TimeDelta::FromDays(6));
- request_params_.set_update_check_count_wait_enabled(false);
- fake_system_state_.fake_clock()->SetWallclockTime(Time::Now());
- ASSERT_TRUE(fake_prefs_.SetInt64(kPrefsWallClockStagingWaitPeriod, 6));
- // This should not prevent scattering due to staging.
- fake_update_response_.max_days_to_scatter = "0";
- ASSERT_FALSE(TestUpdateCheck(fake_update_response_.GetUpdateResponse(),
- -1,
- false, // ping_only
- ErrorCode::kOmahaUpdateDeferredPerPolicy,
- metrics::CheckResult::kUpdateAvailable,
- metrics::CheckReaction::kDeferring,
- metrics::DownloadErrorCode::kUnset,
- &response,
- nullptr));
- EXPECT_FALSE(response.update_exists);
- // Interactive updates should not be affected.
- request_params_.set_interactive(true);
- ASSERT_TRUE(TestUpdateCheck(fake_update_response_.GetUpdateResponse(),
- -1,
- false, // ping_only
- ErrorCode::kSuccess,
- metrics::CheckResult::kUpdateAvailable,
- metrics::CheckReaction::kUpdating,
- metrics::DownloadErrorCode::kUnset,
- &response,
- nullptr));
- EXPECT_TRUE(response.update_exists);
- }
- TEST_F(OmahaRequestActionTest, CohortsArePersisted) {
- OmahaResponse response;
- fake_update_response_.include_cohorts = true;
- fake_update_response_.cohort = "s/154454/8479665";
- fake_update_response_.cohorthint = "please-put-me-on-beta";
- fake_update_response_.cohortname = "stable";
- ASSERT_TRUE(TestUpdateCheck(fake_update_response_.GetUpdateResponse(),
- -1,
- false, // ping_only
- ErrorCode::kSuccess,
- metrics::CheckResult::kUpdateAvailable,
- metrics::CheckReaction::kUpdating,
- metrics::DownloadErrorCode::kUnset,
- &response,
- nullptr));
- string value;
- EXPECT_TRUE(fake_prefs_.GetString(kPrefsOmahaCohort, &value));
- EXPECT_EQ(fake_update_response_.cohort, value);
- EXPECT_TRUE(fake_prefs_.GetString(kPrefsOmahaCohortHint, &value));
- EXPECT_EQ(fake_update_response_.cohorthint, value);
- EXPECT_TRUE(fake_prefs_.GetString(kPrefsOmahaCohortName, &value));
- EXPECT_EQ(fake_update_response_.cohortname, value);
- }
- TEST_F(OmahaRequestActionTest, CohortsAreUpdated) {
- OmahaResponse response;
- EXPECT_TRUE(fake_prefs_.SetString(kPrefsOmahaCohort, "old_value"));
- EXPECT_TRUE(fake_prefs_.SetString(kPrefsOmahaCohortHint, "old_hint"));
- EXPECT_TRUE(fake_prefs_.SetString(kPrefsOmahaCohortName, "old_name"));
- fake_update_response_.include_cohorts = true;
- fake_update_response_.cohort = "s/154454/8479665";
- fake_update_response_.cohorthint = "please-put-me-on-beta";
- fake_update_response_.cohortname = "";
- ASSERT_TRUE(TestUpdateCheck(fake_update_response_.GetUpdateResponse(),
- -1,
- false, // ping_only
- ErrorCode::kSuccess,
- metrics::CheckResult::kUpdateAvailable,
- metrics::CheckReaction::kUpdating,
- metrics::DownloadErrorCode::kUnset,
- &response,
- nullptr));
- string value;
- EXPECT_TRUE(fake_prefs_.GetString(kPrefsOmahaCohort, &value));
- EXPECT_EQ(fake_update_response_.cohort, value);
- EXPECT_TRUE(fake_prefs_.GetString(kPrefsOmahaCohortHint, &value));
- EXPECT_EQ(fake_update_response_.cohorthint, value);
- EXPECT_FALSE(fake_prefs_.GetString(kPrefsOmahaCohortName, &value));
- }
- TEST_F(OmahaRequestActionTest, CohortsAreNotModifiedWhenMissing) {
- OmahaResponse response;
- EXPECT_TRUE(fake_prefs_.SetString(kPrefsOmahaCohort, "old_value"));
- ASSERT_TRUE(TestUpdateCheck(fake_update_response_.GetUpdateResponse(),
- -1,
- false, // ping_only
- ErrorCode::kSuccess,
- metrics::CheckResult::kUpdateAvailable,
- metrics::CheckReaction::kUpdating,
- metrics::DownloadErrorCode::kUnset,
- &response,
- nullptr));
- string value;
- EXPECT_TRUE(fake_prefs_.GetString(kPrefsOmahaCohort, &value));
- EXPECT_EQ("old_value", value);
- EXPECT_FALSE(fake_prefs_.GetString(kPrefsOmahaCohortHint, &value));
- EXPECT_FALSE(fake_prefs_.GetString(kPrefsOmahaCohortName, &value));
- }
- TEST_F(OmahaRequestActionTest, CohortsArePersistedWhenNoUpdate) {
- OmahaResponse response;
- fake_update_response_.include_cohorts = true;
- fake_update_response_.cohort = "s/154454/8479665";
- fake_update_response_.cohorthint = "please-put-me-on-beta";
- fake_update_response_.cohortname = "stable";
- ASSERT_TRUE(TestUpdateCheck(fake_update_response_.GetNoUpdateResponse(),
- -1,
- false, // ping_only
- ErrorCode::kSuccess,
- metrics::CheckResult::kNoUpdateAvailable,
- metrics::CheckReaction::kUnset,
- metrics::DownloadErrorCode::kUnset,
- &response,
- nullptr));
- string value;
- EXPECT_TRUE(fake_prefs_.GetString(kPrefsOmahaCohort, &value));
- EXPECT_EQ(fake_update_response_.cohort, value);
- EXPECT_TRUE(fake_prefs_.GetString(kPrefsOmahaCohortHint, &value));
- EXPECT_EQ(fake_update_response_.cohorthint, value);
- EXPECT_TRUE(fake_prefs_.GetString(kPrefsOmahaCohortName, &value));
- EXPECT_EQ(fake_update_response_.cohortname, value);
- }
- TEST_F(OmahaRequestActionTest, MultiAppCohortTest) {
- OmahaResponse response;
- fake_update_response_.multi_app = true;
- fake_update_response_.include_cohorts = true;
- fake_update_response_.cohort = "s/154454/8479665";
- fake_update_response_.cohorthint = "please-put-me-on-beta";
- fake_update_response_.cohortname = "stable";
- ASSERT_TRUE(TestUpdateCheck(fake_update_response_.GetUpdateResponse(),
- -1,
- false, // ping_only
- ErrorCode::kSuccess,
- metrics::CheckResult::kUpdateAvailable,
- metrics::CheckReaction::kUpdating,
- metrics::DownloadErrorCode::kUnset,
- &response,
- nullptr));
- string value;
- EXPECT_TRUE(fake_prefs_.GetString(kPrefsOmahaCohort, &value));
- EXPECT_EQ(fake_update_response_.cohort, value);
- EXPECT_TRUE(fake_prefs_.GetString(kPrefsOmahaCohortHint, &value));
- EXPECT_EQ(fake_update_response_.cohorthint, value);
- EXPECT_TRUE(fake_prefs_.GetString(kPrefsOmahaCohortName, &value));
- EXPECT_EQ(fake_update_response_.cohortname, value);
- }
- TEST_F(OmahaRequestActionTest, NoOutputPipeTest) {
- const string http_response(fake_update_response_.GetNoUpdateResponse());
- brillo::FakeMessageLoop loop(nullptr);
- loop.SetAsCurrent();
- auto action = std::make_unique<OmahaRequestAction>(
- &fake_system_state_,
- nullptr,
- std::make_unique<MockHttpFetcher>(
- http_response.data(), http_response.size(), nullptr),
- false);
- ActionProcessor processor;
- processor.set_delegate(&delegate_);
- processor.EnqueueAction(std::move(action));
- loop.PostTask(base::Bind(
- [](ActionProcessor* processor) { processor->StartProcessing(); },
- base::Unretained(&processor)));
- loop.Run();
- EXPECT_FALSE(loop.PendingTasks());
- EXPECT_FALSE(processor.IsRunning());
- }
- TEST_F(OmahaRequestActionTest, InvalidXmlTest) {
- OmahaResponse response;
- ASSERT_FALSE(TestUpdateCheck("invalid xml>",
- -1,
- false, // ping_only
- ErrorCode::kOmahaRequestXMLParseError,
- metrics::CheckResult::kParsingError,
- metrics::CheckReaction::kUnset,
- metrics::DownloadErrorCode::kUnset,
- &response,
- nullptr));
- EXPECT_FALSE(response.update_exists);
- }
- TEST_F(OmahaRequestActionTest, EmptyResponseTest) {
- OmahaResponse response;
- ASSERT_FALSE(TestUpdateCheck("",
- -1,
- false, // ping_only
- ErrorCode::kOmahaRequestEmptyResponseError,
- metrics::CheckResult::kParsingError,
- metrics::CheckReaction::kUnset,
- metrics::DownloadErrorCode::kUnset,
- &response,
- nullptr));
- EXPECT_FALSE(response.update_exists);
- }
- TEST_F(OmahaRequestActionTest, MissingStatusTest) {
- OmahaResponse response;
- ASSERT_FALSE(TestUpdateCheck(
- "<?xml version=\"1.0\" encoding=\"UTF-8\"?><response protocol=\"3.0\">"
- "<daystart elapsed_seconds=\"100\"/>"
- "<app appid=\"foo\" status=\"ok\">"
- "<ping status=\"ok\"/>"
- "<updatecheck/></app></response>",
- -1,
- false, // ping_only
- ErrorCode::kOmahaResponseInvalid,
- metrics::CheckResult::kParsingError,
- metrics::CheckReaction::kUnset,
- metrics::DownloadErrorCode::kUnset,
- &response,
- nullptr));
- EXPECT_FALSE(response.update_exists);
- }
- TEST_F(OmahaRequestActionTest, InvalidStatusTest) {
- OmahaResponse response;
- ASSERT_FALSE(TestUpdateCheck(
- "<?xml version=\"1.0\" encoding=\"UTF-8\"?><response protocol=\"3.0\">"
- "<daystart elapsed_seconds=\"100\"/>"
- "<app appid=\"foo\" status=\"ok\">"
- "<ping status=\"ok\"/>"
- "<updatecheck status=\"InvalidStatusTest\"/></app></response>",
- -1,
- false, // ping_only
- ErrorCode::kOmahaResponseInvalid,
- metrics::CheckResult::kParsingError,
- metrics::CheckReaction::kUnset,
- metrics::DownloadErrorCode::kUnset,
- &response,
- nullptr));
- EXPECT_FALSE(response.update_exists);
- }
- TEST_F(OmahaRequestActionTest, MissingNodesetTest) {
- OmahaResponse response;
- ASSERT_FALSE(TestUpdateCheck(
- "<?xml version=\"1.0\" encoding=\"UTF-8\"?><response protocol=\"3.0\">"
- "<daystart elapsed_seconds=\"100\"/>"
- "<app appid=\"foo\" status=\"ok\">"
- "<ping status=\"ok\"/>"
- "</app></response>",
- -1,
- false, // ping_only
- ErrorCode::kOmahaResponseInvalid,
- metrics::CheckResult::kParsingError,
- metrics::CheckReaction::kUnset,
- metrics::DownloadErrorCode::kUnset,
- &response,
- nullptr));
- EXPECT_FALSE(response.update_exists);
- }
- TEST_F(OmahaRequestActionTest, MissingFieldTest) {
- string input_response =
- "<?xml version=\"1.0\" encoding=\"UTF-8\"?><response protocol=\"3.0\">"
- "<daystart elapsed_seconds=\"100\"/>"
- // the appid needs to match that in the request params
- "<app appid=\"" +
- fake_update_response_.app_id +
- "\" status=\"ok\">"
- "<updatecheck status=\"ok\">"
- "<urls><url codebase=\"http://missing/field/test/\"/></urls>"
- "<manifest version=\"10.2.3.4\">"
- "<packages><package hash=\"not-used\" name=\"f\" "
- "size=\"587\" hash_sha256=\"lkq34j5345\"/></packages>"
- "<actions><action event=\"postinstall\" "
- "Prompt=\"false\" "
- "IsDeltaPayload=\"false\" "
- "sha256=\"not-used\" "
- "/></actions></manifest></updatecheck></app></response>";
- LOG(INFO) << "Input Response = " << input_response;
- OmahaResponse response;
- ASSERT_TRUE(TestUpdateCheck(input_response,
- -1,
- false, // ping_only
- ErrorCode::kSuccess,
- metrics::CheckResult::kUpdateAvailable,
- metrics::CheckReaction::kUpdating,
- metrics::DownloadErrorCode::kUnset,
- &response,
- nullptr));
- EXPECT_TRUE(response.update_exists);
- EXPECT_EQ("10.2.3.4", response.version);
- EXPECT_EQ("http://missing/field/test/f",
- response.packages[0].payload_urls[0]);
- EXPECT_EQ("", response.more_info_url);
- EXPECT_EQ("lkq34j5345", response.packages[0].hash);
- EXPECT_EQ(587u, response.packages[0].size);
- EXPECT_FALSE(response.prompt);
- EXPECT_TRUE(response.deadline.empty());
- }
- namespace {
- class TerminateEarlyTestProcessorDelegate : public ActionProcessorDelegate {
- public:
- void ProcessingStopped(const ActionProcessor* processor) {
- brillo::MessageLoop::current()->BreakLoop();
- }
- };
- void TerminateTransferTestStarter(ActionProcessor* processor) {
- processor->StartProcessing();
- CHECK(processor->IsRunning());
- processor->StopProcessing();
- }
- } // namespace
- TEST_F(OmahaRequestActionTest, TerminateTransferTest) {
- brillo::FakeMessageLoop loop(nullptr);
- loop.SetAsCurrent();
- string http_response("doesn't matter");
- auto action = std::make_unique<OmahaRequestAction>(
- &fake_system_state_,
- nullptr,
- std::make_unique<MockHttpFetcher>(
- http_response.data(), http_response.size(), nullptr),
- false);
- TerminateEarlyTestProcessorDelegate delegate;
- ActionProcessor processor;
- processor.set_delegate(&delegate);
- processor.EnqueueAction(std::move(action));
- loop.PostTask(base::Bind(&TerminateTransferTestStarter, &processor));
- loop.Run();
- EXPECT_FALSE(loop.PendingTasks());
- }
- TEST_F(OmahaRequestActionTest, XmlEncodeTest) {
- string output;
- EXPECT_TRUE(XmlEncode("ab", &output));
- EXPECT_EQ("ab", output);
- EXPECT_TRUE(XmlEncode("a<b", &output));
- EXPECT_EQ("a<b", output);
- EXPECT_TRUE(XmlEncode("<&>\"\'\\", &output));
- EXPECT_EQ("<&>"'\\", output);
- EXPECT_TRUE(XmlEncode("<&>", &output));
- EXPECT_EQ("&lt;&amp;&gt;", output);
- // Check that unterminated UTF-8 strings are handled properly.
- EXPECT_FALSE(XmlEncode("\xc2", &output));
- // Fail with invalid ASCII-7 chars.
- EXPECT_FALSE(XmlEncode("This is an 'n' with a tilde: \xc3\xb1", &output));
- }
- TEST_F(OmahaRequestActionTest, XmlEncodeWithDefaultTest) {
- EXPECT_EQ("<&>", XmlEncodeWithDefault("<&>", "something else"));
- EXPECT_EQ("<not escaped>", XmlEncodeWithDefault("\xc2", "<not escaped>"));
- }
- TEST_F(OmahaRequestActionTest, XmlEncodeIsUsedForParams) {
- brillo::Blob post_data;
- // Make sure XML Encode is being called on the params
- request_params_.set_os_sp("testtheservice_pack>");
- request_params_.set_os_board("x86 generic<id");
- request_params_.set_current_channel("unittest_track<");
- request_params_.set_target_channel("unittest_track<");
- request_params_.set_hwid("<OEM MODEL>");
- fake_prefs_.SetString(kPrefsOmahaCohort, "evil\nstring");
- fake_prefs_.SetString(kPrefsOmahaCohortHint, "evil&string\\");
- fake_prefs_.SetString(
- kPrefsOmahaCohortName,
- base::JoinString(vector<string>(100, "My spoon is too big."), " "));
- OmahaResponse response;
- ASSERT_FALSE(TestUpdateCheck("invalid xml>",
- -1,
- false, // ping_only
- ErrorCode::kOmahaRequestXMLParseError,
- metrics::CheckResult::kParsingError,
- metrics::CheckReaction::kUnset,
- metrics::DownloadErrorCode::kUnset,
- &response,
- &post_data));
- // convert post_data to string
- string post_str(post_data.begin(), post_data.end());
- EXPECT_NE(string::npos, post_str.find("testtheservice_pack>"));
- EXPECT_EQ(string::npos, post_str.find("testtheservice_pack>"));
- EXPECT_NE(string::npos, post_str.find("x86 generic<id"));
- EXPECT_EQ(string::npos, post_str.find("x86 generic<id"));
- EXPECT_NE(string::npos, post_str.find("unittest_track&lt;"));
- EXPECT_EQ(string::npos, post_str.find("unittest_track<"));
- EXPECT_NE(string::npos, post_str.find("<OEM MODEL>"));
- EXPECT_EQ(string::npos, post_str.find("<OEM MODEL>"));
- EXPECT_NE(string::npos, post_str.find("cohort=\"evil\nstring\""));
- EXPECT_EQ(string::npos, post_str.find("cohorthint=\"evil&string\\\""));
- EXPECT_NE(string::npos, post_str.find("cohorthint=\"evil&string\\\""));
- // Values from Prefs that are too big are removed from the XML instead of
- // encoded.
- EXPECT_EQ(string::npos, post_str.find("cohortname="));
- }
- TEST_F(OmahaRequestActionTest, XmlDecodeTest) {
- OmahaResponse response;
- fake_update_response_.deadline = "<20110101";
- fake_update_response_.more_info_url = "testthe<url";
- fake_update_response_.codebase = "testthe&codebase/";
- ASSERT_TRUE(TestUpdateCheck(fake_update_response_.GetUpdateResponse(),
- -1,
- false, // ping_only
- ErrorCode::kSuccess,
- metrics::CheckResult::kUpdateAvailable,
- metrics::CheckReaction::kUpdating,
- metrics::DownloadErrorCode::kUnset,
- &response,
- nullptr));
- EXPECT_EQ("testthe<url", response.more_info_url);
- EXPECT_EQ("testthe&codebase/file.signed",
- response.packages[0].payload_urls[0]);
- EXPECT_EQ("<20110101", response.deadline);
- }
- TEST_F(OmahaRequestActionTest, ParseIntTest) {
- OmahaResponse response;
- // overflows int32_t:
- fake_update_response_.size = 123123123123123ull;
- ASSERT_TRUE(TestUpdateCheck(fake_update_response_.GetUpdateResponse(),
- -1,
- false, // ping_only
- ErrorCode::kSuccess,
- metrics::CheckResult::kUpdateAvailable,
- metrics::CheckReaction::kUpdating,
- metrics::DownloadErrorCode::kUnset,
- &response,
- nullptr));
- EXPECT_EQ(fake_update_response_.size, response.packages[0].size);
- }
- TEST_F(OmahaRequestActionTest, FormatUpdateCheckOutputTest) {
- brillo::Blob post_data;
- NiceMock<MockPrefs> prefs;
- fake_system_state_.set_prefs(&prefs);
- EXPECT_CALL(prefs, GetString(kPrefsPreviousVersion, _))
- .WillOnce(DoAll(SetArgPointee<1>(string("")), Return(true)));
- // An existing but empty previous version means that we didn't reboot to a new
- // update, therefore, no need to update the previous version.
- EXPECT_CALL(prefs, SetString(kPrefsPreviousVersion, _)).Times(0);
- ASSERT_FALSE(TestUpdateCheck("invalid xml>",
- -1,
- false, // ping_only
- ErrorCode::kOmahaRequestXMLParseError,
- metrics::CheckResult::kParsingError,
- metrics::CheckReaction::kUnset,
- metrics::DownloadErrorCode::kUnset,
- nullptr, // response
- &post_data));
- // convert post_data to string
- string post_str(post_data.begin(), post_data.end());
- EXPECT_NE(
- post_str.find(" <ping active=\"1\" a=\"-1\" r=\"-1\"></ping>\n"
- " <updatecheck></updatecheck>\n"),
- string::npos);
- EXPECT_NE(post_str.find("hardware_class=\"OEM MODEL 09235 7471\""),
- string::npos);
- EXPECT_NE(post_str.find("fw_version=\"ChromeOSFirmware.1.0\""), string::npos);
- EXPECT_NE(post_str.find("ec_version=\"0X0A1\""), string::npos);
- // No <event> tag should be sent if we didn't reboot to an update.
- EXPECT_EQ(post_str.find("<event"), string::npos);
- }
- TEST_F(OmahaRequestActionTest, FormatSuccessEventOutputTest) {
- brillo::Blob post_data;
- TestEvent(new OmahaEvent(OmahaEvent::kTypeUpdateDownloadStarted),
- "invalid xml>",
- &post_data);
- // convert post_data to string
- string post_str(post_data.begin(), post_data.end());
- string expected_event = base::StringPrintf(
- " <event eventtype=\"%d\" eventresult=\"%d\"></event>\n",
- OmahaEvent::kTypeUpdateDownloadStarted,
- OmahaEvent::kResultSuccess);
- EXPECT_NE(post_str.find(expected_event), string::npos);
- EXPECT_EQ(post_str.find("ping"), string::npos);
- EXPECT_EQ(post_str.find("updatecheck"), string::npos);
- }
- TEST_F(OmahaRequestActionTest, FormatErrorEventOutputTest) {
- brillo::Blob post_data;
- TestEvent(new OmahaEvent(OmahaEvent::kTypeDownloadComplete,
- OmahaEvent::kResultError,
- ErrorCode::kError),
- "invalid xml>",
- &post_data);
- // convert post_data to string
- string post_str(post_data.begin(), post_data.end());
- string expected_event = base::StringPrintf(
- " <event eventtype=\"%d\" eventresult=\"%d\" "
- "errorcode=\"%d\"></event>\n",
- OmahaEvent::kTypeDownloadComplete,
- OmahaEvent::kResultError,
- static_cast<int>(ErrorCode::kError));
- EXPECT_NE(post_str.find(expected_event), string::npos);
- EXPECT_EQ(post_str.find("updatecheck"), string::npos);
- }
- TEST_F(OmahaRequestActionTest, IsEventTest) {
- string http_response("doesn't matter");
- OmahaRequestAction update_check_action(
- &fake_system_state_,
- nullptr,
- std::make_unique<MockHttpFetcher>(
- http_response.data(), http_response.size(), nullptr),
- false);
- EXPECT_FALSE(update_check_action.IsEvent());
- OmahaRequestAction event_action(
- &fake_system_state_,
- new OmahaEvent(OmahaEvent::kTypeUpdateComplete),
- std::make_unique<MockHttpFetcher>(
- http_response.data(), http_response.size(), nullptr),
- false);
- EXPECT_TRUE(event_action.IsEvent());
- }
- TEST_F(OmahaRequestActionTest, FormatDeltaOkayOutputTest) {
- for (int i = 0; i < 2; i++) {
- bool delta_okay = i == 1;
- const char* delta_okay_str = delta_okay ? "true" : "false";
- brillo::Blob post_data;
- request_params_.set_delta_okay(delta_okay);
- ASSERT_FALSE(TestUpdateCheck("invalid xml>",
- -1,
- false, // ping_only
- ErrorCode::kOmahaRequestXMLParseError,
- metrics::CheckResult::kParsingError,
- metrics::CheckReaction::kUnset,
- metrics::DownloadErrorCode::kUnset,
- nullptr,
- &post_data));
- // convert post_data to string
- string post_str(post_data.begin(), post_data.end());
- EXPECT_NE(
- post_str.find(base::StringPrintf(" delta_okay=\"%s\"", delta_okay_str)),
- string::npos)
- << "i = " << i;
- }
- }
- TEST_F(OmahaRequestActionTest, FormatInteractiveOutputTest) {
- for (int i = 0; i < 2; i++) {
- bool interactive = i == 1;
- const char* interactive_str = interactive ? "ondemandupdate" : "scheduler";
- brillo::Blob post_data;
- FakeSystemState fake_system_state;
- request_params_.set_interactive(interactive);
- ASSERT_FALSE(TestUpdateCheck("invalid xml>",
- -1,
- false, // ping_only
- ErrorCode::kOmahaRequestXMLParseError,
- metrics::CheckResult::kParsingError,
- metrics::CheckReaction::kUnset,
- metrics::DownloadErrorCode::kUnset,
- nullptr,
- &post_data));
- // convert post_data to string
- string post_str(post_data.begin(), post_data.end());
- EXPECT_NE(post_str.find(
- base::StringPrintf("installsource=\"%s\"", interactive_str)),
- string::npos)
- << "i = " << i;
- }
- }
- TEST_F(OmahaRequestActionTest, FormatTargetVersionPrefixOutputTest) {
- for (int i = 0; i < 2; i++) {
- bool target_version_set = i == 1;
- const char* target_version_prefix = target_version_set ? "10032." : "";
- brillo::Blob post_data;
- FakeSystemState fake_system_state;
- request_params_.set_target_version_prefix(target_version_prefix);
- ASSERT_FALSE(TestUpdateCheck("invalid xml>",
- -1,
- false, // ping_only
- ErrorCode::kOmahaRequestXMLParseError,
- metrics::CheckResult::kParsingError,
- metrics::CheckReaction::kUnset,
- metrics::DownloadErrorCode::kUnset,
- nullptr,
- &post_data));
- // convert post_data to string
- string post_str(post_data.begin(), post_data.end());
- if (target_version_set) {
- EXPECT_NE(post_str.find("<updatecheck targetversionprefix=\"10032.\">"),
- string::npos)
- << "i = " << i;
- } else {
- EXPECT_EQ(post_str.find("targetversionprefix"), string::npos)
- << "i = " << i;
- }
- }
- }
- TEST_F(OmahaRequestActionTest, FormatRollbackAllowedOutputTest) {
- for (int i = 0; i < 4; i++) {
- bool rollback_allowed = i / 2 == 0;
- bool target_version_set = i % 2 == 0;
- brillo::Blob post_data;
- FakeSystemState fake_system_state;
- request_params_.set_target_version_prefix(target_version_set ? "10032."
- : "");
- request_params_.set_rollback_allowed(rollback_allowed);
- ASSERT_FALSE(TestUpdateCheck("invalid xml>",
- -1,
- false, // ping_only
- ErrorCode::kOmahaRequestXMLParseError,
- metrics::CheckResult::kParsingError,
- metrics::CheckReaction::kUnset,
- metrics::DownloadErrorCode::kUnset,
- nullptr,
- &post_data));
- // convert post_data to string
- string post_str(post_data.begin(), post_data.end());
- if (rollback_allowed && target_version_set) {
- EXPECT_NE(post_str.find("rollback_allowed=\"true\""), string::npos)
- << "i = " << i;
- } else {
- EXPECT_EQ(post_str.find("rollback_allowed"), string::npos) << "i = " << i;
- }
- }
- }
- TEST_F(OmahaRequestActionTest, OmahaEventTest) {
- OmahaEvent default_event;
- EXPECT_EQ(OmahaEvent::kTypeUnknown, default_event.type);
- EXPECT_EQ(OmahaEvent::kResultError, default_event.result);
- EXPECT_EQ(ErrorCode::kError, default_event.error_code);
- OmahaEvent success_event(OmahaEvent::kTypeUpdateDownloadStarted);
- EXPECT_EQ(OmahaEvent::kTypeUpdateDownloadStarted, success_event.type);
- EXPECT_EQ(OmahaEvent::kResultSuccess, success_event.result);
- EXPECT_EQ(ErrorCode::kSuccess, success_event.error_code);
- OmahaEvent error_event(OmahaEvent::kTypeUpdateDownloadFinished,
- OmahaEvent::kResultError,
- ErrorCode::kError);
- EXPECT_EQ(OmahaEvent::kTypeUpdateDownloadFinished, error_event.type);
- EXPECT_EQ(OmahaEvent::kResultError, error_event.result);
- EXPECT_EQ(ErrorCode::kError, error_event.error_code);
- }
- void OmahaRequestActionTest::PingTest(bool ping_only) {
- NiceMock<MockPrefs> prefs;
- fake_system_state_.set_prefs(&prefs);
- EXPECT_CALL(prefs, GetInt64(kPrefsMetricsCheckLastReportingTime, _))
- .Times(AnyNumber());
- EXPECT_CALL(prefs, SetInt64(_, _)).Times(AnyNumber());
- // Add a few hours to the day difference to test no rounding, etc.
- int64_t five_days_ago =
- (Time::Now() - TimeDelta::FromHours(5 * 24 + 13)).ToInternalValue();
- int64_t six_days_ago =
- (Time::Now() - TimeDelta::FromHours(6 * 24 + 11)).ToInternalValue();
- EXPECT_CALL(prefs, GetInt64(kPrefsInstallDateDays, _))
- .WillOnce(DoAll(SetArgPointee<1>(0), Return(true)));
- EXPECT_CALL(prefs, GetInt64(kPrefsLastActivePingDay, _))
- .WillOnce(DoAll(SetArgPointee<1>(six_days_ago), Return(true)));
- EXPECT_CALL(prefs, GetInt64(kPrefsLastRollCallPingDay, _))
- .WillOnce(DoAll(SetArgPointee<1>(five_days_ago), Return(true)));
- brillo::Blob post_data;
- ASSERT_TRUE(TestUpdateCheck(fake_update_response_.GetNoUpdateResponse(),
- -1,
- ping_only,
- ErrorCode::kSuccess,
- metrics::CheckResult::kNoUpdateAvailable,
- metrics::CheckReaction::kUnset,
- metrics::DownloadErrorCode::kUnset,
- nullptr,
- &post_data));
- string post_str(post_data.begin(), post_data.end());
- EXPECT_NE(post_str.find("<ping active=\"1\" a=\"6\" r=\"5\"></ping>"),
- string::npos);
- if (ping_only) {
- EXPECT_EQ(post_str.find("updatecheck"), string::npos);
- EXPECT_EQ(post_str.find("previousversion"), string::npos);
- } else {
- EXPECT_NE(post_str.find("updatecheck"), string::npos);
- EXPECT_NE(post_str.find("previousversion"), string::npos);
- }
- }
- TEST_F(OmahaRequestActionTest, PingTestSendOnlyAPing) {
- PingTest(true /* ping_only */);
- }
- TEST_F(OmahaRequestActionTest, PingTestSendAlsoAnUpdateCheck) {
- PingTest(false /* ping_only */);
- }
- TEST_F(OmahaRequestActionTest, ActivePingTest) {
- NiceMock<MockPrefs> prefs;
- fake_system_state_.set_prefs(&prefs);
- EXPECT_CALL(prefs, GetInt64(kPrefsMetricsCheckLastReportingTime, _))
- .Times(AnyNumber());
- EXPECT_CALL(prefs, SetInt64(_, _)).Times(AnyNumber());
- int64_t three_days_ago =
- (Time::Now() - TimeDelta::FromHours(3 * 24 + 12)).ToInternalValue();
- int64_t now = Time::Now().ToInternalValue();
- EXPECT_CALL(prefs, GetInt64(kPrefsInstallDateDays, _))
- .WillOnce(DoAll(SetArgPointee<1>(0), Return(true)));
- EXPECT_CALL(prefs, GetInt64(kPrefsLastActivePingDay, _))
- .WillOnce(DoAll(SetArgPointee<1>(three_days_ago), Return(true)));
- EXPECT_CALL(prefs, GetInt64(kPrefsLastRollCallPingDay, _))
- .WillOnce(DoAll(SetArgPointee<1>(now), Return(true)));
- brillo::Blob post_data;
- ASSERT_TRUE(TestUpdateCheck(fake_update_response_.GetNoUpdateResponse(),
- -1,
- false, // ping_only
- ErrorCode::kSuccess,
- metrics::CheckResult::kNoUpdateAvailable,
- metrics::CheckReaction::kUnset,
- metrics::DownloadErrorCode::kUnset,
- nullptr,
- &post_data));
- string post_str(post_data.begin(), post_data.end());
- EXPECT_NE(post_str.find("<ping active=\"1\" a=\"3\"></ping>"), string::npos);
- }
- TEST_F(OmahaRequestActionTest, RollCallPingTest) {
- NiceMock<MockPrefs> prefs;
- fake_system_state_.set_prefs(&prefs);
- EXPECT_CALL(prefs, GetInt64(kPrefsMetricsCheckLastReportingTime, _))
- .Times(AnyNumber());
- EXPECT_CALL(prefs, SetInt64(_, _)).Times(AnyNumber());
- int64_t four_days_ago =
- (Time::Now() - TimeDelta::FromHours(4 * 24)).ToInternalValue();
- int64_t now = Time::Now().ToInternalValue();
- EXPECT_CALL(prefs, GetInt64(kPrefsInstallDateDays, _))
- .WillOnce(DoAll(SetArgPointee<1>(0), Return(true)));
- EXPECT_CALL(prefs, GetInt64(kPrefsLastActivePingDay, _))
- .WillOnce(DoAll(SetArgPointee<1>(now), Return(true)));
- EXPECT_CALL(prefs, GetInt64(kPrefsLastRollCallPingDay, _))
- .WillOnce(DoAll(SetArgPointee<1>(four_days_ago), Return(true)));
- brillo::Blob post_data;
- ASSERT_TRUE(TestUpdateCheck(fake_update_response_.GetNoUpdateResponse(),
- -1,
- false, // ping_only
- ErrorCode::kSuccess,
- metrics::CheckResult::kNoUpdateAvailable,
- metrics::CheckReaction::kUnset,
- metrics::DownloadErrorCode::kUnset,
- nullptr,
- &post_data));
- string post_str(post_data.begin(), post_data.end());
- EXPECT_NE(post_str.find("<ping active=\"1\" r=\"4\"></ping>\n"),
- string::npos);
- }
- TEST_F(OmahaRequestActionTest, NoPingTest) {
- NiceMock<MockPrefs> prefs;
- fake_system_state_.set_prefs(&prefs);
- EXPECT_CALL(prefs, GetInt64(kPrefsMetricsCheckLastReportingTime, _))
- .Times(AnyNumber());
- EXPECT_CALL(prefs, SetInt64(_, _)).Times(AnyNumber());
- int64_t one_hour_ago =
- (Time::Now() - TimeDelta::FromHours(1)).ToInternalValue();
- EXPECT_CALL(prefs, GetInt64(kPrefsInstallDateDays, _))
- .WillOnce(DoAll(SetArgPointee<1>(0), Return(true)));
- EXPECT_CALL(prefs, GetInt64(kPrefsLastActivePingDay, _))
- .WillOnce(DoAll(SetArgPointee<1>(one_hour_ago), Return(true)));
- EXPECT_CALL(prefs, GetInt64(kPrefsLastRollCallPingDay, _))
- .WillOnce(DoAll(SetArgPointee<1>(one_hour_ago), Return(true)));
- // LastActivePingDay and PrefsLastRollCallPingDay are set even if we didn't
- // send a ping.
- EXPECT_CALL(prefs, SetInt64(kPrefsLastActivePingDay, _))
- .WillOnce(Return(true));
- EXPECT_CALL(prefs, SetInt64(kPrefsLastRollCallPingDay, _))
- .WillOnce(Return(true));
- brillo::Blob post_data;
- ASSERT_TRUE(TestUpdateCheck(fake_update_response_.GetNoUpdateResponse(),
- -1,
- false, // ping_only
- ErrorCode::kSuccess,
- metrics::CheckResult::kNoUpdateAvailable,
- metrics::CheckReaction::kUnset,
- metrics::DownloadErrorCode::kUnset,
- nullptr,
- &post_data));
- string post_str(post_data.begin(), post_data.end());
- EXPECT_EQ(post_str.find("ping"), string::npos);
- }
- TEST_F(OmahaRequestActionTest, IgnoreEmptyPingTest) {
- // This test ensures that we ignore empty ping only requests.
- NiceMock<MockPrefs> prefs;
- fake_system_state_.set_prefs(&prefs);
- int64_t now = Time::Now().ToInternalValue();
- EXPECT_CALL(prefs, GetInt64(kPrefsLastActivePingDay, _))
- .WillOnce(DoAll(SetArgPointee<1>(now), Return(true)));
- EXPECT_CALL(prefs, GetInt64(kPrefsLastRollCallPingDay, _))
- .WillOnce(DoAll(SetArgPointee<1>(now), Return(true)));
- EXPECT_CALL(prefs, SetInt64(kPrefsLastActivePingDay, _)).Times(0);
- EXPECT_CALL(prefs, SetInt64(kPrefsLastRollCallPingDay, _)).Times(0);
- brillo::Blob post_data;
- EXPECT_TRUE(TestUpdateCheck(fake_update_response_.GetNoUpdateResponse(),
- -1,
- true, // ping_only
- ErrorCode::kSuccess,
- metrics::CheckResult::kUnset,
- metrics::CheckReaction::kUnset,
- metrics::DownloadErrorCode::kUnset,
- nullptr,
- &post_data));
- EXPECT_EQ(0U, post_data.size());
- }
- TEST_F(OmahaRequestActionTest, BackInTimePingTest) {
- NiceMock<MockPrefs> prefs;
- fake_system_state_.set_prefs(&prefs);
- EXPECT_CALL(prefs, GetInt64(kPrefsMetricsCheckLastReportingTime, _))
- .Times(AnyNumber());
- EXPECT_CALL(prefs, SetInt64(_, _)).Times(AnyNumber());
- int64_t future =
- (Time::Now() + TimeDelta::FromHours(3 * 24 + 4)).ToInternalValue();
- EXPECT_CALL(prefs, GetInt64(kPrefsInstallDateDays, _))
- .WillOnce(DoAll(SetArgPointee<1>(0), Return(true)));
- EXPECT_CALL(prefs, GetInt64(kPrefsLastActivePingDay, _))
- .WillOnce(DoAll(SetArgPointee<1>(future), Return(true)));
- EXPECT_CALL(prefs, GetInt64(kPrefsLastRollCallPingDay, _))
- .WillOnce(DoAll(SetArgPointee<1>(future), Return(true)));
- EXPECT_CALL(prefs, SetInt64(kPrefsLastActivePingDay, _))
- .WillOnce(Return(true));
- EXPECT_CALL(prefs, SetInt64(kPrefsLastRollCallPingDay, _))
- .WillOnce(Return(true));
- brillo::Blob post_data;
- ASSERT_TRUE(
- TestUpdateCheck("<?xml version=\"1.0\" encoding=\"UTF-8\"?><response "
- "protocol=\"3.0\"><daystart elapsed_seconds=\"100\"/>"
- "<app appid=\"foo\" status=\"ok\"><ping status=\"ok\"/>"
- "<updatecheck status=\"noupdate\"/></app></response>",
- -1,
- false, // ping_only
- ErrorCode::kSuccess,
- metrics::CheckResult::kNoUpdateAvailable,
- metrics::CheckReaction::kUnset,
- metrics::DownloadErrorCode::kUnset,
- nullptr,
- &post_data));
- string post_str(post_data.begin(), post_data.end());
- EXPECT_EQ(post_str.find("ping"), string::npos);
- }
- TEST_F(OmahaRequestActionTest, LastPingDayUpdateTest) {
- // This test checks that the action updates the last ping day to now
- // minus 200 seconds with a slack of 5 seconds. Therefore, the test
- // may fail if it runs for longer than 5 seconds. It shouldn't run
- // that long though.
- int64_t midnight =
- (Time::Now() - TimeDelta::FromSeconds(200)).ToInternalValue();
- int64_t midnight_slack =
- (Time::Now() - TimeDelta::FromSeconds(195)).ToInternalValue();
- NiceMock<MockPrefs> prefs;
- fake_system_state_.set_prefs(&prefs);
- EXPECT_CALL(prefs, GetInt64(_, _)).Times(AnyNumber());
- EXPECT_CALL(prefs, SetInt64(_, _)).Times(AnyNumber());
- EXPECT_CALL(prefs,
- SetInt64(kPrefsLastActivePingDay,
- AllOf(Ge(midnight), Le(midnight_slack))))
- .WillOnce(Return(true));
- EXPECT_CALL(prefs,
- SetInt64(kPrefsLastRollCallPingDay,
- AllOf(Ge(midnight), Le(midnight_slack))))
- .WillOnce(Return(true));
- ASSERT_TRUE(
- TestUpdateCheck("<?xml version=\"1.0\" encoding=\"UTF-8\"?><response "
- "protocol=\"3.0\"><daystart elapsed_seconds=\"200\"/>"
- "<app appid=\"foo\" status=\"ok\"><ping status=\"ok\"/>"
- "<updatecheck status=\"noupdate\"/></app></response>",
- -1,
- false, // ping_only
- ErrorCode::kSuccess,
- metrics::CheckResult::kNoUpdateAvailable,
- metrics::CheckReaction::kUnset,
- metrics::DownloadErrorCode::kUnset,
- nullptr,
- nullptr));
- }
- TEST_F(OmahaRequestActionTest, NoElapsedSecondsTest) {
- NiceMock<MockPrefs> prefs;
- fake_system_state_.set_prefs(&prefs);
- EXPECT_CALL(prefs, GetInt64(_, _)).Times(AnyNumber());
- EXPECT_CALL(prefs, SetInt64(_, _)).Times(AnyNumber());
- EXPECT_CALL(prefs, SetInt64(kPrefsLastActivePingDay, _)).Times(0);
- EXPECT_CALL(prefs, SetInt64(kPrefsLastRollCallPingDay, _)).Times(0);
- ASSERT_TRUE(
- TestUpdateCheck("<?xml version=\"1.0\" encoding=\"UTF-8\"?><response "
- "protocol=\"3.0\"><daystart blah=\"200\"/>"
- "<app appid=\"foo\" status=\"ok\"><ping status=\"ok\"/>"
- "<updatecheck status=\"noupdate\"/></app></response>",
- -1,
- false, // ping_only
- ErrorCode::kSuccess,
- metrics::CheckResult::kNoUpdateAvailable,
- metrics::CheckReaction::kUnset,
- metrics::DownloadErrorCode::kUnset,
- nullptr,
- nullptr));
- }
- TEST_F(OmahaRequestActionTest, BadElapsedSecondsTest) {
- NiceMock<MockPrefs> prefs;
- fake_system_state_.set_prefs(&prefs);
- EXPECT_CALL(prefs, GetInt64(_, _)).Times(AnyNumber());
- EXPECT_CALL(prefs, SetInt64(_, _)).Times(AnyNumber());
- EXPECT_CALL(prefs, SetInt64(kPrefsLastActivePingDay, _)).Times(0);
- EXPECT_CALL(prefs, SetInt64(kPrefsLastRollCallPingDay, _)).Times(0);
- ASSERT_TRUE(
- TestUpdateCheck("<?xml version=\"1.0\" encoding=\"UTF-8\"?><response "
- "protocol=\"3.0\"><daystart elapsed_seconds=\"x\"/>"
- "<app appid=\"foo\" status=\"ok\"><ping status=\"ok\"/>"
- "<updatecheck status=\"noupdate\"/></app></response>",
- -1,
- false, // ping_only
- ErrorCode::kSuccess,
- metrics::CheckResult::kNoUpdateAvailable,
- metrics::CheckReaction::kUnset,
- metrics::DownloadErrorCode::kUnset,
- nullptr,
- nullptr));
- }
- TEST_F(OmahaRequestActionTest, ParseUpdateCheckAttributesTest) {
- // Test that the "eol" flags is only parsed from the "_eol" attribute and not
- // the "eol" attribute.
- ASSERT_TRUE(
- TestUpdateCheck("<?xml version=\"1.0\" encoding=\"UTF-8\"?><response "
- "protocol=\"3.0\"><app appid=\"foo\" status=\"ok\">"
- "<ping status=\"ok\"/><updatecheck status=\"noupdate\" "
- "_eol=\"security-only\" eol=\"eol\" _foo=\"bar\"/>"
- "</app></response>",
- -1,
- false, // ping_only
- ErrorCode::kSuccess,
- metrics::CheckResult::kNoUpdateAvailable,
- metrics::CheckReaction::kUnset,
- metrics::DownloadErrorCode::kUnset,
- nullptr,
- nullptr));
- string eol_pref;
- EXPECT_TRUE(
- fake_system_state_.prefs()->GetString(kPrefsOmahaEolStatus, &eol_pref));
- // Note that the eol="eol" attribute should be ignored and the _eol should be
- // used instead.
- EXPECT_EQ("security-only", eol_pref);
- }
- TEST_F(OmahaRequestActionTest, NoUniqueIDTest) {
- brillo::Blob post_data;
- ASSERT_FALSE(TestUpdateCheck("invalid xml>",
- -1,
- false, // ping_only
- ErrorCode::kOmahaRequestXMLParseError,
- metrics::CheckResult::kParsingError,
- metrics::CheckReaction::kUnset,
- metrics::DownloadErrorCode::kUnset,
- nullptr, // response
- &post_data));
- // convert post_data to string
- string post_str(post_data.begin(), post_data.end());
- EXPECT_EQ(post_str.find("machineid="), string::npos);
- EXPECT_EQ(post_str.find("userid="), string::npos);
- }
- TEST_F(OmahaRequestActionTest, NetworkFailureTest) {
- OmahaResponse response;
- const int http_error_code =
- static_cast<int>(ErrorCode::kOmahaRequestHTTPResponseBase) + 501;
- ASSERT_FALSE(TestUpdateCheck("",
- 501,
- false, // ping_only
- static_cast<ErrorCode>(http_error_code),
- metrics::CheckResult::kDownloadError,
- metrics::CheckReaction::kUnset,
- static_cast<metrics::DownloadErrorCode>(501),
- &response,
- nullptr));
- EXPECT_FALSE(response.update_exists);
- }
- TEST_F(OmahaRequestActionTest, NetworkFailureBadHTTPCodeTest) {
- OmahaResponse response;
- const int http_error_code =
- static_cast<int>(ErrorCode::kOmahaRequestHTTPResponseBase) + 999;
- ASSERT_FALSE(TestUpdateCheck("",
- 1500,
- false, // ping_only
- static_cast<ErrorCode>(http_error_code),
- metrics::CheckResult::kDownloadError,
- metrics::CheckReaction::kUnset,
- metrics::DownloadErrorCode::kHttpStatusOther,
- &response,
- nullptr));
- EXPECT_FALSE(response.update_exists);
- }
- TEST_F(OmahaRequestActionTest, TestUpdateFirstSeenAtGetsPersistedFirstTime) {
- OmahaResponse response;
- request_params_.set_wall_clock_based_wait_enabled(true);
- request_params_.set_waiting_period(TimeDelta().FromDays(1));
- request_params_.set_update_check_count_wait_enabled(false);
- Time arbitrary_date;
- ASSERT_TRUE(Time::FromString("6/4/1989", &arbitrary_date));
- fake_system_state_.fake_clock()->SetWallclockTime(arbitrary_date);
- ASSERT_FALSE(TestUpdateCheck(fake_update_response_.GetUpdateResponse(),
- -1,
- false, // ping_only
- ErrorCode::kOmahaUpdateDeferredPerPolicy,
- metrics::CheckResult::kUpdateAvailable,
- metrics::CheckReaction::kDeferring,
- metrics::DownloadErrorCode::kUnset,
- &response,
- nullptr));
- int64_t timestamp = 0;
- ASSERT_TRUE(fake_prefs_.GetInt64(kPrefsUpdateFirstSeenAt, ×tamp));
- EXPECT_EQ(arbitrary_date.ToInternalValue(), timestamp);
- EXPECT_FALSE(response.update_exists);
- // Verify if we are interactive check we don't defer.
- request_params_.set_interactive(true);
- ASSERT_TRUE(TestUpdateCheck(fake_update_response_.GetUpdateResponse(),
- -1,
- false, // ping_only
- ErrorCode::kSuccess,
- metrics::CheckResult::kUpdateAvailable,
- metrics::CheckReaction::kUpdating,
- metrics::DownloadErrorCode::kUnset,
- &response,
- nullptr));
- EXPECT_TRUE(response.update_exists);
- }
- TEST_F(OmahaRequestActionTest, TestUpdateFirstSeenAtGetsUsedIfAlreadyPresent) {
- OmahaResponse response;
- request_params_.set_wall_clock_based_wait_enabled(true);
- request_params_.set_waiting_period(TimeDelta().FromDays(1));
- request_params_.set_update_check_count_wait_enabled(false);
- Time t1, t2;
- ASSERT_TRUE(Time::FromString("1/1/2012", &t1));
- ASSERT_TRUE(Time::FromString("1/3/2012", &t2));
- ASSERT_TRUE(
- fake_prefs_.SetInt64(kPrefsUpdateFirstSeenAt, t1.ToInternalValue()));
- fake_system_state_.fake_clock()->SetWallclockTime(t2);
- ASSERT_TRUE(TestUpdateCheck(fake_update_response_.GetUpdateResponse(),
- -1,
- false, // ping_only
- ErrorCode::kSuccess,
- metrics::CheckResult::kUpdateAvailable,
- metrics::CheckReaction::kUpdating,
- metrics::DownloadErrorCode::kUnset,
- &response,
- nullptr));
- EXPECT_TRUE(response.update_exists);
- // Make sure the timestamp t1 is unchanged showing that it was reused.
- int64_t timestamp = 0;
- ASSERT_TRUE(fake_prefs_.GetInt64(kPrefsUpdateFirstSeenAt, ×tamp));
- ASSERT_TRUE(timestamp == t1.ToInternalValue());
- }
- TEST_F(OmahaRequestActionTest, TestChangingToMoreStableChannel) {
- // Create a uniquely named test directory.
- base::ScopedTempDir tempdir;
- ASSERT_TRUE(tempdir.CreateUniqueTempDir());
- brillo::Blob post_data;
- request_params_.set_root(tempdir.GetPath().value());
- request_params_.set_app_id("{22222222-2222-2222-2222-222222222222}");
- request_params_.set_app_version("1.2.3.4");
- request_params_.set_product_components("o.bundle=1");
- request_params_.set_current_channel("canary-channel");
- EXPECT_TRUE(
- request_params_.SetTargetChannel("stable-channel", true, nullptr));
- request_params_.UpdateDownloadChannel();
- EXPECT_TRUE(request_params_.ShouldPowerwash());
- ASSERT_FALSE(TestUpdateCheck("invalid xml>",
- -1,
- false, // ping_only
- ErrorCode::kOmahaRequestXMLParseError,
- metrics::CheckResult::kParsingError,
- metrics::CheckReaction::kUnset,
- metrics::DownloadErrorCode::kUnset,
- nullptr, // response
- &post_data));
- // convert post_data to string
- string post_str(post_data.begin(), post_data.end());
- EXPECT_NE(
- string::npos,
- post_str.find("appid=\"{22222222-2222-2222-2222-222222222222}\" "
- "version=\"0.0.0.0\" from_version=\"1.2.3.4\" "
- "track=\"stable-channel\" from_track=\"canary-channel\" "));
- EXPECT_EQ(string::npos, post_str.find("o.bundle"));
- }
- TEST_F(OmahaRequestActionTest, TestChangingToLessStableChannel) {
- // Create a uniquely named test directory.
- base::ScopedTempDir tempdir;
- ASSERT_TRUE(tempdir.CreateUniqueTempDir());
- brillo::Blob post_data;
- request_params_.set_root(tempdir.GetPath().value());
- request_params_.set_app_id("{11111111-1111-1111-1111-111111111111}");
- request_params_.set_app_version("5.6.7.8");
- request_params_.set_product_components("o.bundle=1");
- request_params_.set_current_channel("stable-channel");
- EXPECT_TRUE(
- request_params_.SetTargetChannel("canary-channel", false, nullptr));
- request_params_.UpdateDownloadChannel();
- EXPECT_FALSE(request_params_.ShouldPowerwash());
- ASSERT_FALSE(TestUpdateCheck("invalid xml>",
- -1,
- false, // ping_only
- ErrorCode::kOmahaRequestXMLParseError,
- metrics::CheckResult::kParsingError,
- metrics::CheckReaction::kUnset,
- metrics::DownloadErrorCode::kUnset,
- nullptr, // response
- &post_data));
- // Convert post_data to string.
- string post_str(post_data.begin(), post_data.end());
- EXPECT_NE(
- string::npos,
- post_str.find("appid=\"{11111111-1111-1111-1111-111111111111}\" "
- "version=\"5.6.7.8\" "
- "track=\"canary-channel\" from_track=\"stable-channel\""));
- EXPECT_EQ(string::npos, post_str.find("from_version"));
- EXPECT_NE(string::npos, post_str.find("o.bundle.version=\"1\""));
- }
- // Checks that the initial ping with a=-1 r=-1 is not send when the device
- // was powerwashed.
- TEST_F(OmahaRequestActionTest, PingWhenPowerwashed) {
- fake_prefs_.SetString(kPrefsPreviousVersion, "");
- // Flag that the device was powerwashed in the past.
- fake_system_state_.fake_hardware()->SetPowerwashCount(1);
- brillo::Blob post_data;
- ASSERT_TRUE(TestUpdateCheck(fake_update_response_.GetNoUpdateResponse(),
- -1,
- false, // ping_only
- ErrorCode::kSuccess,
- metrics::CheckResult::kNoUpdateAvailable,
- metrics::CheckReaction::kUnset,
- metrics::DownloadErrorCode::kUnset,
- nullptr,
- &post_data));
- // We shouldn't send a ping in this case since powerwash > 0.
- string post_str(post_data.begin(), post_data.end());
- EXPECT_EQ(string::npos, post_str.find("<ping"));
- }
- // Checks that the initial ping with a=-1 r=-1 is not send when the device
- // first_active_omaha_ping_sent is set.
- TEST_F(OmahaRequestActionTest, PingWhenFirstActiveOmahaPingIsSent) {
- fake_prefs_.SetString(kPrefsPreviousVersion, "");
- // Flag that the device was not powerwashed in the past.
- fake_system_state_.fake_hardware()->SetPowerwashCount(0);
- // Flag that the device has sent first active ping in the past.
- fake_system_state_.fake_hardware()->SetFirstActiveOmahaPingSent();
- brillo::Blob post_data;
- ASSERT_TRUE(TestUpdateCheck(fake_update_response_.GetNoUpdateResponse(),
- -1,
- false, // ping_only
- ErrorCode::kSuccess,
- metrics::CheckResult::kNoUpdateAvailable,
- metrics::CheckReaction::kUnset,
- metrics::DownloadErrorCode::kUnset,
- nullptr,
- &post_data));
- // We shouldn't send a ping in this case since
- // first_active_omaha_ping_sent=true
- string post_str(post_data.begin(), post_data.end());
- EXPECT_EQ(string::npos, post_str.find("<ping"));
- }
- // Checks that the event 54 is sent on a reboot to a new update.
- TEST_F(OmahaRequestActionTest, RebootAfterUpdateEvent) {
- // Flag that the device was updated in a previous boot.
- fake_prefs_.SetString(kPrefsPreviousVersion, "1.2.3.4");
- brillo::Blob post_data;
- ASSERT_TRUE(TestUpdateCheck(fake_update_response_.GetNoUpdateResponse(),
- -1,
- false, // ping_only
- ErrorCode::kSuccess,
- metrics::CheckResult::kNoUpdateAvailable,
- metrics::CheckReaction::kUnset,
- metrics::DownloadErrorCode::kUnset,
- nullptr,
- &post_data));
- string post_str(post_data.begin(), post_data.end());
- // An event 54 is included and has the right version.
- EXPECT_NE(
- string::npos,
- post_str.find(base::StringPrintf("<event eventtype=\"%d\"",
- OmahaEvent::kTypeRebootedAfterUpdate)));
- EXPECT_NE(string::npos,
- post_str.find("previousversion=\"1.2.3.4\"></event>"));
- // The previous version flag should have been removed.
- EXPECT_TRUE(fake_prefs_.Exists(kPrefsPreviousVersion));
- string prev_version;
- EXPECT_TRUE(fake_prefs_.GetString(kPrefsPreviousVersion, &prev_version));
- EXPECT_TRUE(prev_version.empty());
- }
- void OmahaRequestActionTest::P2PTest(bool initial_allow_p2p_for_downloading,
- bool initial_allow_p2p_for_sharing,
- bool omaha_disable_p2p_for_downloading,
- bool omaha_disable_p2p_for_sharing,
- bool payload_state_allow_p2p_attempt,
- bool expect_p2p_client_lookup,
- const string& p2p_client_result_url,
- bool expected_allow_p2p_for_downloading,
- bool expected_allow_p2p_for_sharing,
- const string& expected_p2p_url) {
- OmahaResponse response;
- bool actual_allow_p2p_for_downloading = initial_allow_p2p_for_downloading;
- bool actual_allow_p2p_for_sharing = initial_allow_p2p_for_sharing;
- string actual_p2p_url;
- MockPayloadState mock_payload_state;
- fake_system_state_.set_payload_state(&mock_payload_state);
- EXPECT_CALL(mock_payload_state, P2PAttemptAllowed())
- .WillRepeatedly(Return(payload_state_allow_p2p_attempt));
- EXPECT_CALL(mock_payload_state, GetUsingP2PForDownloading())
- .WillRepeatedly(ReturnPointee(&actual_allow_p2p_for_downloading));
- EXPECT_CALL(mock_payload_state, GetUsingP2PForSharing())
- .WillRepeatedly(ReturnPointee(&actual_allow_p2p_for_sharing));
- EXPECT_CALL(mock_payload_state, SetUsingP2PForDownloading(_))
- .WillRepeatedly(SaveArg<0>(&actual_allow_p2p_for_downloading));
- EXPECT_CALL(mock_payload_state, SetUsingP2PForSharing(_))
- .WillRepeatedly(SaveArg<0>(&actual_allow_p2p_for_sharing));
- EXPECT_CALL(mock_payload_state, SetP2PUrl(_))
- .WillRepeatedly(SaveArg<0>(&actual_p2p_url));
- MockP2PManager mock_p2p_manager;
- fake_system_state_.set_p2p_manager(&mock_p2p_manager);
- mock_p2p_manager.fake().SetLookupUrlForFileResult(p2p_client_result_url);
- TimeDelta timeout = TimeDelta::FromSeconds(kMaxP2PNetworkWaitTimeSeconds);
- EXPECT_CALL(mock_p2p_manager, LookupUrlForFile(_, _, timeout, _))
- .Times(expect_p2p_client_lookup ? 1 : 0);
- fake_update_response_.disable_p2p_for_downloading =
- omaha_disable_p2p_for_downloading;
- fake_update_response_.disable_p2p_for_sharing = omaha_disable_p2p_for_sharing;
- ASSERT_TRUE(TestUpdateCheck(fake_update_response_.GetUpdateResponse(),
- -1,
- false, // ping_only
- ErrorCode::kSuccess,
- metrics::CheckResult::kUpdateAvailable,
- metrics::CheckReaction::kUpdating,
- metrics::DownloadErrorCode::kUnset,
- &response,
- nullptr));
- EXPECT_TRUE(response.update_exists);
- EXPECT_EQ(omaha_disable_p2p_for_downloading,
- response.disable_p2p_for_downloading);
- EXPECT_EQ(omaha_disable_p2p_for_sharing, response.disable_p2p_for_sharing);
- EXPECT_EQ(expected_allow_p2p_for_downloading,
- actual_allow_p2p_for_downloading);
- EXPECT_EQ(expected_allow_p2p_for_sharing, actual_allow_p2p_for_sharing);
- EXPECT_EQ(expected_p2p_url, actual_p2p_url);
- }
- TEST_F(OmahaRequestActionTest, P2PWithPeer) {
- P2PTest(true, // initial_allow_p2p_for_downloading
- true, // initial_allow_p2p_for_sharing
- false, // omaha_disable_p2p_for_downloading
- false, // omaha_disable_p2p_for_sharing
- true, // payload_state_allow_p2p_attempt
- true, // expect_p2p_client_lookup
- "http://1.3.5.7/p2p", // p2p_client_result_url
- true, // expected_allow_p2p_for_downloading
- true, // expected_allow_p2p_for_sharing
- "http://1.3.5.7/p2p"); // expected_p2p_url
- }
- TEST_F(OmahaRequestActionTest, P2PWithoutPeer) {
- P2PTest(true, // initial_allow_p2p_for_downloading
- true, // initial_allow_p2p_for_sharing
- false, // omaha_disable_p2p_for_downloading
- false, // omaha_disable_p2p_for_sharing
- true, // payload_state_allow_p2p_attempt
- true, // expect_p2p_client_lookup
- "", // p2p_client_result_url
- false, // expected_allow_p2p_for_downloading
- true, // expected_allow_p2p_for_sharing
- ""); // expected_p2p_url
- }
- TEST_F(OmahaRequestActionTest, P2PDownloadNotAllowed) {
- P2PTest(false, // initial_allow_p2p_for_downloading
- true, // initial_allow_p2p_for_sharing
- false, // omaha_disable_p2p_for_downloading
- false, // omaha_disable_p2p_for_sharing
- true, // payload_state_allow_p2p_attempt
- false, // expect_p2p_client_lookup
- "unset", // p2p_client_result_url
- false, // expected_allow_p2p_for_downloading
- true, // expected_allow_p2p_for_sharing
- ""); // expected_p2p_url
- }
- TEST_F(OmahaRequestActionTest, P2PWithPeerDownloadDisabledByOmaha) {
- P2PTest(true, // initial_allow_p2p_for_downloading
- true, // initial_allow_p2p_for_sharing
- true, // omaha_disable_p2p_for_downloading
- false, // omaha_disable_p2p_for_sharing
- true, // payload_state_allow_p2p_attempt
- false, // expect_p2p_client_lookup
- "unset", // p2p_client_result_url
- false, // expected_allow_p2p_for_downloading
- true, // expected_allow_p2p_for_sharing
- ""); // expected_p2p_url
- }
- TEST_F(OmahaRequestActionTest, P2PWithPeerSharingDisabledByOmaha) {
- P2PTest(true, // initial_allow_p2p_for_downloading
- true, // initial_allow_p2p_for_sharing
- false, // omaha_disable_p2p_for_downloading
- true, // omaha_disable_p2p_for_sharing
- true, // payload_state_allow_p2p_attempt
- true, // expect_p2p_client_lookup
- "http://1.3.5.7/p2p", // p2p_client_result_url
- true, // expected_allow_p2p_for_downloading
- false, // expected_allow_p2p_for_sharing
- "http://1.3.5.7/p2p"); // expected_p2p_url
- }
- TEST_F(OmahaRequestActionTest, P2PWithPeerBothDisabledByOmaha) {
- P2PTest(true, // initial_allow_p2p_for_downloading
- true, // initial_allow_p2p_for_sharing
- true, // omaha_disable_p2p_for_downloading
- true, // omaha_disable_p2p_for_sharing
- true, // payload_state_allow_p2p_attempt
- false, // expect_p2p_client_lookup
- "unset", // p2p_client_result_url
- false, // expected_allow_p2p_for_downloading
- false, // expected_allow_p2p_for_sharing
- ""); // expected_p2p_url
- }
- bool OmahaRequestActionTest::InstallDateParseHelper(const string& elapsed_days,
- OmahaResponse* response) {
- fake_update_response_.elapsed_days = elapsed_days;
- return TestUpdateCheck(fake_update_response_.GetUpdateResponse(),
- -1,
- false, // ping_only
- ErrorCode::kSuccess,
- metrics::CheckResult::kUpdateAvailable,
- metrics::CheckReaction::kUpdating,
- metrics::DownloadErrorCode::kUnset,
- response,
- nullptr);
- }
- TEST_F(OmahaRequestActionTest, ParseInstallDateFromResponse) {
- OmahaResponse response;
- // Simulate a successful update check that happens during OOBE. The
- // deadline in the response is needed to force the update attempt to
- // occur; responses without a deadline seen during OOBE will normally
- // return ErrorCode::kNonCriticalUpdateInOOBE.
- fake_system_state_.fake_hardware()->UnsetIsOOBEComplete();
- fake_update_response_.deadline = "20101020";
- // Check that we parse elapsed_days in the Omaha Response correctly.
- // and that the kPrefsInstallDateDays value is written to.
- EXPECT_FALSE(fake_prefs_.Exists(kPrefsInstallDateDays));
- EXPECT_TRUE(InstallDateParseHelper("42", &response));
- EXPECT_TRUE(response.update_exists);
- EXPECT_EQ(42, response.install_date_days);
- EXPECT_TRUE(fake_prefs_.Exists(kPrefsInstallDateDays));
- int64_t prefs_days;
- EXPECT_TRUE(fake_prefs_.GetInt64(kPrefsInstallDateDays, &prefs_days));
- EXPECT_EQ(prefs_days, 42);
- // If there already is a value set, we shouldn't do anything.
- EXPECT_TRUE(InstallDateParseHelper("7", &response));
- EXPECT_TRUE(response.update_exists);
- EXPECT_EQ(7, response.install_date_days);
- EXPECT_TRUE(fake_prefs_.GetInt64(kPrefsInstallDateDays, &prefs_days));
- EXPECT_EQ(prefs_days, 42);
- // Note that elapsed_days is not necessarily divisible by 7 so check
- // that we round down correctly when populating kPrefsInstallDateDays.
- EXPECT_TRUE(fake_prefs_.Delete(kPrefsInstallDateDays));
- EXPECT_TRUE(InstallDateParseHelper("23", &response));
- EXPECT_TRUE(response.update_exists);
- EXPECT_EQ(23, response.install_date_days);
- EXPECT_TRUE(fake_prefs_.GetInt64(kPrefsInstallDateDays, &prefs_days));
- EXPECT_EQ(prefs_days, 21);
- // Check that we correctly handle elapsed_days not being included in
- // the Omaha Response.
- EXPECT_TRUE(InstallDateParseHelper("", &response));
- EXPECT_TRUE(response.update_exists);
- EXPECT_EQ(-1, response.install_date_days);
- }
- // If there is no prefs and OOBE is not complete, we should not
- // report anything to Omaha.
- TEST_F(OmahaRequestActionTest, GetInstallDateWhenNoPrefsNorOOBE) {
- fake_system_state_.fake_hardware()->UnsetIsOOBEComplete();
- EXPECT_EQ(OmahaRequestAction::GetInstallDate(&fake_system_state_), -1);
- EXPECT_FALSE(fake_prefs_.Exists(kPrefsInstallDateDays));
- }
- // If OOBE is complete and happened on a valid date (e.g. after Jan
- // 1 2007 0:00 PST), that date should be used and written to
- // prefs. However, first try with an invalid date and check we do
- // nothing.
- TEST_F(OmahaRequestActionTest, GetInstallDateWhenOOBECompletedWithInvalidDate) {
- Time oobe_date = Time::FromTimeT(42); // Dec 31, 1969 16:00:42 PST.
- fake_system_state_.fake_hardware()->SetIsOOBEComplete(oobe_date);
- EXPECT_EQ(OmahaRequestAction::GetInstallDate(&fake_system_state_), -1);
- EXPECT_FALSE(fake_prefs_.Exists(kPrefsInstallDateDays));
- }
- // Then check with a valid date. The date Jan 20, 2007 0:00 PST
- // should yield an InstallDate of 14.
- TEST_F(OmahaRequestActionTest, GetInstallDateWhenOOBECompletedWithValidDate) {
- Time oobe_date = Time::FromTimeT(1169280000); // Jan 20, 2007 0:00 PST.
- fake_system_state_.fake_hardware()->SetIsOOBEComplete(oobe_date);
- EXPECT_EQ(OmahaRequestAction::GetInstallDate(&fake_system_state_), 14);
- EXPECT_TRUE(fake_prefs_.Exists(kPrefsInstallDateDays));
- int64_t prefs_days;
- EXPECT_TRUE(fake_prefs_.GetInt64(kPrefsInstallDateDays, &prefs_days));
- EXPECT_EQ(prefs_days, 14);
- }
- // Now that we have a valid date in prefs, check that we keep using
- // that even if OOBE date reports something else. The date Jan 30,
- // 2007 0:00 PST should yield an InstallDate of 28... but since
- // there's a prefs file, we should still get 14.
- TEST_F(OmahaRequestActionTest, GetInstallDateWhenOOBECompletedDateChanges) {
- // Set a valid date in the prefs first.
- EXPECT_TRUE(fake_prefs_.SetInt64(kPrefsInstallDateDays, 14));
- Time oobe_date = Time::FromTimeT(1170144000); // Jan 30, 2007 0:00 PST.
- fake_system_state_.fake_hardware()->SetIsOOBEComplete(oobe_date);
- EXPECT_EQ(OmahaRequestAction::GetInstallDate(&fake_system_state_), 14);
- int64_t prefs_days;
- EXPECT_TRUE(fake_prefs_.GetInt64(kPrefsInstallDateDays, &prefs_days));
- EXPECT_EQ(prefs_days, 14);
- // If we delete the prefs file, we should get 28 days.
- EXPECT_TRUE(fake_prefs_.Delete(kPrefsInstallDateDays));
- EXPECT_EQ(OmahaRequestAction::GetInstallDate(&fake_system_state_), 28);
- EXPECT_TRUE(fake_prefs_.GetInt64(kPrefsInstallDateDays, &prefs_days));
- EXPECT_EQ(prefs_days, 28);
- }
- // Verifies that a device with no device policy, and is not a consumer
- // device sets the max kernel key version to the current version.
- // ie. the same behavior as if rollback is enabled.
- TEST_F(OmahaRequestActionTest, NoPolicyEnterpriseDevicesSetMaxRollback) {
- FakeHardware* fake_hw = fake_system_state_.fake_hardware();
- // Setup and verify some initial default values for the kernel TPM
- // values that control verified boot and rollback.
- const int min_kernel_version = 4;
- fake_hw->SetMinKernelKeyVersion(min_kernel_version);
- fake_hw->SetMaxKernelKeyRollforward(kRollforwardInfinity);
- EXPECT_EQ(min_kernel_version, fake_hw->GetMinKernelKeyVersion());
- EXPECT_EQ(kRollforwardInfinity, fake_hw->GetMaxKernelKeyRollforward());
- EXPECT_CALL(
- *fake_system_state_.mock_metrics_reporter(),
- ReportKeyVersionMetrics(min_kernel_version, min_kernel_version, true))
- .Times(1);
- OmahaResponse response;
- TestRollbackCheck(false /* is_consumer_device */,
- 3 /* rollback_allowed_milestones */,
- false /* is_policy_loaded */,
- &response);
- // Verify kernel_max_rollforward was set to the current minimum
- // kernel key version. This has the effect of freezing roll
- // forwards indefinitely. This will hold the rollback window
- // open until a future change will be able to move this forward
- // relative the configured window.
- EXPECT_EQ(min_kernel_version, fake_hw->GetMinKernelKeyVersion());
- EXPECT_EQ(min_kernel_version, fake_hw->GetMaxKernelKeyRollforward());
- }
- // Verifies that a conmsumer device with no device policy sets the
- // max kernel key version to the current version. ie. the same
- // behavior as if rollback is enabled.
- TEST_F(OmahaRequestActionTest, NoPolicyConsumerDevicesSetMaxRollback) {
- FakeHardware* fake_hw = fake_system_state_.fake_hardware();
- // Setup and verify some initial default values for the kernel TPM
- // values that control verified boot and rollback.
- const int min_kernel_version = 3;
- fake_hw->SetMinKernelKeyVersion(min_kernel_version);
- fake_hw->SetMaxKernelKeyRollforward(kRollforwardInfinity);
- EXPECT_EQ(min_kernel_version, fake_hw->GetMinKernelKeyVersion());
- EXPECT_EQ(kRollforwardInfinity, fake_hw->GetMaxKernelKeyRollforward());
- EXPECT_CALL(
- *fake_system_state_.mock_metrics_reporter(),
- ReportKeyVersionMetrics(min_kernel_version, kRollforwardInfinity, true))
- .Times(1);
- OmahaResponse response;
- TestRollbackCheck(true /* is_consumer_device */,
- 3 /* rollback_allowed_milestones */,
- false /* is_policy_loaded */,
- &response);
- // Verify that with rollback disabled that kernel_max_rollforward
- // was set to logical infinity. This is the expected behavior for
- // consumer devices and matches the existing behavior prior to the
- // rollback features.
- EXPECT_EQ(min_kernel_version, fake_hw->GetMinKernelKeyVersion());
- EXPECT_EQ(kRollforwardInfinity, fake_hw->GetMaxKernelKeyRollforward());
- }
- // Verifies that a device with rollback enabled sets kernel_max_rollforward
- // in the TPM to prevent roll forward.
- TEST_F(OmahaRequestActionTest, RollbackEnabledDevicesSetMaxRollback) {
- FakeHardware* fake_hw = fake_system_state_.fake_hardware();
- // Setup and verify some initial default values for the kernel TPM
- // values that control verified boot and rollback.
- const int allowed_milestones = 4;
- const int min_kernel_version = 3;
- fake_hw->SetMinKernelKeyVersion(min_kernel_version);
- fake_hw->SetMaxKernelKeyRollforward(kRollforwardInfinity);
- EXPECT_EQ(min_kernel_version, fake_hw->GetMinKernelKeyVersion());
- EXPECT_EQ(kRollforwardInfinity, fake_hw->GetMaxKernelKeyRollforward());
- EXPECT_CALL(
- *fake_system_state_.mock_metrics_reporter(),
- ReportKeyVersionMetrics(min_kernel_version, min_kernel_version, true))
- .Times(1);
- OmahaResponse response;
- TestRollbackCheck(false /* is_consumer_device */,
- allowed_milestones,
- true /* is_policy_loaded */,
- &response);
- // Verify that with rollback enabled that kernel_max_rollforward
- // was set to the current minimum kernel key version. This has
- // the effect of freezing roll forwards indefinitely. This will
- // hold the rollback window open until a future change will
- // be able to move this forward relative the configured window.
- EXPECT_EQ(min_kernel_version, fake_hw->GetMinKernelKeyVersion());
- EXPECT_EQ(min_kernel_version, fake_hw->GetMaxKernelKeyRollforward());
- }
- // Verifies that a device with rollback disabled sets kernel_max_rollforward
- // in the TPM to logical infinity, to allow roll forward.
- TEST_F(OmahaRequestActionTest, RollbackDisabledDevicesSetMaxRollback) {
- FakeHardware* fake_hw = fake_system_state_.fake_hardware();
- // Setup and verify some initial default values for the kernel TPM
- // values that control verified boot and rollback.
- const int allowed_milestones = 0;
- const int min_kernel_version = 3;
- fake_hw->SetMinKernelKeyVersion(min_kernel_version);
- fake_hw->SetMaxKernelKeyRollforward(kRollforwardInfinity);
- EXPECT_EQ(min_kernel_version, fake_hw->GetMinKernelKeyVersion());
- EXPECT_EQ(kRollforwardInfinity, fake_hw->GetMaxKernelKeyRollforward());
- EXPECT_CALL(
- *fake_system_state_.mock_metrics_reporter(),
- ReportKeyVersionMetrics(min_kernel_version, kRollforwardInfinity, true))
- .Times(1);
- OmahaResponse response;
- TestRollbackCheck(false /* is_consumer_device */,
- allowed_milestones,
- true /* is_policy_loaded */,
- &response);
- // Verify that with rollback disabled that kernel_max_rollforward
- // was set to logical infinity.
- EXPECT_EQ(min_kernel_version, fake_hw->GetMinKernelKeyVersion());
- EXPECT_EQ(kRollforwardInfinity, fake_hw->GetMaxKernelKeyRollforward());
- }
- TEST_F(OmahaRequestActionTest, RollbackResponseParsedNoEntries) {
- OmahaResponse response;
- fake_update_response_.rollback = true;
- TestRollbackCheck(false /* is_consumer_device */,
- 4 /* rollback_allowed_milestones */,
- true /* is_policy_loaded */,
- &response);
- EXPECT_TRUE(response.is_rollback);
- }
- TEST_F(OmahaRequestActionTest, RollbackResponseValidVersionsParsed) {
- OmahaResponse response;
- fake_update_response_.rollback_firmware_version = "1.2";
- fake_update_response_.rollback_kernel_version = "3.4";
- fake_update_response_.rollback = true;
- TestRollbackCheck(false /* is_consumer_device */,
- 4 /* rollback_allowed_milestones */,
- true /* is_policy_loaded */,
- &response);
- EXPECT_TRUE(response.is_rollback);
- EXPECT_EQ(1, response.rollback_key_version.firmware_key);
- EXPECT_EQ(2, response.rollback_key_version.firmware);
- EXPECT_EQ(3, response.rollback_key_version.kernel_key);
- EXPECT_EQ(4, response.rollback_key_version.kernel);
- }
- TEST_F(OmahaRequestActionTest,
- TestUpdateFirstSeenAtPrefPersistedIfUpdateExists) {
- FakeClock fake_clock;
- Time now = Time::Now();
- fake_clock.SetWallclockTime(now);
- fake_system_state_.set_clock(&fake_clock);
- OmahaResponse response;
- ASSERT_TRUE(TestUpdateCheck(fake_update_response_.GetUpdateResponse(),
- -1,
- false, // ping_only
- ErrorCode::kSuccess,
- metrics::CheckResult::kUpdateAvailable,
- metrics::CheckReaction::kUpdating,
- metrics::DownloadErrorCode::kUnset,
- &response,
- nullptr));
- EXPECT_TRUE(response.update_exists);
- EXPECT_TRUE(fake_prefs_.Exists(kPrefsUpdateFirstSeenAt));
- int64_t stored_first_seen_at_time;
- EXPECT_TRUE(fake_prefs_.GetInt64(kPrefsUpdateFirstSeenAt,
- &stored_first_seen_at_time));
- EXPECT_EQ(now.ToInternalValue(), stored_first_seen_at_time);
- }
- TEST_F(OmahaRequestActionTest,
- TestUpdateFirstSeenAtPrefNotPersistedIfUpdateFails) {
- FakeClock fake_clock;
- Time now = Time::Now();
- fake_clock.SetWallclockTime(now);
- fake_system_state_.set_clock(&fake_clock);
- OmahaResponse response;
- ASSERT_TRUE(TestUpdateCheck(fake_update_response_.GetNoUpdateResponse(),
- -1,
- false, // ping_only
- ErrorCode::kSuccess,
- metrics::CheckResult::kNoUpdateAvailable,
- metrics::CheckReaction::kUnset,
- metrics::DownloadErrorCode::kUnset,
- &response,
- nullptr));
- EXPECT_FALSE(response.update_exists);
- EXPECT_FALSE(fake_prefs_.Exists(kPrefsUpdateFirstSeenAt));
- }
- TEST_F(OmahaRequestActionTest, InstallTest) {
- OmahaResponse response;
- request_params_.set_is_install(true);
- request_params_.set_dlc_module_ids({"dlc_no_0", "dlc_no_1"});
- brillo::Blob post_data;
- ASSERT_TRUE(TestUpdateCheck(fake_update_response_.GetUpdateResponse(),
- -1,
- false, // ping_only
- true, // is_consumer_device
- 0, // rollback_allowed_milestones
- false, // is_policy_loaded
- ErrorCode::kSuccess,
- metrics::CheckResult::kUpdateAvailable,
- metrics::CheckReaction::kUpdating,
- metrics::DownloadErrorCode::kUnset,
- &response,
- &post_data));
- // Convert post_data to string.
- string post_str(post_data.begin(), post_data.end());
- for (const auto& dlc_module_id : request_params_.dlc_module_ids()) {
- EXPECT_NE(string::npos,
- post_str.find("appid=\"" + fake_update_response_.app_id + "_" +
- dlc_module_id + "\""));
- }
- EXPECT_NE(string::npos,
- post_str.find("appid=\"" + fake_update_response_.app_id + "\""));
- // Count number of updatecheck tag in response.
- int updatecheck_count = 0;
- size_t pos = 0;
- while ((pos = post_str.find("<updatecheck", pos)) != string::npos) {
- updatecheck_count++;
- pos++;
- }
- EXPECT_EQ(request_params_.dlc_module_ids().size(), updatecheck_count);
- }
- TEST_F(OmahaRequestActionTest, InstallMissingPlatformVersionTest) {
- fake_update_response_.multi_app_skip_updatecheck = true;
- fake_update_response_.multi_app_no_update = false;
- request_params_.set_is_install(true);
- request_params_.set_dlc_module_ids({"dlc_no_0", "dlc_no_1"});
- request_params_.set_app_id(fake_update_response_.app_id_skip_updatecheck);
- OmahaResponse response;
- ASSERT_TRUE(TestUpdateCheck(fake_update_response_.GetUpdateResponse(),
- -1,
- false, // ping_only
- ErrorCode::kSuccess,
- metrics::CheckResult::kUpdateAvailable,
- metrics::CheckReaction::kUpdating,
- metrics::DownloadErrorCode::kUnset,
- &response,
- nullptr));
- EXPECT_TRUE(response.update_exists);
- EXPECT_EQ(fake_update_response_.current_version, response.version);
- }
- } // namespace chromeos_update_engine
|