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
3 // found in the LICENSE file.
4
5 #include "base/logging.h"
6 #include "chromeos/ime/component_extension_ime_manager.h"
7 #include "chromeos/ime/extension_ime_util.h"
8 #include "chromeos/ime/mock_component_extension_ime_manager_delegate.h"
9 #include "testing/gtest/include/gtest/gtest.h"
10
11 namespace chromeos {
12 namespace input_method {
13
14 namespace {
15
16 class ComponentExtensionIMEManagerTest :
17 public testing::Test,
18 public ComponentExtensionIMEManager::Observer {
19 public:
ComponentExtensionIMEManagerTest()20 ComponentExtensionIMEManagerTest()
21 : mock_delegate_(NULL),
22 on_initialized_callcount_(0) {
23 }
24
SetUp()25 virtual void SetUp() {
26 ime_list_.clear();
27
28 ComponentExtensionIME ext1;
29 ext1.id = "ext1_id";
30 ext1.description = "ext1_description";
31 ext1.options_page_url =
32 GURL("chrome-extension://" + ext1.id + "/options.html");
33 ext1.path = base::FilePath("ext1_file_path");
34
35 ComponentExtensionEngine ext1_engine1;
36 ext1_engine1.engine_id = "ext1_engine1_engine_id";
37 ext1_engine1.display_name = "ext1_engine_1_display_name";
38 ext1_engine1.language_codes.push_back("en");
39 ext1_engine1.layouts.push_back("us");
40 ext1.engines.push_back(ext1_engine1);
41
42 ComponentExtensionEngine ext1_engine2;
43 ext1_engine2.engine_id = "ext1_engine2_engine_id";
44 ext1_engine2.display_name = "ext1_engine2_display_name";
45 ext1_engine2.language_codes.push_back("en");
46 ext1_engine2.layouts.push_back("us");
47 ext1.engines.push_back(ext1_engine2);
48
49 ComponentExtensionEngine ext1_engine3;
50 ext1_engine3.engine_id = "ext1_engine3_engine_id";
51 ext1_engine3.display_name = "ext1_engine3_display_name";
52 ext1_engine3.language_codes.push_back("ja");
53 ext1_engine3.layouts.push_back("us");
54 ext1.engines.push_back(ext1_engine3);
55
56 ime_list_.push_back(ext1);
57
58 ComponentExtensionIME ext2;
59 ext2.id = "ext2_id";
60 ext2.description = "ext2_description";
61 ext2.path = base::FilePath("ext2_file_path");
62
63 ComponentExtensionEngine ext2_engine1;
64 ext2_engine1.engine_id = "ext2_engine1_engine_id";
65 ext2_engine1.display_name = "ext2_engine_1_display_name";
66 ext2_engine1.language_codes.push_back("en");
67 ext2_engine1.layouts.push_back("us");
68 ext2.engines.push_back(ext2_engine1);
69
70 ComponentExtensionEngine ext2_engine2;
71 ext2_engine2.engine_id = "ext2_engine2_engine_id";
72 ext2_engine2.display_name = "ext2_engine2_display_name";
73 ext2_engine2.language_codes.push_back("hi");
74 ext2_engine2.layouts.push_back("us");
75 ext2.engines.push_back(ext2_engine2);
76
77 ComponentExtensionEngine ext2_engine3;
78 ext2_engine3.engine_id = "ext2_engine3_engine_id";
79 ext2_engine3.display_name = "ext2_engine3_display_name";
80 ext2_engine3.language_codes.push_back("ja");
81 ext2_engine3.layouts.push_back("jp");
82 ext2.engines.push_back(ext2_engine3);
83
84 ime_list_.push_back(ext2);
85
86 ComponentExtensionIME ext3;
87 ext3.id = "ext3_id";
88 ext3.description = "ext3_description";
89 ext3.options_page_url =
90 GURL("chrome-extension://" + ext3.id + "/options.html");
91 ext3.path = base::FilePath("ext3_file_path");
92
93 ComponentExtensionEngine ext3_engine1;
94 ext3_engine1.engine_id = "ext3_engine1_engine_id";
95 ext3_engine1.display_name = "ext3_engine_1_display_name";
96 ext3_engine1.language_codes.push_back("hi");
97 ext3_engine1.layouts.push_back("us");
98 ext3.engines.push_back(ext3_engine1);
99
100 ComponentExtensionEngine ext3_engine2;
101 ext3_engine2.engine_id = "ext3_engine2_engine_id";
102 ext3_engine2.display_name = "ext3_engine2_display_name";
103 ext3_engine2.language_codes.push_back("en");
104 ext3_engine2.layouts.push_back("us");
105 ext3.engines.push_back(ext3_engine2);
106
107 ComponentExtensionEngine ext3_engine3;
108 ext3_engine3.engine_id = "ext3_engine3_engine_id";
109 ext3_engine3.display_name = "ext3_engine3_display_name";
110 ext3_engine3.language_codes.push_back("en");
111 ext3_engine3.layouts.push_back("us");
112 ext3.engines.push_back(ext3_engine3);
113
114 ime_list_.push_back(ext3);
115
116 mock_delegate_ = new MockComponentExtIMEManagerDelegate();
117 mock_delegate_->set_ime_list(ime_list_);
118 component_ext_mgr_.reset(new ComponentExtensionIMEManager());
119 component_ext_mgr_->AddObserver(this);
120 EXPECT_FALSE(component_ext_mgr_->IsInitialized());
121 component_ext_mgr_->Initialize(
122 scoped_ptr<ComponentExtensionIMEManagerDelegate>(
123 mock_delegate_).Pass());
124 EXPECT_TRUE(component_ext_mgr_->IsInitialized());
125
126 }
127
TearDown()128 virtual void TearDown() {
129 EXPECT_EQ(1, on_initialized_callcount_);
130 component_ext_mgr_->RemoveObserver(this);
131 }
132
133 protected:
134 MockComponentExtIMEManagerDelegate* mock_delegate_;
135 scoped_ptr<ComponentExtensionIMEManager> component_ext_mgr_;
136 std::vector<ComponentExtensionIME> ime_list_;
137
138 private:
OnInitialized()139 virtual void OnInitialized() OVERRIDE {
140 ++on_initialized_callcount_;
141 }
142
143 int on_initialized_callcount_;
144
145 DISALLOW_COPY_AND_ASSIGN(ComponentExtensionIMEManagerTest);
146 };
147
TEST_F(ComponentExtensionIMEManagerTest,LoadComponentExtensionIMETest)148 TEST_F(ComponentExtensionIMEManagerTest, LoadComponentExtensionIMETest) {
149 for (size_t i = 0; i < ime_list_.size(); ++i) {
150 for (size_t j = 0; j < ime_list_[i].engines.size(); ++j) {
151 const std::string input_method_id =
152 extension_ime_util::GetComponentInputMethodID(
153 ime_list_[i].id,
154 ime_list_[i].engines[j].engine_id);
155 component_ext_mgr_->LoadComponentExtensionIME(input_method_id);
156 EXPECT_EQ(ime_list_[i].id, mock_delegate_->last_loaded_extension_id());
157 }
158 }
159 EXPECT_EQ(9, mock_delegate_->load_call_count());
160 }
161
TEST_F(ComponentExtensionIMEManagerTest,UnloadComponentExtensionIMETest)162 TEST_F(ComponentExtensionIMEManagerTest, UnloadComponentExtensionIMETest) {
163 for (size_t i = 0; i < ime_list_.size(); ++i) {
164 for (size_t j = 0; j < ime_list_[i].engines.size(); ++j) {
165 const std::string input_method_id =
166 extension_ime_util::GetComponentInputMethodID(
167 ime_list_[i].id,
168 ime_list_[i].engines[j].engine_id);
169 component_ext_mgr_->UnloadComponentExtensionIME(input_method_id);
170 EXPECT_EQ(ime_list_[i].id, mock_delegate_->last_unloaded_extension_id());
171 }
172 }
173 EXPECT_EQ(9, mock_delegate_->unload_call_count());
174 }
175
TEST_F(ComponentExtensionIMEManagerTest,IsWhitelistedTest)176 TEST_F(ComponentExtensionIMEManagerTest, IsWhitelistedTest) {
177 EXPECT_TRUE(component_ext_mgr_->IsWhitelisted(
178 extension_ime_util::GetComponentInputMethodID(
179 ime_list_[0].id,
180 ime_list_[0].engines[0].engine_id)));
181 EXPECT_FALSE(component_ext_mgr_->IsWhitelisted(
182 extension_ime_util::GetInputMethodID(
183 ime_list_[0].id,
184 ime_list_[0].engines[0].engine_id)));
185 EXPECT_FALSE(component_ext_mgr_->IsWhitelisted("mozc"));
186 EXPECT_FALSE(component_ext_mgr_->IsWhitelisted(
187 extension_ime_util::GetInputMethodID("AAAA", "012345")));
188 EXPECT_FALSE(component_ext_mgr_->IsWhitelisted(
189 extension_ime_util::GetComponentInputMethodID(
190 "AAAA", "012345")));
191 }
192
TEST_F(ComponentExtensionIMEManagerTest,IsWhitelistedExtensionTest)193 TEST_F(ComponentExtensionIMEManagerTest, IsWhitelistedExtensionTest) {
194 EXPECT_TRUE(component_ext_mgr_->IsWhitelistedExtension(ime_list_[0].id));
195 EXPECT_TRUE(component_ext_mgr_->IsWhitelistedExtension(ime_list_[1].id));
196 EXPECT_FALSE(component_ext_mgr_->IsWhitelistedExtension("dummy"));
197 EXPECT_FALSE(component_ext_mgr_->IsWhitelistedExtension(""));
198 }
199
TEST_F(ComponentExtensionIMEManagerTest,GetNameDescriptionTest)200 TEST_F(ComponentExtensionIMEManagerTest, GetNameDescriptionTest) {
201 for (size_t i = 0; i < ime_list_.size(); ++i) {
202 for (size_t j = 0; j < ime_list_[i].engines.size(); ++j) {
203 const ComponentExtensionEngine& engine
204 = ime_list_[i].engines[j];
205
206 const std::string input_method_id =
207 extension_ime_util::GetComponentInputMethodID(
208 ime_list_[i].id,
209 engine.engine_id);
210
211 EXPECT_EQ(input_method_id,
212 component_ext_mgr_->GetId(ime_list_[i].id, engine.engine_id));
213 EXPECT_EQ(engine.display_name,
214 component_ext_mgr_->GetName(input_method_id));
215 EXPECT_EQ(engine.description,
216 component_ext_mgr_->GetDescription(input_method_id));
217 }
218 }
219 }
220
TEST_F(ComponentExtensionIMEManagerTest,ListIMEByLanguageTest)221 TEST_F(ComponentExtensionIMEManagerTest, ListIMEByLanguageTest) {
222 const std::string hindi_layout1 =
223 extension_ime_util::GetComponentInputMethodID(
224 ime_list_[1].id, ime_list_[1].engines[1].engine_id);
225 const std::string hindi_layout2 =
226 extension_ime_util::GetComponentInputMethodID(
227 ime_list_[2].id, ime_list_[2].engines[0].engine_id);
228
229 std::vector<std::string> hindi_list
230 = component_ext_mgr_->ListIMEByLanguage("hi");
231 ASSERT_EQ(2UL, hindi_list.size());
232 EXPECT_TRUE(hindi_list[0] == hindi_layout1 || hindi_list[0] == hindi_layout2);
233 EXPECT_TRUE(hindi_list[1] == hindi_layout1 || hindi_list[1] == hindi_layout2);
234
235 EXPECT_EQ(0UL, component_ext_mgr_->ListIMEByLanguage("ru").size());
236 EXPECT_EQ(0UL, component_ext_mgr_->ListIMEByLanguage("").size());
237 EXPECT_EQ(0UL, component_ext_mgr_->ListIMEByLanguage("invalid").size());
238 EXPECT_EQ(5UL, component_ext_mgr_->ListIMEByLanguage("en").size());
239 EXPECT_EQ(2UL, component_ext_mgr_->ListIMEByLanguage("ja").size());
240 }
241
TEST_F(ComponentExtensionIMEManagerTest,GetAllIMEAsInputMethodDescriptor)242 TEST_F(ComponentExtensionIMEManagerTest, GetAllIMEAsInputMethodDescriptor) {
243 input_method::InputMethodDescriptors descriptors =
244 component_ext_mgr_->GetAllIMEAsInputMethodDescriptor();
245 size_t total_ime_size = 0;
246 for (size_t i = 0; i < ime_list_.size(); ++i) {
247 total_ime_size += ime_list_[i].engines.size();
248 }
249 EXPECT_EQ(total_ime_size, descriptors.size());
250 }
251
252 } // namespace
253
254 } // namespace input_method
255 } // namespace chromeos
256