Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(187)

Unified Diff: chrome/browser/extensions/shell_window_geometry_cache_unittest.cc

Issue 10871086: First part of remembering platform app window geometry. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: fix mihai's comments Created 8 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/browser/extensions/shell_window_geometry_cache_unittest.cc
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 0000000000000000000000000000000000000000..e59aca6dc5198438cffd6b4551968d6723f49169
--- /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

Powered by Google App Engine
This is Rietveld 408576698