Home | History | Annotate | Download | only in ash
      1 // Copyright 2013 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #include "chrome/browser/ui/ash/screenshot_taker.h"
      6 
      7 #include "ash/shell.h"
      8 #include "ash/test/ash_test_base.h"
      9 #include "base/bind.h"
     10 #include "base/command_line.h"
     11 #include "base/files/file_util.h"
     12 #include "base/files/scoped_temp_dir.h"
     13 #include "base/message_loop/message_loop.h"
     14 #include "chrome/browser/browser_process.h"
     15 #include "chrome/browser/notifications/notification_ui_manager.h"
     16 #include "chrome/test/base/in_process_browser_test.h"
     17 #include "chrome/test/base/testing_browser_process.h"
     18 #include "chrome/test/base/testing_profile.h"
     19 #include "chrome/test/base/testing_profile_manager.h"
     20 #include "content/public/test/test_utils.h"
     21 #include "ui/aura/window_event_dispatcher.h"
     22 
     23 #if defined(OS_CHROMEOS)
     24 #include "chromeos/login/login_state.h"
     25 #endif
     26 
     27 namespace ash {
     28 namespace test {
     29 
     30 class ScreenshotTakerTest : public AshTestBase,
     31                             public ScreenshotTakerObserver {
     32  public:
     33   ScreenshotTakerTest()
     34       : running_(false),
     35         screenshot_complete_(false),
     36         screenshot_result_(ScreenshotTakerObserver::SCREENSHOT_SUCCESS) {
     37   }
     38 
     39   virtual void SetUp() {
     40     AshTestBase::SetUp();
     41   }
     42 
     43   virtual void TearDown() {
     44     RunAllPendingInMessageLoop();
     45     AshTestBase::TearDown();
     46   }
     47 
     48   // Overridden from ScreenshotTakerObserver
     49   virtual void OnScreenshotCompleted(
     50       ScreenshotTakerObserver::Result screenshot_result,
     51       const base::FilePath& screenshot_path) OVERRIDE {
     52     screenshot_complete_ = true;
     53     screenshot_result_ = screenshot_result;
     54     screenshot_path_ = screenshot_path;
     55     if (!running_)
     56       return;
     57     message_loop_runner_->Quit();
     58     running_ = false;
     59   }
     60 
     61  protected:
     62   // ScreenshotTakerTest is a friend of ScreenshotTaker and therefore
     63   // allowed to set the directory, basename and profile.
     64   void SetScreenshotDirectoryForTest(
     65       ScreenshotTaker* screenshot_taker,
     66       const base::FilePath& screenshot_directory) {
     67     screenshot_taker->SetScreenshotDirectoryForTest(screenshot_directory);
     68   }
     69   void SetScreenshotBasenameForTest(
     70       ScreenshotTaker* screenshot_taker,
     71       const std::string& screenshot_basename) {
     72     screenshot_taker->SetScreenshotBasenameForTest(screenshot_basename);
     73   }
     74   void SetScreenshotProfileForTest(
     75       ScreenshotTaker* screenshot_taker,
     76       Profile* profile) {
     77     screenshot_taker->SetScreenshotProfileForTest(profile);
     78   }
     79 
     80   void Wait() {
     81     if (screenshot_complete_)
     82       return;
     83     running_ = true;
     84     message_loop_runner_ = new content::MessageLoopRunner;
     85     message_loop_runner_->Run();
     86     EXPECT_TRUE(screenshot_complete_);
     87   }
     88 
     89   bool running_;
     90   bool screenshot_complete_;
     91   ScreenshotTakerObserver::Result screenshot_result_;
     92   base::FilePath screenshot_path_;
     93   scoped_refptr<content::MessageLoopRunner> message_loop_runner_;
     94 
     95  private:
     96   DISALLOW_COPY_AND_ASSIGN(ScreenshotTakerTest);
     97 };
     98 
     99 TEST_F(ScreenshotTakerTest, TakeScreenshot) {
    100 #if defined(OS_CHROMEOS)
    101   // Note that within the test framework the LoginState object will always
    102   // claim that the user did log in.
    103   ASSERT_FALSE(chromeos::LoginState::IsInitialized());
    104   chromeos::LoginState::Initialize();
    105 #endif
    106   scoped_ptr<TestingProfileManager> profile_manager(
    107       new TestingProfileManager(TestingBrowserProcess::GetGlobal()));
    108   ASSERT_TRUE(profile_manager->SetUp());
    109   TestingProfile* profile =
    110       profile_manager->CreateTestingProfile("test_profile");
    111   ScreenshotTaker screenshot_taker;
    112   screenshot_taker.AddObserver(this);
    113   base::ScopedTempDir directory;
    114   ASSERT_TRUE(directory.CreateUniqueTempDir());
    115   SetScreenshotDirectoryForTest(&screenshot_taker, directory.path());
    116   SetScreenshotBasenameForTest(&screenshot_taker, "Screenshot");
    117   SetScreenshotProfileForTest(&screenshot_taker, profile);
    118 
    119   EXPECT_TRUE(screenshot_taker.CanTakeScreenshot());
    120 
    121   screenshot_taker.HandleTakePartialScreenshot(
    122       Shell::GetPrimaryRootWindow(), gfx::Rect(0, 0, 100, 100));
    123 
    124   EXPECT_FALSE(screenshot_taker.CanTakeScreenshot());
    125 
    126   Wait();
    127 
    128 #if defined(OS_CHROMEOS)
    129   // Screenshot notifications on Windows not yet turned on.
    130   EXPECT_TRUE(g_browser_process->notification_ui_manager()->FindById(
    131       std::string("screenshot")) != NULL);
    132   g_browser_process->notification_ui_manager()->CancelAll();
    133 #endif
    134 
    135   EXPECT_EQ(ScreenshotTakerObserver::SCREENSHOT_SUCCESS, screenshot_result_);
    136 
    137   if (ScreenshotTakerObserver::SCREENSHOT_SUCCESS == screenshot_result_)
    138     EXPECT_TRUE(base::PathExists(screenshot_path_));
    139 
    140 #if defined(OS_CHROMEOS)
    141   chromeos::LoginState::Shutdown();
    142 #endif
    143 }
    144 
    145 }  // namespace test
    146 }  // namespace ash
    147