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