11320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Copyright 2014 The Chromium Authors. All rights reserved.
21320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Use of this source code is governed by a BSD-style license that can be
31320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// found in the LICENSE file.
41320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
51320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chrome/browser/chromeos/power/renderer_freezer.h"
61320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
71320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include <string>
81320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
91320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/message_loop/message_loop.h"
101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/run_loop.h"
111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chromeos/dbus/dbus_thread_manager.h"
121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chromeos/dbus/fake_power_manager_client.h"
131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "testing/gtest/include/gtest/gtest-death-test.h"
141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "testing/gtest/include/gtest/gtest.h"
151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccinamespace chromeos {
171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccinamespace {
191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Class that delegates used in testing can inherit from to record calls that
201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// are made by the code being tested.
211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciclass ActionRecorder {
221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci public:
231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ActionRecorder() {}
241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  virtual ~ActionRecorder() {}
251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Returns a comma-separated string describing the actions that were
271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // requested since the previous call to GetActions() (i.e. results are
281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // non-repeatable).
291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  std::string GetActions() {
301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    std::string actions = actions_;
311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    actions_.clear();
321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return actions;
331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci protected:
361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Appends |new_action| to |actions_|, using a comma as a separator if
371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // other actions are already listed.
381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  void AppendAction(const std::string& new_action) {
391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (!actions_.empty())
401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      actions_ += ",";
411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    actions_ += new_action;
421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci private:
451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Comma-separated list of actions that have been performed.
461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  std::string actions_;
471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  DISALLOW_COPY_AND_ASSIGN(ActionRecorder);
491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci};
501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Actions that can be returned by TestDelegate::GetActions().
521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciconst char kFreezeRenderers[] = "freeze_renderers";
531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciconst char kThawRenderers[] = "thaw_renderers";
541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciconst char kNoActions[] = "";
551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Test implementation of RendererFreezer::Delegate that records the actions it
571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// was asked to perform.
581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciclass TestDelegate : public RendererFreezer::Delegate, public ActionRecorder {
591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci public:
601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  TestDelegate()
611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      : can_freeze_renderers_(true),
621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        freeze_renderers_result_(true),
631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        thaw_renderers_result_(true) {}
641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  virtual ~TestDelegate() {}
661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // RendererFreezer::Delegate overrides.
681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  virtual bool FreezeRenderers() OVERRIDE {
691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    AppendAction(kFreezeRenderers);
701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return freeze_renderers_result_;
721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  virtual bool ThawRenderers() OVERRIDE {
741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    AppendAction(kThawRenderers);
751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return thaw_renderers_result_;
771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  virtual bool CanFreezeRenderers() OVERRIDE { return can_freeze_renderers_; }
791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  void set_freeze_renderers_result(bool result) {
811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    freeze_renderers_result_ = result;
821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  void set_thaw_renderers_result(bool result) {
851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    thaw_renderers_result_ = result;
861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Sets whether the delegate is capable of freezing renderers.  This also
891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // changes |freeze_renderers_result_| and |thaw_renderers_result_|.
901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  void set_can_freeze_renderers(bool can_freeze) {
911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    can_freeze_renderers_ = can_freeze;
921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    // If the delegate cannot freeze renderers, then the result of trying to do
941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    // so will be false.
951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    freeze_renderers_result_ = can_freeze;
961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    thaw_renderers_result_ = can_freeze;
971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci private:
1001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  bool can_freeze_renderers_;
1011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  bool freeze_renderers_result_;
1021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  bool thaw_renderers_result_;
1031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  DISALLOW_COPY_AND_ASSIGN(TestDelegate);
1051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci};
1061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}  // namespace
1081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciclass RendererFreezerTest : public testing::Test {
1101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci public:
1111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  RendererFreezerTest()
1121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      : power_manager_client_(new FakePowerManagerClient()),
1131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        test_delegate_(new TestDelegate()) {
1141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    DBusThreadManager::GetSetterForTesting()->SetPowerManagerClient(
1151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        scoped_ptr<PowerManagerClient>(power_manager_client_));
1161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
1171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  virtual ~RendererFreezerTest() {
1191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    renderer_freezer_.reset();
1201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    DBusThreadManager::Shutdown();
1221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
1231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  void Init() {
1251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    renderer_freezer_.reset(new RendererFreezer(
1261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        scoped_ptr<RendererFreezer::Delegate>(test_delegate_)));
1271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
1281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci protected:
1301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  FakePowerManagerClient* power_manager_client_;
1311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  TestDelegate* test_delegate_;
1321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  scoped_ptr<RendererFreezer> renderer_freezer_;
1341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci private:
1361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  base::MessageLoop message_loop_;
1371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  DISALLOW_COPY_AND_ASSIGN(RendererFreezerTest);
1381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci};
1391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Tests that the RendererFreezer freezes renderers on suspend and thaws them on
1411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// resume.
1421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST_F(RendererFreezerTest, SuspendResume) {
1431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  Init();
1441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  power_manager_client_->SendSuspendImminent();
1461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // The RendererFreezer should have grabbed an asynchronous callback and done
1481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // nothing else.
1491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(1, power_manager_client_->GetNumPendingSuspendReadinessCallbacks());
1501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(kNoActions, test_delegate_->GetActions());
1511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // The RendererFreezer should eventually freeze the renderers and run the
1531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // callback.
1541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  base::RunLoop().RunUntilIdle();
1551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(0, power_manager_client_->GetNumPendingSuspendReadinessCallbacks());
1561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(kFreezeRenderers, test_delegate_->GetActions());
1571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // The renderers should be thawed when we resume.
1591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  power_manager_client_->SendSuspendDone();
1601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(kThawRenderers, test_delegate_->GetActions());
1611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
1621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Tests that the RendereFreezer doesn't freeze renderers if the suspend attempt
1641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// was canceled before it had a chance to complete.
1651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST_F(RendererFreezerTest, SuspendCanceled) {
1661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  Init();
1671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // We shouldn't do anything yet.
1691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  power_manager_client_->SendSuspendImminent();
1701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(kNoActions, test_delegate_->GetActions());
1711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // If a suspend gets canceled for any reason, we should see a SuspendDone().
1731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  power_manager_client_->SendSuspendDone();
1741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // We shouldn't try to freeze the renderers now.
1761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  base::RunLoop().RunUntilIdle();
1771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(kNoActions, test_delegate_->GetActions());
1781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
1791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Tests that the renderer freezer does nothing if the delegate cannot freeze
1811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// renderers.
1821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST_F(RendererFreezerTest, DelegateCannotFreezeRenderers) {
1831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  test_delegate_->set_can_freeze_renderers(false);
1841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  Init();
1851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  power_manager_client_->SendSuspendImminent();
1871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // The RendererFreezer should not have grabbed a callback or done anything
1891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // else.
1901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(0, power_manager_client_->GetNumPendingSuspendReadinessCallbacks());
1911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(kNoActions, test_delegate_->GetActions());
1921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // There should be nothing in the message loop.
1941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  base::RunLoop().RunUntilIdle();
1951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(kNoActions, test_delegate_->GetActions());
1961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Nothing happens on resume.
1981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  power_manager_client_->SendSuspendDone();
1991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(kNoActions, test_delegate_->GetActions());
2001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
2011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Tests that the RendererFreezer does nothing on resume if the freezing
2031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// operation was unsuccessful.
2041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST_F(RendererFreezerTest, ErrorFreezingRenderers) {
2051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  Init();
2061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  test_delegate_->set_freeze_renderers_result(false);
2071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  power_manager_client_->SendSuspendImminent();
2091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(1, power_manager_client_->GetNumPendingSuspendReadinessCallbacks());
2101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // The freezing operation should fail, but we should still report readiness.
2121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  base::RunLoop().RunUntilIdle();
2131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(kFreezeRenderers, test_delegate_->GetActions());
2141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(0, power_manager_client_->GetNumPendingSuspendReadinessCallbacks());
2151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Since the delegate reported that the freezing was unsuccessful, don't do
2171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // anything on resume.
2181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  power_manager_client_->SendSuspendDone();
2191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(kNoActions, test_delegate_->GetActions());
2201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
2211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#if defined(GTEST_HAS_DEATH_TEST)
2231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Tests that the RendererFreezer crashes the browser if the freezing operation
2241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// was successful but the thawing operation failed.
2251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST_F(RendererFreezerTest, ErrorThawingRenderers) {
2261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  Init();
2271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  test_delegate_->set_thaw_renderers_result(false);
2281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  power_manager_client_->SendSuspendImminent();
2301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  base::RunLoop().RunUntilIdle();
2311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(kFreezeRenderers, test_delegate_->GetActions());
2321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_DEATH(power_manager_client_->SendSuspendDone(), "Unable to thaw");
2341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
2351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif  // GTEST_HAS_DEATH_TEST
2361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}  // namespace chromeos
238