resizing_host_observer_unittest.cc revision 23730a6e56a168d1879203e4b3819bb36e3d8f1f
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <list>
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/compiler_specific.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h"
9868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/memory/ref_counted.h"
109ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#include "base/message_loop/message_loop.h"
11868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/run_loop.h"
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "remoting/host/desktop_resizer.h"
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "remoting/host/resizing_host_observer.h"
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "remoting/host/screen_resolution.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
1690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "third_party/webrtc/modules/desktop_capture/desktop_geometry.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
180f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)namespace remoting {
190f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
200f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)std::ostream& operator<<(std::ostream& os, const ScreenResolution& resolution) {
210f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  return os << resolution.dimensions().width() << "x"
220f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)            << resolution.dimensions().height() << " @ "
230f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)            << resolution.dpi().x() << "x" << resolution.dpi().y();
240f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)}
250f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
260f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)bool operator==(const ScreenResolution& a, const ScreenResolution& b) {
270f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  return a.Equals(b);
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const int kDefaultDPI = 96;
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
320f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)ScreenResolution MakeResolution(int width, int height) {
330f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  return ScreenResolution(webrtc::DesktopSize(width, height),
340f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)                          webrtc::DesktopVector(kDefaultDPI, kDefaultDPI));
350f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)}
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class FakeDesktopResizer : public DesktopResizer {
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
390f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  FakeDesktopResizer(const ScreenResolution& initial_resolution,
400f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)                     bool exact_size_supported,
410f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)                     const ScreenResolution* supported_resolutions,
4223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)                     int num_supported_resolutions,
4323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)                     int* restore_resolution_call_count)
440f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      : initial_resolution_(initial_resolution),
450f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)        current_resolution_(initial_resolution),
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        exact_size_supported_(exact_size_supported),
4723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)        set_resolution_call_count_(0),
4823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)        restore_resolution_call_count_(restore_resolution_call_count) {
490f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    for (int i = 0; i < num_supported_resolutions; ++i) {
500f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      supported_resolutions_.push_back(supported_resolutions[i]);
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~FakeDesktopResizer() {
550f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    EXPECT_EQ(initial_resolution_, GetCurrentResolution());
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
580f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  int set_resolution_call_count() { return set_resolution_call_count_; }
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // remoting::DesktopResizer interface
610f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  virtual ScreenResolution GetCurrentResolution() OVERRIDE {
620f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    return current_resolution_;
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
640f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  virtual std::list<ScreenResolution> GetSupportedResolutions(
650f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      const ScreenResolution& preferred) OVERRIDE {
660f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    std::list<ScreenResolution> result = supported_resolutions_;
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (exact_size_supported_) {
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      result.push_back(preferred);
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return result;
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
720f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  virtual void SetResolution(const ScreenResolution& resolution) OVERRIDE {
730f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    current_resolution_ = resolution;
740f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    ++set_resolution_call_count_;
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
760f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  virtual void RestoreResolution(const ScreenResolution& resolution) OVERRIDE {
770f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    current_resolution_ = resolution;
7823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    if (restore_resolution_call_count_)
7923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)      ++(*restore_resolution_call_count_);
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
830f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  ScreenResolution initial_resolution_;
840f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  ScreenResolution current_resolution_;
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool exact_size_supported_;
860f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  std::list<ScreenResolution> supported_resolutions_;
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
880f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  int set_resolution_call_count_;
8923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  int* restore_resolution_call_count_;
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ResizingHostObserverTest : public testing::Test {
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
94868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  ResizingHostObserverTest()
95868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      : desktop_resizer_(NULL),
96868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        now_(base::Time::Now()) {
972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
99868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // This needs to be public because the derived test-case class needs to
100868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // pass it to Bind, which fails if it's protected.
101868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  base::Time GetTime() {
102868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    return now_;
103868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  }
104868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
105868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) protected:
1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void SetDesktopResizer(scoped_ptr<FakeDesktopResizer> desktop_resizer) {
1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    CHECK(!desktop_resizer_) << "Call SetDeskopResizer once per test";
1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    desktop_resizer_ = desktop_resizer.get();
1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    resizing_host_observer_.reset(
1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        new ResizingHostObserver(desktop_resizer.PassAs<DesktopResizer>()));
112868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    resizing_host_observer_->SetNowFunctionForTesting(
113868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        base::Bind(&ResizingHostObserverTest::GetTimeAndIncrement,
114868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                   base::Unretained(this)));
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1170f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  ScreenResolution GetBestResolution(const ScreenResolution& client_size) {
1180f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    resizing_host_observer_->SetScreenResolution(client_size);
1190f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    return desktop_resizer_->GetCurrentResolution();
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1220f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  void VerifySizes(const ScreenResolution* client_sizes,
1230f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)                   const ScreenResolution* expected_sizes,
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   int number_of_sizes) {
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (int i = 0; i < number_of_sizes; ++i) {
1260f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      ScreenResolution best_size = GetBestResolution(client_sizes[i]);
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_EQ(expected_sizes[i], best_size)
1280f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)          << "Input resolution = " << client_sizes[i];
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
132868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  base::Time GetTimeAndIncrement() {
133868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    base::Time result = now_;
134868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    now_ += base::TimeDelta::FromSeconds(1);
135868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    return result;
136868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  }
137868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<ResizingHostObserver> resizing_host_observer_;
1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FakeDesktopResizer* desktop_resizer_;
140868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  base::Time now_;
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)// Check that the resolution isn't restored if it wasn't changed by this class.
14423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)TEST_F(ResizingHostObserverTest, NoRestoreResolution) {
14523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  int restore_resolution_call_count = 0;
14623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  ScreenResolution initial = MakeResolution(640, 480);
14723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  scoped_ptr<FakeDesktopResizer> desktop_resizer(
14823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)      new FakeDesktopResizer(initial, false, NULL, 0,
14923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)                             &restore_resolution_call_count));
15023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  SetDesktopResizer(desktop_resizer.Pass());
15123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  VerifySizes(NULL, NULL, 0);
15223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  resizing_host_observer_.reset();
15323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  EXPECT_EQ(0, restore_resolution_call_count);
15423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)}
15523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Check that the host is not resized if GetSupportedSizes returns an empty
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// list (even if GetCurrentSize is supported).
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ResizingHostObserverTest, EmptyGetSupportedSizes) {
15923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  int restore_resolution_call_count = 0;
1600f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  ScreenResolution initial = MakeResolution(640, 480);
1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<FakeDesktopResizer> desktop_resizer(
16223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)      new FakeDesktopResizer(initial, false, NULL, 0,
16323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)                             &restore_resolution_call_count));
1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetDesktopResizer(desktop_resizer.Pass());
1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1660f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  ScreenResolution client_sizes[] = { MakeResolution(200, 100),
1670f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)                                      MakeResolution(100, 200) };
1680f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  ScreenResolution expected_sizes[] = { initial, initial };
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VerifySizes(client_sizes, expected_sizes, arraysize(client_sizes));
17023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
17123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  resizing_host_observer_.reset();
17223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  EXPECT_EQ(0, restore_resolution_call_count);
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Check that if the implementation supports exact size matching, it is used.
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ResizingHostObserverTest, SelectExactSize) {
17723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  int restore_resolution_call_count = 0;
1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<FakeDesktopResizer> desktop_resizer(
17923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)        new FakeDesktopResizer(MakeResolution(640, 480), true, NULL, 0,
18023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)                               &restore_resolution_call_count));
1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetDesktopResizer(desktop_resizer.Pass());
1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1830f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  ScreenResolution client_sizes[] = { MakeResolution(200, 100),
1840f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)                                      MakeResolution(100, 200),
1850f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)                                      MakeResolution(640, 480),
1860f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)                                      MakeResolution(480, 640),
1870f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)                                      MakeResolution(1280, 1024) };
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VerifySizes(client_sizes, client_sizes, arraysize(client_sizes));
18923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  resizing_host_observer_.reset();
19023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  EXPECT_EQ(1, restore_resolution_call_count);
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Check that if the implementation supports a size that is no larger than
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the requested size, then the largest such size is used.
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ResizingHostObserverTest, SelectBestSmallerSize) {
1960f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  ScreenResolution supported_sizes[] = { MakeResolution(639, 479),
1970f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)                                         MakeResolution(640, 480) };
1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<FakeDesktopResizer> desktop_resizer(
1990f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      new FakeDesktopResizer(MakeResolution(640, 480), false,
20023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)                             supported_sizes, arraysize(supported_sizes),
20123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)                             NULL));
2022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetDesktopResizer(desktop_resizer.Pass());
2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2040f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  ScreenResolution client_sizes[] = { MakeResolution(639, 479),
2050f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)                                      MakeResolution(640, 480),
2060f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)                                      MakeResolution(641, 481),
2070f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)                                      MakeResolution(999, 999) };
2080f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  ScreenResolution expected_sizes[] = { supported_sizes[0], supported_sizes[1],
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               supported_sizes[1], supported_sizes[1] };
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VerifySizes(client_sizes, expected_sizes, arraysize(client_sizes));
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Check that if the implementation supports only sizes that are larger than
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the requested size, then the one that requires the least down-scaling.
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ResizingHostObserverTest, SelectBestScaleFactor) {
2160f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  ScreenResolution supported_sizes[] = { MakeResolution(100, 100),
2170f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)                                         MakeResolution(200, 100) };
2182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<FakeDesktopResizer> desktop_resizer(
2190f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      new FakeDesktopResizer(MakeResolution(200, 100), false,
22023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)                             supported_sizes, arraysize(supported_sizes),
22123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)                             NULL));
2222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetDesktopResizer(desktop_resizer.Pass());
2232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2240f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  ScreenResolution client_sizes[] = { MakeResolution(1, 1),
2250f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)                                      MakeResolution(99, 99),
2260f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)                                      MakeResolution(199, 99) };
2270f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  ScreenResolution expected_sizes[] = { supported_sizes[0], supported_sizes[0],
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               supported_sizes[1] };
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VerifySizes(client_sizes, expected_sizes, arraysize(client_sizes));
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Check that if the implementation supports two sizes that have the same
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// resultant scale factor, then the widest one is selected.
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ResizingHostObserverTest, SelectWidest) {
2350f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  ScreenResolution supported_sizes[] = { MakeResolution(640, 480),
2360f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)                                         MakeResolution(480, 640) };
2372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<FakeDesktopResizer> desktop_resizer(
2380f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      new FakeDesktopResizer(MakeResolution(480, 640), false,
23923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)                             supported_sizes, arraysize(supported_sizes),
24023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)                             NULL));
2412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetDesktopResizer(desktop_resizer.Pass());
2422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2430f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  ScreenResolution client_sizes[] = { MakeResolution(100, 100),
2440f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)                                      MakeResolution(480, 480),
2450f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)                                      MakeResolution(500, 500),
2460f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)                                      MakeResolution(640, 640),
2470f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)                                      MakeResolution(1000, 1000) };
2480f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  ScreenResolution expected_sizes[] = { supported_sizes[0], supported_sizes[0],
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               supported_sizes[0], supported_sizes[0],
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               supported_sizes[0] };
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VerifySizes(client_sizes, expected_sizes, arraysize(client_sizes));
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Check that if the best match for the client size doesn't change, then we
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// don't call SetSize.
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ResizingHostObserverTest, NoSetSizeForSameSize) {
2570f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  ScreenResolution supported_sizes[] = { MakeResolution(640, 480),
2580f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)                                         MakeResolution(480, 640) };
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FakeDesktopResizer* desktop_resizer =
26023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)      new FakeDesktopResizer(MakeResolution(480, 640), false,
26123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)                             supported_sizes, arraysize(supported_sizes), NULL);
2622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetDesktopResizer(scoped_ptr<FakeDesktopResizer>(desktop_resizer));
2632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2640f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  ScreenResolution client_sizes[] = { MakeResolution(640, 640),
2650f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)                                      MakeResolution(1024, 768),
2660f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)                                      MakeResolution(640, 480) };
2670f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  ScreenResolution expected_sizes[] = { MakeResolution(640, 480),
2680f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)                                        MakeResolution(640, 480),
2690f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)                                        MakeResolution(640, 480) };
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VerifySizes(client_sizes, expected_sizes, arraysize(client_sizes));
27123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  EXPECT_EQ(desktop_resizer->set_resolution_call_count(), 1);
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
274868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Check that desktop resizes are rate-limited, and that if multiple resize
275868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// requests are received in the time-out period, the most recent is respected.
276868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)TEST_F(ResizingHostObserverTest, RateLimited) {
277868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  FakeDesktopResizer* desktop_resizer =
27823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)      new FakeDesktopResizer(MakeResolution(640, 480), true, NULL, 0, NULL);
279868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  SetDesktopResizer(scoped_ptr<FakeDesktopResizer>(desktop_resizer));
280868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  resizing_host_observer_->SetNowFunctionForTesting(
281868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      base::Bind(&ResizingHostObserverTest::GetTime, base::Unretained(this)));
282868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
283868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  base::MessageLoop message_loop;
284868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  base::RunLoop run_loop;
285868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
2860f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  EXPECT_EQ(GetBestResolution(MakeResolution(100, 100)),
2870f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)            MakeResolution(100, 100));
288868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  now_ += base::TimeDelta::FromMilliseconds(900);
2890f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  EXPECT_EQ(GetBestResolution(MakeResolution(200, 200)),
2900f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)            MakeResolution(100, 100));
291868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  now_ += base::TimeDelta::FromMilliseconds(99);
2920f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  EXPECT_EQ(GetBestResolution(MakeResolution(300, 300)),
2930f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)            MakeResolution(100, 100));
294868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  now_ += base::TimeDelta::FromMilliseconds(1);
295868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
296868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Due to the kMinimumResizeIntervalMs constant in resizing_host_observer.cc,
297868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // We need to wait a total of 1000ms for the final resize to be processed.
298868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Since it was queued 900 + 99 ms after the first, we need to wait an
299868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // additional 1ms. However, since RunLoop is not guaranteed to process tasks
300868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // with the same due time in FIFO order, wait an additional 1ms for safety.
301868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  message_loop.PostDelayedTask(
302868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      FROM_HERE,
303868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      run_loop.QuitClosure(),
304868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      base::TimeDelta::FromMilliseconds(2));
305868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  run_loop.Run();
306868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
307868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // If the QuitClosure fired before the final resize, it's a test failure.
3080f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  EXPECT_EQ(desktop_resizer_->GetCurrentResolution(), MakeResolution(300, 300));
309868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
310868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace remoting
312