diff options
author | mek@chromium.org <mek@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-08-31 17:16:56 +0000 |
---|---|---|
committer | mek@chromium.org <mek@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-08-31 17:16:56 +0000 |
commit | cb610dca62d8e84ba3a35ab3dbb4e7611d559ad8 (patch) | |
tree | eeaf2985e9060f8ef4eb7f16c9a96d475ef42495 /chrome/browser/extensions/shell_window_geometry_cache_unittest.cc | |
parent | 571138da3894c31f327f32439945d1724a7be1d3 (diff) | |
download | chromium_src-cb610dca62d8e84ba3a35ab3dbb4e7611d559ad8.zip chromium_src-cb610dca62d8e84ba3a35ab3dbb4e7611d559ad8.tar.gz chromium_src-cb610dca62d8e84ba3a35ab3dbb4e7611d559ad8.tar.bz2 |
First part of remembering platform app window geometry.
This adds the infastructure necesary to remember and restore window sizes and positions, but doesn't include the platform-specific bits to actually remember window geometry yet.
BUG=140658
Review URL: https://chromiumcodereview.appspot.com/10871086
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@154451 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser/extensions/shell_window_geometry_cache_unittest.cc')
-rw-r--r-- | chrome/browser/extensions/shell_window_geometry_cache_unittest.cc | 170 |
1 files changed, 170 insertions, 0 deletions
diff --git a/chrome/browser/extensions/shell_window_geometry_cache_unittest.cc b/chrome/browser/extensions/shell_window_geometry_cache_unittest.cc new file mode 100644 index 0000000..e59aca6 --- /dev/null +++ b/chrome/browser/extensions/shell_window_geometry_cache_unittest.cc @@ -0,0 +1,170 @@ +// Copyright (c) 2012 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "base/memory/scoped_ptr.h" +#include "chrome/browser/extensions/shell_window_geometry_cache.h" +#include "chrome/browser/extensions/state_store.h" +#include "chrome/browser/value_store/testing_value_store.h" +#include "chrome/test/base/testing_profile.h" +#include "content/public/test/test_browser_thread.h" +#include "content/public/test/test_utils.h" +#include "testing/gtest/include/gtest/gtest.h" + +namespace { + static const char kExtensionId[] = "extensionid"; + static const char kExtensionId2[] = "extensionid2"; + static const char kWindowId[] = "windowid"; + static const char kWindowId2[] = "windowid2"; + + const char kWindowGeometryKey[] = "window_geometry"; +} // namespace + +using content::BrowserThread; + +namespace extensions { + +// Base class for tests. +class ShellWindowGeometryCacheTest : public testing::Test { + public: + ShellWindowGeometryCacheTest() : + ui_thread_(BrowserThread::UI, &message_loop_), + file_thread_(BrowserThread::FILE, &message_loop_), + value_store_(new TestingValueStore()) { + + state_store_.reset(new StateStore(&profile_, value_store_)); + cache_.reset( + new ShellWindowGeometryCache(&profile_, state_store_.get())); + } + + void AddGeometryAndLoadExtension(const std::string& extension_id, + const std::string& window_id, + const gfx::Rect& bounds); + void LoadExtension(const std::string& extension_id); + void UnloadExtension(const std::string& extension_id); + + protected: + TestingProfile profile_; + MessageLoopForUI message_loop_; + content::TestBrowserThread ui_thread_; + content::TestBrowserThread file_thread_; + TestingValueStore* value_store_; + scoped_ptr<StateStore> state_store_; + scoped_ptr<ShellWindowGeometryCache> cache_; +}; + +void ShellWindowGeometryCacheTest::AddGeometryAndLoadExtension( + const std::string& extension_id, const std::string& window_id, + const gfx::Rect& bounds) { + scoped_ptr<base::DictionaryValue> dict(new base::DictionaryValue); + base::DictionaryValue* value = new base::DictionaryValue; + value->SetInteger("x", bounds.x()); + value->SetInteger("y", bounds.y()); + value->SetInteger("w", bounds.width()); + value->SetInteger("h", bounds.height()); + dict->SetWithoutPathExpansion(window_id, value); + state_store_->SetExtensionValue(extension_id, kWindowGeometryKey, + scoped_ptr<base::Value>(dict.release())); + + LoadExtension(extension_id); +} + +void ShellWindowGeometryCacheTest::LoadExtension( + const std::string& extension_id) { + cache_->OnExtensionLoaded(extension_id); + + // TODO(mek): not sure this is the best way to ensure that loading of data + // from the store has actually finished for the given extension id. + content::RunAllPendingInMessageLoop(); +} + +void ShellWindowGeometryCacheTest::UnloadExtension( + const std::string& extension_id) { + cache_->OnExtensionUnloaded(extension_id); + + // TODO(mek): not sure this is the best way to ensure that saving of data to + // the store has actually finished for the given extension id. + content::RunAllPendingInMessageLoop(); +} + +// Test getting geometry from an empty store. +TEST_F(ShellWindowGeometryCacheTest, GetGeometryEmptyStore) { + gfx::Rect bounds; + ASSERT_FALSE(cache_->GetGeometry(kExtensionId, kWindowId, &bounds)); +} + +// Test getting geometry for an unknown extension. +TEST_F(ShellWindowGeometryCacheTest, GetGeometryUnkownExtension) { + AddGeometryAndLoadExtension(kExtensionId, kWindowId, + gfx::Rect(4, 5, 31, 43)); + gfx::Rect bounds; + ASSERT_FALSE(cache_->GetGeometry(kExtensionId2, kWindowId, &bounds)); +} + +// Test getting geometry for an unknown window in a known extension. +TEST_F(ShellWindowGeometryCacheTest, GetGeometryUnkownWindow) { + AddGeometryAndLoadExtension(kExtensionId, kWindowId, + gfx::Rect(4, 5, 31, 43)); + gfx::Rect bounds; + ASSERT_FALSE(cache_->GetGeometry(kExtensionId, kWindowId2, &bounds)); +} + +// Test that loading geometry from the store works correctly. +TEST_F(ShellWindowGeometryCacheTest, GetGeometryFromStore) { + gfx::Rect bounds(4, 5, 31, 43); + AddGeometryAndLoadExtension(kExtensionId, kWindowId, bounds); + gfx::Rect newBounds; + ASSERT_TRUE(cache_->GetGeometry(kExtensionId, kWindowId, &newBounds)); + ASSERT_EQ(bounds, newBounds); +} + +// Test saving geometry to the cache and state store, and reading it back. +TEST_F(ShellWindowGeometryCacheTest, SaveGeometryToStore) { + const std::string extension_id(kExtensionId); + const std::string window_id(kWindowId); + + // inform cache of extension + LoadExtension(extension_id); + + // update geometry stored in cache + gfx::Rect bounds(4, 5, 31, 43); + gfx::Rect newBounds; + cache_->SaveGeometry(extension_id, window_id, bounds); + + // make sure that immediately reading back geometry works + ASSERT_TRUE(cache_->GetGeometry(extension_id, window_id, &newBounds)); + ASSERT_EQ(bounds, newBounds); + + // unload extension to force cache to save data to the state store + UnloadExtension(extension_id); + + // check if geometry got stored correctly in the state store + ValueStore::ReadResult result = value_store_->Get(extension_id + "." + + kWindowGeometryKey); + ASSERT_FALSE(result->HasError()); + DictionaryValue* dict; + ASSERT_TRUE(result->settings()->GetDictionaryWithoutPathExpansion( + extension_id + "." + kWindowGeometryKey, &dict)); + + ASSERT_TRUE(dict->HasKey(window_id)); + int v; + ASSERT_TRUE(dict->GetInteger(window_id + ".x", &v)); + ASSERT_EQ(bounds.x(), v); + ASSERT_TRUE(dict->GetInteger(window_id + ".y", &v)); + ASSERT_EQ(bounds.y(), v); + ASSERT_TRUE(dict->GetInteger(window_id + ".w", &v)); + ASSERT_EQ(bounds.width(), v); + ASSERT_TRUE(dict->GetInteger(window_id + ".h", &v)); + ASSERT_EQ(bounds.height(), v); + + // check to make sure cache indeed doesn't know about this extension anymore + ASSERT_FALSE(cache_->GetGeometry(extension_id, window_id, &newBounds)); + + // reload extension + LoadExtension(extension_id); + // and make sure the geometry got reloaded properly too + ASSERT_TRUE(cache_->GetGeometry(extension_id, window_id, &newBounds)); + ASSERT_EQ(bounds, newBounds); +} + +} // namespace extensions |