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

Side by Side Diff: ios/chrome/browser/sessions/session_service_ios_unittest.mm

Issue 2811593004: [ios] Allow having multiple session windows in a session. (Closed)
Patch Set: Rebase on origin/master. Created 3 years, 8 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 unified diff | Download patch
OLDNEW
1 // Copyright 2012 The Chromium Authors. All rights reserved. 1 // Copyright 2012 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 <Foundation/Foundation.h> 5 #import <Foundation/Foundation.h>
6 6
7 #include <memory> 7 #include <memory>
8 8
9 #include "base/files/file_path.h" 9 #include "base/files/file_path.h"
10 #include "base/files/file_util.h" 10 #include "base/files/file_util.h"
11 #include "base/files/scoped_temp_dir.h" 11 #include "base/files/scoped_temp_dir.h"
12 #include "base/path_service.h" 12 #include "base/path_service.h"
13 #include "base/run_loop.h" 13 #include "base/run_loop.h"
14 #include "base/strings/sys_string_conversions.h" 14 #include "base/strings/sys_string_conversions.h"
15 #include "base/test/scoped_task_environment.h" 15 #include "base/test/scoped_task_environment.h"
16 #include "base/threading/thread_task_runner_handle.h" 16 #include "base/threading/thread_task_runner_handle.h"
17 #include "ios/chrome/browser/chrome_paths.h" 17 #include "ios/chrome/browser/chrome_paths.h"
18 #import "ios/chrome/browser/sessions/session_ios.h"
18 #import "ios/chrome/browser/sessions/session_service_ios.h" 19 #import "ios/chrome/browser/sessions/session_service_ios.h"
19 #import "ios/chrome/browser/sessions/session_window_ios.h" 20 #import "ios/chrome/browser/sessions/session_window_ios.h"
20 #import "ios/web/public/crw_session_storage.h" 21 #import "ios/web/public/crw_session_storage.h"
21 #include "testing/gtest/include/gtest/gtest.h" 22 #include "testing/gtest/include/gtest/gtest.h"
22 #include "testing/gtest_mac.h" 23 #include "testing/gtest_mac.h"
23 #include "testing/platform_test.h" 24 #include "testing/platform_test.h"
24 25
25 #if !defined(__has_feature) || !__has_feature(objc_arc) 26 #if !defined(__has_feature) || !__has_feature(objc_arc)
26 #error "This file requires ARC support." 27 #error "This file requires ARC support."
27 #endif 28 #endif
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
61 return nil; 62 return nil;
62 63
63 session_path = session_path.Append(FILE_PATH_LITERAL("sessions")); 64 session_path = session_path.Append(FILE_PATH_LITERAL("sessions"));
64 session_path = session_path.Append(filename); 65 session_path = session_path.Append(filename);
65 if (!base::PathExists(session_path)) 66 if (!base::PathExists(session_path))
66 return nil; 67 return nil;
67 68
68 return base::SysUTF8ToNSString(session_path.AsUTF8Unsafe()); 69 return base::SysUTF8ToNSString(session_path.AsUTF8Unsafe());
69 } 70 }
70 71
71 // Create a SessionWindowIOS with |tab_count| tabs. 72 // Create a SessionIOS corresponding to |window_count| windows each with
72 SessionWindowIOS* CreateSessionWindow(NSUInteger tab_count) { 73 // |tab_count| tabs.
73 NSMutableArray<CRWSessionStorage*>* tabs = [NSMutableArray array]; 74 SessionIOS* CreateSession(NSUInteger window_count, NSUInteger tab_count) {
74 while (tabs.count < tab_count) { 75 NSMutableArray<SessionWindowIOS*>* windows = [NSMutableArray array];
75 [tabs addObject:[[CRWSessionStorage alloc] init]]; 76 while (windows.count < window_count) {
77 NSMutableArray<CRWSessionStorage*>* tabs = [NSMutableArray array];
78 while (tabs.count < tab_count) {
79 [tabs addObject:[[CRWSessionStorage alloc] init]];
80 }
81 [windows addObject:[[SessionWindowIOS alloc]
82 initWithSessions:[tabs copy]
83 selectedIndex:(tabs.count ? tabs.count - 1
84 : NSNotFound)]];
76 } 85 }
77 return [[SessionWindowIOS alloc] 86 return [[SessionIOS alloc] initWithWindows:[windows copy]];
78 initWithSessions:[tabs copy]
79 selectedIndex:(tabs.count ? tabs.count - 1 : NSNotFound)];
80 } 87 }
81 88
82 SessionServiceIOS* session_service() { return session_service_; } 89 SessionServiceIOS* session_service() { return session_service_; }
83 90
84 NSString* directory() { return directory_; } 91 NSString* directory() { return directory_; }
85 92
86 private: 93 private:
87 base::ScopedTempDir scoped_temp_directory_; 94 base::ScopedTempDir scoped_temp_directory_;
88 base::test::ScopedTaskEnvironment scoped_task_environment_; 95 base::test::ScopedTaskEnvironment scoped_task_environment_;
89 SessionServiceIOS* session_service_; 96 SessionServiceIOS* session_service_;
90 NSString* directory_; 97 NSString* directory_;
91 98
92 DISALLOW_COPY_AND_ASSIGN(SessionServiceTest); 99 DISALLOW_COPY_AND_ASSIGN(SessionServiceTest);
93 }; 100 };
94 101
95 TEST_F(SessionServiceTest, SessionPathForDirectory) { 102 TEST_F(SessionServiceTest, SessionPathForDirectory) {
96 EXPECT_NSEQ(@"session.plist", 103 EXPECT_NSEQ(@"session.plist",
97 [SessionServiceIOS sessionPathForDirectory:@""]); 104 [SessionServiceIOS sessionPathForDirectory:@""]);
98 } 105 }
99 106
100 TEST_F(SessionServiceTest, SaveSessionWindowToDirectory) { 107 TEST_F(SessionServiceTest, SaveSessionWindowToPath) {
101 [session_service() saveSessionWindow:CreateSessionWindow(0u) 108 [session_service() saveSession:CreateSession(0u, 0u)
102 directory:directory() 109 directory:directory()
103 immediately:YES]; 110 immediately:YES];
104 111
105 // Even if immediately is YES, the file is created by a task on the task 112 // Even if immediately is YES, the file is created by a task on the task
106 // runner passed to SessionServiceIOS initializer (which is the current 113 // runner passed to SessionServiceIOS initializer (which is the current
107 // thread task runner during test). Wait for the task to complete. 114 // thread task runner during test). Wait for the task to complete.
108 base::RunLoop().RunUntilIdle(); 115 base::RunLoop().RunUntilIdle();
109 116
110 NSFileManager* file_manager = [NSFileManager defaultManager]; 117 NSFileManager* file_manager = [NSFileManager defaultManager];
111 EXPECT_TRUE([file_manager removeItemAtPath:directory() error:nullptr]); 118 EXPECT_TRUE([file_manager removeItemAtPath:directory() error:nullptr]);
112 } 119 }
113 120
114 TEST_F(SessionServiceTest, SaveSessionWindowToExistingDirectory) { 121 TEST_F(SessionServiceTest, SaveSessionWindowToPathDirectoryExists) {
115 ASSERT_TRUE([[NSFileManager defaultManager] createDirectoryAtPath:directory() 122 ASSERT_TRUE([[NSFileManager defaultManager] createDirectoryAtPath:directory()
116 withIntermediateDirectories:YES 123 withIntermediateDirectories:YES
117 attributes:nil 124 attributes:nil
118 error:nullptr]); 125 error:nullptr]);
119 126
120 [session_service() saveSessionWindow:CreateSessionWindow(0u) 127 [session_service() saveSession:CreateSession(0u, 0u)
121 directory:directory() 128 directory:directory()
122 immediately:YES]; 129 immediately:YES];
123 130
124 // Even if immediately is YES, the file is created by a task on the task 131 // Even if immediately is YES, the file is created by a task on the task
marq (ping after 24h) 2017/04/18 15:16:55 |immediately|, here and below
sdefresne 2017/04/19 14:54:41 Done.
125 // runner passed to SessionServiceIOS initializer (which is the current 132 // runner passed to SessionServiceIOS initializer (which is the current
126 // thread task runner during test). Wait for the task to complete. 133 // thread task runner during test). Wait for the task to complete.
127 base::RunLoop().RunUntilIdle(); 134 base::RunLoop().RunUntilIdle();
128 135
129 NSFileManager* file_manager = [NSFileManager defaultManager]; 136 NSFileManager* file_manager = [NSFileManager defaultManager];
130 EXPECT_TRUE([file_manager removeItemAtPath:directory() error:nullptr]); 137 EXPECT_TRUE([file_manager removeItemAtPath:directory() error:nullptr]);
131 } 138 }
132 139
133 TEST_F(SessionServiceTest, LoadSessionWindowFromDirectoryNoFile) { 140 TEST_F(SessionServiceTest, LoadSessionFromDirectoryNoFile) {
134 SessionWindowIOS* session_window = 141 SessionIOS* session =
135 [session_service() loadSessionWindowFromDirectory:directory()]; 142 [session_service() loadSessionFromDirectory:directory()];
136 EXPECT_TRUE(session_window == nil); 143 EXPECT_TRUE(session == nil);
137 } 144 }
138 145
139 TEST_F(SessionServiceTest, LoadSessionWindowFromDirectory) { 146 TEST_F(SessionServiceTest, LoadSessionFromDirectory) {
140 [session_service() saveSessionWindow:CreateSessionWindow(1u) 147 [session_service() saveSession:CreateSession(2u, 1u)
141 directory:directory() 148 directory:directory()
142 immediately:YES]; 149 immediately:YES];
143 150
144 // Even if immediately is YES, the file is created by a task on the task 151 // Even if immediately is YES, the file is created by a task on the task
145 // runner passed to SessionServiceIOS initializer (which is the current 152 // runner passed to SessionServiceIOS initializer (which is the current
146 // thread task runner during test). Wait for the task to complete. 153 // thread task runner during test). Wait for the task to complete.
147 base::RunLoop().RunUntilIdle(); 154 base::RunLoop().RunUntilIdle();
148 155
149 SessionWindowIOS* session_window = 156 SessionIOS* session =
150 [session_service() loadSessionWindowFromDirectory:directory()]; 157 [session_service() loadSessionFromDirectory:directory()];
151 EXPECT_EQ(1u, session_window.sessions.count); 158 EXPECT_EQ(2u, session.sessionWindows.count);
152 EXPECT_EQ(0u, session_window.selectedIndex); 159 for (SessionWindowIOS* sessionWindow in session.sessionWindows) {
160 EXPECT_EQ(1u, sessionWindow.sessions.count);
161 EXPECT_EQ(0u, sessionWindow.selectedIndex);
162 }
153 } 163 }
154 164
155 TEST_F(SessionServiceTest, LoadSessionWindowFromPath) { 165 TEST_F(SessionServiceTest, LoadSessionFromPath) {
156 [session_service() saveSessionWindow:CreateSessionWindow(1u) 166 [session_service() saveSession:CreateSession(2u, 1u)
157 directory:directory() 167 directory:directory()
158 immediately:YES]; 168 immediately:YES];
159 169
160 // Even if immediately is YES, the file is created by a task on the task 170 // Even if immediately is YES, the file is created by a task on the task
161 // runner passed to SessionServiceIOS initializer (which is the current 171 // runner passed to SessionServiceIOS initializer (which is the current
162 // thread task runner during test). Wait for the task to complete. 172 // thread task runner during test). Wait for the task to complete.
163 base::RunLoop().RunUntilIdle(); 173 base::RunLoop().RunUntilIdle();
164 174
165 NSString* session_path = 175 NSString* session_path =
166 [SessionServiceIOS sessionPathForDirectory:directory()]; 176 [SessionServiceIOS sessionPathForDirectory:directory()];
167 NSString* renamed_path = [session_path stringByAppendingPathExtension:@"bak"]; 177 NSString* renamed_path = [session_path stringByAppendingPathExtension:@"bak"];
168 ASSERT_NSNE(session_path, renamed_path); 178 ASSERT_NSNE(session_path, renamed_path);
169 179
170 // Rename the file. 180 // Rename the file.
171 ASSERT_TRUE([[NSFileManager defaultManager] moveItemAtPath:session_path 181 ASSERT_TRUE([[NSFileManager defaultManager] moveItemAtPath:session_path
172 toPath:renamed_path 182 toPath:renamed_path
173 error:nil]); 183 error:nil]);
174 184
175 SessionWindowIOS* session_window = 185 SessionIOS* session = [session_service() loadSessionFromPath:renamed_path];
176 [session_service() loadSessionWindowFromPath:renamed_path]; 186 EXPECT_EQ(2u, session.sessionWindows.count);
177 EXPECT_EQ(1u, session_window.sessions.count); 187 for (SessionWindowIOS* sessionWindow in session.sessionWindows) {
178 EXPECT_EQ(0u, session_window.selectedIndex); 188 EXPECT_EQ(1u, sessionWindow.sessions.count);
189 EXPECT_EQ(0u, sessionWindow.selectedIndex);
190 }
179 } 191 }
180 192
181 TEST_F(SessionServiceTest, LoadCorruptedSessionWindow) { 193 TEST_F(SessionServiceTest, LoadCorruptedSession) {
182 NSString* session_path = 194 NSString* session_path =
183 SessionPathForTestData(FILE_PATH_LITERAL("corrupted.plist")); 195 SessionPathForTestData(FILE_PATH_LITERAL("corrupted.plist"));
184 ASSERT_NSNE(nil, session_path); 196 ASSERT_NSNE(nil, session_path);
185 SessionWindowIOS* session_window = 197 SessionIOS* session = [session_service() loadSessionFromPath:session_path];
186 [session_service() loadSessionWindowFromPath:session_path]; 198 EXPECT_TRUE(session == nil);
187 EXPECT_TRUE(session_window == nil);
188 } 199 }
189 200
190 // TODO(crbug.com/661633): remove this once M67 has shipped (i.e. once more 201 // TODO(crbug.com/661633): remove this once M67 has shipped (i.e. once more
191 // than a year has passed since the introduction of the compatibility code). 202 // than a year has passed since the introduction of the compatibility code).
192 TEST_F(SessionServiceTest, LoadM57Session) { 203 TEST_F(SessionServiceTest, LoadM57Session) {
193 NSString* session_path = 204 NSString* session_path =
194 SessionPathForTestData(FILE_PATH_LITERAL("session_m57.plist")); 205 SessionPathForTestData(FILE_PATH_LITERAL("session_m57.plist"));
195 ASSERT_NSNE(nil, session_path); 206 ASSERT_NSNE(nil, session_path);
196 SessionWindowIOS* session_window = 207 SessionIOS* session = [session_service() loadSessionFromPath:session_path];
197 [session_service() loadSessionWindowFromPath:session_path]; 208 EXPECT_EQ(1u, session.sessionWindows.count);
198 EXPECT_TRUE(session_window != nil);
199 } 209 }
200 210
201 // TODO(crbug.com/661633): remove this once M68 has shipped (i.e. once more 211 // TODO(crbug.com/661633): remove this once M68 has shipped (i.e. once more
202 // than a year has passed since the introduction of the compatibility code). 212 // than a year has passed since the introduction of the compatibility code).
203 TEST_F(SessionServiceTest, LoadM58Session) { 213 TEST_F(SessionServiceTest, LoadM58Session) {
204 NSString* session_path = 214 NSString* session_path =
205 SessionPathForTestData(FILE_PATH_LITERAL("session_m58.plist")); 215 SessionPathForTestData(FILE_PATH_LITERAL("session_m58.plist"));
206 ASSERT_NSNE(nil, session_path); 216 ASSERT_NSNE(nil, session_path);
207 SessionWindowIOS* session_window = 217 SessionIOS* session = [session_service() loadSessionFromPath:session_path];
208 [session_service() loadSessionWindowFromPath:session_path]; 218 EXPECT_EQ(1u, session.sessionWindows.count);
209 EXPECT_TRUE(session_window != nil);
210 } 219 }
211 220
212 } // anonymous namespace 221 } // anonymous namespace
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698