Index: chrome/browser/chromeos/login/screenshot_tester.cc |
diff --git a/chrome/browser/chromeos/login/screenshot_tester.cc b/chrome/browser/chromeos/login/screenshot_tester.cc |
index 44602f56eb0be35dcf70549306a9189fa7bae9b0..683f987d6d0f82c460edeaf1d1ef6841bf16722d 100644 |
--- a/chrome/browser/chromeos/login/screenshot_tester.cc |
+++ b/chrome/browser/chromeos/login/screenshot_tester.cc |
@@ -8,7 +8,6 @@ |
#include "base/base_export.h" |
#include "base/bind_internal.h" |
#include "base/command_line.h" |
-#include "base/logging.h" |
#include "base/memory/weak_ptr.h" |
#include "base/prefs/pref_service.h" |
#include "base/run_loop.h" |
@@ -16,27 +15,13 @@ |
#include "chrome/common/pref_names.h" |
#include "chromeos/chromeos_switches.h" |
#include "content/public/browser/browser_thread.h" |
-#include "testing/gtest/include/gtest/gtest.h" |
-#include "third_party/skia/include/core/SkBitmap.h" |
-#include "third_party/skia/include/core/SkCanvas.h" |
#include "ui/compositor/compositor_switches.h" |
-#include "ui/gfx/codec/png_codec.h" |
#include "ui/gfx/image/image.h" |
#include "ui/snapshot/snapshot.h" |
-namespace { |
- |
-// Sets test mode for screenshot testing. |
-const char kTestMode[] = "test"; |
- |
-// Sets update mode for screenshot testing. |
-const char kUpdateMode[] = "update;" |
- |
-} // namespace |
- |
namespace chromeos { |
-ScreenshotTester::ScreenshotTester() : test_mode_(false), weak_factory_(this) { |
+ScreenshotTester::ScreenshotTester() : weak_factory_(this) { |
} |
ScreenshotTester::~ScreenshotTester() { |
@@ -44,7 +29,7 @@ |
bool ScreenshotTester::TryInitialize() { |
CommandLine& command_line = *CommandLine::ForCurrentProcess(); |
- if (!command_line.HasSwitch(switches::kEnableScreenshotTestingWithMode)) |
+ if (!command_line.HasSwitch(switches::kEnableScreenshotTesting)) |
return false; |
if (!command_line.HasSwitch(::switches::kEnablePixelOutputInTests) || |
!command_line.HasSwitch(::switches::kUIEnableImplSidePainting)) { |
@@ -55,172 +40,64 @@ |
<< "screenshots"; |
return false; |
} |
- |
- std::string mode = command_line.GetSwitchValueASCII( |
- switches::kEnableScreenshotTestingWithMode); |
- if (mode != kUpdateMode && mode != kTestMode) { |
- CHECK(false) << "Invalid mode for screenshot testing: " << mode; |
+ if (!command_line.HasSwitch(switches::kScreenshotDestinationDir)) { |
+ LOG(ERROR) << "No destination for screenshots specified"; |
+ return false; |
} |
- |
- if (!command_line.HasSwitch(chromeos::switches::kGoldenScreenshotsDir)) { |
- CHECK(false) << "No directory for golden screenshots specified"; |
- } |
- |
- golden_screenshots_dir_ = |
- command_line.GetSwitchValuePath(switches::kGoldenScreenshotsDir); |
- |
- if (mode == kTestMode) { |
- test_mode_ = true; |
- if (!command_line.HasSwitch(switches::kArtifactsDir)) { |
- artifacts_dir_ = golden_screenshots_dir_; |
- LOG(WARNING) |
- << "No directory for artifact storing specified. Artifacts will be" |
- << "saved at golden screenshots directory."; |
- } else { |
- artifacts_dir_ = command_line.GetSwitchValuePath(switches::kArtifactsDir); |
- } |
- } |
+ screenshot_dest_ = command_line.GetSwitchValuePath( |
+ chromeos::switches::kScreenshotDestinationDir); |
return true; |
} |
-void ScreenshotTester::Run(const std::string& test_name) { |
- test_name_ = test_name; |
- PNGFile current_screenshot = TakeScreenshot(); |
- if (test_mode_) { |
- PNGFile golden_screenshot = LoadGoldenScreenshot(); |
- VLOG(0) << "Loaded golden screenshot"; |
- CompareScreenshots(golden_screenshot, current_screenshot); |
- } else { |
- UpdateGoldenScreenshot(current_screenshot); |
- } |
+void ScreenshotTester::Run(const std::string& file_name) { |
+ TakeScreenshot(); |
+ PNGFile current_screenshot = screenshot_; |
+ UpdateGoldenScreenshot(file_name, current_screenshot); |
} |
-void ScreenshotTester::UpdateGoldenScreenshot(PNGFile png_data) { |
- CHECK(SaveImage("golden_screenshot", golden_screenshots_dir_, png_data)); |
+void ScreenshotTester::UpdateGoldenScreenshot(const std::string& file_name, |
+ PNGFile png_data) { |
+ DCHECK_CURRENTLY_ON(content::BrowserThread::UI); |
+ if (!png_data) { |
+ LOG(ERROR) << "Can't take a screenshot"; |
+ return; |
+ } |
+ base::FilePath golden_screenshot_path = |
+ screenshot_dest_.AppendASCII(file_name + ".png"); |
+ if (!base::CreateDirectory(golden_screenshot_path.DirName())) { |
+ LOG(ERROR) << "Can't create a directory "; |
+ return; |
+ } |
+ if (static_cast<size_t>( |
+ base::WriteFile(golden_screenshot_path, |
+ reinterpret_cast<char*>(&(png_data->data()[0])), |
+ png_data->size())) != png_data->size()) { |
+ LOG(ERROR) << "Can't save screenshot"; |
+ } |
+ VLOG(0) << "Golden screenshot updated successfully"; |
} |
-bool ScreenshotTester::SaveImage(const std::string& file_name, |
- const base::FilePath& screenshot_dir, |
- PNGFile png_data) { |
+void ScreenshotTester::ReturnScreenshot(PNGFile png_data) { |
+ // TODO(elizavetai): rewrite this function so that TakeScreenshot |
+ // could return a |PNGFile| -- current screenshot. |
DCHECK_CURRENTLY_ON(content::BrowserThread::UI); |
- base::FilePath screenshot_path = |
- screenshot_dir.AppendASCII(test_name_ + "_" + file_name + ".png"); |
- if (!png_data) { |
- LOG(ERROR) << "Can't take a screenshot"; |
- return false; |
- } |
- if (!base::CreateDirectory(screenshot_path.DirName())) { |
- LOG(ERROR) << "Can't create a directory " |
- << screenshot_path.DirName().value(); |
- return false; |
- } |
- if (static_cast<size_t>( |
- base::WriteFile(screenshot_path, |
- reinterpret_cast<char*>(&(png_data->data()[0])), |
- png_data->size())) != png_data->size()) { |
- LOG(ERROR) << "Can't save screenshot " << file_name; |
- return false; |
- } |
- VLOG(0) << "Screenshot " << file_name << ".png saved successfully to " |
- << screenshot_dir.value(); |
- return true; |
-} |
- |
-void ScreenshotTester::ReturnScreenshot(const PNGFile& screenshot, |
- PNGFile png_data) { |
- DCHECK_CURRENTLY_ON(content::BrowserThread::UI); |
- screenshot->data() = png_data->data(); |
+ screenshot_ = png_data; |
content::BrowserThread::PostTask( |
content::BrowserThread::UI, FROM_HERE, run_loop_quitter_); |
} |
-ScreenshotTester::PNGFile ScreenshotTester::TakeScreenshot() { |
- DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); |
+void ScreenshotTester::TakeScreenshot() { |
+ DCHECK_CURRENTLY_ON(content::BrowserThread::UI); |
aura::Window* primary_window = ash::Shell::GetPrimaryRootWindow(); |
gfx::Rect rect = primary_window->bounds(); |
- PNGFile screenshot = new base::RefCountedBytes; |
ui::GrabWindowSnapshotAsync(primary_window, |
rect, |
content::BrowserThread::GetBlockingPool(), |
base::Bind(&ScreenshotTester::ReturnScreenshot, |
- weak_factory_.GetWeakPtr(), |
- screenshot)); |
+ weak_factory_.GetWeakPtr())); |
base::RunLoop run_loop; |
run_loop_quitter_ = run_loop.QuitClosure(); |
run_loop.Run(); |
- return screenshot; |
-} |
- |
-ScreenshotTester::PNGFile ScreenshotTester::LoadGoldenScreenshot() { |
- DCHECK_CURRENTLY_ON(content::BrowserThread::UI); |
- |
- base::FilePath screenshot_path = golden_screenshots_dir_.AppendASCII( |
- test_name_ + "_golden_screenshot.png"); |
- if (!base::PathExists(screenshot_path)) { |
- CHECK(false) << "Can't find a golden screenshot for this test"; |
- } |
- |
- size_t golden_screenshot_size; |
- base::GetFileSize(screenshot_path, |
- reinterpret_cast<int64*>(&golden_screenshot_size)); |
- |
- if (golden_screenshot_size == -1) { |
- CHECK(false) << "Can't get golden screenshot size"; |
- } |
- PNGFile png_data = new base::RefCountedBytes; |
- png_data->data().resize(golden_screenshot_size); |
- base::ReadFile(screenshot_path, |
- reinterpret_cast<char*>(&(png_data->data()[0])), |
- golden_screenshot_size); |
- |
- return png_data; |
-} |
- |
-void ScreenshotTester::CompareScreenshots(PNGFile model, PNGFile sample) { |
- DCHECK_CURRENTLY_ON(content::BrowserThread::UI); |
- |
- ASSERT_TRUE(model.get()); |
- ASSERT_TRUE(sample.get()); |
- |
- SkBitmap model_bitmap; |
- SkBitmap sample_bitmap; |
- gfx::PNGCodec::Decode(reinterpret_cast<unsigned char*>(&(model->data()[0])), |
- model->data().size(), |
- &model_bitmap); |
- gfx::PNGCodec::Decode(reinterpret_cast<unsigned char*>(&(sample->data()[0])), |
- sample->data().size(), |
- &sample_bitmap); |
- |
- ASSERT_EQ(model_bitmap.config(), sample_bitmap.config()); |
- ASSERT_EQ(model_bitmap.width(), sample_bitmap.width()); |
- ASSERT_EQ(model_bitmap.height(), sample_bitmap.height()); |
- |
- bool screenshots_match = true; |
- |
- SkCanvas diff_canvas(sample_bitmap); |
- for (int i = 0; i < model_bitmap.width(); i++) |
- for (int j = 0; j < model_bitmap.height(); j++) { |
- if (model_bitmap.getColor(i, j) == sample_bitmap.getColor(i, j)) { |
- diff_canvas.drawPoint(i, j, SK_ColorWHITE); |
- } else { |
- screenshots_match = false; |
- diff_canvas.drawPoint(i, j, SK_ColorRED); |
- } |
- } |
- |
- if (!screenshots_match) { |
- CHECK(SaveImage("failed_screenshot", artifacts_dir_, sample)); |
- gfx::PNGCodec::EncodeBGRASkBitmap(sample_bitmap, false, &sample->data()); |
- CHECK(SaveImage("difference", artifacts_dir_, sample)); |
- LOG(ERROR) |
- << "Screenshots testing failed. Screenshots differ in some pixels"; |
- VLOG(0) << "Current screenshot and diff picture saved to " |
- << artifacts_dir_.value(); |
- } else { |
- VLOG(0) << "Current screenshot matches the golden screenshot. Screenshot " |
- "testing passed."; |
- } |
- ASSERT_TRUE(screenshots_match); |
} |
} // namespace chromeos |