OLD | NEW |
---|---|
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/strings/sys_string_conversions.h" | 13 #include "base/strings/sys_string_conversions.h" |
14 #include "ios/chrome/browser/browser_state/test_chrome_browser_state.h" | 14 #include "base/test/scoped_task_environment.h" |
15 #include "base/threading/thread_task_runner_handle.h" | |
15 #include "ios/chrome/browser/chrome_paths.h" | 16 #include "ios/chrome/browser/chrome_paths.h" |
16 #import "ios/chrome/browser/sessions/session_service_ios.h" | 17 #import "ios/chrome/browser/sessions/session_service_ios.h" |
17 #import "ios/chrome/browser/sessions/session_window_ios.h" | 18 #import "ios/chrome/browser/sessions/session_window_ios.h" |
18 #include "ios/web/public/navigation_item.h" | |
19 #import "ios/web/public/navigation_manager.h" | |
20 #include "ios/web/public/test/test_web_thread_bundle.h" | |
21 #include "testing/gtest/include/gtest/gtest.h" | 19 #include "testing/gtest/include/gtest/gtest.h" |
22 #include "testing/gtest_mac.h" | 20 #include "testing/gtest_mac.h" |
23 #include "testing/platform_test.h" | 21 #include "testing/platform_test.h" |
24 #import "third_party/ocmock/OCMock/OCMock.h" | |
25 | 22 |
26 #if !defined(__has_feature) || !__has_feature(objc_arc) | 23 #if !defined(__has_feature) || !__has_feature(objc_arc) |
27 #error "This file requires ARC support." | 24 #error "This file requires ARC support." |
28 #endif | 25 #endif |
29 | 26 |
30 namespace { | 27 namespace { |
31 | 28 |
32 // Fixture Class. Takes care of deleting the directory used to store test data. | 29 // Fixture Class. Takes care of deleting the directory used to store test data. |
33 class SessionServiceTest : public PlatformTest { | 30 class SessionServiceTest : public PlatformTest { |
34 public: | 31 public: |
35 SessionServiceTest() = default; | 32 SessionServiceTest() = default; |
36 ~SessionServiceTest() override = default; | 33 ~SessionServiceTest() override = default; |
37 | 34 |
38 protected: | 35 protected: |
39 void SetUp() override { | 36 void SetUp() override { |
marq (ping after 24h)
2017/04/11 10:46:29
Can this move into the constructor?
sdefresne
2017/04/11 11:49:41
ScopedTempDir::CreateUniqueTempDir() does return a
| |
40 PlatformTest::SetUp(); | 37 PlatformTest::SetUp(); |
41 ASSERT_TRUE(test_dir_.CreateUniqueTempDir()); | 38 ASSERT_TRUE(scoped_temp_directory_.CreateUniqueTempDir()); |
42 TestChromeBrowserState::Builder test_cbs_builder; | 39 base::FilePath directory_name = scoped_temp_directory_.GetPath(); |
43 test_cbs_builder.SetPath(test_dir_.GetPath()); | 40 directory_name = directory_name.Append(FILE_PATH_LITERAL("sessions")); |
44 chrome_browser_state_ = test_cbs_builder.Build(); | 41 directory_name_ = base::SysUTF8ToNSString(directory_name.AsUTF8Unsafe()); |
45 directory_name_ = [base::SysUTF8ToNSString( | 42 |
46 chrome_browser_state_->GetStatePath().value()) copy]; | 43 scoped_refptr<base::SequencedTaskRunner> task_runner = |
44 base::ThreadTaskRunnerHandle::Get(); | |
45 session_service_ = | |
46 [[SessionServiceIOS alloc] initWithTaskRunner:task_runner]; | |
47 } | 47 } |
48 | 48 |
49 // Helper function to load a SessionWindowIOS from a given testdata | 49 void TearDown() override { session_service_ = nil; } |
50 // |filename|. Returns nil if there was an error loading the session. | 50 |
51 SessionWindowIOS* LoadSessionFromTestDataFile( | 51 // Returns the path to serialized SessionWindowIOS from a testdata file named |
52 const base::FilePath::StringType& filename) { | 52 // |filename| or nil if the file cannot be found. |
53 SessionServiceIOS* service = [SessionServiceIOS sharedService]; | 53 NSString* SessionPathForTestData(const base::FilePath::CharType* filename) { |
54 base::FilePath plist_path; | 54 base::FilePath session_path; |
55 bool success = PathService::Get(ios::DIR_TEST_DATA, &plist_path); | 55 if (!PathService::Get(ios::DIR_TEST_DATA, &session_path)) |
56 EXPECT_TRUE(success); | |
57 if (!success) { | |
58 return nil; | 56 return nil; |
59 } | |
60 | 57 |
61 plist_path = plist_path.AppendASCII("sessions"); | 58 session_path = session_path.Append(FILE_PATH_LITERAL("sessions")); |
62 plist_path = plist_path.Append(filename); | 59 session_path = session_path.Append(filename); |
63 EXPECT_TRUE(base::PathExists(plist_path)); | 60 if (!base::PathExists(session_path)) |
61 return nil; | |
64 | 62 |
65 NSString* path = base::SysUTF8ToNSString(plist_path.value()); | 63 return base::SysUTF8ToNSString(session_path.AsUTF8Unsafe()); |
66 return [service loadWindowFromPath:path]; | |
67 } | 64 } |
68 | 65 |
69 ios::ChromeBrowserState* chrome_browser_state() { | 66 NSData* CreateSerializedSessionWindow() { |
70 return chrome_browser_state_.get(); | 67 SessionWindowIOS* session_window = |
68 [[SessionWindowIOS alloc] initWithSessions:@[] | |
69 selectedIndex:NSNotFound]; | |
70 return [NSKeyedArchiver archivedDataWithRootObject:session_window]; | |
71 } | 71 } |
72 | 72 |
73 SessionServiceIOS* session_service() { return session_service_; } | |
74 | |
73 NSString* directory_name() { return directory_name_; } | 75 NSString* directory_name() { return directory_name_; } |
74 | 76 |
77 NSString* session_path() { | |
78 return [session_service() sessionPathForDirectory:directory_name()]; | |
79 } | |
80 | |
75 private: | 81 private: |
76 base::ScopedTempDir test_dir_; | 82 base::ScopedTempDir scoped_temp_directory_; |
77 web::TestWebThreadBundle thread_bundle_; | 83 base::test::ScopedTaskEnvironment scoped_task_environment_; |
78 std::unique_ptr<ios::ChromeBrowserState> chrome_browser_state_; | 84 SessionServiceIOS* session_service_; |
79 NSString* directory_name_; | 85 NSString* directory_name_; |
80 | 86 |
81 DISALLOW_COPY_AND_ASSIGN(SessionServiceTest); | 87 DISALLOW_COPY_AND_ASSIGN(SessionServiceTest); |
82 }; | 88 }; |
83 | 89 |
84 TEST_F(SessionServiceTest, Singleton) { | 90 TEST_F(SessionServiceTest, SaveWindowToDirectory) { |
85 SessionServiceIOS* service = [SessionServiceIOS sharedService]; | 91 NSData* session_data = CreateSerializedSessionWindow(); |
86 EXPECT_TRUE(service != nil); | 92 ASSERT_NSNE(nil, session_data); |
87 | 93 |
88 SessionServiceIOS* another_service = [SessionServiceIOS sharedService]; | 94 [session_service() performSaveSessionData:session_data |
89 EXPECT_TRUE(another_service != nil); | 95 sessionPath:session_path()]; |
90 | |
91 EXPECT_TRUE(service == another_service); | |
92 } | |
93 | |
94 TEST_F(SessionServiceTest, SaveWindowToDirectory) { | |
95 id session_window_mock = | |
96 [OCMockObject niceMockForClass:[SessionWindowIOS class]]; | |
97 SessionServiceIOS* service = [SessionServiceIOS sharedService]; | |
98 [service performSaveWindow:session_window_mock toDirectory:directory_name()]; | |
99 | 96 |
100 NSFileManager* file_manager = [NSFileManager defaultManager]; | 97 NSFileManager* file_manager = [NSFileManager defaultManager]; |
101 EXPECT_TRUE([file_manager removeItemAtPath:directory_name() error:nullptr]); | 98 EXPECT_TRUE([file_manager removeItemAtPath:directory_name() error:nullptr]); |
102 } | 99 } |
103 | 100 |
104 TEST_F(SessionServiceTest, SaveWindowToDirectoryAlreadyExistent) { | 101 TEST_F(SessionServiceTest, SaveWindowToDirectoryAlreadyExistent) { |
105 id session_window_mock = | 102 ASSERT_TRUE([[NSFileManager defaultManager] |
106 [OCMockObject niceMockForClass:[SessionWindowIOS class]]; | |
107 EXPECT_TRUE([[NSFileManager defaultManager] | |
108 createDirectoryAtPath:directory_name() | 103 createDirectoryAtPath:directory_name() |
109 withIntermediateDirectories:YES | 104 withIntermediateDirectories:YES |
110 attributes:nil | 105 attributes:nil |
111 error:nullptr]); | 106 error:nullptr]); |
112 | 107 |
113 SessionServiceIOS* service = [SessionServiceIOS sharedService]; | 108 NSData* session_data = CreateSerializedSessionWindow(); |
114 [service performSaveWindow:session_window_mock toDirectory:directory_name()]; | 109 ASSERT_NSNE(nil, session_data); |
110 | |
111 [session_service() performSaveSessionData:session_data | |
112 sessionPath:session_path()]; | |
115 | 113 |
116 NSFileManager* file_manager = [NSFileManager defaultManager]; | 114 NSFileManager* file_manager = [NSFileManager defaultManager]; |
117 EXPECT_TRUE([file_manager removeItemAtPath:directory_name() error:nullptr]); | 115 EXPECT_TRUE([file_manager removeItemAtPath:directory_name() error:nullptr]); |
118 } | 116 } |
119 | 117 |
120 TEST_F(SessionServiceTest, LoadEmptyWindowFromDirectory) { | 118 TEST_F(SessionServiceTest, LoadEmptyWindowFromDirectory) { |
121 SessionServiceIOS* service = [SessionServiceIOS sharedService]; | 119 SessionServiceIOS* service = session_service(); |
122 SessionWindowIOS* session_window = | 120 SessionWindowIOS* session_window = |
123 [service loadWindowForBrowserState:chrome_browser_state()]; | 121 [service loadSessionWindowFromPath:session_path()]; |
124 EXPECT_TRUE(session_window == nil); | 122 EXPECT_TRUE(session_window == nil); |
125 } | 123 } |
126 | 124 |
127 TEST_F(SessionServiceTest, LoadWindowFromDirectory) { | 125 TEST_F(SessionServiceTest, LoadWindowFromDirectory) { |
128 SessionServiceIOS* service = [SessionServiceIOS sharedService]; | 126 NSData* session_data = CreateSerializedSessionWindow(); |
129 SessionWindowIOS* origSessionWindow = [[SessionWindowIOS alloc] init]; | 127 ASSERT_NSNE(nil, session_data); |
130 [service performSaveWindow:origSessionWindow toDirectory:directory_name()]; | 128 |
129 [session_service() performSaveSessionData:session_data | |
130 sessionPath:session_path()]; | |
131 | 131 |
132 SessionWindowIOS* session_window = | 132 SessionWindowIOS* session_window = |
133 [service loadWindowForBrowserState:chrome_browser_state()]; | 133 [session_service() loadSessionWindowFromPath:session_path()]; |
134 EXPECT_TRUE(session_window != nil); | 134 EXPECT_TRUE(session_window != nil); |
135 EXPECT_EQ(NSNotFound, static_cast<NSInteger>(session_window.selectedIndex)); | 135 EXPECT_EQ(NSNotFound, static_cast<NSInteger>(session_window.selectedIndex)); |
136 EXPECT_EQ(0U, session_window.sessions.count); | 136 EXPECT_EQ(0U, session_window.sessions.count); |
137 } | 137 } |
138 | 138 |
139 TEST_F(SessionServiceTest, LoadCorruptedWindow) { | 139 TEST_F(SessionServiceTest, LoadCorruptedWindow) { |
140 NSString* session_path = | |
141 SessionPathForTestData(FILE_PATH_LITERAL("corrupted.plist")); | |
142 ASSERT_NSNE(nil, session_path); | |
140 SessionWindowIOS* session_window = | 143 SessionWindowIOS* session_window = |
141 LoadSessionFromTestDataFile(FILE_PATH_LITERAL("corrupted.plist")); | 144 [session_service() loadSessionWindowFromPath:session_path]; |
142 EXPECT_TRUE(session_window == nil); | 145 EXPECT_TRUE(session_window == nil); |
143 } | 146 } |
144 | 147 |
145 // TODO(crbug.com/661633): remove this once M67 has shipped (i.e. once more | 148 // TODO(crbug.com/661633): remove this once M67 has shipped (i.e. once more |
146 // than a year has passed since the introduction of the compatibility code). | 149 // than a year has passed since the introduction of the compatibility code). |
147 TEST_F(SessionServiceTest, LoadM57Session) { | 150 TEST_F(SessionServiceTest, LoadM57Session) { |
151 NSString* session_path = | |
152 SessionPathForTestData(FILE_PATH_LITERAL("session_m57.plist")); | |
153 ASSERT_NSNE(nil, session_path); | |
148 SessionWindowIOS* session_window = | 154 SessionWindowIOS* session_window = |
149 LoadSessionFromTestDataFile(FILE_PATH_LITERAL("session_m57.plist")); | 155 [session_service() loadSessionWindowFromPath:session_path]; |
150 EXPECT_TRUE(session_window != nil); | 156 EXPECT_TRUE(session_window != nil); |
151 } | 157 } |
152 | 158 |
153 // TODO(crbug.com/661633): remove this once M68 has shipped (i.e. once more | 159 // TODO(crbug.com/661633): remove this once M68 has shipped (i.e. once more |
154 // than a year has passed since the introduction of the compatibility code). | 160 // than a year has passed since the introduction of the compatibility code). |
155 TEST_F(SessionServiceTest, LoadM58Session) { | 161 TEST_F(SessionServiceTest, LoadM58Session) { |
162 NSString* session_path = | |
163 SessionPathForTestData(FILE_PATH_LITERAL("session_m58.plist")); | |
164 ASSERT_NSNE(nil, session_path); | |
156 SessionWindowIOS* session_window = | 165 SessionWindowIOS* session_window = |
157 LoadSessionFromTestDataFile(FILE_PATH_LITERAL("session_m58.plist")); | 166 [session_service() loadSessionWindowFromPath:session_path]; |
158 EXPECT_TRUE(session_window != nil); | 167 EXPECT_TRUE(session_window != nil); |
159 } | 168 } |
160 | 169 |
161 } // anonymous namespace | 170 } // anonymous namespace |
OLD | NEW |