| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "remoting/host/resizing_host_observer.h" | 5 #include "remoting/host/resizing_host_observer.h" |
| 6 | 6 |
| 7 #include <list> | 7 #include <list> |
| 8 #include <utility> | 8 #include <utility> |
| 9 | 9 |
| 10 #include "base/compiler_specific.h" | 10 #include "base/compiler_specific.h" |
| 11 #include "base/logging.h" | 11 #include "base/logging.h" |
| 12 #include "base/macros.h" | 12 #include "base/macros.h" |
| 13 #include "base/memory/ptr_util.h" |
| 13 #include "base/memory/ref_counted.h" | 14 #include "base/memory/ref_counted.h" |
| 14 #include "base/message_loop/message_loop.h" | 15 #include "base/message_loop/message_loop.h" |
| 15 #include "base/run_loop.h" | 16 #include "base/run_loop.h" |
| 16 #include "remoting/host/desktop_resizer.h" | 17 #include "remoting/host/desktop_resizer.h" |
| 17 #include "remoting/host/screen_resolution.h" | 18 #include "remoting/host/screen_resolution.h" |
| 18 #include "testing/gtest/include/gtest/gtest.h" | 19 #include "testing/gtest/include/gtest/gtest.h" |
| 19 #include "third_party/webrtc/modules/desktop_capture/desktop_geometry.h" | 20 #include "third_party/webrtc/modules/desktop_capture/desktop_geometry.h" |
| 20 | 21 |
| 21 namespace remoting { | 22 namespace remoting { |
| 22 | 23 |
| (...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 99 now_(base::Time::Now()) { | 100 now_(base::Time::Now()) { |
| 100 } | 101 } |
| 101 | 102 |
| 102 // This needs to be public because the derived test-case class needs to | 103 // This needs to be public because the derived test-case class needs to |
| 103 // pass it to Bind, which fails if it's protected. | 104 // pass it to Bind, which fails if it's protected. |
| 104 base::Time GetTime() { | 105 base::Time GetTime() { |
| 105 return now_; | 106 return now_; |
| 106 } | 107 } |
| 107 | 108 |
| 108 protected: | 109 protected: |
| 109 void SetDesktopResizer(scoped_ptr<FakeDesktopResizer> desktop_resizer) { | 110 void SetDesktopResizer(std::unique_ptr<FakeDesktopResizer> desktop_resizer) { |
| 110 CHECK(!desktop_resizer_) << "Call SetDeskopResizer once per test"; | 111 CHECK(!desktop_resizer_) << "Call SetDeskopResizer once per test"; |
| 111 desktop_resizer_ = desktop_resizer.get(); | 112 desktop_resizer_ = desktop_resizer.get(); |
| 112 | 113 |
| 113 resizing_host_observer_.reset( | 114 resizing_host_observer_.reset( |
| 114 new ResizingHostObserver(std::move(desktop_resizer))); | 115 new ResizingHostObserver(std::move(desktop_resizer))); |
| 115 resizing_host_observer_->SetNowFunctionForTesting( | 116 resizing_host_observer_->SetNowFunctionForTesting( |
| 116 base::Bind(&ResizingHostObserverTest::GetTimeAndIncrement, | 117 base::Bind(&ResizingHostObserverTest::GetTimeAndIncrement, |
| 117 base::Unretained(this))); | 118 base::Unretained(this))); |
| 118 } | 119 } |
| 119 | 120 |
| (...skipping 11 matching lines...) Expand all Loading... |
| 131 << "Input resolution = " << client_sizes[i]; | 132 << "Input resolution = " << client_sizes[i]; |
| 132 } | 133 } |
| 133 } | 134 } |
| 134 | 135 |
| 135 base::Time GetTimeAndIncrement() { | 136 base::Time GetTimeAndIncrement() { |
| 136 base::Time result = now_; | 137 base::Time result = now_; |
| 137 now_ += base::TimeDelta::FromSeconds(1); | 138 now_ += base::TimeDelta::FromSeconds(1); |
| 138 return result; | 139 return result; |
| 139 } | 140 } |
| 140 | 141 |
| 141 scoped_ptr<ResizingHostObserver> resizing_host_observer_; | 142 std::unique_ptr<ResizingHostObserver> resizing_host_observer_; |
| 142 FakeDesktopResizer* desktop_resizer_; | 143 FakeDesktopResizer* desktop_resizer_; |
| 143 base::Time now_; | 144 base::Time now_; |
| 144 }; | 145 }; |
| 145 | 146 |
| 146 // Check that the resolution isn't restored if it wasn't changed by this class. | 147 // Check that the resolution isn't restored if it wasn't changed by this class. |
| 147 TEST_F(ResizingHostObserverTest, NoRestoreResolution) { | 148 TEST_F(ResizingHostObserverTest, NoRestoreResolution) { |
| 148 int restore_resolution_call_count = 0; | 149 int restore_resolution_call_count = 0; |
| 149 ScreenResolution initial = MakeResolution(640, 480); | 150 ScreenResolution initial = MakeResolution(640, 480); |
| 150 scoped_ptr<FakeDesktopResizer> desktop_resizer( | 151 std::unique_ptr<FakeDesktopResizer> desktop_resizer(new FakeDesktopResizer( |
| 151 new FakeDesktopResizer(initial, false, nullptr, 0, | 152 initial, false, nullptr, 0, &restore_resolution_call_count)); |
| 152 &restore_resolution_call_count)); | |
| 153 SetDesktopResizer(std::move(desktop_resizer)); | 153 SetDesktopResizer(std::move(desktop_resizer)); |
| 154 VerifySizes(nullptr, nullptr, 0); | 154 VerifySizes(nullptr, nullptr, 0); |
| 155 resizing_host_observer_.reset(); | 155 resizing_host_observer_.reset(); |
| 156 EXPECT_EQ(0, restore_resolution_call_count); | 156 EXPECT_EQ(0, restore_resolution_call_count); |
| 157 } | 157 } |
| 158 | 158 |
| 159 // Check that the host is not resized if GetSupportedSizes returns an empty | 159 // Check that the host is not resized if GetSupportedSizes returns an empty |
| 160 // list (even if GetCurrentSize is supported). | 160 // list (even if GetCurrentSize is supported). |
| 161 TEST_F(ResizingHostObserverTest, EmptyGetSupportedSizes) { | 161 TEST_F(ResizingHostObserverTest, EmptyGetSupportedSizes) { |
| 162 int restore_resolution_call_count = 0; | 162 int restore_resolution_call_count = 0; |
| 163 ScreenResolution initial = MakeResolution(640, 480); | 163 ScreenResolution initial = MakeResolution(640, 480); |
| 164 scoped_ptr<FakeDesktopResizer> desktop_resizer( | 164 std::unique_ptr<FakeDesktopResizer> desktop_resizer(new FakeDesktopResizer( |
| 165 new FakeDesktopResizer(initial, false, nullptr, 0, | 165 initial, false, nullptr, 0, &restore_resolution_call_count)); |
| 166 &restore_resolution_call_count)); | |
| 167 SetDesktopResizer(std::move(desktop_resizer)); | 166 SetDesktopResizer(std::move(desktop_resizer)); |
| 168 | 167 |
| 169 ScreenResolution client_sizes[] = { MakeResolution(200, 100), | 168 ScreenResolution client_sizes[] = { MakeResolution(200, 100), |
| 170 MakeResolution(100, 200) }; | 169 MakeResolution(100, 200) }; |
| 171 ScreenResolution expected_sizes[] = { initial, initial }; | 170 ScreenResolution expected_sizes[] = { initial, initial }; |
| 172 VerifySizes(client_sizes, expected_sizes, arraysize(client_sizes)); | 171 VerifySizes(client_sizes, expected_sizes, arraysize(client_sizes)); |
| 173 | 172 |
| 174 resizing_host_observer_.reset(); | 173 resizing_host_observer_.reset(); |
| 175 EXPECT_EQ(0, restore_resolution_call_count); | 174 EXPECT_EQ(0, restore_resolution_call_count); |
| 176 } | 175 } |
| 177 | 176 |
| 178 // Check that if the implementation supports exact size matching, it is used. | 177 // Check that if the implementation supports exact size matching, it is used. |
| 179 TEST_F(ResizingHostObserverTest, SelectExactSize) { | 178 TEST_F(ResizingHostObserverTest, SelectExactSize) { |
| 180 int restore_resolution_call_count = 0; | 179 int restore_resolution_call_count = 0; |
| 181 scoped_ptr<FakeDesktopResizer> desktop_resizer( | 180 std::unique_ptr<FakeDesktopResizer> desktop_resizer( |
| 182 new FakeDesktopResizer(MakeResolution(640, 480), true, nullptr, 0, | 181 new FakeDesktopResizer(MakeResolution(640, 480), true, nullptr, 0, |
| 183 &restore_resolution_call_count)); | 182 &restore_resolution_call_count)); |
| 184 SetDesktopResizer(std::move(desktop_resizer)); | 183 SetDesktopResizer(std::move(desktop_resizer)); |
| 185 | 184 |
| 186 ScreenResolution client_sizes[] = { MakeResolution(200, 100), | 185 ScreenResolution client_sizes[] = { MakeResolution(200, 100), |
| 187 MakeResolution(100, 200), | 186 MakeResolution(100, 200), |
| 188 MakeResolution(640, 480), | 187 MakeResolution(640, 480), |
| 189 MakeResolution(480, 640), | 188 MakeResolution(480, 640), |
| 190 MakeResolution(1280, 1024) }; | 189 MakeResolution(1280, 1024) }; |
| 191 VerifySizes(client_sizes, client_sizes, arraysize(client_sizes)); | 190 VerifySizes(client_sizes, client_sizes, arraysize(client_sizes)); |
| 192 resizing_host_observer_.reset(); | 191 resizing_host_observer_.reset(); |
| 193 EXPECT_EQ(1, restore_resolution_call_count); | 192 EXPECT_EQ(1, restore_resolution_call_count); |
| 194 } | 193 } |
| 195 | 194 |
| 196 // Check that if the implementation supports a size that is no larger than | 195 // Check that if the implementation supports a size that is no larger than |
| 197 // the requested size, then the largest such size is used. | 196 // the requested size, then the largest such size is used. |
| 198 TEST_F(ResizingHostObserverTest, SelectBestSmallerSize) { | 197 TEST_F(ResizingHostObserverTest, SelectBestSmallerSize) { |
| 199 ScreenResolution supported_sizes[] = { MakeResolution(639, 479), | 198 ScreenResolution supported_sizes[] = { MakeResolution(639, 479), |
| 200 MakeResolution(640, 480) }; | 199 MakeResolution(640, 480) }; |
| 201 scoped_ptr<FakeDesktopResizer> desktop_resizer( | 200 std::unique_ptr<FakeDesktopResizer> desktop_resizer( |
| 202 new FakeDesktopResizer(MakeResolution(640, 480), false, | 201 new FakeDesktopResizer(MakeResolution(640, 480), false, supported_sizes, |
| 203 supported_sizes, arraysize(supported_sizes), | 202 arraysize(supported_sizes), nullptr)); |
| 204 nullptr)); | |
| 205 SetDesktopResizer(std::move(desktop_resizer)); | 203 SetDesktopResizer(std::move(desktop_resizer)); |
| 206 | 204 |
| 207 ScreenResolution client_sizes[] = { MakeResolution(639, 479), | 205 ScreenResolution client_sizes[] = { MakeResolution(639, 479), |
| 208 MakeResolution(640, 480), | 206 MakeResolution(640, 480), |
| 209 MakeResolution(641, 481), | 207 MakeResolution(641, 481), |
| 210 MakeResolution(999, 999) }; | 208 MakeResolution(999, 999) }; |
| 211 ScreenResolution expected_sizes[] = { supported_sizes[0], supported_sizes[1], | 209 ScreenResolution expected_sizes[] = { supported_sizes[0], supported_sizes[1], |
| 212 supported_sizes[1], supported_sizes[1] }; | 210 supported_sizes[1], supported_sizes[1] }; |
| 213 VerifySizes(client_sizes, expected_sizes, arraysize(client_sizes)); | 211 VerifySizes(client_sizes, expected_sizes, arraysize(client_sizes)); |
| 214 } | 212 } |
| 215 | 213 |
| 216 // Check that if the implementation supports only sizes that are larger than | 214 // Check that if the implementation supports only sizes that are larger than |
| 217 // the requested size, then the one that requires the least down-scaling. | 215 // the requested size, then the one that requires the least down-scaling. |
| 218 TEST_F(ResizingHostObserverTest, SelectBestScaleFactor) { | 216 TEST_F(ResizingHostObserverTest, SelectBestScaleFactor) { |
| 219 ScreenResolution supported_sizes[] = { MakeResolution(100, 100), | 217 ScreenResolution supported_sizes[] = { MakeResolution(100, 100), |
| 220 MakeResolution(200, 100) }; | 218 MakeResolution(200, 100) }; |
| 221 scoped_ptr<FakeDesktopResizer> desktop_resizer( | 219 std::unique_ptr<FakeDesktopResizer> desktop_resizer( |
| 222 new FakeDesktopResizer(MakeResolution(200, 100), false, | 220 new FakeDesktopResizer(MakeResolution(200, 100), false, supported_sizes, |
| 223 supported_sizes, arraysize(supported_sizes), | 221 arraysize(supported_sizes), nullptr)); |
| 224 nullptr)); | |
| 225 SetDesktopResizer(std::move(desktop_resizer)); | 222 SetDesktopResizer(std::move(desktop_resizer)); |
| 226 | 223 |
| 227 ScreenResolution client_sizes[] = { MakeResolution(1, 1), | 224 ScreenResolution client_sizes[] = { MakeResolution(1, 1), |
| 228 MakeResolution(99, 99), | 225 MakeResolution(99, 99), |
| 229 MakeResolution(199, 99) }; | 226 MakeResolution(199, 99) }; |
| 230 ScreenResolution expected_sizes[] = { supported_sizes[0], supported_sizes[0], | 227 ScreenResolution expected_sizes[] = { supported_sizes[0], supported_sizes[0], |
| 231 supported_sizes[1] }; | 228 supported_sizes[1] }; |
| 232 VerifySizes(client_sizes, expected_sizes, arraysize(client_sizes)); | 229 VerifySizes(client_sizes, expected_sizes, arraysize(client_sizes)); |
| 233 } | 230 } |
| 234 | 231 |
| 235 // Check that if the implementation supports two sizes that have the same | 232 // Check that if the implementation supports two sizes that have the same |
| 236 // resultant scale factor, then the widest one is selected. | 233 // resultant scale factor, then the widest one is selected. |
| 237 TEST_F(ResizingHostObserverTest, SelectWidest) { | 234 TEST_F(ResizingHostObserverTest, SelectWidest) { |
| 238 ScreenResolution supported_sizes[] = { MakeResolution(640, 480), | 235 ScreenResolution supported_sizes[] = { MakeResolution(640, 480), |
| 239 MakeResolution(480, 640) }; | 236 MakeResolution(480, 640) }; |
| 240 scoped_ptr<FakeDesktopResizer> desktop_resizer( | 237 std::unique_ptr<FakeDesktopResizer> desktop_resizer( |
| 241 new FakeDesktopResizer(MakeResolution(480, 640), false, | 238 new FakeDesktopResizer(MakeResolution(480, 640), false, supported_sizes, |
| 242 supported_sizes, arraysize(supported_sizes), | 239 arraysize(supported_sizes), nullptr)); |
| 243 nullptr)); | |
| 244 SetDesktopResizer(std::move(desktop_resizer)); | 240 SetDesktopResizer(std::move(desktop_resizer)); |
| 245 | 241 |
| 246 ScreenResolution client_sizes[] = { MakeResolution(100, 100), | 242 ScreenResolution client_sizes[] = { MakeResolution(100, 100), |
| 247 MakeResolution(480, 480), | 243 MakeResolution(480, 480), |
| 248 MakeResolution(500, 500), | 244 MakeResolution(500, 500), |
| 249 MakeResolution(640, 640), | 245 MakeResolution(640, 640), |
| 250 MakeResolution(1000, 1000) }; | 246 MakeResolution(1000, 1000) }; |
| 251 ScreenResolution expected_sizes[] = { supported_sizes[0], supported_sizes[0], | 247 ScreenResolution expected_sizes[] = { supported_sizes[0], supported_sizes[0], |
| 252 supported_sizes[0], supported_sizes[0], | 248 supported_sizes[0], supported_sizes[0], |
| 253 supported_sizes[0] }; | 249 supported_sizes[0] }; |
| 254 VerifySizes(client_sizes, expected_sizes, arraysize(client_sizes)); | 250 VerifySizes(client_sizes, expected_sizes, arraysize(client_sizes)); |
| 255 } | 251 } |
| 256 | 252 |
| 257 // Check that if the best match for the client size doesn't change, then we | 253 // Check that if the best match for the client size doesn't change, then we |
| 258 // don't call SetSize. | 254 // don't call SetSize. |
| 259 TEST_F(ResizingHostObserverTest, NoSetSizeForSameSize) { | 255 TEST_F(ResizingHostObserverTest, NoSetSizeForSameSize) { |
| 260 ScreenResolution supported_sizes[] = { MakeResolution(640, 480), | 256 ScreenResolution supported_sizes[] = { MakeResolution(640, 480), |
| 261 MakeResolution(480, 640) }; | 257 MakeResolution(480, 640) }; |
| 262 SetDesktopResizer(make_scoped_ptr(new FakeDesktopResizer( | 258 SetDesktopResizer(base::WrapUnique( |
| 263 MakeResolution(480, 640), false, | 259 new FakeDesktopResizer(MakeResolution(480, 640), false, supported_sizes, |
| 264 supported_sizes, arraysize(supported_sizes), nullptr))); | 260 arraysize(supported_sizes), nullptr))); |
| 265 | 261 |
| 266 ScreenResolution client_sizes[] = { MakeResolution(640, 640), | 262 ScreenResolution client_sizes[] = { MakeResolution(640, 640), |
| 267 MakeResolution(1024, 768), | 263 MakeResolution(1024, 768), |
| 268 MakeResolution(640, 480) }; | 264 MakeResolution(640, 480) }; |
| 269 ScreenResolution expected_sizes[] = { MakeResolution(640, 480), | 265 ScreenResolution expected_sizes[] = { MakeResolution(640, 480), |
| 270 MakeResolution(640, 480), | 266 MakeResolution(640, 480), |
| 271 MakeResolution(640, 480) }; | 267 MakeResolution(640, 480) }; |
| 272 VerifySizes(client_sizes, expected_sizes, arraysize(client_sizes)); | 268 VerifySizes(client_sizes, expected_sizes, arraysize(client_sizes)); |
| 273 EXPECT_EQ(desktop_resizer_->set_resolution_call_count(), 1); | 269 EXPECT_EQ(desktop_resizer_->set_resolution_call_count(), 1); |
| 274 } | 270 } |
| 275 | 271 |
| 276 // Check that desktop resizes are rate-limited, and that if multiple resize | 272 // Check that desktop resizes are rate-limited, and that if multiple resize |
| 277 // requests are received in the time-out period, the most recent is respected. | 273 // requests are received in the time-out period, the most recent is respected. |
| 278 TEST_F(ResizingHostObserverTest, RateLimited) { | 274 TEST_F(ResizingHostObserverTest, RateLimited) { |
| 279 SetDesktopResizer(make_scoped_ptr(new FakeDesktopResizer( | 275 SetDesktopResizer(base::WrapUnique(new FakeDesktopResizer( |
| 280 MakeResolution(640, 480), true, nullptr, 0, nullptr))); | 276 MakeResolution(640, 480), true, nullptr, 0, nullptr))); |
| 281 resizing_host_observer_->SetNowFunctionForTesting( | 277 resizing_host_observer_->SetNowFunctionForTesting( |
| 282 base::Bind(&ResizingHostObserverTest::GetTime, base::Unretained(this))); | 278 base::Bind(&ResizingHostObserverTest::GetTime, base::Unretained(this))); |
| 283 | 279 |
| 284 base::MessageLoop message_loop; | 280 base::MessageLoop message_loop; |
| 285 base::RunLoop run_loop; | 281 base::RunLoop run_loop; |
| 286 | 282 |
| 287 EXPECT_EQ(GetBestResolution(MakeResolution(100, 100)), | 283 EXPECT_EQ(GetBestResolution(MakeResolution(100, 100)), |
| 288 MakeResolution(100, 100)); | 284 MakeResolution(100, 100)); |
| 289 now_ += base::TimeDelta::FromMilliseconds(900); | 285 now_ += base::TimeDelta::FromMilliseconds(900); |
| (...skipping 13 matching lines...) Expand all Loading... |
| 303 FROM_HERE, | 299 FROM_HERE, |
| 304 run_loop.QuitClosure(), | 300 run_loop.QuitClosure(), |
| 305 base::TimeDelta::FromMilliseconds(2)); | 301 base::TimeDelta::FromMilliseconds(2)); |
| 306 run_loop.Run(); | 302 run_loop.Run(); |
| 307 | 303 |
| 308 // If the QuitClosure fired before the final resize, it's a test failure. | 304 // If the QuitClosure fired before the final resize, it's a test failure. |
| 309 EXPECT_EQ(desktop_resizer_->GetCurrentResolution(), MakeResolution(300, 300)); | 305 EXPECT_EQ(desktop_resizer_->GetCurrentResolution(), MakeResolution(300, 300)); |
| 310 } | 306 } |
| 311 | 307 |
| 312 } // namespace remoting | 308 } // namespace remoting |
| OLD | NEW |