| OLD | NEW |
| (Empty) |
| 1 // Copyright 2009-2010 Google Inc. | |
| 2 // | |
| 3 // Licensed under the Apache License, Version 2.0 (the "License"); | |
| 4 // you may not use this file except in compliance with the License. | |
| 5 // You may obtain a copy of the License at | |
| 6 // | |
| 7 // http://www.apache.org/licenses/LICENSE-2.0 | |
| 8 // | |
| 9 // Unless required by applicable law or agreed to in writing, software | |
| 10 // distributed under the License is distributed on an "AS IS" BASIS, | |
| 11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
| 12 // See the License for the specific language governing permissions and | |
| 13 // limitations under the License. | |
| 14 // ======================================================================== | |
| 15 | |
| 16 #include <atlsecurity.h> | |
| 17 #include "omaha/base/app_util.h" | |
| 18 #include "omaha/base/error.h" | |
| 19 #include "omaha/base/reg_key.h" | |
| 20 #include "omaha/base/scoped_ptr_address.h" | |
| 21 #include "omaha/base/thread_pool.h" | |
| 22 #include "omaha/base/utils.h" | |
| 23 #include "omaha/common/lang.h" | |
| 24 #include "omaha/goopdate/app_bundle_state_busy.h" | |
| 25 #include "omaha/goopdate/app_bundle_state_initialized.h" | |
| 26 #include "omaha/goopdate/app_bundle_state_paused.h" | |
| 27 #include "omaha/goopdate/app_bundle_state_ready.h" | |
| 28 #include "omaha/goopdate/app_bundle_state_stopped.h" | |
| 29 #include "omaha/goopdate/app_manager.h" | |
| 30 #include "omaha/goopdate/model.h" | |
| 31 #include "omaha/goopdate/resource_manager.h" | |
| 32 #include "omaha/goopdate/worker.h" | |
| 33 #include "omaha/goopdate/worker_mock.h" | |
| 34 #include "omaha/testing/unit_test.h" | |
| 35 | |
| 36 namespace omaha { | |
| 37 | |
| 38 const int kKnownError = 0x87658765; | |
| 39 | |
| 40 const TCHAR* const kDefaultAppName = _T("Google Application"); | |
| 41 | |
| 42 const uint32 kInitialInstallTimeDiff = static_cast<uint32>(-1 * kSecondsPerDay); | |
| 43 | |
| 44 // TODO(omaha): there is a problem with this unit test. The model is built | |
| 45 // bottom up. This makes it impossible to set the references to parents. Will | |
| 46 // have to fix the code, eventually using Builder DP to create a bunch of | |
| 47 // models containing bundles, apps, and such. | |
| 48 | |
| 49 | |
| 50 // Helper functions. | |
| 51 // TODO(omaha): helper functions need to go into their own compilation unit to | |
| 52 // avoid dependencies between unit test modules. | |
| 53 | |
| 54 void ValidateFreshInstallDefaultValues(const App& app) { | |
| 55 EXPECT_FALSE(::IsEqualGUID(GUID_NULL, app.app_guid())); | |
| 56 EXPECT_TRUE(app.language().IsEmpty()); | |
| 57 EXPECT_TRUE(app.ap().IsEmpty()); | |
| 58 EXPECT_TRUE(app.tt_token().IsEmpty()); | |
| 59 EXPECT_TRUE(::IsEqualGUID(GUID_NULL, app.iid())); | |
| 60 EXPECT_TRUE(app.brand_code().IsEmpty()); | |
| 61 EXPECT_TRUE(app.client_id().IsEmpty()); | |
| 62 EXPECT_TRUE(app.GetExperimentLabels().IsEmpty()); | |
| 63 EXPECT_TRUE(app.referral_id().IsEmpty()); | |
| 64 EXPECT_EQ(kInitialInstallTimeDiff, app.install_time_diff_sec()); | |
| 65 EXPECT_FALSE(app.is_eula_accepted()); | |
| 66 EXPECT_TRUE(app.display_name().IsEmpty()); | |
| 67 EXPECT_EQ(BROWSER_UNKNOWN, app.browser_type()); | |
| 68 EXPECT_TRUE(app.server_install_data_index().IsEmpty()); | |
| 69 EXPECT_EQ(TRISTATE_NONE, app.usage_stats_enable()); | |
| 70 EXPECT_TRUE(app.client_install_data().IsEmpty()); | |
| 71 EXPECT_TRUE(app.server_install_data().IsEmpty()); | |
| 72 EXPECT_EQ(ACTIVE_UNKNOWN, app.did_run()); | |
| 73 EXPECT_EQ(0, app.days_since_last_active_ping()); | |
| 74 EXPECT_EQ(0, app.days_since_last_roll_call()); | |
| 75 | |
| 76 EXPECT_TRUE(app.current_version()->version().IsEmpty()); | |
| 77 EXPECT_TRUE(app.next_version()->version().IsEmpty()); | |
| 78 // TODO(omaha3): Add all the new values (state_, etc.). | |
| 79 } | |
| 80 | |
| 81 void PopulateDataAndRegistryForRegisteredAndUnInstalledAppsTests( | |
| 82 bool is_machine, | |
| 83 App* expected_app0, | |
| 84 App* expected_app1, | |
| 85 App* expected_app2, | |
| 86 App* opposite_hive_app1, | |
| 87 App* opposite_hive_app2); | |
| 88 | |
| 89 void SetDisplayName(const CString& name, App* app); | |
| 90 | |
| 91 void ValidateExpectedValues(const App& expected, const App& actual) { | |
| 92 EXPECT_STREQ(GuidToString(expected.app_guid()), | |
| 93 GuidToString(actual.app_guid())); | |
| 94 EXPECT_STREQ(expected.language(), actual.language()); | |
| 95 EXPECT_STREQ(expected.ap(), actual.ap()); | |
| 96 EXPECT_STREQ(expected.tt_token(), actual.tt_token()); | |
| 97 EXPECT_STREQ(GuidToString(expected.iid()), GuidToString(actual.iid())); | |
| 98 EXPECT_STREQ(expected.brand_code(), actual.brand_code()); | |
| 99 EXPECT_STREQ(expected.client_id(), actual.client_id()); | |
| 100 EXPECT_STREQ(expected.GetExperimentLabels(), actual.GetExperimentLabels()); | |
| 101 EXPECT_STREQ(expected.referral_id(), actual.referral_id()); | |
| 102 EXPECT_EQ(expected.install_time_diff_sec(), actual.install_time_diff_sec()); | |
| 103 EXPECT_EQ(expected.is_eula_accepted(), actual.is_eula_accepted()); | |
| 104 EXPECT_STREQ(expected.display_name(), actual.display_name()); | |
| 105 EXPECT_EQ(expected.browser_type(), actual.browser_type()); | |
| 106 EXPECT_STREQ(expected.server_install_data_index(), | |
| 107 actual.server_install_data_index()); | |
| 108 EXPECT_EQ(expected.usage_stats_enable(), actual.usage_stats_enable()); | |
| 109 EXPECT_STREQ(expected.client_install_data(), actual.client_install_data()); | |
| 110 EXPECT_STREQ(expected.server_install_data(), actual.server_install_data()); | |
| 111 EXPECT_EQ(expected.did_run(), actual.did_run()); | |
| 112 | |
| 113 EXPECT_STREQ(expected.current_version()->version(), | |
| 114 actual.current_version()->version()); | |
| 115 EXPECT_STREQ(expected.next_version()->version(), | |
| 116 actual.next_version()->version()); | |
| 117 | |
| 118 // TODO(omaha3): Add all the new values (state(), etc.)? | |
| 119 } | |
| 120 | |
| 121 using ::testing::_; | |
| 122 using ::testing::Return; | |
| 123 | |
| 124 namespace { | |
| 125 | |
| 126 // TODO(omaha): At least some of these and where they are used have to be kept | |
| 127 // in sync with app_manager_unittest.cc because the constants are hard-coded in | |
| 128 // functions used by these tests. Break this coupling. | |
| 129 const TCHAR* const kGuid1 = _T("{21CD0965-0B0E-47cf-B421-2D191C16C0E2}"); | |
| 130 const TCHAR* const kGuid2 = _T("{A979ACBD-1F55-4b12-A35F-4DBCA5A7CCB8}"); | |
| 131 const TCHAR* const kGuid3 = _T("{661045C5-4429-4140-BC48-8CEA241D1DEF}"); | |
| 132 const TCHAR* const kGuid4 = _T("{AAFA1CF9-E94F-42e6-A899-4CD27F37D5A7}"); | |
| 133 const TCHAR* const kGuid5 = _T("{3B1A3CCA-0525-4418-93E6-A0DB3398EC9B}"); | |
| 134 const TCHAR* const kGuid6 = _T("{F3F2CFD4-5F98-4bf0-ABB0-BEEEA46C62B4}"); | |
| 135 const TCHAR* const kGuid7 = _T("{6FD2272F-8583-4bbd-895A-E65F8003FC7B}"); | |
| 136 | |
| 137 | |
| 138 class DummyUserWorkItem : public UserWorkItem { | |
| 139 private: | |
| 140 virtual void DoProcess() {} | |
| 141 }; | |
| 142 | |
| 143 ACTION_P(SetWorkItem, work_item) { | |
| 144 UNREFERENCED_ACTION_PARAMETERS; | |
| 145 arg0->set_user_work_item(work_item); | |
| 146 return 0; | |
| 147 } | |
| 148 | |
| 149 } // namespace | |
| 150 | |
| 151 class AppBundleNoBundleTest : public testing::Test { | |
| 152 protected: | |
| 153 explicit AppBundleNoBundleTest(bool is_machine) | |
| 154 : is_machine_(is_machine) {} | |
| 155 | |
| 156 virtual void SetUp() { | |
| 157 EXPECT_SUCCEEDED(AppManager::CreateInstance(is_machine_)); | |
| 158 | |
| 159 // By default, no Worker methods should be called, so use StrictMock. | |
| 160 // Override this behavior for specific methods in the individual test cases. | |
| 161 worker_.reset(new testing::StrictMock<MockWorker>); | |
| 162 model_.reset(new Model(worker_.get())); | |
| 163 | |
| 164 EXPECT_CALL(*worker_, Lock()).WillRepeatedly(Return(2)); | |
| 165 EXPECT_CALL(*worker_, Unlock()).WillRepeatedly(Return(1)); | |
| 166 } | |
| 167 | |
| 168 virtual void TearDown() { | |
| 169 AppManager::DeleteInstance(); | |
| 170 } | |
| 171 | |
| 172 const bool is_machine_; | |
| 173 scoped_ptr<MockWorker> worker_; | |
| 174 scoped_ptr<Model> model_; | |
| 175 | |
| 176 private: | |
| 177 DISALLOW_IMPLICIT_CONSTRUCTORS(AppBundleNoBundleTest); | |
| 178 }; | |
| 179 | |
| 180 class AppBundleTest : public AppBundleNoBundleTest { | |
| 181 protected: | |
| 182 explicit AppBundleTest(bool is_machine) : AppBundleNoBundleTest(is_machine) {} | |
| 183 | |
| 184 static void SetUpTestCase() { | |
| 185 EXPECT_EQ(STATE_INIT, fsm::AppBundleState::STATE_INIT); | |
| 186 EXPECT_EQ(STATE_INITIALIZED, fsm::AppBundleState::STATE_INITIALIZED); | |
| 187 EXPECT_EQ(STATE_BUSY, fsm::AppBundleState::STATE_BUSY); | |
| 188 EXPECT_EQ(STATE_READY, fsm::AppBundleState::STATE_READY); | |
| 189 EXPECT_EQ(STATE_PAUSED, fsm::AppBundleState::STATE_PAUSED); | |
| 190 EXPECT_EQ(STATE_STOPPED, fsm::AppBundleState::STATE_STOPPED); | |
| 191 } | |
| 192 | |
| 193 virtual void SetUp() { | |
| 194 AppBundleNoBundleTest::SetUp(); | |
| 195 app_bundle_ = model_->CreateAppBundle(is_machine_); | |
| 196 ASSERT_TRUE(app_bundle_.get()); | |
| 197 } | |
| 198 | |
| 199 virtual void TearDown() { | |
| 200 app_bundle_.reset(); | |
| 201 AppBundleNoBundleTest::TearDown(); | |
| 202 } | |
| 203 | |
| 204 void TestPropertyReflexiveness() { | |
| 205 EXPECT_SUCCEEDED(app_bundle_->put_displayName(CComBSTR(_T("My Apps")))); | |
| 206 CComBSTR name(_T("")); | |
| 207 EXPECT_SUCCEEDED(app_bundle_->get_displayName(&name)); | |
| 208 EXPECT_STREQ(_T("My Apps"), name); | |
| 209 | |
| 210 EXPECT_SUCCEEDED(app_bundle_->put_displayLanguage(CComBSTR(_T("en")))); | |
| 211 CComBSTR lang(_T("")); | |
| 212 EXPECT_SUCCEEDED(app_bundle_->get_displayLanguage(&lang)); | |
| 213 EXPECT_STREQ(_T("en"), lang); | |
| 214 | |
| 215 EXPECT_SUCCEEDED(app_bundle_->put_installSource(CComBSTR(_T("unittest")))); | |
| 216 CComBSTR source(_T("")); | |
| 217 EXPECT_SUCCEEDED(app_bundle_->get_installSource(&source)); | |
| 218 EXPECT_STREQ(_T("unittest"), source); | |
| 219 | |
| 220 EXPECT_SUCCEEDED(app_bundle_->put_priority(INSTALL_PRIORITY_LOW)); | |
| 221 long priority = INSTALL_PRIORITY_HIGH; // NOLINT | |
| 222 EXPECT_SUCCEEDED(app_bundle_->get_priority(&priority)); | |
| 223 EXPECT_EQ(INSTALL_PRIORITY_LOW, priority); | |
| 224 } | |
| 225 | |
| 226 // A copy of the protected enum in AppBundleState, allowing the individual | |
| 227 // tests to use these values. | |
| 228 enum BundleState { | |
| 229 STATE_INIT, | |
| 230 STATE_INITIALIZED, | |
| 231 STATE_BUSY, | |
| 232 STATE_READY, | |
| 233 STATE_PAUSED, | |
| 234 STATE_STOPPED, | |
| 235 }; | |
| 236 | |
| 237 BundleState GetBundleState() { | |
| 238 return static_cast<BundleState>(app_bundle_->app_bundle_state_->state_); | |
| 239 } | |
| 240 | |
| 241 shared_ptr<AppBundle> app_bundle_; | |
| 242 | |
| 243 private: | |
| 244 DISALLOW_IMPLICIT_CONSTRUCTORS(AppBundleTest); | |
| 245 }; | |
| 246 | |
| 247 class AppBundleUninitializedTest : public AppBundleTest { | |
| 248 protected: | |
| 249 explicit AppBundleUninitializedTest(bool is_machine) | |
| 250 : AppBundleTest(is_machine) {} | |
| 251 | |
| 252 void TestPropertyDefaults() { | |
| 253 CComBSTR name; | |
| 254 EXPECT_SUCCEEDED(app_bundle_->get_displayName(&name)); | |
| 255 EXPECT_STREQ(_T(""), name); | |
| 256 | |
| 257 CComBSTR lang; | |
| 258 EXPECT_SUCCEEDED(app_bundle_->get_displayLanguage(&lang)); | |
| 259 EXPECT_STREQ(lang::GetDefaultLanguage(is_machine_), lang); | |
| 260 | |
| 261 CComBSTR install_source; | |
| 262 EXPECT_SUCCEEDED(app_bundle_->get_installSource(&install_source)); | |
| 263 EXPECT_STREQ(_T("unknown"), install_source); | |
| 264 | |
| 265 CComBSTR offline_dir; | |
| 266 EXPECT_SUCCEEDED(app_bundle_->get_offlineDirectory(&offline_dir)); | |
| 267 EXPECT_STREQ(_T(""), offline_dir); | |
| 268 | |
| 269 long priority; // NOLINT | |
| 270 EXPECT_SUCCEEDED(app_bundle_->get_priority(&priority)); | |
| 271 EXPECT_EQ(INSTALL_PRIORITY_HIGH, priority); | |
| 272 } | |
| 273 }; | |
| 274 | |
| 275 class AppBundleUninitializedMachineTest : public AppBundleUninitializedTest { | |
| 276 protected: | |
| 277 AppBundleUninitializedMachineTest() : AppBundleUninitializedTest(true) {} | |
| 278 }; | |
| 279 | |
| 280 class AppBundleUninitializedUserTest : public AppBundleUninitializedTest { | |
| 281 protected: | |
| 282 AppBundleUninitializedUserTest() : AppBundleUninitializedTest(false) {} | |
| 283 }; | |
| 284 | |
| 285 TEST_F(AppBundleUninitializedMachineTest, Properties) { | |
| 286 TestPropertyDefaults(); | |
| 287 TestPropertyReflexiveness(); | |
| 288 } | |
| 289 | |
| 290 TEST_F(AppBundleUninitializedUserTest, Properties) { | |
| 291 TestPropertyDefaults(); | |
| 292 TestPropertyReflexiveness(); | |
| 293 } | |
| 294 | |
| 295 class AppBundleInitializedTest : public AppBundleTest { | |
| 296 protected: | |
| 297 explicit AppBundleInitializedTest(bool is_machine) | |
| 298 : AppBundleTest(is_machine) {} | |
| 299 | |
| 300 virtual void SetUp() { | |
| 301 AppBundleTest::SetUp(); | |
| 302 // TODO(omaha): UserRights::GetCallerToken() fails with ERROR_NO_TOKEN | |
| 303 // when initialize() is called for a machine bundle during these tests. | |
| 304 // It might make sense to move theimpersonation stuff to the COM wrapper, | |
| 305 // but I am not sure how this would work with the AppBundleStates. | |
| 306 // If we can do something about this, call initialize() in all cases. | |
| 307 if (is_machine_) { | |
| 308 SetAppBundleStateForUnitTest(app_bundle_.get(), | |
| 309 new fsm::AppBundleStateInitialized); | |
| 310 } else { | |
| 311 EXPECT_SUCCEEDED(app_bundle_->put_displayName(CComBSTR(_T("My Bundle")))); | |
| 312 EXPECT_SUCCEEDED(app_bundle_->put_displayLanguage(CComBSTR(_T("en")))); | |
| 313 EXPECT_SUCCEEDED(app_bundle_->initialize()); | |
| 314 } | |
| 315 } | |
| 316 }; | |
| 317 | |
| 318 class AppBundleNoBundleMachineTest : public AppBundleNoBundleTest { | |
| 319 protected: | |
| 320 AppBundleNoBundleMachineTest() : AppBundleNoBundleTest(true) {} | |
| 321 }; | |
| 322 | |
| 323 class AppBundleNoBundleUserTest : public AppBundleNoBundleTest { | |
| 324 protected: | |
| 325 AppBundleNoBundleUserTest() : AppBundleNoBundleTest(false) {} | |
| 326 }; | |
| 327 | |
| 328 class AppBundleInitializedMachineTest : public AppBundleInitializedTest { | |
| 329 protected: | |
| 330 AppBundleInitializedMachineTest() : AppBundleInitializedTest(true) {} | |
| 331 }; | |
| 332 | |
| 333 class AppBundleInitializedUserTest : public AppBundleInitializedTest { | |
| 334 protected: | |
| 335 AppBundleInitializedUserTest() : AppBundleInitializedTest(false) {} | |
| 336 }; | |
| 337 | |
| 338 | |
| 339 // The creation of an app bundle inserts it in the model and increments | |
| 340 // the server module count. | |
| 341 TEST_F(AppBundleNoBundleUserTest, ConstructorAndDestructor) { | |
| 342 EXPECT_CALL(*worker_, Lock()).WillOnce(Return(2)); | |
| 343 EXPECT_CALL(*worker_, Unlock()).WillOnce(Return(1)); | |
| 344 | |
| 345 shared_ptr<AppBundle> app_bundle(model_->CreateAppBundle(is_machine_)); | |
| 346 EXPECT_TRUE(app_bundle.get()); | |
| 347 EXPECT_EQ(1, model_->GetNumberOfAppBundles()); | |
| 348 EXPECT_EQ(app_bundle.get(), model_->GetAppBundle(0).get()); | |
| 349 app_bundle.reset(); | |
| 350 EXPECT_EQ(0, model_->GetNumberOfAppBundles()); | |
| 351 } | |
| 352 | |
| 353 TEST_F(AppBundleNoBundleMachineTest, ConstructorAndDestructor) { | |
| 354 EXPECT_CALL(*worker_, Lock()).WillOnce(Return(2)); | |
| 355 EXPECT_CALL(*worker_, Unlock()).WillOnce(Return(1)); | |
| 356 | |
| 357 shared_ptr<AppBundle> app_bundle(model_->CreateAppBundle(is_machine_)); | |
| 358 EXPECT_TRUE(app_bundle.get()); | |
| 359 EXPECT_EQ(1, model_->GetNumberOfAppBundles()); | |
| 360 EXPECT_EQ(app_bundle.get(), model_->GetAppBundle(0).get()); | |
| 361 app_bundle.reset(); | |
| 362 EXPECT_EQ(0, model_->GetNumberOfAppBundles()); | |
| 363 } | |
| 364 | |
| 365 class AppBundlePopulatedRegistryTest : public AppBundleInitializedTest { | |
| 366 protected: | |
| 367 explicit AppBundlePopulatedRegistryTest(bool is_machine) | |
| 368 : AppBundleInitializedTest(is_machine), | |
| 369 hive_override_key_name_(kRegistryHiveOverrideRoot) {} | |
| 370 | |
| 371 virtual void SetUp() { | |
| 372 AppBundleInitializedTest::SetUp(); | |
| 373 | |
| 374 RegKey::DeleteKey(hive_override_key_name_); | |
| 375 OverrideRegistryHives(hive_override_key_name_); | |
| 376 | |
| 377 EXPECT_SUCCEEDED(ResourceManager::Create( | |
| 378 is_machine_, app_util::GetCurrentModuleDirectory(), _T("en"))); | |
| 379 | |
| 380 dummy_app_bundle_for_expected_apps_ = model_->CreateAppBundle(is_machine_); | |
| 381 ASSERT_TRUE(dummy_app_bundle_for_expected_apps_.get()); | |
| 382 // TODO(omaha): Address with the TODO in AppBundleInitializedTest::SetUp. | |
| 383 if (is_machine_) { | |
| 384 SetAppBundleStateForUnitTest(dummy_app_bundle_for_expected_apps_.get(), | |
| 385 new fsm::AppBundleStateInitialized); | |
| 386 } else { | |
| 387 EXPECT_SUCCEEDED(dummy_app_bundle_for_expected_apps_->put_displayName( | |
| 388 CComBSTR(_T("My Bundle")))); | |
| 389 EXPECT_SUCCEEDED(dummy_app_bundle_for_expected_apps_->put_displayLanguage( | |
| 390 CComBSTR(_T("en")))); | |
| 391 EXPECT_SUCCEEDED(dummy_app_bundle_for_expected_apps_->initialize()); | |
| 392 } | |
| 393 } | |
| 394 | |
| 395 virtual void TearDown() { | |
| 396 dummy_app_bundle_for_expected_apps_.reset(); | |
| 397 | |
| 398 ResourceManager::Delete(); | |
| 399 | |
| 400 RestoreRegistryHives(); | |
| 401 RegKey::DeleteKey(hive_override_key_name_); | |
| 402 | |
| 403 AppBundleInitializedTest::TearDown(); | |
| 404 } | |
| 405 | |
| 406 // App will be cleaned up when bundle is destroyed. | |
| 407 // This is a hack for creating registry data. Would be nice to have a | |
| 408 // different mechanism. | |
| 409 App* CreateExpectedApp(const TCHAR* app_id) { | |
| 410 App* app = NULL; | |
| 411 EXPECT_SUCCEEDED( | |
| 412 dummy_app_bundle_for_expected_apps_->createApp(CComBSTR(app_id), &app)); | |
| 413 ASSERT1(app); | |
| 414 return app; | |
| 415 } | |
| 416 | |
| 417 void PopulateDataAndRegistryForRegisteredAndUnInstalledAppsTests( | |
| 418 App** expected_app0, | |
| 419 App** expected_app1, | |
| 420 App** expected_app2) { | |
| 421 *expected_app0 = CreateExpectedApp(kGuid1); | |
| 422 *expected_app1 = CreateExpectedApp(kGuid2); | |
| 423 *expected_app2 = CreateExpectedApp(kGuid3); | |
| 424 App* opposite_hive_app1 = CreateExpectedApp(kGuid6); | |
| 425 App* opposite_hive_app2 = CreateExpectedApp(kGuid7); | |
| 426 omaha::PopulateDataAndRegistryForRegisteredAndUnInstalledAppsTests( | |
| 427 is_machine_, | |
| 428 *expected_app0, | |
| 429 *expected_app1, | |
| 430 *expected_app2, | |
| 431 opposite_hive_app1, | |
| 432 opposite_hive_app2); | |
| 433 | |
| 434 // Reload install age since registry has been changed. | |
| 435 AppManager::Instance()->ReadAppInstallTimeDiff(*expected_app0); | |
| 436 AppManager::Instance()->ReadAppInstallTimeDiff(*expected_app1); | |
| 437 AppManager::Instance()->ReadAppInstallTimeDiff(*expected_app2); | |
| 438 AppManager::Instance()->ReadAppInstallTimeDiff(opposite_hive_app1); | |
| 439 AppManager::Instance()->ReadAppInstallTimeDiff(opposite_hive_app2); | |
| 440 } | |
| 441 | |
| 442 CString hive_override_key_name_; | |
| 443 shared_ptr<AppBundle> dummy_app_bundle_for_expected_apps_; | |
| 444 LLock lock_; | |
| 445 | |
| 446 DISALLOW_IMPLICIT_CONSTRUCTORS(AppBundlePopulatedRegistryTest); | |
| 447 }; | |
| 448 | |
| 449 class AppBundlePopulatedRegistryMachineTest | |
| 450 : public AppBundlePopulatedRegistryTest { | |
| 451 protected: | |
| 452 AppBundlePopulatedRegistryMachineTest() | |
| 453 : AppBundlePopulatedRegistryTest(true) {} | |
| 454 }; | |
| 455 | |
| 456 class AppBundlePopulatedRegistryUserTest | |
| 457 : public AppBundlePopulatedRegistryTest { | |
| 458 protected: | |
| 459 AppBundlePopulatedRegistryUserTest() | |
| 460 : AppBundlePopulatedRegistryTest(false) {} | |
| 461 }; | |
| 462 | |
| 463 TEST_F(AppBundleInitializedUserTest, CountAndItem_NoApps) { | |
| 464 EXPECT_EQ(0, app_bundle_->GetNumberOfApps()); | |
| 465 long num_apps = 0; // NOLINT | |
| 466 EXPECT_SUCCEEDED(app_bundle_->get_Count(&num_apps)); | |
| 467 EXPECT_EQ(0, num_apps); | |
| 468 | |
| 469 { | |
| 470 ExpectAsserts expect_asserts; | |
| 471 EXPECT_FALSE(app_bundle_->GetApp(0)); | |
| 472 } | |
| 473 App* app0_obtained = NULL; | |
| 474 EXPECT_EQ(HRESULT_FROM_WIN32(ERROR_INVALID_INDEX), | |
| 475 app_bundle_->get_Item(0, &app0_obtained)); | |
| 476 EXPECT_FALSE(app0_obtained); | |
| 477 | |
| 478 { | |
| 479 ExpectAsserts expect_asserts; | |
| 480 EXPECT_FALSE(app_bundle_->GetApp(1)); | |
| 481 } | |
| 482 App* app1_obtained = NULL; | |
| 483 EXPECT_EQ(HRESULT_FROM_WIN32(ERROR_INVALID_INDEX), | |
| 484 app_bundle_->get_Item(1, &app1_obtained)); | |
| 485 EXPECT_FALSE(app1_obtained); | |
| 486 } | |
| 487 | |
| 488 TEST_F(AppBundleInitializedUserTest, CountAndItem_OneApp) { | |
| 489 App* app0_created = NULL; | |
| 490 EXPECT_SUCCEEDED(app_bundle_->createApp(CComBSTR(kGuid1), &app0_created)); | |
| 491 | |
| 492 EXPECT_EQ(1, app_bundle_->GetNumberOfApps()); | |
| 493 long num_apps = 0; // NOLINT | |
| 494 EXPECT_SUCCEEDED(app_bundle_->get_Count(&num_apps)); | |
| 495 EXPECT_EQ(1, num_apps); | |
| 496 | |
| 497 EXPECT_TRUE(app_bundle_->GetApp(0)); | |
| 498 App* app0_obtained = NULL; | |
| 499 EXPECT_SUCCEEDED(app_bundle_->get_Item(0, &app0_obtained)); | |
| 500 EXPECT_TRUE(app0_obtained); | |
| 501 | |
| 502 { | |
| 503 ExpectAsserts expect_asserts; | |
| 504 EXPECT_FALSE(app_bundle_->GetApp(1)); | |
| 505 } | |
| 506 App* app1_obtained = NULL; | |
| 507 EXPECT_EQ(HRESULT_FROM_WIN32(ERROR_INVALID_INDEX), | |
| 508 app_bundle_->get_Item(1, &app1_obtained)); | |
| 509 EXPECT_FALSE(app1_obtained); | |
| 510 } | |
| 511 | |
| 512 TEST_F(AppBundleInitializedUserTest, CountAndItem_TwoApp) { | |
| 513 App* app0_created = NULL; | |
| 514 EXPECT_SUCCEEDED(app_bundle_->createApp(CComBSTR(kGuid1), &app0_created)); | |
| 515 App* app1_created = NULL; | |
| 516 EXPECT_SUCCEEDED(app_bundle_->createApp(CComBSTR(kGuid2), &app1_created)); | |
| 517 | |
| 518 EXPECT_EQ(2, app_bundle_->GetNumberOfApps()); | |
| 519 long num_apps = 0; // NOLINT | |
| 520 EXPECT_SUCCEEDED(app_bundle_->get_Count(&num_apps)); | |
| 521 EXPECT_EQ(2, num_apps); | |
| 522 | |
| 523 EXPECT_TRUE(app_bundle_->GetApp(0)); | |
| 524 App* app0_obtained = NULL; | |
| 525 EXPECT_SUCCEEDED(app_bundle_->get_Item(0, &app0_obtained)); | |
| 526 EXPECT_TRUE(app0_obtained); | |
| 527 EXPECT_EQ(app0_created, app0_obtained); | |
| 528 | |
| 529 EXPECT_TRUE(app_bundle_->GetApp(1)); | |
| 530 App* app1_obtained = NULL; | |
| 531 EXPECT_SUCCEEDED(app_bundle_->get_Item(1, &app1_obtained)); | |
| 532 EXPECT_TRUE(app1_obtained); | |
| 533 | |
| 534 { | |
| 535 ExpectAsserts expect_asserts; | |
| 536 EXPECT_FALSE(app_bundle_->GetApp(2)); | |
| 537 } | |
| 538 App* app2_obtained = NULL; | |
| 539 EXPECT_EQ(HRESULT_FROM_WIN32(ERROR_INVALID_INDEX), | |
| 540 app_bundle_->get_Item(2, &app2_obtained)); | |
| 541 EXPECT_FALSE(app2_obtained); | |
| 542 } | |
| 543 | |
| 544 TEST_F(AppBundleInitializedUserTest, createApp) { | |
| 545 App* app0_created = NULL; | |
| 546 EXPECT_SUCCEEDED(app_bundle_->createApp(CComBSTR(kGuid1), &app0_created)); | |
| 547 EXPECT_TRUE(app0_created); | |
| 548 EXPECT_EQ(1, app_bundle_->GetNumberOfApps()); | |
| 549 | |
| 550 App* app0 = app_bundle_->GetApp(0); | |
| 551 EXPECT_EQ(app0_created, app0); | |
| 552 | |
| 553 EXPECT_STREQ(CString(kGuid1).MakeUpper(), app0->app_guid_string()); | |
| 554 ValidateFreshInstallDefaultValues(*app0); | |
| 555 } | |
| 556 | |
| 557 TEST_F(AppBundleInitializedUserTest, createApp_TwoApps) { | |
| 558 App* app0_created = NULL; | |
| 559 EXPECT_SUCCEEDED(app_bundle_->createApp(CComBSTR(kGuid1), &app0_created)); | |
| 560 EXPECT_TRUE(app0_created); | |
| 561 EXPECT_EQ(1, app_bundle_->GetNumberOfApps()); | |
| 562 | |
| 563 App* app0 = app_bundle_->GetApp(0); | |
| 564 EXPECT_EQ(app0_created, app0); | |
| 565 | |
| 566 EXPECT_STREQ(CString(kGuid1).MakeUpper(), app0->app_guid_string()); | |
| 567 ValidateFreshInstallDefaultValues(*app0); | |
| 568 | |
| 569 // Add a second app to the bundle. | |
| 570 | |
| 571 App* app1_created = NULL; | |
| 572 EXPECT_SUCCEEDED(app_bundle_->createApp(CComBSTR(kGuid2), &app1_created)); | |
| 573 EXPECT_TRUE(app1_created); | |
| 574 EXPECT_EQ(2, app_bundle_->GetNumberOfApps()); | |
| 575 | |
| 576 App* app1 = app_bundle_->GetApp(1); | |
| 577 EXPECT_EQ(app1_created, app1); | |
| 578 | |
| 579 EXPECT_STREQ(CString(kGuid2).MakeUpper(), app1->app_guid_string()); | |
| 580 ValidateFreshInstallDefaultValues(*app1); | |
| 581 } | |
| 582 | |
| 583 TEST_F(AppBundleInitializedUserTest, createApp_SameAppTwice) { | |
| 584 App* app0_created = NULL; | |
| 585 EXPECT_SUCCEEDED(app_bundle_->createApp(CComBSTR(kGuid1), &app0_created)); | |
| 586 EXPECT_TRUE(app0_created); | |
| 587 EXPECT_EQ(1, app_bundle_->GetNumberOfApps()); | |
| 588 | |
| 589 App* app0 = app_bundle_->GetApp(0); | |
| 590 EXPECT_EQ(app0_created, app0); | |
| 591 | |
| 592 EXPECT_STREQ(CString(kGuid1).MakeUpper(), app0->app_guid_string()); | |
| 593 ValidateFreshInstallDefaultValues(*app0); | |
| 594 | |
| 595 // Attempt to add the same app to the bundle again. | |
| 596 | |
| 597 App* app1_created = NULL; | |
| 598 EXPECT_EQ(GOOPDATE_E_CALL_UNEXPECTED, | |
| 599 app_bundle_->createApp(CComBSTR(kGuid1), &app1_created)); | |
| 600 EXPECT_FALSE(app1_created); | |
| 601 EXPECT_EQ(1, app_bundle_->GetNumberOfApps()); | |
| 602 } | |
| 603 | |
| 604 TEST_F(AppBundleInitializedUserTest, createApp_AfterUpdateCheck) { | |
| 605 DummyUserWorkItem dummy_work_item; | |
| 606 EXPECT_CALL(*worker_, CheckForUpdateAsync(_)) | |
| 607 .WillOnce(SetWorkItem(&dummy_work_item)); | |
| 608 | |
| 609 App* app0_created = NULL; | |
| 610 EXPECT_SUCCEEDED(app_bundle_->createApp(CComBSTR(kGuid1), &app0_created)); | |
| 611 EXPECT_SUCCEEDED(app_bundle_->checkForUpdate()); | |
| 612 | |
| 613 App* app1_created = NULL; | |
| 614 EXPECT_EQ(GOOPDATE_E_CALL_UNEXPECTED, | |
| 615 app_bundle_->createApp(CComBSTR(kGuid2), &app1_created)); | |
| 616 | |
| 617 app_bundle_->CompleteAsyncCall(); // Simulate thread completion. | |
| 618 } | |
| 619 | |
| 620 TEST_F(AppBundleInitializedMachineTest, createApp) { | |
| 621 App* app0_created = NULL; | |
| 622 EXPECT_SUCCEEDED(app_bundle_->createApp(CComBSTR(kGuid1), &app0_created)); | |
| 623 EXPECT_TRUE(app0_created); | |
| 624 EXPECT_EQ(1, app_bundle_->GetNumberOfApps()); | |
| 625 | |
| 626 App* app0 = app_bundle_->GetApp(0); | |
| 627 EXPECT_EQ(app0_created, app0); | |
| 628 | |
| 629 EXPECT_STREQ(CString(kGuid1).MakeUpper(), app0->app_guid_string()); | |
| 630 ValidateFreshInstallDefaultValues(*app0); | |
| 631 } | |
| 632 | |
| 633 TEST_F(AppBundleInitializedUserTest, checkForUpdate_NoApps) { | |
| 634 EXPECT_EQ(GOOPDATE_E_CALL_UNEXPECTED, app_bundle_->checkForUpdate()); | |
| 635 } | |
| 636 | |
| 637 // Does not verify the update check occurs. | |
| 638 TEST_F(AppBundleInitializedUserTest, checkForUpdate_OneApp) { | |
| 639 DummyUserWorkItem dummy_work_item; | |
| 640 EXPECT_CALL(*worker_, CheckForUpdateAsync(_)) | |
| 641 .WillOnce(SetWorkItem(&dummy_work_item)); | |
| 642 | |
| 643 App* app = NULL; | |
| 644 EXPECT_SUCCEEDED(app_bundle_->createApp(CComBSTR(kGuid1), &app)); | |
| 645 | |
| 646 EXPECT_SUCCEEDED(app_bundle_->checkForUpdate()); | |
| 647 | |
| 648 app_bundle_->CompleteAsyncCall(); // Simulate thread completion. | |
| 649 } | |
| 650 | |
| 651 // Does not verify the update check occurs. | |
| 652 TEST_F(AppBundleInitializedUserTest, checkForUpdate_TwoApps) { | |
| 653 DummyUserWorkItem dummy_work_item; | |
| 654 EXPECT_CALL(*worker_, CheckForUpdateAsync(_)) | |
| 655 .WillOnce(SetWorkItem(&dummy_work_item)); | |
| 656 | |
| 657 App* app0 = NULL; | |
| 658 App* app1 = NULL; | |
| 659 EXPECT_SUCCEEDED(app_bundle_->createApp(CComBSTR(kGuid1), &app0)); | |
| 660 EXPECT_SUCCEEDED(app_bundle_->createApp(CComBSTR(kGuid2), &app1)); | |
| 661 | |
| 662 EXPECT_SUCCEEDED(app_bundle_->checkForUpdate()); | |
| 663 | |
| 664 app_bundle_->CompleteAsyncCall(); // Simulate thread completion. | |
| 665 } | |
| 666 | |
| 667 TEST_F(AppBundleInitializedUserTest, checkForUpdate_Twice) { | |
| 668 DummyUserWorkItem dummy_work_item; | |
| 669 EXPECT_CALL(*worker_, CheckForUpdateAsync(_)) | |
| 670 .WillOnce(SetWorkItem(&dummy_work_item)); | |
| 671 | |
| 672 App* app = NULL; | |
| 673 EXPECT_SUCCEEDED(app_bundle_->createApp(CComBSTR(kGuid1), &app)); | |
| 674 | |
| 675 EXPECT_SUCCEEDED(app_bundle_->checkForUpdate()); | |
| 676 app_bundle_->CompleteAsyncCall(); // Simulate thread completion. | |
| 677 | |
| 678 EXPECT_EQ(GOOPDATE_E_CALL_UNEXPECTED, app_bundle_->checkForUpdate()); | |
| 679 } | |
| 680 | |
| 681 TEST_F(AppBundleInitializedUserTest, checkForUpdate_WhileBundleIsBusy) { | |
| 682 DummyUserWorkItem dummy_work_item; | |
| 683 EXPECT_CALL(*worker_, CheckForUpdateAsync(_)) | |
| 684 .WillOnce(SetWorkItem(&dummy_work_item)); | |
| 685 | |
| 686 App* app = NULL; | |
| 687 EXPECT_SUCCEEDED(app_bundle_->createApp(CComBSTR(kGuid1), &app)); | |
| 688 | |
| 689 EXPECT_SUCCEEDED(app_bundle_->checkForUpdate()); | |
| 690 EXPECT_EQ(GOOPDATE_E_CALL_UNEXPECTED, app_bundle_->checkForUpdate()); | |
| 691 | |
| 692 app_bundle_->CompleteAsyncCall(); // Simulate thread completion. | |
| 693 } | |
| 694 | |
| 695 // Does not verify the update check occurs. | |
| 696 TEST_F(AppBundleInitializedMachineTest, checkForUpdate_OneApp) { | |
| 697 DummyUserWorkItem dummy_work_item; | |
| 698 EXPECT_CALL(*worker_, CheckForUpdateAsync(_)) | |
| 699 .WillOnce(SetWorkItem(&dummy_work_item)); | |
| 700 | |
| 701 App* app = NULL; | |
| 702 EXPECT_SUCCEEDED(app_bundle_->createApp(CComBSTR(kGuid1), &app)); | |
| 703 | |
| 704 EXPECT_SUCCEEDED(app_bundle_->checkForUpdate()); | |
| 705 | |
| 706 app_bundle_->CompleteAsyncCall(); // Simulate thread completion. | |
| 707 } | |
| 708 | |
| 709 TEST_F(AppBundleInitializedUserTest, download_WithoutUpdateCheck) { | |
| 710 EXPECT_EQ(GOOPDATE_E_CALL_UNEXPECTED, app_bundle_->download()); | |
| 711 } | |
| 712 | |
| 713 // The AppBundle does not prevent this, but the apps may enter the error state. | |
| 714 TEST_F(AppBundleInitializedUserTest, download_AfterInstall) { | |
| 715 DummyUserWorkItem dummy_work_item; | |
| 716 { | |
| 717 ::testing::InSequence dummy; | |
| 718 EXPECT_CALL(*worker_, CheckForUpdateAsync(_)) | |
| 719 .WillOnce(SetWorkItem(&dummy_work_item)); | |
| 720 EXPECT_CALL(*worker_, DownloadAndInstallAsync(_)) | |
| 721 .WillOnce(SetWorkItem(&dummy_work_item)); | |
| 722 EXPECT_CALL(*worker_, DownloadAsync(_)) | |
| 723 .WillOnce(SetWorkItem(&dummy_work_item)); | |
| 724 } | |
| 725 | |
| 726 App* app = NULL; | |
| 727 EXPECT_SUCCEEDED(app_bundle_->createApp(CComBSTR(kGuid1), &app)); | |
| 728 | |
| 729 EXPECT_SUCCEEDED(app_bundle_->checkForUpdate()); | |
| 730 app_bundle_->CompleteAsyncCall(); // Simulate thread completion. | |
| 731 EXPECT_SUCCEEDED(app_bundle_->install()); | |
| 732 app_bundle_->CompleteAsyncCall(); // Simulate thread completion. | |
| 733 | |
| 734 EXPECT_SUCCEEDED(app_bundle_->download()); | |
| 735 | |
| 736 app_bundle_->CompleteAsyncCall(); // Simulate thread completion. | |
| 737 } | |
| 738 | |
| 739 // The AppBundle does not prevent this, but the apps may enter the error state. | |
| 740 TEST_F(AppBundleInitializedUserTest, download_Twice) { | |
| 741 DummyUserWorkItem dummy_work_item; | |
| 742 { | |
| 743 ::testing::InSequence dummy; | |
| 744 EXPECT_CALL(*worker_, CheckForUpdateAsync(_)) | |
| 745 .WillOnce(SetWorkItem(&dummy_work_item)); | |
| 746 EXPECT_CALL(*worker_, DownloadAsync(_)) | |
| 747 .Times(2) | |
| 748 .WillRepeatedly(SetWorkItem(&dummy_work_item)); | |
| 749 } | |
| 750 | |
| 751 App* app = NULL; | |
| 752 EXPECT_SUCCEEDED(app_bundle_->createApp(CComBSTR(kGuid1), &app)); | |
| 753 | |
| 754 EXPECT_SUCCEEDED(app_bundle_->checkForUpdate()); | |
| 755 app_bundle_->CompleteAsyncCall(); // Simulate thread completion. | |
| 756 EXPECT_SUCCEEDED(app_bundle_->download()); | |
| 757 app_bundle_->CompleteAsyncCall(); // Simulate thread completion. | |
| 758 | |
| 759 EXPECT_SUCCEEDED(app_bundle_->download()); | |
| 760 | |
| 761 app_bundle_->CompleteAsyncCall(); // Simulate thread completion. | |
| 762 } | |
| 763 | |
| 764 // Simulates the update check still in progress when download() is called. | |
| 765 TEST_F(AppBundleInitializedUserTest, download_WhileBundleIsBusy) { | |
| 766 DummyUserWorkItem dummy_work_item; | |
| 767 EXPECT_CALL(*worker_, CheckForUpdateAsync(_)) | |
| 768 .WillOnce(SetWorkItem(&dummy_work_item)); | |
| 769 | |
| 770 App* app = NULL; | |
| 771 EXPECT_SUCCEEDED(app_bundle_->createApp(CComBSTR(kGuid1), &app)); | |
| 772 | |
| 773 EXPECT_SUCCEEDED(app_bundle_->checkForUpdate()); | |
| 774 | |
| 775 EXPECT_EQ(GOOPDATE_E_NON_BLOCKING_CALL_PENDING, app_bundle_->download()); | |
| 776 | |
| 777 app_bundle_->CompleteAsyncCall(); // Simulate thread completion. | |
| 778 } | |
| 779 | |
| 780 // The AppBundle does not prevent this, but the apps may enter the error state. | |
| 781 TEST_F(AppBundleInitializedMachineTest, download_Twice) { | |
| 782 DummyUserWorkItem dummy_work_item; | |
| 783 { | |
| 784 ::testing::InSequence dummy; | |
| 785 EXPECT_CALL(*worker_, CheckForUpdateAsync(_)) | |
| 786 .WillOnce(SetWorkItem(&dummy_work_item)); | |
| 787 EXPECT_CALL(*worker_, DownloadAsync(_)) | |
| 788 .Times(2) | |
| 789 .WillRepeatedly(SetWorkItem(&dummy_work_item)); | |
| 790 } | |
| 791 | |
| 792 App* app = NULL; | |
| 793 EXPECT_SUCCEEDED(app_bundle_->createApp(CComBSTR(kGuid1), &app)); | |
| 794 | |
| 795 EXPECT_SUCCEEDED(app_bundle_->checkForUpdate()); | |
| 796 app_bundle_->CompleteAsyncCall(); // Simulate thread completion. | |
| 797 EXPECT_SUCCEEDED(app_bundle_->download()); | |
| 798 app_bundle_->CompleteAsyncCall(); // Simulate thread completion. | |
| 799 | |
| 800 EXPECT_SUCCEEDED(app_bundle_->download()); | |
| 801 | |
| 802 app_bundle_->CompleteAsyncCall(); // Simulate thread completion. | |
| 803 } | |
| 804 | |
| 805 TEST_F(AppBundleInitializedUserTest, install_WithoutUpdateCheck) { | |
| 806 EXPECT_EQ(GOOPDATE_E_CALL_UNEXPECTED, app_bundle_->install()); | |
| 807 } | |
| 808 | |
| 809 TEST_F(AppBundleInitializedUserTest, install_WithoutDownload) { | |
| 810 DummyUserWorkItem dummy_work_item; | |
| 811 { | |
| 812 ::testing::InSequence dummy; | |
| 813 EXPECT_CALL(*worker_, CheckForUpdateAsync(_)) | |
| 814 .WillOnce(SetWorkItem(&dummy_work_item)); | |
| 815 EXPECT_CALL(*worker_, DownloadAndInstallAsync(_)) | |
| 816 .WillOnce(SetWorkItem(&dummy_work_item)); | |
| 817 } | |
| 818 | |
| 819 App* app = NULL; | |
| 820 EXPECT_SUCCEEDED(app_bundle_->createApp(CComBSTR(kGuid1), &app)); | |
| 821 | |
| 822 EXPECT_SUCCEEDED(app_bundle_->checkForUpdate()); | |
| 823 app_bundle_->CompleteAsyncCall(); // Simulate thread completion. | |
| 824 | |
| 825 EXPECT_SUCCEEDED(app_bundle_->install()); | |
| 826 | |
| 827 app_bundle_->CompleteAsyncCall(); // Simulate thread completion. | |
| 828 } | |
| 829 | |
| 830 TEST_F(AppBundleInitializedUserTest, install_AfterDownload) { | |
| 831 DummyUserWorkItem dummy_work_item; | |
| 832 { | |
| 833 ::testing::InSequence dummy; | |
| 834 EXPECT_CALL(*worker_, CheckForUpdateAsync(_)) | |
| 835 .WillOnce(SetWorkItem(&dummy_work_item)); | |
| 836 EXPECT_CALL(*worker_, DownloadAsync(_)) | |
| 837 .WillOnce(SetWorkItem(&dummy_work_item)); | |
| 838 EXPECT_CALL(*worker_, DownloadAndInstallAsync(_)) | |
| 839 .WillOnce(SetWorkItem(&dummy_work_item)); | |
| 840 } | |
| 841 | |
| 842 App* app = NULL; | |
| 843 EXPECT_SUCCEEDED(app_bundle_->createApp(CComBSTR(kGuid1), &app)); | |
| 844 | |
| 845 EXPECT_SUCCEEDED(app_bundle_->checkForUpdate()); | |
| 846 app_bundle_->CompleteAsyncCall(); // Simulate thread completion. | |
| 847 EXPECT_SUCCEEDED(app_bundle_->download()); | |
| 848 app_bundle_->CompleteAsyncCall(); // Simulate thread completion. | |
| 849 | |
| 850 EXPECT_SUCCEEDED(app_bundle_->install()); | |
| 851 | |
| 852 app_bundle_->CompleteAsyncCall(); // Simulate thread completion. | |
| 853 } | |
| 854 | |
| 855 // The AppBundle does not prevent this, but the apps may enter the error state. | |
| 856 TEST_F(AppBundleInitializedUserTest, install_Twice) { | |
| 857 DummyUserWorkItem dummy_work_item; | |
| 858 { | |
| 859 ::testing::InSequence dummy; | |
| 860 EXPECT_CALL(*worker_, CheckForUpdateAsync(_)) | |
| 861 .WillOnce(SetWorkItem(&dummy_work_item)); | |
| 862 EXPECT_CALL(*worker_, DownloadAndInstallAsync(_)) | |
| 863 .Times(2) | |
| 864 .WillRepeatedly(SetWorkItem(&dummy_work_item)); | |
| 865 } | |
| 866 | |
| 867 App* app = NULL; | |
| 868 EXPECT_SUCCEEDED(app_bundle_->createApp(CComBSTR(kGuid1), &app)); | |
| 869 | |
| 870 EXPECT_SUCCEEDED(app_bundle_->checkForUpdate()); | |
| 871 app_bundle_->CompleteAsyncCall(); // Simulate thread completion. | |
| 872 EXPECT_SUCCEEDED(app_bundle_->install()); | |
| 873 app_bundle_->CompleteAsyncCall(); // Simulate thread completion. | |
| 874 | |
| 875 EXPECT_SUCCEEDED(app_bundle_->install()); | |
| 876 | |
| 877 app_bundle_->CompleteAsyncCall(); // Simulate thread completion. | |
| 878 } | |
| 879 | |
| 880 // TODO(omaha): These tests are disabled because CaptureCallerPrimaryToken() | |
| 881 // fails. We could move this to AppBundleWrapper, but we would need to expose | |
| 882 // some functions to AppBundleWrapper. | |
| 883 TEST_F(AppBundleInitializedMachineTest, DISABLED_install_WithoutDownload) { | |
| 884 DummyUserWorkItem dummy_work_item; | |
| 885 { | |
| 886 ::testing::InSequence dummy; | |
| 887 EXPECT_CALL(*worker_, CheckForUpdateAsync(_)) | |
| 888 .WillOnce(SetWorkItem(&dummy_work_item)); | |
| 889 EXPECT_CALL(*worker_, DownloadAndInstallAsync(_)) | |
| 890 .WillOnce(SetWorkItem(&dummy_work_item)); | |
| 891 } | |
| 892 | |
| 893 App* app = NULL; | |
| 894 EXPECT_SUCCEEDED(app_bundle_->createApp(CComBSTR(kGuid1), &app)); | |
| 895 | |
| 896 EXPECT_SUCCEEDED(app_bundle_->checkForUpdate()); | |
| 897 app_bundle_->CompleteAsyncCall(); // Simulate thread completion. | |
| 898 | |
| 899 EXPECT_SUCCEEDED(app_bundle_->install()); | |
| 900 | |
| 901 app_bundle_->CompleteAsyncCall(); // Simulate thread completion. | |
| 902 } | |
| 903 | |
| 904 TEST_F(AppBundleInitializedMachineTest, DISABLED_install_AfterDownload) { | |
| 905 DummyUserWorkItem dummy_work_item; | |
| 906 { | |
| 907 ::testing::InSequence dummy; | |
| 908 EXPECT_CALL(*worker_, CheckForUpdateAsync(_)) | |
| 909 .WillOnce(SetWorkItem(&dummy_work_item)); | |
| 910 EXPECT_CALL(*worker_, DownloadAsync(_)) | |
| 911 .WillOnce(SetWorkItem(&dummy_work_item)); | |
| 912 EXPECT_CALL(*worker_, DownloadAndInstallAsync(_)) | |
| 913 .WillOnce(SetWorkItem(&dummy_work_item)); | |
| 914 } | |
| 915 | |
| 916 App* app = NULL; | |
| 917 EXPECT_SUCCEEDED(app_bundle_->createApp(CComBSTR(kGuid1), &app)); | |
| 918 | |
| 919 EXPECT_SUCCEEDED(app_bundle_->checkForUpdate()); | |
| 920 app_bundle_->CompleteAsyncCall(); // Simulate thread completion. | |
| 921 EXPECT_SUCCEEDED(app_bundle_->download()); | |
| 922 app_bundle_->CompleteAsyncCall(); // Simulate thread completion. | |
| 923 | |
| 924 EXPECT_SUCCEEDED(app_bundle_->install()); | |
| 925 | |
| 926 app_bundle_->CompleteAsyncCall(); // Simulate thread completion. | |
| 927 } | |
| 928 | |
| 929 // Simulates the update check still in progress when install is called. | |
| 930 TEST_F(AppBundleInitializedUserTest, install_WhileBundleIsBusy) { | |
| 931 DummyUserWorkItem dummy_work_item; | |
| 932 EXPECT_CALL(*worker_, CheckForUpdateAsync(_)) | |
| 933 .WillOnce(SetWorkItem(&dummy_work_item)); | |
| 934 | |
| 935 App* app = NULL; | |
| 936 EXPECT_SUCCEEDED(app_bundle_->createApp(CComBSTR(kGuid1), &app)); | |
| 937 | |
| 938 EXPECT_SUCCEEDED(app_bundle_->checkForUpdate()); | |
| 939 EXPECT_EQ(GOOPDATE_E_NON_BLOCKING_CALL_PENDING, app_bundle_->install()); | |
| 940 | |
| 941 app_bundle_->CompleteAsyncCall(); // Simulate thread completion. | |
| 942 } | |
| 943 | |
| 944 // Also tests adding another app via the same method. | |
| 945 TEST_F(AppBundlePopulatedRegistryUserTest, createInstalledApp_Present_TwoApps) { | |
| 946 App *expected_app0, *expected_app1, *expected_app2; | |
| 947 PopulateDataAndRegistryForRegisteredAndUnInstalledAppsTests(&expected_app0, | |
| 948 &expected_app1, | |
| 949 &expected_app2); | |
| 950 | |
| 951 App* app0_created = NULL; | |
| 952 EXPECT_SUCCEEDED(app_bundle_->createInstalledApp(CComBSTR(kGuid1), | |
| 953 &app0_created)); | |
| 954 EXPECT_TRUE(app0_created); | |
| 955 EXPECT_EQ(1, app_bundle_->GetNumberOfApps()); | |
| 956 | |
| 957 App* app0 = app_bundle_->GetApp(0); | |
| 958 EXPECT_EQ(app0_created, app0); | |
| 959 EXPECT_STREQ(CString(kGuid1).MakeUpper(), app0->app_guid_string()); | |
| 960 EXPECT_SUCCEEDED(expected_app0->put_isEulaAccepted(VARIANT_TRUE)); | |
| 961 ValidateExpectedValues(*expected_app0, *app0); | |
| 962 | |
| 963 // Add a second app to the bundle. | |
| 964 | |
| 965 App* app1_created = NULL; | |
| 966 EXPECT_SUCCEEDED(app_bundle_->createInstalledApp(CComBSTR(kGuid2), | |
| 967 &app1_created)); | |
| 968 EXPECT_TRUE(app1_created); | |
| 969 EXPECT_EQ(2, app_bundle_->GetNumberOfApps()); | |
| 970 | |
| 971 long num_apps = 0; // NOLINT | |
| 972 EXPECT_SUCCEEDED(app_bundle_->get_Count(&num_apps)); | |
| 973 EXPECT_EQ(2, num_apps); | |
| 974 | |
| 975 App* app1 = app_bundle_->GetApp(1); | |
| 976 EXPECT_EQ(app1_created, app1); | |
| 977 EXPECT_STREQ(CString(kGuid2).MakeUpper(), app1->app_guid_string()); | |
| 978 SetDisplayName(kDefaultAppName, expected_app1); | |
| 979 EXPECT_SUCCEEDED(expected_app1->put_isEulaAccepted(VARIANT_TRUE)); | |
| 980 ValidateExpectedValues(*expected_app1, *app1); | |
| 981 | |
| 982 // Verify COM methods return the same values as the C++ methods used above. | |
| 983 EXPECT_SUCCEEDED(app_bundle_->get_Count(&num_apps)); | |
| 984 EXPECT_EQ(2, num_apps); | |
| 985 App* app0_obtained = NULL; | |
| 986 EXPECT_SUCCEEDED(app_bundle_->get_Item(0, &app0_obtained)); | |
| 987 EXPECT_EQ(app0, app0_obtained); | |
| 988 App* app1_obtained = NULL; | |
| 989 EXPECT_SUCCEEDED(app_bundle_->get_Item(1, &app1_obtained)); | |
| 990 EXPECT_EQ(app1, app1_obtained); | |
| 991 } | |
| 992 | |
| 993 TEST_F(AppBundlePopulatedRegistryMachineTest, createInstalledApp_Present) { | |
| 994 App *expected_app0, *expected_app1, *expected_app2; | |
| 995 PopulateDataAndRegistryForRegisteredAndUnInstalledAppsTests(&expected_app0, | |
| 996 &expected_app1, | |
| 997 &expected_app2); | |
| 998 | |
| 999 App* app0_created = NULL; | |
| 1000 EXPECT_SUCCEEDED(app_bundle_->createInstalledApp(CComBSTR(kGuid1), | |
| 1001 &app0_created)); | |
| 1002 EXPECT_TRUE(app0_created); | |
| 1003 EXPECT_EQ(1, app_bundle_->GetNumberOfApps()); | |
| 1004 | |
| 1005 App* app0 = app_bundle_->GetApp(0); | |
| 1006 EXPECT_EQ(app0_created, app0); | |
| 1007 EXPECT_STREQ(CString(kGuid1).MakeUpper(), app0->app_guid_string()); | |
| 1008 EXPECT_SUCCEEDED(expected_app0->put_isEulaAccepted(VARIANT_TRUE)); | |
| 1009 ValidateExpectedValues(*expected_app0, *app0); | |
| 1010 | |
| 1011 long num_apps = 0; // NOLINT | |
| 1012 EXPECT_SUCCEEDED(app_bundle_->get_Count(&num_apps)); | |
| 1013 EXPECT_EQ(1, num_apps); | |
| 1014 } | |
| 1015 | |
| 1016 // TODO(omaha3): Test that the same app can be added to different bundles for | |
| 1017 // each of the create methods. | |
| 1018 TEST_F(AppBundlePopulatedRegistryUserTest, createInstalledApp_SameAppTwice) { | |
| 1019 App *expected_app0, *expected_app1, *expected_app2; | |
| 1020 PopulateDataAndRegistryForRegisteredAndUnInstalledAppsTests(&expected_app0, | |
| 1021 &expected_app1, | |
| 1022 &expected_app2); | |
| 1023 | |
| 1024 App* app0_created = NULL; | |
| 1025 EXPECT_SUCCEEDED(app_bundle_->createInstalledApp(CComBSTR(kGuid1), | |
| 1026 &app0_created)); | |
| 1027 EXPECT_TRUE(app0_created); | |
| 1028 EXPECT_EQ(1, app_bundle_->GetNumberOfApps()); | |
| 1029 | |
| 1030 App* app0 = app_bundle_->GetApp(0); | |
| 1031 EXPECT_EQ(app0_created, app0); | |
| 1032 EXPECT_STREQ(CString(kGuid1).MakeUpper(), app0->app_guid_string()); | |
| 1033 EXPECT_SUCCEEDED(expected_app0->put_isEulaAccepted(VARIANT_TRUE)); | |
| 1034 ValidateExpectedValues(*expected_app0, *app0); | |
| 1035 | |
| 1036 // Attempt to add the same app to the bundle again. | |
| 1037 | |
| 1038 App* app1_created = NULL; | |
| 1039 EXPECT_EQ(GOOPDATE_E_CALL_UNEXPECTED, | |
| 1040 app_bundle_->createInstalledApp(CComBSTR(kGuid1), &app1_created)); | |
| 1041 EXPECT_FALSE(app1_created); | |
| 1042 EXPECT_EQ(1, app_bundle_->GetNumberOfApps()); | |
| 1043 } | |
| 1044 | |
| 1045 TEST_F(AppBundlePopulatedRegistryUserTest, createInstalledApp_NotPresent) { | |
| 1046 App *expected_app0, *expected_app1, *expected_app2; | |
| 1047 PopulateDataAndRegistryForRegisteredAndUnInstalledAppsTests(&expected_app0, | |
| 1048 &expected_app1, | |
| 1049 &expected_app2); | |
| 1050 | |
| 1051 App* app0_created = NULL; | |
| 1052 EXPECT_EQ(HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND), | |
| 1053 app_bundle_->createInstalledApp( | |
| 1054 CComBSTR(_T("{2D5F8E16-B56B-496a-BA8B-3A0B5EC17F4F}")), | |
| 1055 &app0_created)); | |
| 1056 EXPECT_FALSE(app0_created); | |
| 1057 EXPECT_EQ(0, app_bundle_->GetNumberOfApps()); | |
| 1058 } | |
| 1059 | |
| 1060 TEST_F(AppBundlePopulatedRegistryUserTest, | |
| 1061 createInstalledApp_NoAppsRegistered) { | |
| 1062 App* app0_created = NULL; | |
| 1063 EXPECT_EQ(HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND), | |
| 1064 app_bundle_->createInstalledApp(CComBSTR(kGuid1), &app0_created)); | |
| 1065 EXPECT_FALSE(app0_created); | |
| 1066 EXPECT_EQ(0, app_bundle_->GetNumberOfApps()); | |
| 1067 } | |
| 1068 | |
| 1069 TEST_F(AppBundlePopulatedRegistryUserTest, | |
| 1070 createInstalledApp_AfterUpdateCheck) { | |
| 1071 App *expected_app0, *expected_app1, *expected_app2; | |
| 1072 PopulateDataAndRegistryForRegisteredAndUnInstalledAppsTests(&expected_app0, | |
| 1073 &expected_app1, | |
| 1074 &expected_app2); | |
| 1075 | |
| 1076 DummyUserWorkItem dummy_work_item; | |
| 1077 EXPECT_CALL(*worker_, CheckForUpdateAsync(_)) | |
| 1078 .WillOnce(SetWorkItem(&dummy_work_item)); | |
| 1079 | |
| 1080 App* app0_created = NULL; | |
| 1081 EXPECT_SUCCEEDED(app_bundle_->createInstalledApp(CComBSTR(kGuid1), | |
| 1082 &app0_created)); | |
| 1083 | |
| 1084 EXPECT_SUCCEEDED(app_bundle_->checkForUpdate()); | |
| 1085 app_bundle_->CompleteAsyncCall(); // Simulate thread completion. | |
| 1086 | |
| 1087 App* app1_created = NULL; | |
| 1088 EXPECT_EQ(GOOPDATE_E_CALL_UNEXPECTED, | |
| 1089 app_bundle_->createInstalledApp(CComBSTR(kGuid2), &app1_created)); | |
| 1090 } | |
| 1091 | |
| 1092 TEST_F(AppBundlePopulatedRegistryUserTest, createAllInstalledApps) { | |
| 1093 App *expected_app0, *expected_app1, *expected_app2; | |
| 1094 PopulateDataAndRegistryForRegisteredAndUnInstalledAppsTests(&expected_app0, | |
| 1095 &expected_app1, | |
| 1096 &expected_app2); | |
| 1097 EXPECT_HRESULT_SUCCEEDED(RegKey::CreateKey( | |
| 1098 AppendRegKeyPath(USER_REG_CLIENT_STATE, kGuid4))); // Avoid assert. | |
| 1099 | |
| 1100 // See comment in machine createAllInstalledApps test. | |
| 1101 const CString incomplete_clients_key = | |
| 1102 AppendRegKeyPath(USER_REG_CLIENTS, kGuid4); | |
| 1103 EXPECT_TRUE(RegKey::HasKey(incomplete_clients_key)); | |
| 1104 EXPECT_FALSE(RegKey::HasValue(incomplete_clients_key, | |
| 1105 kRegValueProductVersion)); | |
| 1106 | |
| 1107 EXPECT_SUCCEEDED(app_bundle_->createAllInstalledApps()); | |
| 1108 EXPECT_EQ(2, app_bundle_->GetNumberOfApps()); | |
| 1109 | |
| 1110 App* app0 = app_bundle_->GetApp(0); | |
| 1111 EXPECT_STREQ(CString(kGuid1).MakeUpper(), app0->app_guid_string()); | |
| 1112 EXPECT_SUCCEEDED(expected_app0->put_isEulaAccepted(VARIANT_TRUE)); | |
| 1113 ValidateExpectedValues(*expected_app0, *app0); | |
| 1114 | |
| 1115 App* app1 = app_bundle_->GetApp(1); | |
| 1116 EXPECT_STREQ(CString(kGuid2).MakeUpper(), app1->app_guid_string()); | |
| 1117 SetDisplayName(kDefaultAppName, expected_app1); | |
| 1118 EXPECT_SUCCEEDED(expected_app1->put_isEulaAccepted(VARIANT_TRUE)); | |
| 1119 ValidateExpectedValues(*expected_app1, *app1); | |
| 1120 | |
| 1121 // Verify COM methods return the same values as the C++ methods used above. | |
| 1122 long num_registered_apps = 0; // NOLINT | |
| 1123 EXPECT_SUCCEEDED(app_bundle_->get_Count(&num_registered_apps)); | |
| 1124 EXPECT_EQ(2, num_registered_apps); | |
| 1125 App* app0_obtained = NULL; | |
| 1126 EXPECT_SUCCEEDED(app_bundle_->get_Item(0, &app0_obtained)); | |
| 1127 EXPECT_EQ(app0, app0_obtained); | |
| 1128 App* app1_obtained = NULL; | |
| 1129 EXPECT_SUCCEEDED(app_bundle_->get_Item(1, &app1_obtained)); | |
| 1130 EXPECT_EQ(app1, app1_obtained); | |
| 1131 } | |
| 1132 | |
| 1133 TEST_F(AppBundlePopulatedRegistryMachineTest, createAllInstalledApps) { | |
| 1134 App *expected_app0, *expected_app1, *expected_app2; | |
| 1135 PopulateDataAndRegistryForRegisteredAndUnInstalledAppsTests(&expected_app0, | |
| 1136 &expected_app1, | |
| 1137 &expected_app2); | |
| 1138 EXPECT_HRESULT_SUCCEEDED(RegKey::CreateKey( | |
| 1139 AppendRegKeyPath(MACHINE_REG_CLIENT_STATE, kGuid4))); // Avoid assert. | |
| 1140 | |
| 1141 // An important part of this test is that processing continues and | |
| 1142 // even though there is a key for an app that is not properly | |
| 1143 // registered (e.g. it does not have a pv value or has an invalid pv value). | |
| 1144 // Since this is so important, explicitly check registry was set up correctly. | |
| 1145 // Invalid pv value type is checked in a separate test since it causes an | |
| 1146 // assert. | |
| 1147 // An app without a pv is not added to the bundle. | |
| 1148 const CString incomplete_clients_key = | |
| 1149 AppendRegKeyPath(MACHINE_REG_CLIENTS, kGuid4); | |
| 1150 EXPECT_TRUE(RegKey::HasKey(incomplete_clients_key)); | |
| 1151 EXPECT_FALSE(RegKey::HasValue(incomplete_clients_key, | |
| 1152 kRegValueProductVersion)); | |
| 1153 | |
| 1154 EXPECT_SUCCEEDED(app_bundle_->createAllInstalledApps()); | |
| 1155 EXPECT_EQ(2, app_bundle_->GetNumberOfApps()); | |
| 1156 | |
| 1157 App* app0 = app_bundle_->GetApp(0); | |
| 1158 EXPECT_STREQ(CString(kGuid1).MakeUpper(), app0->app_guid_string()); | |
| 1159 EXPECT_SUCCEEDED(expected_app0->put_isEulaAccepted(VARIANT_TRUE)); | |
| 1160 ValidateExpectedValues(*expected_app0, *app0); | |
| 1161 | |
| 1162 App* app1 = app_bundle_->GetApp(1); | |
| 1163 EXPECT_STREQ(CString(kGuid2).MakeUpper(), app1->app_guid_string()); | |
| 1164 SetDisplayName(kDefaultAppName, expected_app1); | |
| 1165 EXPECT_SUCCEEDED(expected_app1->put_isEulaAccepted(VARIANT_TRUE)); | |
| 1166 ValidateExpectedValues(*expected_app1, *app1); | |
| 1167 | |
| 1168 // Verify COM methods return the same values as the C++ methods used above. | |
| 1169 long num_registered_apps = 0; // NOLINT | |
| 1170 EXPECT_SUCCEEDED(app_bundle_->get_Count(&num_registered_apps)); | |
| 1171 EXPECT_EQ(2, num_registered_apps); | |
| 1172 App* app0_obtained = NULL; | |
| 1173 EXPECT_SUCCEEDED(app_bundle_->get_Item(0, &app0_obtained)); | |
| 1174 EXPECT_EQ(app0, app0_obtained); | |
| 1175 App* app1_obtained = NULL; | |
| 1176 EXPECT_SUCCEEDED(app_bundle_->get_Item(1, &app1_obtained)); | |
| 1177 EXPECT_EQ(app1, app1_obtained); | |
| 1178 } | |
| 1179 | |
| 1180 TEST_F(AppBundlePopulatedRegistryUserTest, | |
| 1181 createAllInstalledApps_InvalidPvValueType) { | |
| 1182 App *expected_app0, *expected_app1, *expected_app2; | |
| 1183 PopulateDataAndRegistryForRegisteredAndUnInstalledAppsTests(&expected_app0, | |
| 1184 &expected_app1, | |
| 1185 &expected_app2); | |
| 1186 | |
| 1187 // Incorrect data type for pv. See comment in machine createAllInstalledApps | |
| 1188 // test. | |
| 1189 // It is important that this value is alphabetically before the other AppIds. | |
| 1190 // This allows us to test that processing continues despite the bad pv. | |
| 1191 const TCHAR* const kInvalidPvTypeAppId = | |
| 1192 _T("{0150B619-867C-4985-B193-ED309A23EE36}"); | |
| 1193 const CString invalid_pv_type_clients_key = | |
| 1194 AppendRegKeyPath(USER_REG_CLIENTS, kInvalidPvTypeAppId); | |
| 1195 const DWORD kInvalidPvDword = 0x3039; | |
| 1196 const TCHAR* const kInvalidPvDwordAsString = _T("\x3039"); | |
| 1197 EXPECT_HRESULT_SUCCEEDED(RegKey::SetValue(invalid_pv_type_clients_key, | |
| 1198 kRegValueProductVersion, | |
| 1199 kInvalidPvDword)); | |
| 1200 EXPECT_TRUE(RegKey::HasValue(invalid_pv_type_clients_key, | |
| 1201 kRegValueProductVersion)); | |
| 1202 DWORD value_type = REG_SZ; | |
| 1203 EXPECT_SUCCEEDED(RegKey::GetValueType(invalid_pv_type_clients_key, | |
| 1204 kRegValueProductVersion, | |
| 1205 &value_type)); | |
| 1206 EXPECT_NE(REG_SZ, value_type); | |
| 1207 App* invalid_pv_app = CreateExpectedApp(kInvalidPvTypeAppId); | |
| 1208 invalid_pv_app->current_version()->set_version(kInvalidPvDwordAsString); | |
| 1209 invalid_pv_app->set_days_since_last_active_ping(-1); | |
| 1210 invalid_pv_app->set_days_since_last_roll_call(-1); | |
| 1211 SetDisplayName(kDefaultAppName, invalid_pv_app); | |
| 1212 | |
| 1213 { | |
| 1214 // An assert occurs when reading the wrong value type. | |
| 1215 ExpectAsserts expect_asserts; | |
| 1216 EXPECT_SUCCEEDED(app_bundle_->createAllInstalledApps()); | |
| 1217 } | |
| 1218 | |
| 1219 EXPECT_EQ(3, app_bundle_->GetNumberOfApps()); | |
| 1220 | |
| 1221 // The invalid pv app is added to the bundle with an unreadable pv. | |
| 1222 App* app0 = app_bundle_->GetApp(0); | |
| 1223 EXPECT_STREQ(kInvalidPvTypeAppId, app0->app_guid_string()); | |
| 1224 EXPECT_STREQ(kInvalidPvDwordAsString, app0->current_version()->version()); | |
| 1225 EXPECT_SUCCEEDED(invalid_pv_app->put_isEulaAccepted(VARIANT_TRUE)); | |
| 1226 ValidateExpectedValues(*invalid_pv_app, *app0); | |
| 1227 | |
| 1228 App* app1 = app_bundle_->GetApp(1); | |
| 1229 EXPECT_STREQ(CString(kGuid1).MakeUpper(), app1->app_guid_string()); | |
| 1230 EXPECT_SUCCEEDED(expected_app0->put_isEulaAccepted(VARIANT_TRUE)); | |
| 1231 ValidateExpectedValues(*expected_app0, *app1); | |
| 1232 | |
| 1233 App* app2 = app_bundle_->GetApp(2); | |
| 1234 EXPECT_STREQ(CString(kGuid2).MakeUpper(), app2->app_guid_string()); | |
| 1235 SetDisplayName(kDefaultAppName, expected_app1); | |
| 1236 EXPECT_SUCCEEDED(expected_app1->put_isEulaAccepted(VARIANT_TRUE)); | |
| 1237 ValidateExpectedValues(*expected_app1, *app2); | |
| 1238 } | |
| 1239 | |
| 1240 TEST_F(AppBundlePopulatedRegistryUserTest, | |
| 1241 createAllInstalledApps_NoAppsRegistered) { | |
| 1242 EXPECT_EQ(HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND), | |
| 1243 app_bundle_->createAllInstalledApps()); | |
| 1244 EXPECT_EQ(0, app_bundle_->GetNumberOfApps()); | |
| 1245 | |
| 1246 { | |
| 1247 ExpectAsserts expect_asserts; | |
| 1248 EXPECT_FALSE(app_bundle_->GetApp(0)); | |
| 1249 } | |
| 1250 } | |
| 1251 | |
| 1252 TEST_F(AppBundlePopulatedRegistryUserTest, | |
| 1253 createAllInstalledApps_OneAppRegistered) { | |
| 1254 CString clients_key_name = AppendRegKeyPath(USER_REG_CLIENTS, kGuid1); | |
| 1255 EXPECT_SUCCEEDED(RegKey::SetValue(clients_key_name, | |
| 1256 kRegValueProductVersion, | |
| 1257 _T("1.0.0.0"))); | |
| 1258 EXPECT_HRESULT_SUCCEEDED(RegKey::CreateKey( | |
| 1259 AppendRegKeyPath(USER_REG_CLIENT_STATE, kGuid1))); // Avoid assert. | |
| 1260 | |
| 1261 EXPECT_SUCCEEDED(app_bundle_->createAllInstalledApps()); | |
| 1262 EXPECT_EQ(1, app_bundle_->GetNumberOfApps()); | |
| 1263 | |
| 1264 App* app0 = app_bundle_->GetApp(0); | |
| 1265 EXPECT_STREQ(CString(kGuid1).MakeUpper(), app0->app_guid_string()); | |
| 1266 } | |
| 1267 | |
| 1268 TEST_F(AppBundlePopulatedRegistryUserTest, | |
| 1269 createAllInstalledApps_AfterUpdateCheck) { | |
| 1270 App *expected_app0, *expected_app1, *expected_app2; | |
| 1271 PopulateDataAndRegistryForRegisteredAndUnInstalledAppsTests(&expected_app0, | |
| 1272 &expected_app1, | |
| 1273 &expected_app2); | |
| 1274 EXPECT_HRESULT_SUCCEEDED(RegKey::CreateKey( | |
| 1275 AppendRegKeyPath(USER_REG_CLIENT_STATE, kGuid4))); // Avoid assert. | |
| 1276 | |
| 1277 DummyUserWorkItem dummy_work_item; | |
| 1278 EXPECT_CALL(*worker_, CheckForUpdateAsync(_)) | |
| 1279 .WillOnce(SetWorkItem(&dummy_work_item)); | |
| 1280 | |
| 1281 EXPECT_SUCCEEDED(app_bundle_->createAllInstalledApps()); | |
| 1282 | |
| 1283 EXPECT_SUCCEEDED(app_bundle_->checkForUpdate()); | |
| 1284 app_bundle_->CompleteAsyncCall(); // Simulate thread completion. | |
| 1285 | |
| 1286 EXPECT_EQ(GOOPDATE_E_CALL_UNEXPECTED, app_bundle_->createAllInstalledApps()); | |
| 1287 } | |
| 1288 | |
| 1289 TEST_F(AppBundlePopulatedRegistryUserTest, createApp_After_createInstalledApp) { | |
| 1290 App *expected_app0, *expected_app1, *expected_app2; | |
| 1291 PopulateDataAndRegistryForRegisteredAndUnInstalledAppsTests(&expected_app0, | |
| 1292 &expected_app1, | |
| 1293 &expected_app2); | |
| 1294 | |
| 1295 App* app0_created = NULL; | |
| 1296 EXPECT_SUCCEEDED(app_bundle_->createInstalledApp(CComBSTR(kGuid1), | |
| 1297 &app0_created)); | |
| 1298 | |
| 1299 App* app1_created = NULL; | |
| 1300 EXPECT_EQ(GOOPDATE_E_CALL_UNEXPECTED, | |
| 1301 app_bundle_->createApp(CComBSTR(kGuid2), &app1_created)); | |
| 1302 } | |
| 1303 | |
| 1304 TEST_F(AppBundlePopulatedRegistryUserTest, createApp_createAllInstalledApps) { | |
| 1305 App *expected_app0, *expected_app1, *expected_app2; | |
| 1306 PopulateDataAndRegistryForRegisteredAndUnInstalledAppsTests(&expected_app0, | |
| 1307 &expected_app1, | |
| 1308 &expected_app2); | |
| 1309 EXPECT_HRESULT_SUCCEEDED(RegKey::CreateKey( | |
| 1310 AppendRegKeyPath(USER_REG_CLIENT_STATE, kGuid4))); // Avoid assert. | |
| 1311 | |
| 1312 EXPECT_SUCCEEDED(app_bundle_->createAllInstalledApps()); | |
| 1313 | |
| 1314 App* app0_created = NULL; | |
| 1315 EXPECT_EQ(GOOPDATE_E_CALL_UNEXPECTED, | |
| 1316 app_bundle_->createApp(CComBSTR(kGuid1), &app0_created)); | |
| 1317 } | |
| 1318 | |
| 1319 TEST_F(AppBundleInitializedUserTest, createInstalledApp_After_createApp) { | |
| 1320 App* app0_created = NULL; | |
| 1321 EXPECT_SUCCEEDED(app_bundle_->createApp(CComBSTR(kGuid1), &app0_created)); | |
| 1322 | |
| 1323 App* app1_created = NULL; | |
| 1324 EXPECT_EQ(GOOPDATE_E_CALL_UNEXPECTED, | |
| 1325 app_bundle_->createInstalledApp(CComBSTR(kGuid2), &app1_created)); | |
| 1326 } | |
| 1327 | |
| 1328 TEST_F(AppBundlePopulatedRegistryUserTest, | |
| 1329 createInstalledApp_After_createAllInstalledApps) { | |
| 1330 App *expected_app0, *expected_app1, *expected_app2; | |
| 1331 PopulateDataAndRegistryForRegisteredAndUnInstalledAppsTests(&expected_app0, | |
| 1332 &expected_app1, | |
| 1333 &expected_app2); | |
| 1334 EXPECT_HRESULT_SUCCEEDED(RegKey::CreateKey( | |
| 1335 AppendRegKeyPath(USER_REG_CLIENT_STATE, kGuid4))); // Avoid assert. | |
| 1336 | |
| 1337 EXPECT_SUCCEEDED(app_bundle_->createAllInstalledApps()); | |
| 1338 | |
| 1339 App* app0_created = NULL; | |
| 1340 EXPECT_EQ(GOOPDATE_E_CALL_UNEXPECTED, | |
| 1341 app_bundle_->createInstalledApp(CComBSTR(kGuid1), &app0_created)); | |
| 1342 } | |
| 1343 | |
| 1344 TEST_F(AppBundleInitializedUserTest, createAllInstalledApps_After_createApp) { | |
| 1345 App* app0_created = NULL; | |
| 1346 EXPECT_SUCCEEDED(app_bundle_->createApp(CComBSTR(kGuid1), &app0_created)); | |
| 1347 | |
| 1348 EXPECT_EQ(GOOPDATE_E_CALL_UNEXPECTED, app_bundle_->createAllInstalledApps()); | |
| 1349 } | |
| 1350 | |
| 1351 TEST_F(AppBundlePopulatedRegistryUserTest, | |
| 1352 createAllInstalledApps_After_createInstalledApp) { | |
| 1353 App *expected_app0, *expected_app1, *expected_app2; | |
| 1354 PopulateDataAndRegistryForRegisteredAndUnInstalledAppsTests(&expected_app0, | |
| 1355 &expected_app1, | |
| 1356 &expected_app2); | |
| 1357 | |
| 1358 App* app0_created = NULL; | |
| 1359 EXPECT_SUCCEEDED(app_bundle_->createInstalledApp(CComBSTR(kGuid1), | |
| 1360 &app0_created)); | |
| 1361 | |
| 1362 EXPECT_EQ(GOOPDATE_E_CALL_UNEXPECTED, app_bundle_->createAllInstalledApps()); | |
| 1363 } | |
| 1364 | |
| 1365 TEST_F(AppBundlePopulatedRegistryUserTest, | |
| 1366 createAllInstalledApps_Twice) { | |
| 1367 App *expected_app0, *expected_app1, *expected_app2; | |
| 1368 PopulateDataAndRegistryForRegisteredAndUnInstalledAppsTests(&expected_app0, | |
| 1369 &expected_app1, | |
| 1370 &expected_app2); | |
| 1371 | |
| 1372 App* app0_created = NULL; | |
| 1373 EXPECT_SUCCEEDED(app_bundle_->createInstalledApp(CComBSTR(kGuid1), | |
| 1374 &app0_created)); | |
| 1375 | |
| 1376 EXPECT_EQ(GOOPDATE_E_CALL_UNEXPECTED, app_bundle_->createAllInstalledApps()); | |
| 1377 } | |
| 1378 | |
| 1379 // TODO(omaha): Enable if we end up needing such a function. | |
| 1380 #if 0 | |
| 1381 TEST_F(AppBundlePopulatedRegistryMachineTest, createUninstalledApps) { | |
| 1382 App *expected_app0, *expected_app1, *expected_app2; | |
| 1383 PopulateDataAndRegistryForRegisteredAndUnInstalledAppsTests(&expected_app0, | |
| 1384 &expected_app1, | |
| 1385 &expected_app2); | |
| 1386 | |
| 1387 EXPECT_SUCCEEDED(app_bundle_->createUninstalledApps()); | |
| 1388 EXPECT_EQ(1, app_bundle_->GetNumberOfApps()); | |
| 1389 | |
| 1390 App* app0 = app_bundle_->GetApp(0); | |
| 1391 EXPECT_STREQ(kGuid3, app0->app_guid_string()); | |
| 1392 ValidateExpectedValues(*expected_app2, *app0); | |
| 1393 } | |
| 1394 | |
| 1395 TEST_F(AppBundlePopulatedRegistryUserTest, createUninstalledApps) { | |
| 1396 App *expected_app0, *expected_app1, *expected_app2; | |
| 1397 PopulateDataAndRegistryForRegisteredAndUnInstalledAppsTests(&expected_app0, | |
| 1398 &expected_app1, | |
| 1399 &expected_app2); | |
| 1400 | |
| 1401 EXPECT_SUCCEEDED(app_bundle_->createUninstalledApps()); | |
| 1402 EXPECT_EQ(1, app_bundle_->GetNumberOfApps()); | |
| 1403 | |
| 1404 App* app0 = app_bundle_->GetApp(0); | |
| 1405 EXPECT_STREQ(kGuid3, app0->app_guid_string()); | |
| 1406 ValidateExpectedValues(*expected_app2, *app0); | |
| 1407 } | |
| 1408 #endif | |
| 1409 | |
| 1410 // | |
| 1411 // State tests. | |
| 1412 // | |
| 1413 | |
| 1414 class AppBundleStateUserTest : public AppBundleTest { | |
| 1415 protected: | |
| 1416 AppBundleStateUserTest() | |
| 1417 : AppBundleTest(false), | |
| 1418 hive_override_key_name_(kRegistryHiveOverrideRoot) {} | |
| 1419 | |
| 1420 virtual void SetUp() { | |
| 1421 AppBundleTest::SetUp(); | |
| 1422 | |
| 1423 RegKey::DeleteKey(hive_override_key_name_); | |
| 1424 OverrideRegistryHives(hive_override_key_name_); | |
| 1425 } | |
| 1426 | |
| 1427 virtual void TearDown() { | |
| 1428 RestoreRegistryHives(); | |
| 1429 RegKey::DeleteKey(hive_override_key_name_); | |
| 1430 | |
| 1431 AppBundleTest::TearDown(); | |
| 1432 } | |
| 1433 | |
| 1434 // Writing name avoids needing to create the ResourceManager. | |
| 1435 void CreateClientsKeyForApp1() { | |
| 1436 CString clients_key = AppendRegKeyPath(USER_REG_CLIENTS, kGuid1); | |
| 1437 EXPECT_SUCCEEDED(RegKey::SetValue(clients_key, | |
| 1438 kRegValueProductVersion, | |
| 1439 _T("1.2.3.4"))); | |
| 1440 EXPECT_SUCCEEDED(RegKey::SetValue(clients_key, | |
| 1441 kRegValueAppName, | |
| 1442 _T("Test App"))); | |
| 1443 } | |
| 1444 | |
| 1445 CString hive_override_key_name_; | |
| 1446 }; | |
| 1447 | |
| 1448 | |
| 1449 class AppBundleStateInitUserTest : public AppBundleStateUserTest { | |
| 1450 protected: | |
| 1451 AppBundleStateInitUserTest() : AppBundleStateUserTest() {} | |
| 1452 | |
| 1453 virtual void SetUp() { | |
| 1454 AppBundleStateUserTest::SetUp(); | |
| 1455 | |
| 1456 // Nothing to do since the budle starts in this state. | |
| 1457 } | |
| 1458 }; | |
| 1459 | |
| 1460 class AppBundleStateInitializedUserTest : public AppBundleStateUserTest { | |
| 1461 protected: | |
| 1462 AppBundleStateInitializedUserTest() : AppBundleStateUserTest() {} | |
| 1463 | |
| 1464 virtual void SetUp() { | |
| 1465 AppBundleStateUserTest::SetUp(); | |
| 1466 EXPECT_SUCCEEDED(app_bundle_->put_displayName(CComBSTR(_T("My Bundle")))); | |
| 1467 EXPECT_SUCCEEDED(app_bundle_->put_displayLanguage(CComBSTR(_T("en")))); | |
| 1468 EXPECT_SUCCEEDED(app_bundle_->initialize()); | |
| 1469 } | |
| 1470 }; | |
| 1471 | |
| 1472 class AppBundleStateBusyUserTest : public AppBundleStateUserTest { | |
| 1473 protected: | |
| 1474 AppBundleStateBusyUserTest() : AppBundleStateUserTest() {} | |
| 1475 | |
| 1476 virtual void SetUp() { | |
| 1477 AppBundleStateUserTest::SetUp(); | |
| 1478 | |
| 1479 DummyUserWorkItem dummy_work_item; | |
| 1480 app_bundle_->set_user_work_item(&dummy_work_item); | |
| 1481 | |
| 1482 SetAppBundleStateForUnitTest(app_bundle_.get(), | |
| 1483 new fsm::AppBundleStateBusy); | |
| 1484 } | |
| 1485 }; | |
| 1486 | |
| 1487 class AppBundleStateReadyUserTest : public AppBundleStateUserTest { | |
| 1488 protected: | |
| 1489 AppBundleStateReadyUserTest() : AppBundleStateUserTest() {} | |
| 1490 | |
| 1491 virtual void SetUp() { | |
| 1492 AppBundleStateUserTest::SetUp(); | |
| 1493 EXPECT_SUCCEEDED(app_bundle_->put_displayName(CComBSTR(_T("My Bundle")))); | |
| 1494 EXPECT_SUCCEEDED(app_bundle_->put_displayLanguage(CComBSTR(_T("en")))); | |
| 1495 EXPECT_SUCCEEDED(app_bundle_->initialize()); | |
| 1496 | |
| 1497 // In all cases, the bundle should have at least one app. | |
| 1498 // The downloadPackage test needs an installed app. | |
| 1499 CreateClientsKeyForApp1(); | |
| 1500 App* app = NULL; | |
| 1501 EXPECT_SUCCEEDED(app_bundle_->createInstalledApp(CComBSTR(kGuid1), &app)); | |
| 1502 | |
| 1503 SetAppBundleStateForUnitTest(app_bundle_.get(), | |
| 1504 new fsm::AppBundleStateReady); | |
| 1505 } | |
| 1506 }; | |
| 1507 | |
| 1508 class AppBundleStatePausedUserTest : public AppBundleStateUserTest { | |
| 1509 protected: | |
| 1510 AppBundleStatePausedUserTest() : AppBundleStateUserTest() {} | |
| 1511 | |
| 1512 virtual void SetUp() { | |
| 1513 AppBundleStateUserTest::SetUp(); | |
| 1514 SetAppBundleStateForUnitTest(app_bundle_.get(), | |
| 1515 new fsm::AppBundleStatePaused); | |
| 1516 } | |
| 1517 }; | |
| 1518 | |
| 1519 class AppBundleStateStoppedUserTest : public AppBundleStateUserTest { | |
| 1520 protected: | |
| 1521 AppBundleStateStoppedUserTest() : AppBundleStateUserTest() {} | |
| 1522 | |
| 1523 virtual void SetUp() { | |
| 1524 AppBundleStateUserTest::SetUp(); | |
| 1525 SetAppBundleStateForUnitTest(app_bundle_.get(), | |
| 1526 new fsm::AppBundleStateStopped); | |
| 1527 } | |
| 1528 }; | |
| 1529 | |
| 1530 // Init. | |
| 1531 | |
| 1532 TEST_F(AppBundleStateInitUserTest, Properties) { | |
| 1533 TestPropertyReflexiveness(); | |
| 1534 EXPECT_EQ(STATE_INIT, GetBundleState()); | |
| 1535 } | |
| 1536 | |
| 1537 TEST_F(AppBundleStateInitUserTest, CountAndItem) { | |
| 1538 long num_apps = 0; // NOLINT | |
| 1539 EXPECT_SUCCEEDED(app_bundle_->get_Count(&num_apps)); | |
| 1540 EXPECT_EQ(0, num_apps); | |
| 1541 | |
| 1542 App* app0_obtained = NULL; | |
| 1543 EXPECT_EQ(HRESULT_FROM_WIN32(ERROR_INVALID_INDEX), | |
| 1544 app_bundle_->get_Item(0, &app0_obtained)); | |
| 1545 EXPECT_FALSE(app0_obtained); | |
| 1546 | |
| 1547 EXPECT_EQ(STATE_INIT, GetBundleState()); | |
| 1548 } | |
| 1549 | |
| 1550 TEST_F(AppBundleStateInitUserTest, put_altTokens) { | |
| 1551 CAccessToken access_token; | |
| 1552 access_token.GetProcessToken(TOKEN_DUPLICATE); | |
| 1553 ULONG_PTR process_token = | |
| 1554 reinterpret_cast<ULONG_PTR>(access_token.GetHandle()); | |
| 1555 EXPECT_SUCCEEDED(app_bundle_->put_altTokens(process_token, | |
| 1556 process_token, | |
| 1557 ::GetCurrentProcessId())); | |
| 1558 EXPECT_EQ(STATE_INIT, GetBundleState()); | |
| 1559 } | |
| 1560 | |
| 1561 TEST_F(AppBundleStateInitUserTest, initialize) { | |
| 1562 EXPECT_SUCCEEDED(app_bundle_->put_displayName(CComBSTR(_T("My Bundle")))); | |
| 1563 EXPECT_SUCCEEDED(app_bundle_->put_displayLanguage(CComBSTR(_T("en")))); | |
| 1564 EXPECT_SUCCEEDED(app_bundle_->initialize()); | |
| 1565 EXPECT_EQ(STATE_INITIALIZED, GetBundleState()); | |
| 1566 } | |
| 1567 | |
| 1568 TEST_F(AppBundleStateInitUserTest, createApp) { | |
| 1569 App* app = NULL; | |
| 1570 EXPECT_EQ(GOOPDATE_E_CALL_UNEXPECTED, | |
| 1571 app_bundle_->createApp(CComBSTR(kGuid1), &app)); | |
| 1572 EXPECT_EQ(STATE_INIT, GetBundleState()); | |
| 1573 } | |
| 1574 | |
| 1575 TEST_F(AppBundleStateInitUserTest, createInstalledApp) { | |
| 1576 CreateClientsKeyForApp1(); | |
| 1577 | |
| 1578 App* app = NULL; | |
| 1579 EXPECT_EQ(GOOPDATE_E_CALL_UNEXPECTED, | |
| 1580 app_bundle_->createInstalledApp(CComBSTR(kGuid1), &app)); | |
| 1581 EXPECT_EQ(STATE_INIT, GetBundleState()); | |
| 1582 } | |
| 1583 | |
| 1584 TEST_F(AppBundleStateInitUserTest, createAllInstalledApps) { | |
| 1585 CreateClientsKeyForApp1(); | |
| 1586 | |
| 1587 App* app = NULL; | |
| 1588 EXPECT_EQ(GOOPDATE_E_CALL_UNEXPECTED, | |
| 1589 app_bundle_->createAllInstalledApps()); | |
| 1590 EXPECT_EQ(STATE_INIT, GetBundleState()); | |
| 1591 } | |
| 1592 | |
| 1593 TEST_F(AppBundleStateInitUserTest, checkForUpdate) { | |
| 1594 EXPECT_EQ(GOOPDATE_E_CALL_UNEXPECTED, app_bundle_->checkForUpdate()); | |
| 1595 EXPECT_EQ(STATE_INIT, GetBundleState()); | |
| 1596 } | |
| 1597 | |
| 1598 TEST_F(AppBundleStateInitUserTest, download) { | |
| 1599 EXPECT_EQ(GOOPDATE_E_CALL_UNEXPECTED, app_bundle_->download()); | |
| 1600 EXPECT_EQ(STATE_INIT, GetBundleState()); | |
| 1601 } | |
| 1602 | |
| 1603 TEST_F(AppBundleStateInitUserTest, install) { | |
| 1604 EXPECT_EQ(GOOPDATE_E_CALL_UNEXPECTED, app_bundle_->install()); | |
| 1605 EXPECT_EQ(STATE_INIT, GetBundleState()); | |
| 1606 } | |
| 1607 | |
| 1608 TEST_F(AppBundleStateInitUserTest, updateAllApps) { | |
| 1609 EXPECT_EQ(GOOPDATE_E_CALL_UNEXPECTED, app_bundle_->updateAllApps()); | |
| 1610 EXPECT_EQ(STATE_INIT, GetBundleState()); | |
| 1611 } | |
| 1612 | |
| 1613 TEST_F(AppBundleStateInitUserTest, stop) { | |
| 1614 EXPECT_EQ(GOOPDATE_E_CALL_UNEXPECTED, app_bundle_->stop()); | |
| 1615 EXPECT_EQ(STATE_INIT, GetBundleState()); | |
| 1616 } | |
| 1617 | |
| 1618 TEST_F(AppBundleStateInitUserTest, pause) { | |
| 1619 EXPECT_EQ(GOOPDATE_E_CALL_UNEXPECTED, app_bundle_->pause()); | |
| 1620 EXPECT_EQ(STATE_INIT, GetBundleState()); | |
| 1621 } | |
| 1622 | |
| 1623 TEST_F(AppBundleStateInitUserTest, resume) { | |
| 1624 EXPECT_EQ(GOOPDATE_E_CALL_UNEXPECTED, app_bundle_->resume()); | |
| 1625 EXPECT_EQ(STATE_INIT, GetBundleState()); | |
| 1626 } | |
| 1627 | |
| 1628 TEST_F(AppBundleStateInitUserTest, isBusy) { | |
| 1629 VARIANT_BOOL is_busy = VARIANT_TRUE; | |
| 1630 EXPECT_SUCCEEDED(app_bundle_->isBusy(&is_busy)); | |
| 1631 EXPECT_EQ(VARIANT_FALSE, is_busy); | |
| 1632 EXPECT_EQ(STATE_INIT, GetBundleState()); | |
| 1633 } | |
| 1634 | |
| 1635 TEST_F(AppBundleStateInitUserTest, downloadPackage) { | |
| 1636 EXPECT_EQ(GOOPDATE_E_CALL_UNEXPECTED, | |
| 1637 app_bundle_->downloadPackage(CComBSTR(kGuid1), | |
| 1638 CComBSTR(_T("package")))); | |
| 1639 EXPECT_EQ(STATE_INIT, GetBundleState()); | |
| 1640 } | |
| 1641 | |
| 1642 // TODO(omaha): Check the state or remove this function. | |
| 1643 TEST_F(AppBundleStateInitUserTest, get_currentState) { | |
| 1644 VARIANT current_state; | |
| 1645 ExpectAsserts expect_asserts; // Not yet implemented. | |
| 1646 EXPECT_EQ(E_NOTIMPL, app_bundle_->get_currentState(¤t_state)); | |
| 1647 EXPECT_EQ(STATE_INIT, GetBundleState()); | |
| 1648 } | |
| 1649 | |
| 1650 TEST_F(AppBundleStateInitUserTest, CompleteAsyncCall) { | |
| 1651 { | |
| 1652 ExpectAsserts expect_asserts; | |
| 1653 app_bundle_->CompleteAsyncCall(); | |
| 1654 } | |
| 1655 | |
| 1656 EXPECT_EQ(STATE_INIT, GetBundleState()); | |
| 1657 } | |
| 1658 | |
| 1659 // Initialized. | |
| 1660 | |
| 1661 TEST_F(AppBundleStateInitializedUserTest, Properties) { | |
| 1662 TestPropertyReflexiveness(); | |
| 1663 EXPECT_EQ(STATE_INITIALIZED, GetBundleState()); | |
| 1664 } | |
| 1665 | |
| 1666 TEST_F(AppBundleStateInitializedUserTest, CountAndItem) { | |
| 1667 long num_apps = 0; // NOLINT | |
| 1668 EXPECT_SUCCEEDED(app_bundle_->get_Count(&num_apps)); | |
| 1669 EXPECT_EQ(0, num_apps); | |
| 1670 | |
| 1671 App* app0_obtained = NULL; | |
| 1672 EXPECT_EQ(HRESULT_FROM_WIN32(ERROR_INVALID_INDEX), | |
| 1673 app_bundle_->get_Item(0, &app0_obtained)); | |
| 1674 EXPECT_FALSE(app0_obtained); | |
| 1675 | |
| 1676 EXPECT_EQ(STATE_INITIALIZED, GetBundleState()); | |
| 1677 } | |
| 1678 | |
| 1679 TEST_F(AppBundleStateInitializedUserTest, put_altTokens) { | |
| 1680 EXPECT_EQ(GOOPDATE_E_CALL_UNEXPECTED, app_bundle_->put_altTokens(1, 2, 3)); | |
| 1681 EXPECT_EQ(STATE_INITIALIZED, GetBundleState()); | |
| 1682 } | |
| 1683 | |
| 1684 TEST_F(AppBundleStateInitializedUserTest, initialize) { | |
| 1685 EXPECT_EQ(GOOPDATE_E_CALL_UNEXPECTED, app_bundle_->initialize()); | |
| 1686 EXPECT_EQ(STATE_INITIALIZED, GetBundleState()); | |
| 1687 } | |
| 1688 | |
| 1689 TEST_F(AppBundleStateInitializedUserTest, createApp) { | |
| 1690 App* app = NULL; | |
| 1691 EXPECT_SUCCEEDED(app_bundle_->createApp(CComBSTR(kGuid1), &app)); | |
| 1692 EXPECT_EQ(STATE_INITIALIZED, GetBundleState()); | |
| 1693 } | |
| 1694 | |
| 1695 TEST_F(AppBundleStateInitializedUserTest, createInstalledApp) { | |
| 1696 CreateClientsKeyForApp1(); | |
| 1697 | |
| 1698 App* app = NULL; | |
| 1699 EXPECT_SUCCEEDED(app_bundle_->createInstalledApp(CComBSTR(kGuid1), &app)); | |
| 1700 EXPECT_EQ(STATE_INITIALIZED, GetBundleState()); | |
| 1701 } | |
| 1702 | |
| 1703 TEST_F(AppBundleStateInitializedUserTest, createAllInstalledApps) { | |
| 1704 CreateClientsKeyForApp1(); | |
| 1705 EXPECT_HRESULT_SUCCEEDED(RegKey::CreateKey( | |
| 1706 AppendRegKeyPath(USER_REG_CLIENT_STATE, kGuid1))); // Avoid assert. | |
| 1707 | |
| 1708 App* app = NULL; | |
| 1709 EXPECT_SUCCEEDED(app_bundle_->createAllInstalledApps()); | |
| 1710 EXPECT_EQ(STATE_INITIALIZED, GetBundleState()); | |
| 1711 } | |
| 1712 | |
| 1713 TEST_F(AppBundleStateInitializedUserTest, checkForUpdate) { | |
| 1714 App* app = NULL; | |
| 1715 EXPECT_SUCCEEDED(app_bundle_->createApp(CComBSTR(kGuid1), &app)); | |
| 1716 DummyUserWorkItem dummy_work_item; | |
| 1717 EXPECT_CALL(*worker_, CheckForUpdateAsync(_)) | |
| 1718 .WillOnce(SetWorkItem(&dummy_work_item)); | |
| 1719 | |
| 1720 EXPECT_SUCCEEDED(app_bundle_->checkForUpdate()); | |
| 1721 EXPECT_EQ(STATE_BUSY, GetBundleState()); | |
| 1722 | |
| 1723 EXPECT_FALSE(app_bundle_->is_auto_update()); | |
| 1724 } | |
| 1725 | |
| 1726 TEST_F(AppBundleStateInitializedUserTest, download) { | |
| 1727 EXPECT_EQ(GOOPDATE_E_CALL_UNEXPECTED, app_bundle_->download()); | |
| 1728 EXPECT_EQ(STATE_INITIALIZED, GetBundleState()); | |
| 1729 } | |
| 1730 | |
| 1731 TEST_F(AppBundleStateInitializedUserTest, install) { | |
| 1732 EXPECT_EQ(GOOPDATE_E_CALL_UNEXPECTED, app_bundle_->install()); | |
| 1733 EXPECT_EQ(STATE_INITIALIZED, GetBundleState()); | |
| 1734 } | |
| 1735 | |
| 1736 TEST_F(AppBundleStateInitializedUserTest, updateAllApps) { | |
| 1737 CreateClientsKeyForApp1(); | |
| 1738 EXPECT_HRESULT_SUCCEEDED(RegKey::CreateKey( | |
| 1739 AppendRegKeyPath(USER_REG_CLIENT_STATE, kGuid1))); // Avoid assert. | |
| 1740 | |
| 1741 DummyUserWorkItem dummy_work_item; | |
| 1742 EXPECT_CALL(*worker_, UpdateAllAppsAsync(_)) | |
| 1743 .WillOnce(SetWorkItem(&dummy_work_item)); | |
| 1744 | |
| 1745 EXPECT_SUCCEEDED(app_bundle_->updateAllApps()); | |
| 1746 EXPECT_EQ(STATE_BUSY, GetBundleState()); | |
| 1747 | |
| 1748 EXPECT_TRUE(app_bundle_->is_auto_update()); | |
| 1749 } | |
| 1750 | |
| 1751 TEST_F(AppBundleStateInitializedUserTest, stop) { | |
| 1752 EXPECT_SUCCEEDED(app_bundle_->stop()); | |
| 1753 EXPECT_EQ(STATE_STOPPED, GetBundleState()); | |
| 1754 } | |
| 1755 | |
| 1756 TEST_F(AppBundleStateInitializedUserTest, pause) { | |
| 1757 EXPECT_SUCCEEDED(app_bundle_->pause()); | |
| 1758 EXPECT_EQ(STATE_PAUSED, GetBundleState()); | |
| 1759 } | |
| 1760 | |
| 1761 TEST_F(AppBundleStateInitializedUserTest, resume) { | |
| 1762 EXPECT_EQ(GOOPDATE_E_CALL_UNEXPECTED, app_bundle_->resume()); | |
| 1763 EXPECT_EQ(STATE_INITIALIZED, GetBundleState()); | |
| 1764 } | |
| 1765 | |
| 1766 TEST_F(AppBundleStateInitializedUserTest, isBusy) { | |
| 1767 VARIANT_BOOL is_busy = VARIANT_TRUE; | |
| 1768 EXPECT_SUCCEEDED(app_bundle_->isBusy(&is_busy)); | |
| 1769 EXPECT_EQ(VARIANT_FALSE, is_busy); | |
| 1770 EXPECT_EQ(STATE_INITIALIZED, GetBundleState()); | |
| 1771 } | |
| 1772 | |
| 1773 // downloadPackage() returns E_INVALIDARG because the app has no packages. | |
| 1774 // TODO(omaha): Add the package so downloadPackage can succeed. | |
| 1775 TEST_F(AppBundleStateInitializedUserTest, downloadPackage) { | |
| 1776 CreateClientsKeyForApp1(); | |
| 1777 App* app = NULL; | |
| 1778 EXPECT_SUCCEEDED(app_bundle_->createInstalledApp(CComBSTR(kGuid1), &app)); | |
| 1779 | |
| 1780 EXPECT_EQ( | |
| 1781 E_INVALIDARG, | |
| 1782 app_bundle_->downloadPackage(CComBSTR(kGuid1), CComBSTR(_T("package")))); | |
| 1783 EXPECT_EQ(STATE_INITIALIZED, GetBundleState()); | |
| 1784 | |
| 1785 EXPECT_FALSE(app_bundle_->is_auto_update()); | |
| 1786 } | |
| 1787 | |
| 1788 TEST_F(AppBundleStateInitializedUserTest, get_currentState) { | |
| 1789 VARIANT current_state; | |
| 1790 ExpectAsserts expect_asserts; // Not yet implemented. | |
| 1791 EXPECT_EQ(E_NOTIMPL, app_bundle_->get_currentState(¤t_state)); | |
| 1792 EXPECT_EQ(STATE_INITIALIZED, GetBundleState()); | |
| 1793 } | |
| 1794 | |
| 1795 TEST_F(AppBundleStateInitializedUserTest, CompleteAsyncCall) { | |
| 1796 { | |
| 1797 ExpectAsserts expect_asserts; | |
| 1798 app_bundle_->CompleteAsyncCall(); | |
| 1799 } | |
| 1800 | |
| 1801 EXPECT_EQ(STATE_INITIALIZED, GetBundleState()); | |
| 1802 } | |
| 1803 | |
| 1804 // Busy. | |
| 1805 | |
| 1806 TEST_F(AppBundleStateBusyUserTest, Properties) { | |
| 1807 TestPropertyReflexiveness(); | |
| 1808 EXPECT_EQ(STATE_BUSY, GetBundleState()); | |
| 1809 } | |
| 1810 | |
| 1811 TEST_F(AppBundleStateBusyUserTest, CountAndItem) { | |
| 1812 long num_apps = 0; // NOLINT | |
| 1813 EXPECT_SUCCEEDED(app_bundle_->get_Count(&num_apps)); | |
| 1814 EXPECT_EQ(0, num_apps); | |
| 1815 | |
| 1816 App* app0_obtained = NULL; | |
| 1817 EXPECT_EQ(HRESULT_FROM_WIN32(ERROR_INVALID_INDEX), | |
| 1818 app_bundle_->get_Item(0, &app0_obtained)); | |
| 1819 EXPECT_FALSE(app0_obtained); | |
| 1820 | |
| 1821 EXPECT_EQ(STATE_BUSY, GetBundleState()); | |
| 1822 } | |
| 1823 | |
| 1824 TEST_F(AppBundleStateBusyUserTest, put_altTokens) { | |
| 1825 EXPECT_EQ(GOOPDATE_E_CALL_UNEXPECTED, app_bundle_->put_altTokens(1, 2, 3)); | |
| 1826 EXPECT_EQ(STATE_BUSY, GetBundleState()); | |
| 1827 } | |
| 1828 | |
| 1829 TEST_F(AppBundleStateBusyUserTest, initialize) { | |
| 1830 EXPECT_EQ(GOOPDATE_E_CALL_UNEXPECTED, app_bundle_->initialize()); | |
| 1831 EXPECT_EQ(STATE_BUSY, GetBundleState()); | |
| 1832 } | |
| 1833 | |
| 1834 TEST_F(AppBundleStateBusyUserTest, createApp) { | |
| 1835 App* app = NULL; | |
| 1836 EXPECT_EQ(GOOPDATE_E_CALL_UNEXPECTED, | |
| 1837 app_bundle_->createApp(CComBSTR(kGuid1), &app)); | |
| 1838 EXPECT_EQ(STATE_BUSY, GetBundleState()); | |
| 1839 } | |
| 1840 | |
| 1841 TEST_F(AppBundleStateBusyUserTest, createInstalledApp) { | |
| 1842 CreateClientsKeyForApp1(); | |
| 1843 | |
| 1844 App* app = NULL; | |
| 1845 EXPECT_EQ(GOOPDATE_E_CALL_UNEXPECTED, | |
| 1846 app_bundle_->createInstalledApp(CComBSTR(kGuid1), &app)); | |
| 1847 EXPECT_EQ(STATE_BUSY, GetBundleState()); | |
| 1848 } | |
| 1849 | |
| 1850 TEST_F(AppBundleStateBusyUserTest, createAllInstalledApps) { | |
| 1851 CreateClientsKeyForApp1(); | |
| 1852 | |
| 1853 App* app = NULL; | |
| 1854 EXPECT_EQ(GOOPDATE_E_CALL_UNEXPECTED, | |
| 1855 app_bundle_->createAllInstalledApps()); | |
| 1856 EXPECT_EQ(STATE_BUSY, GetBundleState()); | |
| 1857 } | |
| 1858 | |
| 1859 TEST_F(AppBundleStateBusyUserTest, checkForUpdate) { | |
| 1860 EXPECT_EQ(GOOPDATE_E_CALL_UNEXPECTED, app_bundle_->checkForUpdate()); | |
| 1861 EXPECT_EQ(STATE_BUSY, GetBundleState()); | |
| 1862 } | |
| 1863 | |
| 1864 TEST_F(AppBundleStateBusyUserTest, download) { | |
| 1865 EXPECT_EQ(GOOPDATE_E_NON_BLOCKING_CALL_PENDING, app_bundle_->download()); | |
| 1866 EXPECT_EQ(STATE_BUSY, GetBundleState()); | |
| 1867 } | |
| 1868 | |
| 1869 TEST_F(AppBundleStateBusyUserTest, install) { | |
| 1870 EXPECT_EQ(GOOPDATE_E_NON_BLOCKING_CALL_PENDING, app_bundle_->install()); | |
| 1871 EXPECT_EQ(STATE_BUSY, GetBundleState()); | |
| 1872 } | |
| 1873 | |
| 1874 TEST_F(AppBundleStateBusyUserTest, updateAllApps) { | |
| 1875 EXPECT_EQ(GOOPDATE_E_CALL_UNEXPECTED, app_bundle_->updateAllApps()); | |
| 1876 EXPECT_EQ(STATE_BUSY, GetBundleState()); | |
| 1877 } | |
| 1878 | |
| 1879 TEST_F(AppBundleStateBusyUserTest, stop_Succeeds) { | |
| 1880 EXPECT_CALL(*worker_, Stop(app_bundle_.get())) | |
| 1881 .WillOnce(Return(S_OK)); | |
| 1882 | |
| 1883 EXPECT_SUCCEEDED(app_bundle_->stop()); | |
| 1884 EXPECT_EQ(STATE_STOPPED, GetBundleState()); | |
| 1885 } | |
| 1886 | |
| 1887 TEST_F(AppBundleStateBusyUserTest, stop_Fails) { | |
| 1888 EXPECT_CALL(*worker_, Stop(app_bundle_.get())) | |
| 1889 .WillOnce(Return(kKnownError)); | |
| 1890 | |
| 1891 EXPECT_EQ(kKnownError, app_bundle_->stop()); | |
| 1892 EXPECT_EQ(STATE_BUSY, GetBundleState()); | |
| 1893 } | |
| 1894 | |
| 1895 TEST_F(AppBundleStateBusyUserTest, pause_Succeeds) { | |
| 1896 EXPECT_CALL(*worker_, Pause(app_bundle_.get())) | |
| 1897 .WillOnce(Return(S_OK)); | |
| 1898 | |
| 1899 EXPECT_EQ(S_OK, app_bundle_->pause()); | |
| 1900 EXPECT_EQ(STATE_PAUSED, GetBundleState()); | |
| 1901 } | |
| 1902 | |
| 1903 TEST_F(AppBundleStateBusyUserTest, pause_Fails) { | |
| 1904 EXPECT_CALL(*worker_, Pause(_)) | |
| 1905 .WillOnce(Return(kKnownError)); | |
| 1906 | |
| 1907 EXPECT_EQ(kKnownError, app_bundle_->pause()); | |
| 1908 EXPECT_EQ(STATE_BUSY, GetBundleState()); | |
| 1909 } | |
| 1910 | |
| 1911 TEST_F(AppBundleStateBusyUserTest, resume) { | |
| 1912 EXPECT_EQ(GOOPDATE_E_CALL_UNEXPECTED, app_bundle_->resume()); | |
| 1913 EXPECT_EQ(STATE_BUSY, GetBundleState()); | |
| 1914 } | |
| 1915 | |
| 1916 TEST_F(AppBundleStateBusyUserTest, isBusy) { | |
| 1917 VARIANT_BOOL is_busy = VARIANT_TRUE; | |
| 1918 EXPECT_SUCCEEDED(app_bundle_->isBusy(&is_busy)); | |
| 1919 EXPECT_EQ(VARIANT_TRUE, is_busy); | |
| 1920 EXPECT_EQ(STATE_BUSY, GetBundleState()); | |
| 1921 } | |
| 1922 | |
| 1923 TEST_F(AppBundleStateBusyUserTest, downloadPackage) { | |
| 1924 EXPECT_EQ(GOOPDATE_E_NON_BLOCKING_CALL_PENDING, | |
| 1925 app_bundle_->downloadPackage(CComBSTR(kGuid1), | |
| 1926 CComBSTR(_T("package")))); | |
| 1927 EXPECT_EQ(STATE_BUSY, GetBundleState()); | |
| 1928 } | |
| 1929 | |
| 1930 TEST_F(AppBundleStateBusyUserTest, get_currentState) { | |
| 1931 VARIANT current_state; | |
| 1932 ExpectAsserts expect_asserts; // Not yet implemented. | |
| 1933 EXPECT_EQ(E_NOTIMPL, app_bundle_->get_currentState(¤t_state)); | |
| 1934 EXPECT_EQ(STATE_BUSY, GetBundleState()); | |
| 1935 } | |
| 1936 | |
| 1937 TEST_F(AppBundleStateBusyUserTest, CompleteAsyncCall) { | |
| 1938 app_bundle_->CompleteAsyncCall(); | |
| 1939 | |
| 1940 EXPECT_EQ(STATE_READY, GetBundleState()); | |
| 1941 } | |
| 1942 | |
| 1943 // Ready. | |
| 1944 | |
| 1945 TEST_F(AppBundleStateReadyUserTest, Properties) { | |
| 1946 TestPropertyReflexiveness(); | |
| 1947 EXPECT_EQ(STATE_READY, GetBundleState()); | |
| 1948 } | |
| 1949 | |
| 1950 TEST_F(AppBundleStateReadyUserTest, CountAndItem) { | |
| 1951 long num_apps = 0; // NOLINT | |
| 1952 EXPECT_SUCCEEDED(app_bundle_->get_Count(&num_apps)); | |
| 1953 EXPECT_EQ(1, num_apps); | |
| 1954 | |
| 1955 App* app0_obtained = NULL; | |
| 1956 EXPECT_SUCCEEDED(app_bundle_->get_Item(0, &app0_obtained)); | |
| 1957 EXPECT_TRUE(app0_obtained); | |
| 1958 | |
| 1959 EXPECT_EQ(STATE_READY, GetBundleState()); | |
| 1960 } | |
| 1961 | |
| 1962 TEST_F(AppBundleStateReadyUserTest, put_altTokens) { | |
| 1963 EXPECT_EQ(GOOPDATE_E_CALL_UNEXPECTED, app_bundle_->put_altTokens(1, 2, 3)); | |
| 1964 EXPECT_EQ(STATE_READY, GetBundleState()); | |
| 1965 } | |
| 1966 | |
| 1967 TEST_F(AppBundleStateReadyUserTest, initialize) { | |
| 1968 EXPECT_EQ(GOOPDATE_E_CALL_UNEXPECTED, app_bundle_->initialize()); | |
| 1969 EXPECT_EQ(STATE_READY, GetBundleState()); | |
| 1970 } | |
| 1971 | |
| 1972 TEST_F(AppBundleStateReadyUserTest, createApp) { | |
| 1973 App* app = NULL; | |
| 1974 EXPECT_EQ(GOOPDATE_E_CALL_UNEXPECTED, | |
| 1975 app_bundle_->createApp(CComBSTR(kGuid1), &app)); | |
| 1976 EXPECT_EQ(STATE_READY, GetBundleState()); | |
| 1977 } | |
| 1978 | |
| 1979 TEST_F(AppBundleStateReadyUserTest, createInstalledApp) { | |
| 1980 CreateClientsKeyForApp1(); | |
| 1981 | |
| 1982 App* app = NULL; | |
| 1983 EXPECT_EQ(GOOPDATE_E_CALL_UNEXPECTED, | |
| 1984 app_bundle_->createInstalledApp(CComBSTR(kGuid1), &app)); | |
| 1985 EXPECT_EQ(STATE_READY, GetBundleState()); | |
| 1986 } | |
| 1987 | |
| 1988 TEST_F(AppBundleStateReadyUserTest, createAllInstalledApps) { | |
| 1989 CreateClientsKeyForApp1(); | |
| 1990 | |
| 1991 App* app = NULL; | |
| 1992 EXPECT_EQ(GOOPDATE_E_CALL_UNEXPECTED, | |
| 1993 app_bundle_->createAllInstalledApps()); | |
| 1994 EXPECT_EQ(STATE_READY, GetBundleState()); | |
| 1995 } | |
| 1996 | |
| 1997 TEST_F(AppBundleStateReadyUserTest, checkForUpdate) { | |
| 1998 EXPECT_EQ(GOOPDATE_E_CALL_UNEXPECTED, app_bundle_->checkForUpdate()); | |
| 1999 EXPECT_EQ(STATE_READY, GetBundleState()); | |
| 2000 } | |
| 2001 | |
| 2002 TEST_F(AppBundleStateReadyUserTest, download) { | |
| 2003 DummyUserWorkItem dummy_work_item; | |
| 2004 EXPECT_CALL(*worker_, DownloadAsync(_)) | |
| 2005 .WillOnce(SetWorkItem(&dummy_work_item)); | |
| 2006 | |
| 2007 EXPECT_SUCCEEDED(app_bundle_->download()); | |
| 2008 EXPECT_EQ(STATE_BUSY, GetBundleState()); | |
| 2009 | |
| 2010 EXPECT_FALSE(app_bundle_->is_auto_update()); | |
| 2011 } | |
| 2012 | |
| 2013 TEST_F(AppBundleStateReadyUserTest, install) { | |
| 2014 DummyUserWorkItem dummy_work_item; | |
| 2015 EXPECT_CALL(*worker_, DownloadAndInstallAsync(_)) | |
| 2016 .WillOnce(SetWorkItem(&dummy_work_item)); | |
| 2017 | |
| 2018 EXPECT_SUCCEEDED(app_bundle_->install()); | |
| 2019 EXPECT_EQ(STATE_BUSY, GetBundleState()); | |
| 2020 | |
| 2021 EXPECT_FALSE(app_bundle_->is_auto_update()); | |
| 2022 } | |
| 2023 | |
| 2024 TEST_F(AppBundleStateReadyUserTest, updateAllApps) { | |
| 2025 EXPECT_EQ(GOOPDATE_E_CALL_UNEXPECTED, app_bundle_->updateAllApps()); | |
| 2026 EXPECT_EQ(STATE_READY, GetBundleState()); | |
| 2027 } | |
| 2028 | |
| 2029 TEST_F(AppBundleStateReadyUserTest, stop) { | |
| 2030 EXPECT_EQ(GOOPDATE_E_CALL_UNEXPECTED, app_bundle_->stop()); | |
| 2031 EXPECT_EQ(STATE_READY, GetBundleState()); | |
| 2032 } | |
| 2033 | |
| 2034 TEST_F(AppBundleStateReadyUserTest, pause) { | |
| 2035 EXPECT_SUCCEEDED(app_bundle_->pause()); | |
| 2036 EXPECT_EQ(STATE_READY, GetBundleState()); | |
| 2037 } | |
| 2038 | |
| 2039 TEST_F(AppBundleStateReadyUserTest, resume) { | |
| 2040 EXPECT_SUCCEEDED(app_bundle_->resume()); | |
| 2041 EXPECT_EQ(STATE_READY, GetBundleState()); | |
| 2042 } | |
| 2043 | |
| 2044 TEST_F(AppBundleStateReadyUserTest, isBusy) { | |
| 2045 VARIANT_BOOL is_busy = VARIANT_TRUE; | |
| 2046 EXPECT_SUCCEEDED(app_bundle_->isBusy(&is_busy)); | |
| 2047 EXPECT_EQ(VARIANT_FALSE, is_busy); | |
| 2048 EXPECT_EQ(STATE_READY, GetBundleState()); | |
| 2049 } | |
| 2050 | |
| 2051 // downloadPackage() returns E_INVALIDARG because the app has no packages. | |
| 2052 // TODO(omaha): Add the package so downloadPackage can succeed. | |
| 2053 TEST_F(AppBundleStateReadyUserTest, downloadPackage) { | |
| 2054 EXPECT_EQ( | |
| 2055 E_INVALIDARG, | |
| 2056 app_bundle_->downloadPackage(CComBSTR(kGuid1), CComBSTR(_T("package")))); | |
| 2057 EXPECT_EQ(STATE_READY, GetBundleState()); | |
| 2058 } | |
| 2059 | |
| 2060 TEST_F(AppBundleStateReadyUserTest, get_currentState) { | |
| 2061 VARIANT current_state; | |
| 2062 ExpectAsserts expect_asserts; // Not yet implemented. | |
| 2063 EXPECT_EQ(E_NOTIMPL, app_bundle_->get_currentState(¤t_state)); | |
| 2064 EXPECT_EQ(STATE_READY, GetBundleState()); | |
| 2065 } | |
| 2066 | |
| 2067 TEST_F(AppBundleStateReadyUserTest, CompleteAsyncCall) { | |
| 2068 { | |
| 2069 ExpectAsserts expect_asserts; | |
| 2070 app_bundle_->CompleteAsyncCall(); | |
| 2071 } | |
| 2072 | |
| 2073 EXPECT_EQ(STATE_READY, GetBundleState()); | |
| 2074 } | |
| 2075 | |
| 2076 // Paused. | |
| 2077 | |
| 2078 TEST_F(AppBundleStatePausedUserTest, Properties) { | |
| 2079 TestPropertyReflexiveness(); | |
| 2080 EXPECT_EQ(STATE_PAUSED, GetBundleState()); | |
| 2081 } | |
| 2082 | |
| 2083 TEST_F(AppBundleStatePausedUserTest, CountAndItem) { | |
| 2084 long num_apps = 0; // NOLINT | |
| 2085 EXPECT_SUCCEEDED(app_bundle_->get_Count(&num_apps)); | |
| 2086 EXPECT_EQ(0, num_apps); | |
| 2087 | |
| 2088 App* app0_obtained = NULL; | |
| 2089 EXPECT_EQ(HRESULT_FROM_WIN32(ERROR_INVALID_INDEX), | |
| 2090 app_bundle_->get_Item(0, &app0_obtained)); | |
| 2091 EXPECT_FALSE(app0_obtained); | |
| 2092 | |
| 2093 EXPECT_EQ(STATE_PAUSED, GetBundleState()); | |
| 2094 } | |
| 2095 | |
| 2096 TEST_F(AppBundleStatePausedUserTest, put_altTokens) { | |
| 2097 EXPECT_EQ(GOOPDATE_E_CALL_UNEXPECTED, app_bundle_->put_altTokens(1, 2, 3)); | |
| 2098 EXPECT_EQ(STATE_PAUSED, GetBundleState()); | |
| 2099 } | |
| 2100 | |
| 2101 TEST_F(AppBundleStatePausedUserTest, initialize) { | |
| 2102 EXPECT_EQ(GOOPDATE_E_CALL_UNEXPECTED, app_bundle_->initialize()); | |
| 2103 EXPECT_EQ(STATE_PAUSED, GetBundleState()); | |
| 2104 } | |
| 2105 | |
| 2106 TEST_F(AppBundleStatePausedUserTest, createApp) { | |
| 2107 App* app = NULL; | |
| 2108 EXPECT_EQ(GOOPDATE_E_CALL_UNEXPECTED, | |
| 2109 app_bundle_->createApp(CComBSTR(kGuid1), &app)); | |
| 2110 EXPECT_EQ(STATE_PAUSED, GetBundleState()); | |
| 2111 } | |
| 2112 | |
| 2113 TEST_F(AppBundleStatePausedUserTest, createInstalledApp) { | |
| 2114 CreateClientsKeyForApp1(); | |
| 2115 | |
| 2116 App* app = NULL; | |
| 2117 EXPECT_EQ(GOOPDATE_E_CALL_UNEXPECTED, | |
| 2118 app_bundle_->createInstalledApp(CComBSTR(kGuid1), &app)); | |
| 2119 EXPECT_EQ(STATE_PAUSED, GetBundleState()); | |
| 2120 } | |
| 2121 | |
| 2122 TEST_F(AppBundleStatePausedUserTest, createAllInstalledApps) { | |
| 2123 CreateClientsKeyForApp1(); | |
| 2124 | |
| 2125 App* app = NULL; | |
| 2126 EXPECT_EQ(GOOPDATE_E_CALL_UNEXPECTED, | |
| 2127 app_bundle_->createAllInstalledApps()); | |
| 2128 EXPECT_EQ(STATE_PAUSED, GetBundleState()); | |
| 2129 } | |
| 2130 | |
| 2131 TEST_F(AppBundleStatePausedUserTest, checkForUpdate) { | |
| 2132 EXPECT_EQ(GOOPDATE_E_CALL_UNEXPECTED, app_bundle_->checkForUpdate()); | |
| 2133 EXPECT_EQ(STATE_PAUSED, GetBundleState()); | |
| 2134 } | |
| 2135 | |
| 2136 TEST_F(AppBundleStatePausedUserTest, download) { | |
| 2137 EXPECT_EQ(GOOPDATE_E_CALL_UNEXPECTED, app_bundle_->download()); | |
| 2138 EXPECT_EQ(STATE_PAUSED, GetBundleState()); | |
| 2139 } | |
| 2140 | |
| 2141 TEST_F(AppBundleStatePausedUserTest, install) { | |
| 2142 EXPECT_EQ(GOOPDATE_E_CALL_UNEXPECTED, app_bundle_->install()); | |
| 2143 EXPECT_EQ(STATE_PAUSED, GetBundleState()); | |
| 2144 } | |
| 2145 | |
| 2146 TEST_F(AppBundleStatePausedUserTest, updateAllApps) { | |
| 2147 EXPECT_EQ(GOOPDATE_E_CALL_UNEXPECTED, app_bundle_->updateAllApps()); | |
| 2148 EXPECT_EQ(STATE_PAUSED, GetBundleState()); | |
| 2149 } | |
| 2150 | |
| 2151 // This may change when implemented. | |
| 2152 TEST_F(AppBundleStatePausedUserTest, stop) { | |
| 2153 EXPECT_EQ(GOOPDATE_E_CALL_UNEXPECTED, app_bundle_->stop()); | |
| 2154 EXPECT_EQ(STATE_PAUSED, GetBundleState()); | |
| 2155 } | |
| 2156 | |
| 2157 TEST_F(AppBundleStatePausedUserTest, pause) { | |
| 2158 EXPECT_SUCCEEDED(app_bundle_->pause()); | |
| 2159 EXPECT_EQ(STATE_PAUSED, GetBundleState()); | |
| 2160 } | |
| 2161 | |
| 2162 TEST_F(AppBundleStatePausedUserTest, resume_Succeeds_AsyncCallNotCompleted) { | |
| 2163 EXPECT_CALL(*worker_, Resume(app_bundle_.get())) | |
| 2164 .WillOnce(Return(S_OK)); | |
| 2165 | |
| 2166 EXPECT_SUCCEEDED(app_bundle_->resume()); | |
| 2167 EXPECT_EQ(STATE_BUSY, GetBundleState()); | |
| 2168 } | |
| 2169 | |
| 2170 TEST_F(AppBundleStatePausedUserTest, resume_Succeeds_AsyncCallCompleted) { | |
| 2171 DummyUserWorkItem dummy_work_item; | |
| 2172 app_bundle_->set_user_work_item(&dummy_work_item); | |
| 2173 app_bundle_->CompleteAsyncCall(); | |
| 2174 | |
| 2175 EXPECT_CALL(*worker_, Resume(app_bundle_.get())) | |
| 2176 .WillOnce(Return(S_OK)); | |
| 2177 | |
| 2178 EXPECT_SUCCEEDED(app_bundle_->resume()); | |
| 2179 EXPECT_EQ(STATE_READY, GetBundleState()); | |
| 2180 } | |
| 2181 | |
| 2182 TEST_F(AppBundleStatePausedUserTest, resume_Fails_AsyncCallNotCompleted) { | |
| 2183 EXPECT_CALL(*worker_, Resume(app_bundle_.get())) | |
| 2184 .WillOnce(Return(kKnownError)); | |
| 2185 | |
| 2186 EXPECT_EQ(kKnownError, app_bundle_->resume()); | |
| 2187 EXPECT_EQ(STATE_PAUSED, GetBundleState()); | |
| 2188 } | |
| 2189 | |
| 2190 TEST_F(AppBundleStatePausedUserTest, resume_Fails_AsyncCallCompleted) { | |
| 2191 DummyUserWorkItem dummy_work_item; | |
| 2192 app_bundle_->set_user_work_item(&dummy_work_item); | |
| 2193 app_bundle_->CompleteAsyncCall(); | |
| 2194 | |
| 2195 EXPECT_CALL(*worker_, Resume(app_bundle_.get())) | |
| 2196 .WillOnce(Return(kKnownError)); | |
| 2197 | |
| 2198 EXPECT_EQ(kKnownError, app_bundle_->resume()); | |
| 2199 EXPECT_EQ(STATE_PAUSED, GetBundleState()); | |
| 2200 } | |
| 2201 | |
| 2202 TEST_F(AppBundleStatePausedUserTest, isBusy) { | |
| 2203 VARIANT_BOOL is_busy = VARIANT_TRUE; | |
| 2204 EXPECT_SUCCEEDED(app_bundle_->isBusy(&is_busy)); | |
| 2205 EXPECT_EQ(VARIANT_FALSE, is_busy); | |
| 2206 EXPECT_EQ(STATE_PAUSED, GetBundleState()); | |
| 2207 } | |
| 2208 | |
| 2209 TEST_F(AppBundleStatePausedUserTest, downloadPackage) { | |
| 2210 EXPECT_EQ(GOOPDATE_E_CALL_UNEXPECTED, | |
| 2211 app_bundle_->downloadPackage(CComBSTR(kGuid1), | |
| 2212 CComBSTR(_T("package")))); | |
| 2213 EXPECT_EQ(STATE_PAUSED, GetBundleState()); | |
| 2214 } | |
| 2215 | |
| 2216 TEST_F(AppBundleStatePausedUserTest, get_currentState) { | |
| 2217 VARIANT current_state; | |
| 2218 ExpectAsserts expect_asserts; // Not yet implemented. | |
| 2219 EXPECT_EQ(E_NOTIMPL, app_bundle_->get_currentState(¤t_state)); | |
| 2220 EXPECT_EQ(STATE_PAUSED, GetBundleState()); | |
| 2221 } | |
| 2222 | |
| 2223 // Remains Paused until resumed. | |
| 2224 TEST_F(AppBundleStatePausedUserTest, CompleteAsyncCall) { | |
| 2225 DummyUserWorkItem dummy_work_item; | |
| 2226 app_bundle_->set_user_work_item(&dummy_work_item); | |
| 2227 SetAppBundleStateForUnitTest(app_bundle_.get(), | |
| 2228 new fsm::AppBundleStatePaused); | |
| 2229 | |
| 2230 app_bundle_->CompleteAsyncCall(); | |
| 2231 | |
| 2232 EXPECT_EQ(STATE_PAUSED, GetBundleState()); | |
| 2233 } | |
| 2234 | |
| 2235 // Stopped. | |
| 2236 | |
| 2237 TEST_F(AppBundleStateStoppedUserTest, Properties) { | |
| 2238 TestPropertyReflexiveness(); | |
| 2239 EXPECT_EQ(STATE_STOPPED, GetBundleState()); | |
| 2240 } | |
| 2241 | |
| 2242 TEST_F(AppBundleStateStoppedUserTest, CountAndItem) { | |
| 2243 long num_apps = 0; // NOLINT | |
| 2244 EXPECT_SUCCEEDED(app_bundle_->get_Count(&num_apps)); | |
| 2245 EXPECT_EQ(0, num_apps); | |
| 2246 | |
| 2247 App* app0_obtained = NULL; | |
| 2248 EXPECT_EQ(HRESULT_FROM_WIN32(ERROR_INVALID_INDEX), | |
| 2249 app_bundle_->get_Item(0, &app0_obtained)); | |
| 2250 EXPECT_FALSE(app0_obtained); | |
| 2251 | |
| 2252 EXPECT_EQ(STATE_STOPPED, GetBundleState()); | |
| 2253 } | |
| 2254 | |
| 2255 TEST_F(AppBundleStateStoppedUserTest, put_altTokens) { | |
| 2256 EXPECT_EQ(GOOPDATE_E_CALL_UNEXPECTED, app_bundle_->put_altTokens(1, 2, 3)); | |
| 2257 EXPECT_EQ(STATE_STOPPED, GetBundleState()); | |
| 2258 } | |
| 2259 | |
| 2260 TEST_F(AppBundleStateStoppedUserTest, initialize) { | |
| 2261 EXPECT_EQ(GOOPDATE_E_CALL_UNEXPECTED, app_bundle_->initialize()); | |
| 2262 EXPECT_EQ(STATE_STOPPED, GetBundleState()); | |
| 2263 } | |
| 2264 | |
| 2265 TEST_F(AppBundleStateStoppedUserTest, createApp) { | |
| 2266 App* app = NULL; | |
| 2267 EXPECT_EQ(GOOPDATE_E_CALL_UNEXPECTED, | |
| 2268 app_bundle_->createApp(CComBSTR(kGuid1), &app)); | |
| 2269 | |
| 2270 EXPECT_EQ(S_OK, app_bundle_->stop()); | |
| 2271 EXPECT_EQ(STATE_STOPPED, GetBundleState()); | |
| 2272 } | |
| 2273 | |
| 2274 TEST_F(AppBundleStateStoppedUserTest, createInstalledApp) { | |
| 2275 CreateClientsKeyForApp1(); | |
| 2276 | |
| 2277 App* app = NULL; | |
| 2278 EXPECT_EQ(GOOPDATE_E_CALL_UNEXPECTED, | |
| 2279 app_bundle_->createInstalledApp(CComBSTR(kGuid1), &app)); | |
| 2280 EXPECT_EQ(STATE_STOPPED, GetBundleState()); | |
| 2281 } | |
| 2282 | |
| 2283 TEST_F(AppBundleStateStoppedUserTest, createAllInstalledApps) { | |
| 2284 CreateClientsKeyForApp1(); | |
| 2285 | |
| 2286 App* app = NULL; | |
| 2287 EXPECT_EQ(GOOPDATE_E_CALL_UNEXPECTED, | |
| 2288 app_bundle_->createAllInstalledApps()); | |
| 2289 EXPECT_EQ(STATE_STOPPED, GetBundleState()); | |
| 2290 } | |
| 2291 | |
| 2292 TEST_F(AppBundleStateStoppedUserTest, checkForUpdate) { | |
| 2293 EXPECT_EQ(GOOPDATE_E_CALL_UNEXPECTED, app_bundle_->checkForUpdate()); | |
| 2294 EXPECT_EQ(STATE_STOPPED, GetBundleState()); | |
| 2295 } | |
| 2296 | |
| 2297 TEST_F(AppBundleStateStoppedUserTest, download) { | |
| 2298 EXPECT_EQ(GOOPDATE_E_CALL_UNEXPECTED, app_bundle_->download()); | |
| 2299 EXPECT_EQ(STATE_STOPPED, GetBundleState()); | |
| 2300 } | |
| 2301 | |
| 2302 TEST_F(AppBundleStateStoppedUserTest, install) { | |
| 2303 EXPECT_EQ(GOOPDATE_E_CALL_UNEXPECTED, app_bundle_->install()); | |
| 2304 EXPECT_EQ(STATE_STOPPED, GetBundleState()); | |
| 2305 } | |
| 2306 | |
| 2307 TEST_F(AppBundleStateStoppedUserTest, updateAllApps) { | |
| 2308 EXPECT_EQ(GOOPDATE_E_CALL_UNEXPECTED, app_bundle_->updateAllApps()); | |
| 2309 EXPECT_EQ(STATE_STOPPED, GetBundleState()); | |
| 2310 } | |
| 2311 | |
| 2312 TEST_F(AppBundleStateStoppedUserTest, stop) { | |
| 2313 EXPECT_EQ(S_OK, app_bundle_->stop()); | |
| 2314 EXPECT_EQ(STATE_STOPPED, GetBundleState()); | |
| 2315 } | |
| 2316 | |
| 2317 TEST_F(AppBundleStateStoppedUserTest, pause) { | |
| 2318 EXPECT_EQ(GOOPDATE_E_CALL_UNEXPECTED, app_bundle_->pause()); | |
| 2319 EXPECT_EQ(STATE_STOPPED, GetBundleState()); | |
| 2320 } | |
| 2321 | |
| 2322 TEST_F(AppBundleStateStoppedUserTest, resume) { | |
| 2323 EXPECT_EQ(GOOPDATE_E_CALL_UNEXPECTED, app_bundle_->resume()); | |
| 2324 EXPECT_EQ(STATE_STOPPED, GetBundleState()); | |
| 2325 } | |
| 2326 | |
| 2327 TEST_F(AppBundleStateStoppedUserTest, isBusy) { | |
| 2328 VARIANT_BOOL is_busy = VARIANT_TRUE; | |
| 2329 EXPECT_SUCCEEDED(app_bundle_->isBusy(&is_busy)); | |
| 2330 EXPECT_EQ(VARIANT_FALSE, is_busy); | |
| 2331 EXPECT_EQ(STATE_STOPPED, GetBundleState()); | |
| 2332 } | |
| 2333 | |
| 2334 TEST_F(AppBundleStateStoppedUserTest, downloadPackage) { | |
| 2335 EXPECT_EQ(GOOPDATE_E_CALL_UNEXPECTED, | |
| 2336 app_bundle_->downloadPackage(CComBSTR(kGuid1), | |
| 2337 CComBSTR(_T("package")))); | |
| 2338 EXPECT_EQ(STATE_STOPPED, GetBundleState()); | |
| 2339 } | |
| 2340 | |
| 2341 TEST_F(AppBundleStateStoppedUserTest, get_currentState) { | |
| 2342 VARIANT current_state; | |
| 2343 ExpectAsserts expect_asserts; // Not yet implemented. | |
| 2344 EXPECT_EQ(E_NOTIMPL, app_bundle_->get_currentState(¤t_state)); | |
| 2345 EXPECT_EQ(STATE_STOPPED, GetBundleState()); | |
| 2346 } | |
| 2347 | |
| 2348 TEST_F(AppBundleStateStoppedUserTest, CompleteAsyncCall) { | |
| 2349 DummyUserWorkItem dummy_work_item; | |
| 2350 app_bundle_->set_user_work_item(&dummy_work_item); | |
| 2351 | |
| 2352 app_bundle_->CompleteAsyncCall(); | |
| 2353 | |
| 2354 EXPECT_EQ(STATE_STOPPED, GetBundleState()); | |
| 2355 } | |
| 2356 | |
| 2357 } // namespace omaha | |
| OLD | NEW |