OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #import "ios/chrome/browser/ui/settings/settings_navigation_controller.h" | 5 #import "ios/chrome/browser/ui/settings/settings_navigation_controller.h" |
6 | 6 |
7 #import <Foundation/Foundation.h> | 7 #import <Foundation/Foundation.h> |
8 | 8 |
9 #include <memory> | 9 #include <memory> |
10 | 10 |
11 #include "base/mac/scoped_nsautorelease_pool.h" | |
12 #import "base/mac/scoped_nsobject.h" | |
13 #include "base/memory/ptr_util.h" | 11 #include "base/memory/ptr_util.h" |
14 #include "components/search_engines/template_url_service.h" | 12 #include "components/search_engines/template_url_service.h" |
15 #include "ios/chrome/browser/browser_state/test_chrome_browser_state.h" | 13 #include "ios/chrome/browser/browser_state/test_chrome_browser_state.h" |
16 #include "ios/chrome/browser/browser_state/test_chrome_browser_state_manager.h" | 14 #include "ios/chrome/browser/browser_state/test_chrome_browser_state_manager.h" |
17 #include "ios/chrome/browser/search_engines/template_url_service_factory.h" | 15 #include "ios/chrome/browser/search_engines/template_url_service_factory.h" |
18 #import "ios/chrome/browser/signin/authentication_service.h" | 16 #import "ios/chrome/browser/signin/authentication_service.h" |
19 #include "ios/chrome/browser/signin/authentication_service_factory.h" | 17 #include "ios/chrome/browser/signin/authentication_service_factory.h" |
20 #import "ios/chrome/browser/signin/authentication_service_fake.h" | 18 #import "ios/chrome/browser/signin/authentication_service_fake.h" |
21 #include "ios/chrome/browser/sync/sync_setup_service.h" | 19 #include "ios/chrome/browser/sync/sync_setup_service.h" |
22 #include "ios/chrome/browser/sync/sync_setup_service_factory.h" | 20 #include "ios/chrome/browser/sync/sync_setup_service_factory.h" |
23 #include "ios/chrome/test/ios_chrome_scoped_testing_chrome_browser_state_manager
.h" | 21 #include "ios/chrome/test/ios_chrome_scoped_testing_chrome_browser_state_manager
.h" |
24 #include "ios/web/public/test/test_web_thread_bundle.h" | 22 #include "ios/web/public/test/test_web_thread_bundle.h" |
25 #include "testing/gmock/include/gmock/gmock.h" | 23 #include "testing/gmock/include/gmock/gmock.h" |
26 #include "testing/gtest/include/gtest/gtest.h" | 24 #include "testing/gtest/include/gtest/gtest.h" |
27 #import "testing/gtest_mac.h" | 25 #import "testing/gtest_mac.h" |
28 #include "testing/platform_test.h" | 26 #include "testing/platform_test.h" |
29 #import "third_party/ocmock/OCMock/OCMock.h" | 27 #import "third_party/ocmock/OCMock/OCMock.h" |
30 #include "third_party/ocmock/gtest_support.h" | 28 #include "third_party/ocmock/gtest_support.h" |
31 | 29 |
| 30 #if !defined(__has_feature) || !__has_feature(objc_arc) |
| 31 #error "This file requires ARC support." |
| 32 #endif |
| 33 |
32 namespace { | 34 namespace { |
33 | 35 |
34 NSString* const kSpdyProxyEnabled = @"SpdyProxyEnabled"; | 36 NSString* const kSpdyProxyEnabled = @"SpdyProxyEnabled"; |
35 | 37 |
36 using testing::ReturnRef; | 38 using testing::ReturnRef; |
37 | 39 |
38 class SettingsNavigationControllerTest : public PlatformTest { | 40 class SettingsNavigationControllerTest : public PlatformTest { |
39 protected: | 41 protected: |
40 SettingsNavigationControllerTest() | 42 SettingsNavigationControllerTest() |
41 : scoped_browser_state_manager_( | 43 : scoped_browser_state_manager_( |
42 base::MakeUnique<TestChromeBrowserStateManager>(base::FilePath())) { | 44 base::MakeUnique<TestChromeBrowserStateManager>(base::FilePath())) { |
43 TestChromeBrowserState::Builder test_cbs_builder; | 45 TestChromeBrowserState::Builder test_cbs_builder; |
44 test_cbs_builder.AddTestingFactory( | 46 test_cbs_builder.AddTestingFactory( |
45 AuthenticationServiceFactory::GetInstance(), | 47 AuthenticationServiceFactory::GetInstance(), |
46 &AuthenticationServiceFake::CreateAuthenticationService); | 48 &AuthenticationServiceFake::CreateAuthenticationService); |
47 test_cbs_builder.AddTestingFactory( | 49 test_cbs_builder.AddTestingFactory( |
48 ios::TemplateURLServiceFactory::GetInstance(), | 50 ios::TemplateURLServiceFactory::GetInstance(), |
49 ios::TemplateURLServiceFactory::GetDefaultFactory()); | 51 ios::TemplateURLServiceFactory::GetDefaultFactory()); |
50 chrome_browser_state_ = test_cbs_builder.Build(); | 52 chrome_browser_state_ = test_cbs_builder.Build(); |
51 | 53 |
52 mockDelegate_.reset([[OCMockObject | 54 mockDelegate_ = [OCMockObject |
53 niceMockForProtocol:@protocol(SettingsNavigationControllerDelegate)] | 55 niceMockForProtocol:@protocol(SettingsNavigationControllerDelegate)]; |
54 retain]); | |
55 | 56 |
56 TemplateURLService* template_url_service = | 57 TemplateURLService* template_url_service = |
57 ios::TemplateURLServiceFactory::GetForBrowserState( | 58 ios::TemplateURLServiceFactory::GetForBrowserState( |
58 chrome_browser_state_.get()); | 59 chrome_browser_state_.get()); |
59 template_url_service->Load(); | 60 template_url_service->Load(); |
60 | 61 |
61 NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults]; | 62 NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults]; |
62 initialValueForSpdyProxyEnabled_.reset( | 63 initialValueForSpdyProxyEnabled_ = |
63 [[defaults stringForKey:kSpdyProxyEnabled] copy]); | 64 [[defaults stringForKey:kSpdyProxyEnabled] copy]; |
64 [defaults setObject:@"Disabled" forKey:kSpdyProxyEnabled]; | 65 [defaults setObject:@"Disabled" forKey:kSpdyProxyEnabled]; |
65 }; | 66 }; |
66 | 67 |
67 ~SettingsNavigationControllerTest() override { | 68 ~SettingsNavigationControllerTest() override { |
68 if (initialValueForSpdyProxyEnabled_) { | 69 if (initialValueForSpdyProxyEnabled_) { |
69 [[NSUserDefaults standardUserDefaults] | 70 [[NSUserDefaults standardUserDefaults] |
70 setObject:initialValueForSpdyProxyEnabled_.get() | 71 setObject:initialValueForSpdyProxyEnabled_ |
71 forKey:kSpdyProxyEnabled]; | 72 forKey:kSpdyProxyEnabled]; |
72 } else { | 73 } else { |
73 [[NSUserDefaults standardUserDefaults] | 74 [[NSUserDefaults standardUserDefaults] |
74 removeObjectForKey:kSpdyProxyEnabled]; | 75 removeObjectForKey:kSpdyProxyEnabled]; |
75 } | 76 } |
76 } | 77 } |
77 | 78 |
78 web::TestWebThreadBundle thread_bundle_; | 79 web::TestWebThreadBundle thread_bundle_; |
79 IOSChromeScopedTestingChromeBrowserStateManager scoped_browser_state_manager_; | 80 IOSChromeScopedTestingChromeBrowserStateManager scoped_browser_state_manager_; |
80 std::unique_ptr<TestChromeBrowserState> chrome_browser_state_; | 81 std::unique_ptr<TestChromeBrowserState> chrome_browser_state_; |
81 base::mac::ScopedNSAutoreleasePool pool_; | 82 id mockDelegate_; |
82 base::scoped_nsprotocol<id> mockDelegate_; | 83 NSString* initialValueForSpdyProxyEnabled_; |
83 base::scoped_nsobject<NSString> initialValueForSpdyProxyEnabled_; | |
84 }; | 84 }; |
85 | 85 |
86 // When navigation stack has more than one view controller, | 86 // When navigation stack has more than one view controller, |
87 // -popViewControllerAnimated: successfully removes the top view controller. | 87 // -popViewControllerAnimated: successfully removes the top view controller. |
88 TEST_F(SettingsNavigationControllerTest, PopController) { | 88 TEST_F(SettingsNavigationControllerTest, PopController) { |
89 base::scoped_nsobject<SettingsNavigationController> settingsController( | 89 @autoreleasepool { |
90 [SettingsNavigationController | 90 SettingsNavigationController* settingsController = |
91 newSettingsMainControllerWithMainBrowserState:chrome_browser_state_ | 91 [SettingsNavigationController |
92 .get() | 92 newSettingsMainControllerWithMainBrowserState:chrome_browser_state_ |
93 currentBrowserState:chrome_browser_state_ | 93 .get() |
94 .get() | 94 currentBrowserState:chrome_browser_state_ |
95 delegate:nil]); | 95 .get() |
96 base::scoped_nsobject<UIViewController> viewController( | 96 delegate:nil]; |
97 [[UIViewController alloc] initWithNibName:nil bundle:nil]); | 97 UIViewController* viewController = |
98 [settingsController pushViewController:viewController animated:NO]; | 98 [[UIViewController alloc] initWithNibName:nil bundle:nil]; |
99 EXPECT_EQ(2U, [[settingsController viewControllers] count]); | 99 [settingsController pushViewController:viewController animated:NO]; |
| 100 EXPECT_EQ(2U, [[settingsController viewControllers] count]); |
100 | 101 |
101 UIViewController* poppedViewController = | 102 UIViewController* poppedViewController = |
102 [settingsController popViewControllerAnimated:NO]; | 103 [settingsController popViewControllerAnimated:NO]; |
103 EXPECT_NSEQ(viewController, poppedViewController); | 104 EXPECT_NSEQ(viewController, poppedViewController); |
104 EXPECT_EQ(1U, [[settingsController viewControllers] count]); | 105 EXPECT_EQ(1U, [[settingsController viewControllers] count]); |
| 106 } |
105 } | 107 } |
106 | 108 |
107 // When the navigation stack has only one view controller, | 109 // When the navigation stack has only one view controller, |
108 // -popViewControllerAnimated: returns false. | 110 // -popViewControllerAnimated: returns false. |
109 TEST_F(SettingsNavigationControllerTest, DontPopRootController) { | 111 TEST_F(SettingsNavigationControllerTest, DontPopRootController) { |
110 base::scoped_nsobject<SettingsNavigationController> settingsController( | 112 @autoreleasepool { |
111 [SettingsNavigationController | 113 SettingsNavigationController* settingsController = |
112 newSettingsMainControllerWithMainBrowserState:chrome_browser_state_ | 114 [SettingsNavigationController |
113 .get() | 115 newSettingsMainControllerWithMainBrowserState:chrome_browser_state_ |
114 currentBrowserState:chrome_browser_state_ | 116 .get() |
115 .get() | 117 currentBrowserState:chrome_browser_state_ |
116 delegate:nil]); | 118 .get() |
117 EXPECT_EQ(1U, [[settingsController viewControllers] count]); | 119 delegate:nil]; |
| 120 EXPECT_EQ(1U, [[settingsController viewControllers] count]); |
118 | 121 |
119 EXPECT_FALSE([settingsController popViewControllerAnimated:NO]); | 122 EXPECT_FALSE([settingsController popViewControllerAnimated:NO]); |
| 123 } |
120 } | 124 } |
121 | 125 |
122 // When the settings navigation stack has more than one view controller, calling | 126 // When the settings navigation stack has more than one view controller, calling |
123 // -popViewControllerOrCloseSettingsAnimated: pops the top view controller to | 127 // -popViewControllerOrCloseSettingsAnimated: pops the top view controller to |
124 // reveal the view controller underneath. | 128 // reveal the view controller underneath. |
125 TEST_F(SettingsNavigationControllerTest, | 129 TEST_F(SettingsNavigationControllerTest, |
126 PopWhenNavigationStackSizeIsGreaterThanOne) { | 130 PopWhenNavigationStackSizeIsGreaterThanOne) { |
127 base::scoped_nsobject<SettingsNavigationController> settingsController( | 131 @autoreleasepool { |
128 [SettingsNavigationController | 132 SettingsNavigationController* settingsController = |
129 newSettingsMainControllerWithMainBrowserState:chrome_browser_state_ | 133 [SettingsNavigationController |
130 .get() | 134 newSettingsMainControllerWithMainBrowserState:chrome_browser_state_ |
131 currentBrowserState:chrome_browser_state_ | 135 .get() |
132 .get() | 136 currentBrowserState:chrome_browser_state_ |
133 delegate:mockDelegate_]); | 137 .get() |
134 base::scoped_nsobject<UIViewController> viewController( | 138 delegate:mockDelegate_]; |
135 [[UIViewController alloc] initWithNibName:nil bundle:nil]); | 139 UIViewController* viewController = |
136 [settingsController pushViewController:viewController animated:NO]; | 140 [[UIViewController alloc] initWithNibName:nil bundle:nil]; |
137 EXPECT_EQ(2U, [[settingsController viewControllers] count]); | 141 [settingsController pushViewController:viewController animated:NO]; |
138 [[mockDelegate_ reject] closeSettings]; | 142 EXPECT_EQ(2U, [[settingsController viewControllers] count]); |
139 [settingsController popViewControllerOrCloseSettingsAnimated:NO]; | 143 [[mockDelegate_ reject] closeSettings]; |
140 EXPECT_EQ(1U, [[settingsController viewControllers] count]); | 144 [settingsController popViewControllerOrCloseSettingsAnimated:NO]; |
141 EXPECT_OCMOCK_VERIFY(mockDelegate_); | 145 EXPECT_EQ(1U, [[settingsController viewControllers] count]); |
| 146 EXPECT_OCMOCK_VERIFY(mockDelegate_); |
| 147 } |
142 } | 148 } |
143 | 149 |
144 // When the settings navigation stack only has one view controller, calling | 150 // When the settings navigation stack only has one view controller, calling |
145 // -popViewControllerOrCloseSettingsAnimated: calls -closeSettings on the | 151 // -popViewControllerOrCloseSettingsAnimated: calls -closeSettings on the |
146 // delegate. | 152 // delegate. |
147 TEST_F(SettingsNavigationControllerTest, | 153 TEST_F(SettingsNavigationControllerTest, |
148 CloseSettingsWhenNavigationStackSizeIsOne) { | 154 CloseSettingsWhenNavigationStackSizeIsOne) { |
149 base::scoped_nsobject<SettingsNavigationController> settingsController( | 155 @autoreleasepool { |
150 [SettingsNavigationController | 156 SettingsNavigationController* settingsController = |
151 newSettingsMainControllerWithMainBrowserState:chrome_browser_state_ | 157 [SettingsNavigationController |
152 .get() | 158 newSettingsMainControllerWithMainBrowserState:chrome_browser_state_ |
153 currentBrowserState:chrome_browser_state_ | 159 .get() |
154 .get() | 160 currentBrowserState:chrome_browser_state_ |
155 delegate:mockDelegate_]); | 161 .get() |
156 EXPECT_EQ(1U, [[settingsController viewControllers] count]); | 162 delegate:mockDelegate_]; |
157 [[mockDelegate_ expect] closeSettings]; | 163 EXPECT_EQ(1U, [[settingsController viewControllers] count]); |
158 [settingsController popViewControllerOrCloseSettingsAnimated:NO]; | 164 [[mockDelegate_ expect] closeSettings]; |
159 EXPECT_OCMOCK_VERIFY(mockDelegate_); | 165 [settingsController popViewControllerOrCloseSettingsAnimated:NO]; |
| 166 EXPECT_OCMOCK_VERIFY(mockDelegate_); |
| 167 } |
160 } | 168 } |
161 | 169 |
162 } // namespace | 170 } // namespace |
OLD | NEW |