blob: 69757cff02f94546f7330f8595f380f40dd18915 [file] [log] [blame]
// Copyright (c) 2010 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.
#import <Cocoa/Cocoa.h>
#include "app/tree_model.h"
#import "base/scoped_nsobject.h"
#include "base/scoped_ptr.h"
#include "chrome/browser/cocoa/browser_test_helper.h"
#include "chrome/browser/browsing_data_remover.h"
#include "chrome/browser/cocoa/clear_browsing_data_controller.h"
#import "chrome/browser/cocoa/cookies_window_controller.h"
#include "chrome/browser/cocoa/cocoa_test_helper.h"
#include "chrome/browser/mock_browsing_data_database_helper.h"
#include "chrome/browser/mock_browsing_data_local_storage_helper.h"
#include "chrome/browser/net/url_request_context_getter.h"
#include "chrome/browser/cookies_tree_model.h"
#include "chrome/test/testing_profile.h"
#include "googleurl/src/gurl.h"
#include "net/url_request/url_request_context.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "testing/platform_test.h"
#import "third_party/ocmock/OCMock/OCMock.h"
// Used to test FindCocoaNode. This only sets the title and node, without
// initializing any other members.
@interface FakeCocoaCookieTreeNode : CocoaCookieTreeNode {
TreeModelNode* testNode_;
}
- (id)initWithTreeNode:(TreeModelNode*)node;
@end
@implementation FakeCocoaCookieTreeNode
- (id)initWithTreeNode:(TreeModelNode*)node {
if ((self = [super init])) {
testNode_ = node;
children_.reset([[NSMutableArray alloc] init]);
}
return self;
}
- (TreeModelNode*)treeNode {
return testNode_;
}
@end
namespace {
class CookiesWindowControllerTest : public CocoaTest {
public:
CookiesWindowControllerTest()
: io_thread_(ChromeThread::IO, MessageLoop::current()) {}
virtual void SetUp() {
CocoaTest::SetUp();
TestingProfile* profile = browser_helper_.profile();
profile->CreateRequestContext();
database_helper_ = new MockBrowsingDataDatabaseHelper(profile);
local_storage_helper_ = new MockBrowsingDataLocalStorageHelper(profile);
controller_.reset(
[[CookiesWindowController alloc] initWithProfile:profile
databaseHelper:database_helper_
storageHelper:local_storage_helper_]
);
}
virtual void TearDown() {
CocoaTest::TearDown();
}
CocoaCookieTreeNode* CocoaNodeFromTreeNode(TreeModelNode* node) {
return [controller_ modelObserver]->CocoaNodeFromTreeNode(node);
}
CocoaCookieTreeNode* FindCocoaNode(TreeModelNode* node,
CocoaCookieTreeNode* start) {
return [controller_ modelObserver]->FindCocoaNode(node, start);
}
protected:
BrowserTestHelper browser_helper_;
// Need an IO thread to not leak from TestingProfile::CreateRequestContext().
ChromeThread io_thread_;
scoped_nsobject<CookiesWindowController> controller_;
MockBrowsingDataDatabaseHelper* database_helper_;
MockBrowsingDataLocalStorageHelper* local_storage_helper_;
};
TEST_F(CookiesWindowControllerTest, Construction) {
std::vector<SkBitmap> skia_icons;
[controller_ treeModel]->GetIcons(&skia_icons);
EXPECT_EQ([[controller_ icons] count], skia_icons.size() + 1U);
}
TEST_F(CookiesWindowControllerTest, FindCocoaNodeRoot) {
scoped_ptr< TreeNodeWithValue<int> > search(new TreeNodeWithValue<int>(42));
scoped_nsobject<FakeCocoaCookieTreeNode> node(
[[FakeCocoaCookieTreeNode alloc] initWithTreeNode:search.get()]);
EXPECT_EQ(node.get(), FindCocoaNode(search.get(), node.get()));
}
TEST_F(CookiesWindowControllerTest, FindCocoaNodeImmediateChild) {
scoped_ptr< TreeNodeWithValue<int> > parent(new TreeNodeWithValue<int>(100));
scoped_ptr< TreeNodeWithValue<int> > child1(new TreeNodeWithValue<int>(10));
scoped_ptr< TreeNodeWithValue<int> > child2(new TreeNodeWithValue<int>(20));
scoped_nsobject<FakeCocoaCookieTreeNode> cocoaParent(
[[FakeCocoaCookieTreeNode alloc] initWithTreeNode:parent.get()]);
scoped_nsobject<FakeCocoaCookieTreeNode> cocoaChild1(
[[FakeCocoaCookieTreeNode alloc] initWithTreeNode:child1.get()]);
scoped_nsobject<FakeCocoaCookieTreeNode> cocoaChild2(
[[FakeCocoaCookieTreeNode alloc] initWithTreeNode:child2.get()]);
[[cocoaParent mutableChildren] addObject:cocoaChild1.get()];
[[cocoaParent mutableChildren] addObject:cocoaChild2.get()];
EXPECT_EQ(cocoaChild2.get(), FindCocoaNode(child2.get(), cocoaParent.get()));
}
TEST_F(CookiesWindowControllerTest, FindCocoaNodeRecursive) {
scoped_ptr< TreeNodeWithValue<int> > parent(new TreeNodeWithValue<int>(100));
scoped_ptr< TreeNodeWithValue<int> > child1(new TreeNodeWithValue<int>(10));
scoped_ptr< TreeNodeWithValue<int> > child2(new TreeNodeWithValue<int>(20));
scoped_nsobject<FakeCocoaCookieTreeNode> cocoaParent(
[[FakeCocoaCookieTreeNode alloc] initWithTreeNode:parent.get()]);
scoped_nsobject<FakeCocoaCookieTreeNode> cocoaChild1(
[[FakeCocoaCookieTreeNode alloc] initWithTreeNode:child1.get()]);
scoped_nsobject<FakeCocoaCookieTreeNode> cocoaChild2(
[[FakeCocoaCookieTreeNode alloc] initWithTreeNode:child2.get()]);
[[cocoaParent mutableChildren] addObject:cocoaChild1.get()];
[[cocoaChild1 mutableChildren] addObject:cocoaChild2.get()];
EXPECT_EQ(cocoaChild2.get(), FindCocoaNode(child2.get(), cocoaParent.get()));
}
TEST_F(CookiesWindowControllerTest, CocoaNodeFromTreeNodeCookie) {
net::CookieMonster* cm = browser_helper_.profile()->GetCookieMonster();
cm->SetCookie(GURL("http://foo.com"), "A=B");
CookiesTreeModel model(browser_helper_.profile(), database_helper_,
local_storage_helper_, nil);
// Root --> foo.com --> Cookies --> A. Create node for 'A'.
TreeModelNode* node = model.GetRoot()->GetChild(0)->GetChild(0)->GetChild(0);
CocoaCookieTreeNode* cookie = CocoaNodeFromTreeNode(node);
EXPECT_TRUE([@"B" isEqualToString:[cookie content]]);
EXPECT_TRUE([@"When I close my browser" isEqualToString:[cookie expires]]);
EXPECT_TRUE([@"Any kind of connection" isEqualToString:[cookie sendFor]]);
EXPECT_TRUE([@"A" isEqualToString:[cookie title]]);
EXPECT_TRUE([@"A" isEqualToString:[cookie name]]);
EXPECT_TRUE([@"/" isEqualToString:[cookie path]]);
EXPECT_EQ(0U, [[cookie children] count]);
EXPECT_TRUE([cookie created]);
EXPECT_TRUE([cookie isLeaf]);
EXPECT_EQ(node, [cookie treeNode]);
}
TEST_F(CookiesWindowControllerTest, CocoaNodeFromTreeNodeRecursive) {
net::CookieMonster* cm = browser_helper_.profile()->GetCookieMonster();
cm->SetCookie(GURL("http://foo.com"), "A=B");
CookiesTreeModel model(browser_helper_.profile(), database_helper_,
local_storage_helper_, nil);
// Root --> foo.com --> Cookies --> A. Create node for 'foo.com'.
CookieTreeNode* node = model.GetRoot()->GetChild(0);
CocoaCookieTreeNode* domain = CocoaNodeFromTreeNode(node);
CocoaCookieTreeNode* cookies = [[domain children] objectAtIndex:0];
CocoaCookieTreeNode* cookie = [[cookies children] objectAtIndex:0];
// Test domain-level node.
EXPECT_TRUE([@"foo.com" isEqualToString:[domain title]]);
EXPECT_FALSE([domain isLeaf]);
EXPECT_EQ(1U, [[domain children] count]);
EXPECT_EQ(node, [domain treeNode]);
// Test "Cookies" folder node.
EXPECT_TRUE([@"Cookies" isEqualToString:[cookies title]]);
EXPECT_FALSE([cookies isLeaf]);
EXPECT_EQ(1U, [[cookies children] count]);
EXPECT_EQ(node->GetChild(0), [cookies treeNode]);
// Test cookie node. This is the same as CocoaNodeFromTreeNodeCookie.
EXPECT_TRUE([@"B" isEqualToString:[cookie content]]);
EXPECT_TRUE([@"When I close my browser" isEqualToString:[cookie expires]]);
EXPECT_TRUE([@"Any kind of connection" isEqualToString:[cookie sendFor]]);
EXPECT_TRUE([@"A" isEqualToString:[cookie title]]);
EXPECT_TRUE([@"A" isEqualToString:[cookie name]]);
EXPECT_TRUE([@"/" isEqualToString:[cookie path]]);
EXPECT_TRUE([@"foo.com" isEqualToString:[cookie domain]]);
EXPECT_EQ(0U, [[cookie children] count]);
EXPECT_TRUE([cookie created]);
EXPECT_TRUE([cookie isLeaf]);
EXPECT_EQ(node->GetChild(0)->GetChild(0), [cookie treeNode]);
}
TEST_F(CookiesWindowControllerTest, TreeNodesAdded) {
const GURL url = GURL("http://foo.com");
TestingProfile* profile = browser_helper_.profile();
net::CookieMonster* cm = profile->GetCookieMonster();
cm->SetCookie(url, "A=B");
controller_.reset(
[[CookiesWindowController alloc] initWithProfile:profile
databaseHelper:database_helper_
storageHelper:local_storage_helper_]);
// Root --> foo.com --> Cookies.
NSMutableArray* cocoa_children =
[[[[[[controller_ cocoaTreeModel] children] objectAtIndex:0]
children] objectAtIndex:0] mutableChildren];
EXPECT_EQ(1U, [cocoa_children count]);
// Create some cookies.
cm->SetCookie(url, "C=D");
cm->SetCookie(url, "E=F");
net::CookieMonster::CookieList list = cm->GetAllCookies();
CookiesTreeModel* model = [controller_ treeModel];
// Root --> foo.com --> Cookies.
CookieTreeNode* parent = model->GetRoot()->GetChild(0)->GetChild(0);
ASSERT_EQ(3U, list.size());
// Add the cookie nodes.
CookieTreeCookieNode* cnode = new CookieTreeCookieNode(&list[1]);
parent->Add(1, cnode); // |parent| takes ownership.
cnode = new CookieTreeCookieNode(&list[2]);
parent->Add(2, cnode);
// Manually notify the observer.
[controller_ modelObserver]->TreeNodesAdded(model, parent, 1, 2);
// Check that we have created 2 more Cocoa nodes.
EXPECT_EQ(3U, [cocoa_children count]);
}
TEST_F(CookiesWindowControllerTest, TreeNodesRemoved) {
const GURL url = GURL("http://foo.com");
TestingProfile* profile = browser_helper_.profile();
net::CookieMonster* cm = profile->GetCookieMonster();
cm->SetCookie(url, "A=B");
cm->SetCookie(url, "C=D");
cm->SetCookie(url, "E=F");
controller_.reset(
[[CookiesWindowController alloc] initWithProfile:profile
databaseHelper:database_helper_
storageHelper:local_storage_helper_]);
// Root --> foo.com --> Cookies.
NSMutableArray* cocoa_children =
[[[[[[controller_ cocoaTreeModel] children] objectAtIndex:0]
children] objectAtIndex:0] mutableChildren];
EXPECT_EQ(3U, [cocoa_children count]);
CookiesTreeModel* model = [controller_ treeModel];
// Root --> foo.com --> Cookies.
CookieTreeNode* parent = model->GetRoot()->GetChild(0)->GetChild(0);
// Pretend to remove the nodes.
[controller_ modelObserver]->TreeNodesRemoved(model, parent, 1, 2);
EXPECT_EQ(1U, [cocoa_children count]);
NSString* title = [[cocoa_children objectAtIndex:0] name];
EXPECT_TRUE([@"A" isEqualToString:title]);
}
TEST_F(CookiesWindowControllerTest, TreeNodeChildrenReordered) {
const GURL url = GURL("http://foo.com");
TestingProfile* profile = browser_helper_.profile();
net::CookieMonster* cm = profile->GetCookieMonster();
cm->SetCookie(url, "A=B");
cm->SetCookie(url, "C=D");
cm->SetCookie(url, "E=F");
controller_.reset(
[[CookiesWindowController alloc] initWithProfile:profile
databaseHelper:database_helper_
storageHelper:local_storage_helper_]);
// Root --> foo.com --> Cookies.
NSMutableArray* cocoa_children =
[[[[[[controller_ cocoaTreeModel] children] objectAtIndex:0]
children] objectAtIndex:0] mutableChildren];
EXPECT_EQ(3U, [cocoa_children count]);
// Check default ordering.
CocoaCookieTreeNode* node = [cocoa_children objectAtIndex:0];
EXPECT_TRUE([@"A" isEqualToString:[node name]]);
node = [cocoa_children objectAtIndex:1];
EXPECT_TRUE([@"C" isEqualToString:[node name]]);
node = [cocoa_children objectAtIndex:2];
EXPECT_TRUE([@"E" isEqualToString:[node name]]);
CookiesTreeModel* model = [controller_ treeModel];
// Root --> foo.com --> Cookies.
CookieTreeNode* parent = model->GetRoot()->GetChild(0)->GetChild(0);
// Reorder the nodes.
CookieTreeNode* node_e = parent->Remove(2);
CookieTreeNode* node_c = parent->Remove(1);
parent->Add(0, node_e);
parent->Add(2, node_c);
// Notify the observer of the reordering.
[controller_ modelObserver]->TreeNodeChildrenReordered(model, parent);
// Check the new order.
node = [cocoa_children objectAtIndex:0];
EXPECT_TRUE([@"E" isEqualToString:[node name]]);
node = [cocoa_children objectAtIndex:1];
EXPECT_TRUE([@"A" isEqualToString:[node name]]);
node = [cocoa_children objectAtIndex:2];
EXPECT_TRUE([@"C" isEqualToString:[node name]]);
}
TEST_F(CookiesWindowControllerTest, TreeNodeChanged) {
const GURL url = GURL("http://foo.com");
TestingProfile* profile = browser_helper_.profile();
net::CookieMonster* cm = profile->GetCookieMonster();
cm->SetCookie(url, "A=B");
controller_.reset(
[[CookiesWindowController alloc] initWithProfile:profile
databaseHelper:database_helper_
storageHelper:local_storage_helper_]);
CookiesTreeModel* model = [controller_ treeModel];
// Root --> foo.com --> Cookies.
CookieTreeNode* node = model->GetRoot()->GetChild(0)->GetChild(0);
// Root --> foo.com --> Cookies.
CocoaCookieTreeNode* cocoa_node =
[[[[[controller_ cocoaTreeModel] children] objectAtIndex:0]
children] objectAtIndex:0];
EXPECT_TRUE([@"Cookies" isEqualToString:[cocoa_node title]]);
// Fake update the cookie folder's title. This would never happen in reality,
// but it tests the code path that ultimately calls CocoaNodeFromTreeNode,
// which is tested elsewhere.
node->SetTitle(L"Silly Change");
[controller_ modelObserver]->TreeNodeChanged(model, node);
EXPECT_TRUE([@"Silly Change" isEqualToString:[cocoa_node title]]);
}
TEST_F(CookiesWindowControllerTest, TestDeleteCookie) {
const GURL url = GURL("http://foo.com");
TestingProfile* profile = browser_helper_.profile();
net::CookieMonster* cm = profile->GetCookieMonster();
cm->SetCookie(url, "A=B");
cm->SetCookie(url, "C=D");
// This will clean itself up when we call |-closeSheet:|. If we reset the
// scoper, we'd get a double-free.
CookiesWindowController* controller =
[[CookiesWindowController alloc] initWithProfile:profile
databaseHelper:database_helper_
storageHelper:local_storage_helper_];
[controller attachSheetTo:test_window()];
NSTreeController* treeController = [controller treeController];
// Pretend to select cookie A.
NSUInteger path[3] = {0, 0, 0};
NSIndexPath* indexPath = [NSIndexPath indexPathWithIndexes:path length:3];
[treeController setSelectionIndexPath:indexPath];
// Press the "Delete" button.
[controller deleteCookie:nil];
// Root --> foo.com --> Cookies.
NSArray* cookies = [[[[[[controller cocoaTreeModel] children]
objectAtIndex:0] children] objectAtIndex:0] children];
EXPECT_EQ(1U, [cookies count]);
EXPECT_TRUE([@"C" isEqualToString:[[cookies lastObject] title]]);
EXPECT_TRUE([indexPath isEqual:[treeController selectionIndexPath]]);
[controller closeSheet:nil];
}
TEST_F(CookiesWindowControllerTest, TestDidExpandItem) {
const GURL url = GURL("http://foo.com");
TestingProfile* profile = browser_helper_.profile();
net::CookieMonster* cm = profile->GetCookieMonster();
cm->SetCookie(url, "A=B");
cm->SetCookie(url, "C=D");
controller_.reset(
[[CookiesWindowController alloc] initWithProfile:profile
databaseHelper:database_helper_
storageHelper:local_storage_helper_]);
// Root --> foo.com.
CocoaCookieTreeNode* foo =
[[[controller_ cocoaTreeModel] children] objectAtIndex:0];
// Create the objects we are going to be testing with.
id outlineView = [OCMockObject mockForClass:[NSOutlineView class]];
id treeNode = [OCMockObject mockForClass:[NSTreeNode class]];
NSTreeNode* childTreeNode =
[NSTreeNode treeNodeWithRepresentedObject:[[foo children] lastObject]];
NSArray* fakeChildren = [NSArray arrayWithObject:childTreeNode];
// Set up the mock object.
[[[treeNode stub] andReturn:foo] representedObject];
[[[treeNode stub] andReturn:fakeChildren] childNodes];
// Create a fake "ItemDidExpand" notification.
NSDictionary* userInfo = [NSDictionary dictionaryWithObject:treeNode
forKey:@"NSObject"];
NSNotification* notif =
[NSNotification notificationWithName:@"ItemDidExpandNotification"
object:outlineView
userInfo:userInfo];
// Make sure we work correctly.
[[outlineView expect] expandItem:childTreeNode];
[controller_ outlineViewItemDidExpand:notif];
[outlineView verify];
}
TEST_F(CookiesWindowControllerTest, ClearBrowsingData) {
const GURL url = GURL("http://foo.com");
TestingProfile* profile = browser_helper_.profile();
net::CookieMonster* cm = profile->GetCookieMonster();
cm->SetCookie(url, "A=B");
cm->SetCookie(url, "C=D");
cm->SetCookie(url, "E=F");
id mock = [OCMockObject partialMockForObject:controller_.get()];
[[mock expect] loadTreeModelFromProfile];
NSNumber* mask =
[NSNumber numberWithInt:BrowsingDataRemover::REMOVE_COOKIES];
NSDictionary* userInfo =
[NSDictionary dictionaryWithObject:mask
forKey:kClearBrowsingDataControllerRemoveMask];
NSNotification* notif =
[NSNotification notificationWithName:kClearBrowsingDataControllerDidDelete
object:nil
userInfo:userInfo];
[controller_ clearBrowsingDataNotification:notif];
[mock verify];
}
// This test has been flaky under Valgrind and turns the bot red since r38504.
// Under Mac Tests 10.5, it occasionally reports:
// malloc: *** error for object 0x31e0468: Non-aligned pointer being freed
// *** set a breakpoint in malloc_error_break to debug
// Attempts to reproduce locally were not successful. This code is likely
// changing in the future, so it's marked flaky for now. http://crbug.com/35327
TEST_F(CookiesWindowControllerTest, FLAKY_RemoveButtonEnabled) {
const GURL url = GURL("http://foo.com");
TestingProfile* profile = browser_helper_.profile();
net::CookieMonster* cm = profile->GetCookieMonster();
cm->SetCookie(url, "A=B");
cm->SetCookie(url, "C=D");
// This will clean itself up when we call |-closeSheet:|. If we reset the
// scoper, we'd get a double-free.
database_helper_ = new MockBrowsingDataDatabaseHelper(profile);
local_storage_helper_ = new MockBrowsingDataLocalStorageHelper(profile);
local_storage_helper_->AddLocalStorageSamples();
CookiesWindowController* controller =
[[CookiesWindowController alloc] initWithProfile:profile
databaseHelper:database_helper_
storageHelper:local_storage_helper_];
local_storage_helper_->Notify();
[controller attachSheetTo:test_window()];
// Nothing should be selected right now.
EXPECT_FALSE([controller removeButtonEnabled]);
{
// Pretend to select cookie A.
NSUInteger path[3] = {0, 0, 0};
NSIndexPath* indexPath = [NSIndexPath indexPathWithIndexes:path length:3];
[[controller treeController] setSelectionIndexPath:indexPath];
[controller outlineViewSelectionDidChange:nil];
EXPECT_TRUE([controller removeButtonEnabled]);
EXPECT_FALSE([[controller cookieInfoView] isHidden]);
EXPECT_TRUE([[controller localStorageInfoView] isHidden]);
}
{
// Pretend to select cookie C.
NSUInteger path[3] = {0, 0, 1};
NSIndexPath* indexPath = [NSIndexPath indexPathWithIndexes:path length:3];
[[controller treeController] setSelectionIndexPath:indexPath];
[controller outlineViewSelectionDidChange:nil];
EXPECT_TRUE([controller removeButtonEnabled]);
EXPECT_FALSE([[controller cookieInfoView] isHidden]);
EXPECT_TRUE([[controller localStorageInfoView] isHidden]);
}
{
// Select a local storage node.
NSUInteger path[3] = {2, 0, 0};
NSIndexPath* indexPath = [NSIndexPath indexPathWithIndexes:path length:3];
[[controller treeController] setSelectionIndexPath:indexPath];
[controller outlineViewSelectionDidChange:nil];
EXPECT_TRUE([controller removeButtonEnabled]);
EXPECT_TRUE([[controller cookieInfoView] isHidden]);
EXPECT_FALSE([[controller localStorageInfoView] isHidden]);
}
{
// Pretend to select something that isn't there!
NSUInteger path[3] = {0, 0, 2};
NSIndexPath* indexPath = [NSIndexPath indexPathWithIndexes:path length:3];
[[controller treeController] setSelectionIndexPath:indexPath];
[controller outlineViewSelectionDidChange:nil];
EXPECT_FALSE([controller removeButtonEnabled]);
}
{
// Try selecting something that doesn't exist again.
NSUInteger path[3] = {7, 1, 4};
NSIndexPath* indexPath = [NSIndexPath indexPathWithIndexes:path length:3];
[[controller treeController] setSelectionIndexPath:indexPath];
[controller outlineViewSelectionDidChange:nil];
EXPECT_FALSE([controller removeButtonEnabled]);
}
[controller closeSheet:nil];
}
TEST_F(CookiesWindowControllerTest, UpdateFilter)
{
const GURL url = GURL("http://foo.com");
TestingProfile* profile = browser_helper_.profile();
net::CookieMonster* cm = profile->GetCookieMonster();
cm->SetCookie(GURL("http://a.com"), "A=B");
cm->SetCookie(GURL("http://aa.com"), "C=D");
cm->SetCookie(GURL("http://b.com"), "E=F");
cm->SetCookie(GURL("http://d.com"), "G=H");
cm->SetCookie(GURL("http://dd.com"), "I=J");
controller_.reset(
[[CookiesWindowController alloc] initWithProfile:profile
databaseHelper:database_helper_
storageHelper:local_storage_helper_]);
// Make sure we registered all five cookies.
EXPECT_EQ(5U, [[[controller_ cocoaTreeModel] children] count]);
NSSearchField* field =
[[NSSearchField alloc] initWithFrame:NSMakeRect(0, 0, 100, 100)];
// Make sure we still have five cookies.
[field setStringValue:@""];
[controller_ updateFilter:field];
EXPECT_EQ(5U, [[[controller_ cocoaTreeModel] children] count]);
// Search for "a".
[field setStringValue:@"a"];
[controller_ updateFilter:field];
EXPECT_EQ(2U, [[[controller_ cocoaTreeModel] children] count]);
// Search for "b".
[field setStringValue:@"b"];
[controller_ updateFilter:field];
EXPECT_EQ(1U, [[[controller_ cocoaTreeModel] children] count]);
// Search for "d".
[field setStringValue:@"d"];
[controller_ updateFilter:field];
EXPECT_EQ(2U, [[[controller_ cocoaTreeModel] children] count]);
// Search for "e".
[field setStringValue:@"e"];
[controller_ updateFilter:field];
EXPECT_EQ(0U, [[[controller_ cocoaTreeModel] children] count]);
// Search for "aa".
[field setStringValue:@"aa"];
[controller_ updateFilter:field];
EXPECT_EQ(1U, [[[controller_ cocoaTreeModel] children] count]);
}
TEST_F(CookiesWindowControllerTest, CreateDatabaseStorageNodes) {
TestingProfile* profile = browser_helper_.profile();
database_helper_ = new MockBrowsingDataDatabaseHelper(profile);
local_storage_helper_ = new MockBrowsingDataLocalStorageHelper(profile);
database_helper_->AddDatabaseSamples();
controller_.reset(
[[CookiesWindowController alloc] initWithProfile:profile
databaseHelper:database_helper_
storageHelper:local_storage_helper_]);
database_helper_->Notify();
ASSERT_EQ(2U, [[[controller_ cocoaTreeModel] children] count]);
// Root --> gdbhost1.
CocoaCookieTreeNode* node =
[[[controller_ cocoaTreeModel] children] objectAtIndex:0];
EXPECT_TRUE([@"gdbhost1" isEqualToString:[node title]]);
EXPECT_EQ(kCocoaCookieTreeNodeTypeFolder, [node nodeType]);
EXPECT_EQ(1U, [[node children] count]);
// host1 --> Web Databases.
node = [[node children] lastObject];
EXPECT_TRUE([@"Web Databases" isEqualToString:[node title]]);
EXPECT_EQ(kCocoaCookieTreeNodeTypeFolder, [node nodeType]);
EXPECT_EQ(1U, [[node children] count]);
// Database Storage --> db1.
node = [[node children] lastObject];
EXPECT_TRUE([@"db1" isEqualToString:[node title]]);
EXPECT_EQ(kCocoaCookieTreeNodeTypeDatabaseStorage, [node nodeType]);
EXPECT_TRUE([@"description 1" isEqualToString:[node databaseDescription]]);
EXPECT_TRUE([node lastModified]);
EXPECT_TRUE([node fileSize]);
// Root --> gdbhost2.
node =
[[[controller_ cocoaTreeModel] children] objectAtIndex:1];
EXPECT_TRUE([@"gdbhost2" isEqualToString:[node title]]);
EXPECT_EQ(kCocoaCookieTreeNodeTypeFolder, [node nodeType]);
EXPECT_EQ(1U, [[node children] count]);
// host1 --> Web Databases.
node = [[node children] lastObject];
EXPECT_TRUE([@"Web Databases" isEqualToString:[node title]]);
EXPECT_EQ(kCocoaCookieTreeNodeTypeFolder, [node nodeType]);
EXPECT_EQ(1U, [[node children] count]);
// Database Storage --> db2.
node = [[node children] lastObject];
EXPECT_TRUE([@"db2" isEqualToString:[node title]]);
EXPECT_EQ(kCocoaCookieTreeNodeTypeDatabaseStorage, [node nodeType]);
EXPECT_TRUE([@"description 2" isEqualToString:[node databaseDescription]]);
EXPECT_TRUE([node lastModified]);
EXPECT_TRUE([node fileSize]);
}
TEST_F(CookiesWindowControllerTest, CreateLocalStorageNodes) {
TestingProfile* profile = browser_helper_.profile();
net::CookieMonster* cm = profile->GetCookieMonster();
cm->SetCookie(GURL("http://google.com"), "A=B");
cm->SetCookie(GURL("http://dev.chromium.org"), "C=D");
database_helper_ = new MockBrowsingDataDatabaseHelper(profile);
local_storage_helper_ = new MockBrowsingDataLocalStorageHelper(profile);
local_storage_helper_->AddLocalStorageSamples();
controller_.reset(
[[CookiesWindowController alloc] initWithProfile:profile
databaseHelper:database_helper_
storageHelper:local_storage_helper_]);
local_storage_helper_->Notify();
ASSERT_EQ(4U, [[[controller_ cocoaTreeModel] children] count]);
// Root --> host1.
CocoaCookieTreeNode* node =
[[[controller_ cocoaTreeModel] children] objectAtIndex:2];
EXPECT_TRUE([@"host1" isEqualToString:[node title]]);
EXPECT_EQ(kCocoaCookieTreeNodeTypeFolder, [node nodeType]);
EXPECT_EQ(1U, [[node children] count]);
// host1 --> Local Storage.
node = [[node children] lastObject];
EXPECT_TRUE([@"Local Storage" isEqualToString:[node title]]);
EXPECT_EQ(kCocoaCookieTreeNodeTypeFolder, [node nodeType]);
EXPECT_EQ(1U, [[node children] count]);
// Local Storage --> origin1.
node = [[node children] lastObject];
EXPECT_TRUE([@"origin1" isEqualToString:[node title]]);
EXPECT_EQ(kCocoaCookieTreeNodeTypeLocalStorage, [node nodeType]);
EXPECT_TRUE([@"origin1" isEqualToString:[node domain]]);
EXPECT_TRUE([node lastModified]);
EXPECT_TRUE([node fileSize]);
// Root --> host2.
node =
[[[controller_ cocoaTreeModel] children] objectAtIndex:3];
EXPECT_TRUE([@"host2" isEqualToString:[node title]]);
EXPECT_EQ(kCocoaCookieTreeNodeTypeFolder, [node nodeType]);
EXPECT_EQ(1U, [[node children] count]);
// host2 --> Local Storage.
node = [[node children] lastObject];
EXPECT_TRUE([@"Local Storage" isEqualToString:[node title]]);
EXPECT_EQ(kCocoaCookieTreeNodeTypeFolder, [node nodeType]);
EXPECT_EQ(1U, [[node children] count]);
// Local Storage --> origin2.
node = [[node children] lastObject];
EXPECT_TRUE([@"origin2" isEqualToString:[node title]]);
EXPECT_EQ(kCocoaCookieTreeNodeTypeLocalStorage, [node nodeType]);
EXPECT_TRUE([@"origin2" isEqualToString:[node domain]]);
EXPECT_TRUE([node lastModified]);
EXPECT_TRUE([node fileSize]);
}
} // namespace