1// Copyright 2014 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#ifndef CHROME_BROWSER_CHROMEOS_LOGIN_SCREENSHOT_TESTER_H_
6#define CHROME_BROWSER_CHROMEOS_LOGIN_SCREENSHOT_TESTER_H_
7
8#include <string>
9
10#include "base/base_export.h"
11#include "base/bind_internal.h"
12#include "base/files/file_path.h"
13#include "base/macros.h"
14#include "base/memory/ref_counted_memory.h"
15#include "base/memory/weak_ptr.h"
16#include "base/run_loop.h"
17
18namespace chromeos {
19
20// A class that allows taking, saving and comparing screnshots while
21// running tests.
22class ScreenshotTester {
23 public:
24  ScreenshotTester();
25  virtual ~ScreenshotTester();
26
27  // Returns true if the screenshots should be taken and will be taken,
28  // false otherwise. Also gets all the information from the command line
29  // swithes.
30  bool TryInitialize();
31
32  // Does all the work that has been stated through switches:
33  // updates golden screenshot or takes a new screenshot and compares it
34  // with the golden one. |test_name| is the name of the test from which
35  // we run this method.
36  void Run(const std::string& test_name);
37
38 private:
39  typedef scoped_refptr<base::RefCountedBytes> PNGFile;
40
41  // Takes a screenshot and returns it.
42  PNGFile TakeScreenshot();
43
44  // Saves |png_data| as a new golden screenshot for test |test_name_|.
45  void UpdateGoldenScreenshot(PNGFile png_data);
46
47  // Saves an image |png_data|, assuming it is a .png file.
48  // Returns true if image was saved successfully.
49  bool SaveImage(const std::string& file_name,
50                 const base::FilePath& screenshot_dir,
51                 PNGFile png_data);
52
53  // Saves |png_data| as a current screenshot.
54  void ReturnScreenshot(const PNGFile& screenshot, PNGFile png_data);
55
56  // Loads golden screenshot from the disk. Fails if there is no
57  // golden screenshot for test |test_name_|.
58  PNGFile LoadGoldenScreenshot();
59
60  // Compares two given screenshots and saves |sample|
61  // and difference between |sample| and |model|, if they differ in any pixel.
62  void CompareScreenshots(PNGFile model, PNGFile sample);
63
64  // Name of the test from which Run() method has been called.
65  // Used for generating names for screenshot files.
66  std::string test_name_;
67
68  // Path to the directory for golden screenshots.
69  base::FilePath golden_screenshots_dir_;
70
71  // Path to the directory where screenshots that failed comparing
72  // and difference between them and golden ones will be stored.
73  base::FilePath artifacts_dir_;
74
75  // |run_loop_| and |run_loop_quitter_| are used to synchronize
76  // with ui::GrabWindowSnapshotAsync.
77  base::RunLoop run_loop_;
78  base::Closure run_loop_quitter_;
79
80  // Is true when we're in test mode:
81  // comparing golden screenshots and current ones.
82  bool test_mode_;
83
84  base::WeakPtrFactory<ScreenshotTester> weak_factory_;
85
86  DISALLOW_COPY_AND_ASSIGN(ScreenshotTester);
87};
88
89}  // namespace chromeos
90
91#endif  // CHROME_BROWSER_CHROMEOS_LOGIN_SCREENSHOT_TESTER_H_
92