resizing_host_observer_unittest.cc revision 0f1bc08d4cfcc34181b0b5cbf065c40f687bf740
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,
420f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)                     int num_supported_resolutions)
430f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      : initial_resolution_(initial_resolution),
440f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)        current_resolution_(initial_resolution),
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        exact_size_supported_(exact_size_supported),
460f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)        set_resolution_call_count_(0) {
470f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    for (int i = 0; i < num_supported_resolutions; ++i) {
480f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      supported_resolutions_.push_back(supported_resolutions[i]);
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~FakeDesktopResizer() {
530f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    EXPECT_EQ(initial_resolution_, GetCurrentResolution());
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
560f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  int set_resolution_call_count() { return set_resolution_call_count_; }
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // remoting::DesktopResizer interface
590f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  virtual ScreenResolution GetCurrentResolution() OVERRIDE {
600f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    return current_resolution_;
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
620f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  virtual std::list<ScreenResolution> GetSupportedResolutions(
630f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      const ScreenResolution& preferred) OVERRIDE {
640f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    std::list<ScreenResolution> result = supported_resolutions_;
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (exact_size_supported_) {
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      result.push_back(preferred);
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return result;
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
700f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  virtual void SetResolution(const ScreenResolution& resolution) OVERRIDE {
710f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    current_resolution_ = resolution;
720f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    ++set_resolution_call_count_;
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
740f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  virtual void RestoreResolution(const ScreenResolution& resolution) OVERRIDE {
750f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    current_resolution_ = resolution;
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
790f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  ScreenResolution initial_resolution_;
800f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  ScreenResolution current_resolution_;
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool exact_size_supported_;
820f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  std::list<ScreenResolution> supported_resolutions_;
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
840f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  int set_resolution_call_count_;
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ResizingHostObserverTest : public testing::Test {
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
89868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  ResizingHostObserverTest()
90868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      : desktop_resizer_(NULL),
91868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        now_(base::Time::Now()) {
922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
94868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // This needs to be public because the derived test-case class needs to
95868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // pass it to Bind, which fails if it's protected.
96868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  base::Time GetTime() {
97868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    return now_;
98868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  }
99868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
100868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) protected:
1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void SetDesktopResizer(scoped_ptr<FakeDesktopResizer> desktop_resizer) {
1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    CHECK(!desktop_resizer_) << "Call SetDeskopResizer once per test";
1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    desktop_resizer_ = desktop_resizer.get();
1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    resizing_host_observer_.reset(
1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        new ResizingHostObserver(desktop_resizer.PassAs<DesktopResizer>()));
107868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    resizing_host_observer_->SetNowFunctionForTesting(
108868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        base::Bind(&ResizingHostObserverTest::GetTimeAndIncrement,
109868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                   base::Unretained(this)));
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1120f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  ScreenResolution GetBestResolution(const ScreenResolution& client_size) {
1130f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    resizing_host_observer_->SetScreenResolution(client_size);
1140f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    return desktop_resizer_->GetCurrentResolution();
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1170f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  void VerifySizes(const ScreenResolution* client_sizes,
1180f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)                   const ScreenResolution* expected_sizes,
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   int number_of_sizes) {
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (int i = 0; i < number_of_sizes; ++i) {
1210f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      ScreenResolution best_size = GetBestResolution(client_sizes[i]);
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_EQ(expected_sizes[i], best_size)
1230f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)          << "Input resolution = " << client_sizes[i];
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
127868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  base::Time GetTimeAndIncrement() {
128868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    base::Time result = now_;
129868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    now_ += base::TimeDelta::FromSeconds(1);
130868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    return result;
131868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  }
132868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<ResizingHostObserver> resizing_host_observer_;
1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FakeDesktopResizer* desktop_resizer_;
135868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  base::Time now_;
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Check that the host is not resized if GetSupportedSizes returns an empty
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// list (even if GetCurrentSize is supported).
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ResizingHostObserverTest, EmptyGetSupportedSizes) {
1410f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  ScreenResolution initial = MakeResolution(640, 480);
1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<FakeDesktopResizer> desktop_resizer(
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new FakeDesktopResizer(initial, false, NULL, 0));
1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetDesktopResizer(desktop_resizer.Pass());
1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1460f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  ScreenResolution client_sizes[] = { MakeResolution(200, 100),
1470f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)                                      MakeResolution(100, 200) };
1480f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  ScreenResolution expected_sizes[] = { initial, initial };
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VerifySizes(client_sizes, expected_sizes, arraysize(client_sizes));
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Check that if the implementation supports exact size matching, it is used.
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ResizingHostObserverTest, SelectExactSize) {
1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<FakeDesktopResizer> desktop_resizer(
1550f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      new FakeDesktopResizer(MakeResolution(640, 480), true, NULL, 0));
1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetDesktopResizer(desktop_resizer.Pass());
1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1580f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  ScreenResolution client_sizes[] = { MakeResolution(200, 100),
1590f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)                                      MakeResolution(100, 200),
1600f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)                                      MakeResolution(640, 480),
1610f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)                                      MakeResolution(480, 640),
1620f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)                                      MakeResolution(1280, 1024) };
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VerifySizes(client_sizes, client_sizes, arraysize(client_sizes));
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Check that if the implementation supports a size that is no larger than
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the requested size, then the largest such size is used.
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ResizingHostObserverTest, SelectBestSmallerSize) {
1690f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  ScreenResolution supported_sizes[] = { MakeResolution(639, 479),
1700f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)                                         MakeResolution(640, 480) };
1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<FakeDesktopResizer> desktop_resizer(
1720f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      new FakeDesktopResizer(MakeResolution(640, 480), false,
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             supported_sizes, arraysize(supported_sizes)));
1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetDesktopResizer(desktop_resizer.Pass());
1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1760f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  ScreenResolution client_sizes[] = { MakeResolution(639, 479),
1770f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)                                      MakeResolution(640, 480),
1780f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)                                      MakeResolution(641, 481),
1790f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)                                      MakeResolution(999, 999) };
1800f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  ScreenResolution expected_sizes[] = { supported_sizes[0], supported_sizes[1],
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               supported_sizes[1], supported_sizes[1] };
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VerifySizes(client_sizes, expected_sizes, arraysize(client_sizes));
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Check that if the implementation supports only sizes that are larger than
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the requested size, then the one that requires the least down-scaling.
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ResizingHostObserverTest, SelectBestScaleFactor) {
1880f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  ScreenResolution supported_sizes[] = { MakeResolution(100, 100),
1890f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)                                         MakeResolution(200, 100) };
1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<FakeDesktopResizer> desktop_resizer(
1910f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      new FakeDesktopResizer(MakeResolution(200, 100), false,
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             supported_sizes, arraysize(supported_sizes)));
1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetDesktopResizer(desktop_resizer.Pass());
1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1950f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  ScreenResolution client_sizes[] = { MakeResolution(1, 1),
1960f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)                                      MakeResolution(99, 99),
1970f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)                                      MakeResolution(199, 99) };
1980f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  ScreenResolution expected_sizes[] = { supported_sizes[0], supported_sizes[0],
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               supported_sizes[1] };
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VerifySizes(client_sizes, expected_sizes, arraysize(client_sizes));
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Check that if the implementation supports two sizes that have the same
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// resultant scale factor, then the widest one is selected.
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ResizingHostObserverTest, SelectWidest) {
2060f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  ScreenResolution supported_sizes[] = { MakeResolution(640, 480),
2070f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)                                         MakeResolution(480, 640) };
2082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<FakeDesktopResizer> desktop_resizer(
2090f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      new FakeDesktopResizer(MakeResolution(480, 640), false,
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             supported_sizes, arraysize(supported_sizes)));
2112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetDesktopResizer(desktop_resizer.Pass());
2122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2130f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  ScreenResolution client_sizes[] = { MakeResolution(100, 100),
2140f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)                                      MakeResolution(480, 480),
2150f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)                                      MakeResolution(500, 500),
2160f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)                                      MakeResolution(640, 640),
2170f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)                                      MakeResolution(1000, 1000) };
2180f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  ScreenResolution expected_sizes[] = { supported_sizes[0], supported_sizes[0],
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               supported_sizes[0], supported_sizes[0],
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               supported_sizes[0] };
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VerifySizes(client_sizes, expected_sizes, arraysize(client_sizes));
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Check that if the best match for the client size doesn't change, then we
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// don't call SetSize.
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ResizingHostObserverTest, NoSetSizeForSameSize) {
2270f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  ScreenResolution supported_sizes[] = { MakeResolution(640, 480),
2280f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)                                         MakeResolution(480, 640) };
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FakeDesktopResizer* desktop_resizer =
2300f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      new FakeDesktopResizer(MakeResolution(640, 480), false,
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             supported_sizes, arraysize(supported_sizes));
2322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetDesktopResizer(scoped_ptr<FakeDesktopResizer>(desktop_resizer));
2332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2340f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  ScreenResolution client_sizes[] = { MakeResolution(640, 640),
2350f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)                                      MakeResolution(1024, 768),
2360f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)                                      MakeResolution(640, 480) };
2370f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  ScreenResolution expected_sizes[] = { MakeResolution(640, 480),
2380f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)                                        MakeResolution(640, 480),
2390f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)                                        MakeResolution(640, 480) };
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VerifySizes(client_sizes, expected_sizes, arraysize(client_sizes));
2410f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  EXPECT_EQ(desktop_resizer->set_resolution_call_count(), 0);
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
244868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Check that desktop resizes are rate-limited, and that if multiple resize
245868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// requests are received in the time-out period, the most recent is respected.
246868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)TEST_F(ResizingHostObserverTest, RateLimited) {
247868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  FakeDesktopResizer* desktop_resizer =
2480f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      new FakeDesktopResizer(MakeResolution(640, 480), true, NULL, 0);
249868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  SetDesktopResizer(scoped_ptr<FakeDesktopResizer>(desktop_resizer));
250868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  resizing_host_observer_->SetNowFunctionForTesting(
251868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      base::Bind(&ResizingHostObserverTest::GetTime, base::Unretained(this)));
252868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
253868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  base::MessageLoop message_loop;
254868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  base::RunLoop run_loop;
255868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
2560f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  EXPECT_EQ(GetBestResolution(MakeResolution(100, 100)),
2570f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)            MakeResolution(100, 100));
258868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  now_ += base::TimeDelta::FromMilliseconds(900);
2590f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  EXPECT_EQ(GetBestResolution(MakeResolution(200, 200)),
2600f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)            MakeResolution(100, 100));
261868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  now_ += base::TimeDelta::FromMilliseconds(99);
2620f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  EXPECT_EQ(GetBestResolution(MakeResolution(300, 300)),
2630f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)            MakeResolution(100, 100));
264868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  now_ += base::TimeDelta::FromMilliseconds(1);
265868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
266868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Due to the kMinimumResizeIntervalMs constant in resizing_host_observer.cc,
267868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // We need to wait a total of 1000ms for the final resize to be processed.
268868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Since it was queued 900 + 99 ms after the first, we need to wait an
269868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // additional 1ms. However, since RunLoop is not guaranteed to process tasks
270868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // with the same due time in FIFO order, wait an additional 1ms for safety.
271868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  message_loop.PostDelayedTask(
272868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      FROM_HERE,
273868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      run_loop.QuitClosure(),
274868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      base::TimeDelta::FromMilliseconds(2));
275868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  run_loop.Run();
276868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
277868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // If the QuitClosure fired before the final resize, it's a test failure.
2780f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  EXPECT_EQ(desktop_resizer_->GetCurrentResolution(), MakeResolution(300, 300));
279868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
280868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace remoting
282