Upstream version 11.39.266.0
[platform/framework/web/crosswalk.git] / src / chrome / browser / chromeos / login / screenshot_tester.h
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
18 namespace chromeos {
19
20 // A class that allows taking, saving and comparing screnshots while
21 // running tests.
22 class 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_