Avi Drissman | d878a501 | 2022-09-12 19:13:30 | [diff] [blame] | 1 | // Copyright 2018 The Chromium Authors |
Sean Topping | b80d72cc | 2018-05-11 00:24:45 | [diff] [blame] | 2 | // Use of this source code is governed by a BSD-style license that can be |
| 3 | // found in the LICENSE file. |
| 4 | |
| 5 | #include "chromecast/browser/lru_renderer_cache.h" |
| 6 | |
| 7 | #include <memory> |
James West | 53c12a22 | 2018-05-12 01:00:58 | [diff] [blame] | 8 | #include <utility> |
Sean Topping | b80d72cc | 2018-05-11 00:24:45 | [diff] [blame] | 9 | |
| 10 | #include "base/memory/ptr_util.h" |
| 11 | #include "chromecast/browser/renderer_prelauncher.h" |
| 12 | #include "content/public/browser/site_instance.h" |
Gabriel Charette | c710874 | 2019-08-23 03:31:40 | [diff] [blame] | 13 | #include "content/public/test/browser_task_environment.h" |
Sean Topping | b80d72cc | 2018-05-11 00:24:45 | [diff] [blame] | 14 | #include "content/public/test/test_browser_context.h" |
Sean Topping | b80d72cc | 2018-05-11 00:24:45 | [diff] [blame] | 15 | #include "testing/gmock/include/gmock/gmock.h" |
| 16 | #include "testing/gtest/include/gtest/gtest.h" |
| 17 | #include "url/gurl.h" |
| 18 | |
Luke Halliwell | 4bebcd98 | 2018-08-17 05:32:59 | [diff] [blame] | 19 | #define EXPECT_CREATE_AND_PRELAUNCH(ptr, url) \ |
| 20 | ptr = new MockPrelauncher(&browser_context_, url); \ |
| 21 | EXPECT_CALL(*ptr, Prelaunch()); \ |
| 22 | EXPECT_CALL(factory_, Create(&browser_context_, url)) \ |
Sean Topping | b80d72cc | 2018-05-11 00:24:45 | [diff] [blame] | 23 | .WillOnce(Return(ByMove(std::unique_ptr<MockPrelauncher>(ptr)))); |
| 24 | |
| 25 | #define EXPECT_EVICTION(ptr) EXPECT_CALL(*ptr, Destroy()); |
| 26 | |
| 27 | using ::testing::_; |
| 28 | using ::testing::ByMove; |
| 29 | using ::testing::Expectation; |
| 30 | using ::testing::Mock; |
| 31 | using ::testing::Return; |
| 32 | using ::testing::StrictMock; |
| 33 | |
| 34 | namespace chromecast { |
| 35 | |
Sean Topping | b80d72cc | 2018-05-11 00:24:45 | [diff] [blame] | 36 | class MockPrelauncher : public RendererPrelauncher { |
| 37 | public: |
| 38 | MockPrelauncher(content::BrowserContext* browser_context, |
| 39 | const GURL& page_url) |
James West | 53c12a22 | 2018-05-12 01:00:58 | [diff] [blame] | 40 | : RendererPrelauncher(browser_context, |
James West | 53c12a22 | 2018-05-12 01:00:58 | [diff] [blame] | 41 | page_url) {} |
Arthur Eubanks | b34721e | 2022-08-24 17:47:20 | [diff] [blame] | 42 | ~MockPrelauncher() override { Destroy(); } |
Sean Topping | b80d72cc | 2018-05-11 00:24:45 | [diff] [blame] | 43 | |
| 44 | MOCK_METHOD0(Prelaunch, void()); |
| 45 | MOCK_METHOD0(Destroy, void()); |
| 46 | }; |
| 47 | |
| 48 | class MockFactory : public RendererPrelauncherFactory { |
| 49 | public: |
| 50 | MOCK_METHOD2(Create, |
| 51 | std::unique_ptr<RendererPrelauncher>( |
| 52 | content::BrowserContext* browser_context, |
| 53 | const GURL& page_url)); |
| 54 | }; |
| 55 | |
| 56 | class LRURendererCacheTest : public testing::Test { |
| 57 | protected: |
| 58 | void SetUp() override {} |
| 59 | |
| 60 | void SetFactory() { |
| 61 | DCHECK(lru_cache_); |
| 62 | lru_cache_->SetFactoryForTesting(&factory_); |
| 63 | } |
| 64 | |
Gabriel Charette | f893a28 | 2019-08-21 20:37:19 | [diff] [blame] | 65 | content::BrowserTaskEnvironment task_environment_; |
Sean Topping | b80d72cc | 2018-05-11 00:24:45 | [diff] [blame] | 66 | content::TestBrowserContext browser_context_; |
| 67 | MockFactory factory_; |
| 68 | std::unique_ptr<LRURendererCache> lru_cache_; |
| 69 | }; |
| 70 | |
| 71 | TEST_F(LRURendererCacheTest, SimpleTakeAndRelease) { |
Peter Kasting | 8bdc8281 | 2020-02-17 18:25:16 | [diff] [blame] | 72 | const GURL kUrl("https://www.one.com"); |
| 73 | |
Luke Halliwell | 4bebcd98 | 2018-08-17 05:32:59 | [diff] [blame] | 74 | lru_cache_ = std::make_unique<LRURendererCache>(&browser_context_, 1); |
Sean Topping | b80d72cc | 2018-05-11 00:24:45 | [diff] [blame] | 75 | SetFactory(); |
| 76 | MockPrelauncher* p1; |
| 77 | std::unique_ptr<RendererPrelauncher> taken; |
| 78 | |
| 79 | // Don't return a prelauncher the first time, since the cache is empty. |
| 80 | EXPECT_CALL(factory_, Create(_, _)).Times(0); |
Peter Kasting | 8bdc8281 | 2020-02-17 18:25:16 | [diff] [blame] | 81 | taken = lru_cache_->TakeRendererPrelauncher(kUrl); |
Sean Topping | b80d72cc | 2018-05-11 00:24:45 | [diff] [blame] | 82 | ASSERT_FALSE(taken); |
| 83 | // Cache: [] |
| 84 | // In-use: [ 1 ] |
| 85 | |
| 86 | // Releasing the prelauncher will cache it and prelaunch for later use. |
Peter Kasting | 8bdc8281 | 2020-02-17 18:25:16 | [diff] [blame] | 87 | EXPECT_CREATE_AND_PRELAUNCH(p1, kUrl); |
| 88 | lru_cache_->ReleaseRendererPrelauncher(kUrl); |
Gabriel Charette | f893a28 | 2019-08-21 20:37:19 | [diff] [blame] | 89 | task_environment_.RunUntilIdle(); |
Sean Topping | b80d72cc | 2018-05-11 00:24:45 | [diff] [blame] | 90 | // Cache: [ 1 ] |
| 91 | // In-use: [] |
| 92 | |
| 93 | // Get the cached prelauncher. |
Peter Kasting | 8bdc8281 | 2020-02-17 18:25:16 | [diff] [blame] | 94 | taken = lru_cache_->TakeRendererPrelauncher(kUrl); |
Sean Topping | b80d72cc | 2018-05-11 00:24:45 | [diff] [blame] | 95 | ASSERT_TRUE(taken); |
Peter Kasting | 8bdc8281 | 2020-02-17 18:25:16 | [diff] [blame] | 96 | ASSERT_TRUE(taken->IsForURL(kUrl)); |
Sean Topping | b80d72cc | 2018-05-11 00:24:45 | [diff] [blame] | 97 | // Cache: [ ] |
| 98 | // In-use: [ 1 ] |
| 99 | |
| 100 | // Return the prelauncher again, it should be cached the same as before. |
Peter Kasting | 8bdc8281 | 2020-02-17 18:25:16 | [diff] [blame] | 101 | EXPECT_CREATE_AND_PRELAUNCH(p1, kUrl); |
| 102 | lru_cache_->ReleaseRendererPrelauncher(kUrl); |
Gabriel Charette | f893a28 | 2019-08-21 20:37:19 | [diff] [blame] | 103 | task_environment_.RunUntilIdle(); |
Sean Topping | b80d72cc | 2018-05-11 00:24:45 | [diff] [blame] | 104 | // Cache: [ 1 ] |
| 105 | // In-use: [] |
| 106 | } |
| 107 | |
| 108 | TEST_F(LRURendererCacheTest, SimpleCacheEviction) { |
Peter Kasting | 8bdc8281 | 2020-02-17 18:25:16 | [diff] [blame] | 109 | const GURL kUrl("https://www.one.com"); |
| 110 | |
Luke Halliwell | 4bebcd98 | 2018-08-17 05:32:59 | [diff] [blame] | 111 | lru_cache_ = std::make_unique<LRURendererCache>(&browser_context_, 1); |
Sean Topping | b80d72cc | 2018-05-11 00:24:45 | [diff] [blame] | 112 | SetFactory(); |
| 113 | MockPrelauncher* p1; |
| 114 | std::unique_ptr<RendererPrelauncher> taken; |
| 115 | |
| 116 | // Fill the cache. |
| 117 | EXPECT_CALL(factory_, Create(_, _)).Times(0); |
Peter Kasting | 8bdc8281 | 2020-02-17 18:25:16 | [diff] [blame] | 118 | taken = lru_cache_->TakeRendererPrelauncher(kUrl); |
Sean Topping | b80d72cc | 2018-05-11 00:24:45 | [diff] [blame] | 119 | ASSERT_FALSE(taken); |
Peter Kasting | 8bdc8281 | 2020-02-17 18:25:16 | [diff] [blame] | 120 | EXPECT_CREATE_AND_PRELAUNCH(p1, kUrl); |
| 121 | lru_cache_->ReleaseRendererPrelauncher(kUrl); |
Gabriel Charette | f893a28 | 2019-08-21 20:37:19 | [diff] [blame] | 122 | task_environment_.RunUntilIdle(); |
Sean Topping | b80d72cc | 2018-05-11 00:24:45 | [diff] [blame] | 123 | // Cache: [ 1 ] |
| 124 | // In-use: [] |
| 125 | |
| 126 | // Taking a different prelauncher destroys the cached one. |
| 127 | EXPECT_CALL(factory_, Create(_, _)).Times(0); |
| 128 | EXPECT_EVICTION(p1); |
Peter Kasting | 8bdc8281 | 2020-02-17 18:25:16 | [diff] [blame] | 129 | taken = lru_cache_->TakeRendererPrelauncher(GURL("https://www.two.com")); |
Sean Topping | b80d72cc | 2018-05-11 00:24:45 | [diff] [blame] | 130 | ASSERT_FALSE(taken); |
| 131 | // Cache: [ ] |
| 132 | // In-use: [ 2 ] |
| 133 | } |
| 134 | |
| 135 | TEST_F(LRURendererCacheTest, CapacityOne) { |
Peter Kasting | 8bdc8281 | 2020-02-17 18:25:16 | [diff] [blame] | 136 | const GURL kUrl1("https://www.one.com"); |
| 137 | const GURL kUrl2("https://www.two.com"); |
| 138 | |
Luke Halliwell | 4bebcd98 | 2018-08-17 05:32:59 | [diff] [blame] | 139 | lru_cache_ = std::make_unique<LRURendererCache>(&browser_context_, 1); |
Sean Topping | b80d72cc | 2018-05-11 00:24:45 | [diff] [blame] | 140 | SetFactory(); |
| 141 | MockPrelauncher* p1; |
| 142 | MockPrelauncher* p2; |
| 143 | std::unique_ptr<RendererPrelauncher> taken; |
| 144 | |
| 145 | // Don't return a prelauncher the first time, since the cache is empty. |
| 146 | EXPECT_CALL(factory_, Create(_, _)).Times(0); |
Peter Kasting | 8bdc8281 | 2020-02-17 18:25:16 | [diff] [blame] | 147 | taken = lru_cache_->TakeRendererPrelauncher(kUrl1); |
Sean Topping | b80d72cc | 2018-05-11 00:24:45 | [diff] [blame] | 148 | ASSERT_FALSE(taken); |
| 149 | // Cache: [] |
| 150 | // In-use: [ 1 ] |
| 151 | |
| 152 | // Releasing the prelauncher will cache it and prelaunch for later use. |
Peter Kasting | 8bdc8281 | 2020-02-17 18:25:16 | [diff] [blame] | 153 | EXPECT_CREATE_AND_PRELAUNCH(p1, kUrl1); |
| 154 | lru_cache_->ReleaseRendererPrelauncher(kUrl1); |
Gabriel Charette | f893a28 | 2019-08-21 20:37:19 | [diff] [blame] | 155 | task_environment_.RunUntilIdle(); |
Sean Topping | b80d72cc | 2018-05-11 00:24:45 | [diff] [blame] | 156 | // Cache: [ 1 ] |
| 157 | // In-use: [] |
| 158 | |
| 159 | // Get the cached prelauncher. |
Peter Kasting | 8bdc8281 | 2020-02-17 18:25:16 | [diff] [blame] | 160 | taken = lru_cache_->TakeRendererPrelauncher(kUrl1); |
Sean Topping | b80d72cc | 2018-05-11 00:24:45 | [diff] [blame] | 161 | ASSERT_TRUE(taken); |
Peter Kasting | 8bdc8281 | 2020-02-17 18:25:16 | [diff] [blame] | 162 | ASSERT_TRUE(taken->IsForURL(kUrl1)); |
Sean Topping | b80d72cc | 2018-05-11 00:24:45 | [diff] [blame] | 163 | // Cache: [ ] |
| 164 | // In-use: [ 1 ] |
| 165 | |
| 166 | // Return the prelauncher again, it should be cached the same as before. |
Peter Kasting | 8bdc8281 | 2020-02-17 18:25:16 | [diff] [blame] | 167 | EXPECT_CREATE_AND_PRELAUNCH(p1, kUrl1); |
| 168 | lru_cache_->ReleaseRendererPrelauncher(kUrl1); |
Gabriel Charette | f893a28 | 2019-08-21 20:37:19 | [diff] [blame] | 169 | task_environment_.RunUntilIdle(); |
Sean Topping | b80d72cc | 2018-05-11 00:24:45 | [diff] [blame] | 170 | // Cache: [ 1 ] |
| 171 | // In-use: [] |
| 172 | |
| 173 | // Getting the prelauncher for a non-cached URL will return nullptr. The cache |
| 174 | // will evict 1 to stay below the renderer limit. |
| 175 | EXPECT_CALL(factory_, Create(_, _)).Times(0); |
| 176 | EXPECT_EVICTION(p1); |
Peter Kasting | 8bdc8281 | 2020-02-17 18:25:16 | [diff] [blame] | 177 | taken = lru_cache_->TakeRendererPrelauncher(kUrl2); |
Sean Topping | b80d72cc | 2018-05-11 00:24:45 | [diff] [blame] | 178 | ASSERT_FALSE(taken); |
| 179 | // Cache: [ ] |
| 180 | // In-use: [ 2 ] |
| 181 | |
| 182 | // Return prelauncher 2, it should be cached. |
Peter Kasting | 8bdc8281 | 2020-02-17 18:25:16 | [diff] [blame] | 183 | EXPECT_CREATE_AND_PRELAUNCH(p2, kUrl2); |
| 184 | lru_cache_->ReleaseRendererPrelauncher(kUrl2); |
Gabriel Charette | f893a28 | 2019-08-21 20:37:19 | [diff] [blame] | 185 | task_environment_.RunUntilIdle(); |
Sean Topping | b80d72cc | 2018-05-11 00:24:45 | [diff] [blame] | 186 | // Cache: [ 2 ] |
| 187 | // In-use: [ ] |
Peter Kasting | 8bdc8281 | 2020-02-17 18:25:16 | [diff] [blame] | 188 | taken = lru_cache_->TakeRendererPrelauncher(kUrl2); |
Sean Topping | b80d72cc | 2018-05-11 00:24:45 | [diff] [blame] | 189 | ASSERT_TRUE(taken); |
Peter Kasting | 8bdc8281 | 2020-02-17 18:25:16 | [diff] [blame] | 190 | ASSERT_TRUE(taken->IsForURL(kUrl2)); |
Sean Topping | b80d72cc | 2018-05-11 00:24:45 | [diff] [blame] | 191 | // Cache: [ ] |
| 192 | // In-use: [ 2 ] |
| 193 | |
| 194 | // Return prelauncher 2 once more, it will be cached. |
Peter Kasting | 8bdc8281 | 2020-02-17 18:25:16 | [diff] [blame] | 195 | EXPECT_CREATE_AND_PRELAUNCH(p2, kUrl2); |
| 196 | lru_cache_->ReleaseRendererPrelauncher(kUrl2); |
Gabriel Charette | f893a28 | 2019-08-21 20:37:19 | [diff] [blame] | 197 | task_environment_.RunUntilIdle(); |
Sean Topping | b80d72cc | 2018-05-11 00:24:45 | [diff] [blame] | 198 | // Cache: [ 2 ] |
| 199 | // In-use: [ ] |
| 200 | |
| 201 | // Prelauncher 1 was evicted when 2 was cached. Taking 1 will evict 2. |
| 202 | EXPECT_CALL(factory_, Create(_, _)).Times(0); |
| 203 | EXPECT_EVICTION(p2); |
Peter Kasting | 8bdc8281 | 2020-02-17 18:25:16 | [diff] [blame] | 204 | taken = lru_cache_->TakeRendererPrelauncher(kUrl1); |
Sean Topping | b80d72cc | 2018-05-11 00:24:45 | [diff] [blame] | 205 | ASSERT_FALSE(taken); |
| 206 | // Cache: [ ] |
| 207 | // In-use: [ 1 ] |
| 208 | |
| 209 | // Prelauncher 2 was evicted when 1 was taken. |
| 210 | EXPECT_CALL(factory_, Create(_, _)).Times(0); |
Peter Kasting | 8bdc8281 | 2020-02-17 18:25:16 | [diff] [blame] | 211 | taken = lru_cache_->TakeRendererPrelauncher(kUrl2); |
Sean Topping | b80d72cc | 2018-05-11 00:24:45 | [diff] [blame] | 212 | ASSERT_FALSE(taken); |
| 213 | // Cache: [ ] |
| 214 | // In-use: [ 1, 2 ] |
| 215 | |
| 216 | // Returning one of the two in-use pages to the cache won't actually cache it, |
| 217 | // since there's still exactly 1 renderer in-use. |
| 218 | EXPECT_CALL(factory_, Create(_, _)).Times(0); |
Peter Kasting | 8bdc8281 | 2020-02-17 18:25:16 | [diff] [blame] | 219 | lru_cache_->ReleaseRendererPrelauncher(kUrl2); |
Gabriel Charette | f893a28 | 2019-08-21 20:37:19 | [diff] [blame] | 220 | task_environment_.RunUntilIdle(); |
Sean Topping | b80d72cc | 2018-05-11 00:24:45 | [diff] [blame] | 221 | // Cache: [ ] |
| 222 | // In-use: [ 1 ] |
| 223 | } |
| 224 | |
| 225 | TEST_F(LRURendererCacheTest, CapacityTwo) { |
Peter Kasting | 8bdc8281 | 2020-02-17 18:25:16 | [diff] [blame] | 226 | const GURL kUrl1("https://www.one.com"); |
| 227 | const GURL kUrl2("https://www.two.com"); |
| 228 | const GURL kUrl3("https://www.three.com"); |
| 229 | |
Luke Halliwell | 4bebcd98 | 2018-08-17 05:32:59 | [diff] [blame] | 230 | lru_cache_ = std::make_unique<LRURendererCache>(&browser_context_, 2); |
Sean Topping | b80d72cc | 2018-05-11 00:24:45 | [diff] [blame] | 231 | SetFactory(); |
| 232 | MockPrelauncher* p1; |
| 233 | MockPrelauncher* p2; |
| 234 | std::unique_ptr<RendererPrelauncher> taken; |
| 235 | |
| 236 | // Take three renderers. |
| 237 | EXPECT_CALL(factory_, Create(_, _)).Times(0); |
Peter Kasting | 8bdc8281 | 2020-02-17 18:25:16 | [diff] [blame] | 238 | taken = lru_cache_->TakeRendererPrelauncher(kUrl1); |
Sean Topping | b80d72cc | 2018-05-11 00:24:45 | [diff] [blame] | 239 | ASSERT_FALSE(taken); |
| 240 | EXPECT_CALL(factory_, Create(_, _)).Times(0); |
Peter Kasting | 8bdc8281 | 2020-02-17 18:25:16 | [diff] [blame] | 241 | taken = lru_cache_->TakeRendererPrelauncher(kUrl2); |
Sean Topping | b80d72cc | 2018-05-11 00:24:45 | [diff] [blame] | 242 | ASSERT_FALSE(taken); |
| 243 | EXPECT_CALL(factory_, Create(_, _)).Times(0); |
Peter Kasting | 8bdc8281 | 2020-02-17 18:25:16 | [diff] [blame] | 244 | taken = lru_cache_->TakeRendererPrelauncher(kUrl3); |
Sean Topping | b80d72cc | 2018-05-11 00:24:45 | [diff] [blame] | 245 | ASSERT_FALSE(taken); |
| 246 | // Cache: [] |
| 247 | // In-use: [ 1, 2, 3 ] |
| 248 | |
| 249 | // Don't cache renderer 3 since there are still 2 in use. |
| 250 | EXPECT_CALL(factory_, Create(_, _)).Times(0); |
Peter Kasting | 8bdc8281 | 2020-02-17 18:25:16 | [diff] [blame] | 251 | lru_cache_->ReleaseRendererPrelauncher(kUrl3); |
Gabriel Charette | f893a28 | 2019-08-21 20:37:19 | [diff] [blame] | 252 | task_environment_.RunUntilIdle(); |
Sean Topping | b80d72cc | 2018-05-11 00:24:45 | [diff] [blame] | 253 | // In-use: [ 1, 2 ] |
| 254 | |
| 255 | // Fill the cache with remaining 2 renderers. |
Peter Kasting | 8bdc8281 | 2020-02-17 18:25:16 | [diff] [blame] | 256 | EXPECT_CREATE_AND_PRELAUNCH(p2, kUrl2); |
| 257 | lru_cache_->ReleaseRendererPrelauncher(kUrl2); |
Gabriel Charette | f893a28 | 2019-08-21 20:37:19 | [diff] [blame] | 258 | task_environment_.RunUntilIdle(); |
Peter Kasting | 8bdc8281 | 2020-02-17 18:25:16 | [diff] [blame] | 259 | EXPECT_CREATE_AND_PRELAUNCH(p1, kUrl1); |
| 260 | lru_cache_->ReleaseRendererPrelauncher(kUrl1); |
Gabriel Charette | f893a28 | 2019-08-21 20:37:19 | [diff] [blame] | 261 | task_environment_.RunUntilIdle(); |
Sean Topping | b80d72cc | 2018-05-11 00:24:45 | [diff] [blame] | 262 | // Cache: [ 1, 2 ] |
| 263 | // In-use: [ ] |
| 264 | |
| 265 | // Cache hit for renderer 1. |
Peter Kasting | 8bdc8281 | 2020-02-17 18:25:16 | [diff] [blame] | 266 | taken = lru_cache_->TakeRendererPrelauncher(kUrl1); |
Sean Topping | b80d72cc | 2018-05-11 00:24:45 | [diff] [blame] | 267 | ASSERT_TRUE(taken); |
Peter Kasting | 8bdc8281 | 2020-02-17 18:25:16 | [diff] [blame] | 268 | ASSERT_TRUE(taken->IsForURL(kUrl1)); |
Sean Topping | b80d72cc | 2018-05-11 00:24:45 | [diff] [blame] | 269 | // Cache: [ 2 ] |
| 270 | // In-use: [ 1 ] |
| 271 | |
| 272 | // Return renderer 1. |
Peter Kasting | 8bdc8281 | 2020-02-17 18:25:16 | [diff] [blame] | 273 | EXPECT_CREATE_AND_PRELAUNCH(p1, kUrl1); |
| 274 | lru_cache_->ReleaseRendererPrelauncher(kUrl1); |
Gabriel Charette | f893a28 | 2019-08-21 20:37:19 | [diff] [blame] | 275 | task_environment_.RunUntilIdle(); |
Sean Topping | b80d72cc | 2018-05-11 00:24:45 | [diff] [blame] | 276 | // Cache: [ 1, 2 ] |
| 277 | // In-use: [ ] |
| 278 | |
| 279 | // Evict the least-recently cached renderer (2). |
| 280 | EXPECT_CALL(factory_, Create(_, _)).Times(0); |
| 281 | EXPECT_EVICTION(p2); |
Peter Kasting | 8bdc8281 | 2020-02-17 18:25:16 | [diff] [blame] | 282 | taken = lru_cache_->TakeRendererPrelauncher(kUrl3); |
Sean Topping | b80d72cc | 2018-05-11 00:24:45 | [diff] [blame] | 283 | ASSERT_FALSE(taken); |
| 284 | // Cache: [ 1 ] |
| 285 | // In-use: [ 3 ] |
| 286 | |
| 287 | // Getting renderer 2 will fail since it's no long cached. This will evict |
| 288 | // renderer 1. |
| 289 | EXPECT_CALL(factory_, Create(_, _)).Times(0); |
| 290 | EXPECT_EVICTION(p1); |
Peter Kasting | 8bdc8281 | 2020-02-17 18:25:16 | [diff] [blame] | 291 | taken = lru_cache_->TakeRendererPrelauncher(kUrl2); |
Sean Topping | b80d72cc | 2018-05-11 00:24:45 | [diff] [blame] | 292 | ASSERT_FALSE(taken); |
| 293 | // Cache: [ ] |
| 294 | // In-use: [ 2, 3 ] |
| 295 | } |
| 296 | |
| 297 | } // namespace chromecast |