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

Unified Diff: extensions/browser/extension_api_frame_id_map_unittest.cc

Issue 1413543005: Use FrameTreeNode ID as frameId in extension APIs (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Add unit test for ExtensionApiFrameIdMap Created 5 years 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: extensions/browser/extension_api_frame_id_map_unittest.cc
diff --git a/extensions/browser/extension_api_frame_id_map_unittest.cc b/extensions/browser/extension_api_frame_id_map_unittest.cc
new file mode 100644
index 0000000000000000000000000000000000000000..c0cc559517f176b4a5e9cb109ecc899f93bb8c59
--- /dev/null
+++ b/extensions/browser/extension_api_frame_id_map_unittest.cc
@@ -0,0 +1,124 @@
+// Copyright 2015 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/bind.h"
+#include "base/run_loop.h"
+#include "content/public/test/test_browser_thread_bundle.h"
+#include "extensions/browser/extension_api_frame_id_map.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+using FrameIdCallback = extensions::ExtensionApiFrameIdMap::FrameIdCallback;
+
+namespace extensions {
+
+namespace {
+
+ExtensionApiFrameId ToTestFrameId(int render_process_id, int frame_routing_id) {
+ // Return a deterministic value (yet different from the input) for testing.
+ return ExtensionApiFrameId(render_process_id + 1, frame_routing_id + 1);
+}
+
+class TestExtensionApiFrameIdMap : public ExtensionApiFrameIdMap {
+ public:
+ int GetInternalSize() { return frame_id_map_.size(); }
+
+ private:
+ // ExtensionApiFrameIdMap:
+ ExtensionApiFrameId KeyToValue(const RenderFrameIdKey& key) const override {
+ return ToTestFrameId(key.render_process_id, key.frame_routing_id);
+ }
+};
+
+class ExtensionApiFrameIdMapTest : public testing::Test {
+ public:
+ ExtensionApiFrameIdMapTest()
+ : thread_bundle_(content::TestBrowserThreadBundle::IO_MAINLOOP) {}
+
+ FrameIdCallback CreateCallback(int render_process_id, int frame_routing_id) {
+ return base::Bind(&ExtensionApiFrameIdMapTest::OnCalledCallback,
+ base::Unretained(this), render_process_id,
+ frame_routing_id);
+ }
+
+ void OnCalledCallback(int render_process_id,
+ int frame_routing_id,
+ const ExtensionApiFrameId& extension_api_frame_id) {
+ // Save results for later, to see whether the ordering is OK.
+ results_.push_back(extension_api_frame_id);
+
+ // If this fails, then the mapping is completely wrong.
+ EXPECT_EQ(ToTestFrameId(render_process_id, frame_routing_id),
+ extension_api_frame_id);
+ }
+
+ const std::vector<ExtensionApiFrameId>& results() { return results_; }
+
+ private:
+ content::TestBrowserThreadBundle thread_bundle_;
+ std::vector<ExtensionApiFrameId> results_;
+
+ DISALLOW_COPY_AND_ASSIGN(ExtensionApiFrameIdMapTest);
+};
+
+} // namespace
+
+// Tests whether getting data from the map gives consistent results.
+TEST_F(ExtensionApiFrameIdMapTest, Basics) {
+ scoped_ptr<TestExtensionApiFrameIdMap> map(new TestExtensionApiFrameIdMap());
+ EXPECT_EQ(0, map->GetInternalSize());
+
+ EXPECT_EQ(ToTestFrameId(1, 2), map->GetFrameId(1, 2));
+ EXPECT_EQ(1, map->GetInternalSize());
+
+ EXPECT_EQ(ToTestFrameId(1, 2), map->GetFrameId(1, 2));
+ EXPECT_EQ(1, map->GetInternalSize());
+
+ EXPECT_EQ(ToTestFrameId(2, 1), map->GetFrameId(2, 1));
+ EXPECT_EQ(2, map->GetInternalSize());
+}
+
+TEST_F(ExtensionApiFrameIdMapTest, GetFrameIdOnIO) {
+ scoped_ptr<TestExtensionApiFrameIdMap> map(new TestExtensionApiFrameIdMap());
+ EXPECT_EQ(0, map->GetInternalSize());
+
+ // Two identical calls, should be processed at the next message loop.
+ map->GetFrameIdOnIO(1, 2, CreateCallback(1, 2));
+ EXPECT_EQ(0, map->GetInternalSize());
+
+ map->GetFrameIdOnIO(1, 2, CreateCallback(1, 2));
+ EXPECT_EQ(0, map->GetInternalSize());
+
+ // First get the frame ID on IO, then on UI.
+ map->GetFrameIdOnIO(2, 1, CreateCallback(2, 1));
+ EXPECT_EQ(0, map->GetInternalSize());
+
+ EXPECT_EQ(ToTestFrameId(2, 1), map->GetFrameId(2, 1));
+ EXPECT_EQ(1, map->GetInternalSize());
+
+ // First get the frame ID on UI, then on UI.
+ EXPECT_EQ(ToTestFrameId(3, 1), map->GetFrameId(3, 1));
+ EXPECT_EQ(2, map->GetInternalSize());
+
+ map->GetFrameIdOnIO(3, 1, CreateCallback(3, 1));
+ EXPECT_EQ(2, map->GetInternalSize());
+
+ base::RunLoop().RunUntilIdle();
+ EXPECT_EQ(3, map->GetInternalSize());
+ EXPECT_EQ(4U, results().size());
+
+ // Disabled these checks because the order is not guaranteed.
+ // EXPECT_EQ(ToTestFrameId(1, 2), results()[0]);
+ // EXPECT_EQ(ToTestFrameId(1, 2), results()[1]);
+ // EXPECT_EQ(ToTestFrameId(2, 1), results()[2]);
+ // EXPECT_EQ(ToTestFrameId(3, 1), results()[3]);
+
+ // Request the frame ID for input that was already looked up. Should complete
+ // synchronously.
+ map->GetFrameIdOnIO(1, 2, CreateCallback(1, 2));
+ EXPECT_EQ(3, map->GetInternalSize());
+ EXPECT_EQ(5U, results().size());
+ EXPECT_EQ(ToTestFrameId(1, 2), results()[4]);
+}
+
+} // namespace extensions

Powered by Google App Engine
This is Rietveld 408576698