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