1 // Copyright (c) 2012 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 // TODO(nona): Add more test case, especially fail case. 5 6 #include "chromeos/dbus/ibus/ibus_object.h" 7 8 #include <string> 9 #include <vector> 10 #include "base/logging.h" 11 #include "base/memory/scoped_ptr.h" 12 #include "base/values.h" 13 #include "dbus/message.h" 14 #include "testing/gtest/include/gtest/gtest.h" 15 16 namespace chromeos { 17 18 TEST(IBusObjectTest, WriteReadTest) { 19 scoped_ptr<dbus::Response> message(dbus::Response::CreateEmpty()); 20 dbus::MessageWriter writer(message.get()); 21 22 const char kSampleTypeName1[] = "Sample Type Name 1"; 23 const char kSampleTypeName2[] = "Sample Type Name 2"; 24 const char kSampleText1[] = "Sample Text 1"; 25 const char kSampleText2[] = "Sample Text 2"; 26 const uint32 kSampleUint32 = 12345UL; 27 const int32 kSampleInt32 = 54321; 28 const bool kSampleBool = false; 29 const uint32 kSampleArrayOfUint32Count = 10UL; 30 const char kAttachmentKey[] = "key"; 31 const char kStringAttachment[] = "Attachment String Value"; 32 33 // Create ibus object. 34 IBusObjectWriter ibus_object_writer(kSampleTypeName1, "suibauv", &writer); 35 36 // Write attachment field. 37 scoped_ptr<base::Value> write_value( 38 base::Value::CreateStringValue(kStringAttachment)); 39 ibus_object_writer.AddAttachment(kAttachmentKey, *write_value.get()); 40 ibus_object_writer.CloseHeader(); 41 42 // Write contents values. 43 ibus_object_writer.AppendString(kSampleText1); 44 ibus_object_writer.AppendUint32(kSampleUint32); 45 ibus_object_writer.AppendInt32(kSampleInt32); 46 ibus_object_writer.AppendBool(kSampleBool); 47 dbus::MessageWriter array_writer(NULL); 48 ibus_object_writer.OpenArray("u", &array_writer); 49 for (uint32 i = 0; i < kSampleArrayOfUint32Count; ++i) 50 array_writer.AppendUint32(i); 51 ibus_object_writer.CloseContainer(&array_writer); 52 IBusObjectWriter ibus_nested_object_writer(kSampleTypeName2, "s", NULL); 53 ibus_object_writer.AppendIBusObject(&ibus_nested_object_writer); 54 ibus_nested_object_writer.CloseHeader(); 55 ibus_nested_object_writer.AppendString(kSampleText2); 56 ibus_object_writer.CloseAll(); 57 58 // Read ibus_object. 59 dbus::MessageReader reader(message.get()); 60 IBusObjectReader ibus_object_reader(kSampleTypeName1, &reader); 61 ASSERT_TRUE(ibus_object_reader.Init()); 62 // Check the attachment value; 63 const base::Value* read_value = 64 ibus_object_reader.GetAttachment(kAttachmentKey); 65 ASSERT_TRUE(read_value); 66 std::string attachment_value; 67 ASSERT_TRUE(read_value->GetAsString(&attachment_value)); 68 EXPECT_EQ(kStringAttachment, attachment_value); 69 // Check the first string value. 70 std::string expected_string; 71 ASSERT_TRUE(ibus_object_reader.PopString(&expected_string)); 72 EXPECT_EQ(kSampleText1, expected_string); 73 // Check the second uint32 value. 74 uint32 expected_uint32 = 0UL; 75 ASSERT_TRUE(ibus_object_reader.PopUint32(&expected_uint32)); 76 EXPECT_EQ(kSampleUint32, expected_uint32); 77 // Check the third int value. 78 int32 expected_int32 = 0; 79 ASSERT_TRUE(ibus_object_reader.PopInt32(&expected_int32)); 80 EXPECT_EQ(kSampleInt32, expected_int32); 81 // Check the fourth boolean value. 82 bool expected_bool = true; 83 ASSERT_TRUE(ibus_object_reader.PopBool(&expected_bool)); 84 EXPECT_TRUE(kSampleBool == expected_bool); 85 // Check the fifth value which is array of uint32. 86 dbus::MessageReader array_reader(NULL); 87 ASSERT_TRUE(ibus_object_reader.PopArray(&array_reader)); 88 for (uint32 i = 0; i < kSampleArrayOfUint32Count; ++i) { 89 uint32 expected_uint32 = 0; 90 ASSERT_TRUE(array_reader.PopUint32(&expected_uint32)); 91 EXPECT_EQ(i, expected_uint32); 92 } 93 // Check the sixth value which is IBusObject. 94 IBusObjectReader ibus_nested_object_reader(kSampleTypeName2, NULL); 95 ibus_object_reader.PopIBusObject(&ibus_nested_object_reader); 96 std::string expected_text2; 97 ASSERT_TRUE(ibus_nested_object_reader.PopString(&expected_text2)); 98 EXPECT_EQ(kSampleText2, expected_text2); 99 100 EXPECT_FALSE(ibus_nested_object_reader.HasMoreData()); 101 EXPECT_FALSE(ibus_object_reader.HasMoreData()); 102 EXPECT_FALSE(array_reader.HasMoreData()); 103 EXPECT_FALSE(reader.HasMoreData()); 104 } 105 106 TEST(IBusObjectTest, EmptyEntryTest) { 107 const char kSampleTypeName[] = "Empty IBusObject Name"; 108 scoped_ptr<dbus::Response> message(dbus::Response::CreateEmpty()); 109 110 // Write empty IBusObject. 111 dbus::MessageWriter writer(message.get()); 112 IBusObjectWriter ibus_object_writer(kSampleTypeName, "", &writer); 113 ibus_object_writer.CloseHeader(); 114 ibus_object_writer.CloseAll(); 115 116 // Read empty IBusObject. 117 dbus::MessageReader reader(message.get()); 118 IBusObjectReader ibus_object_reader(kSampleTypeName, &reader); 119 ASSERT_TRUE(ibus_object_reader.Init()); 120 EXPECT_FALSE(ibus_object_reader.HasMoreData()); 121 } 122 123 TEST(IBusObjectTest, PopAppendIBusTextTest) { 124 const char kSampleTypeName[] = "Empty IBusObject Name"; 125 const char kSampleString[] = "Sapmle String"; 126 IBusText::SelectionAttribute selection_attribute; 127 selection_attribute.start_index = 0UL; 128 selection_attribute.end_index = 10UL; 129 scoped_ptr<dbus::Response> message(dbus::Response::CreateEmpty()); 130 131 // Write IBusText. 132 dbus::MessageWriter writer(message.get()); 133 IBusObjectWriter ibus_object_writer(kSampleTypeName, "v", &writer); 134 ibus_object_writer.CloseHeader(); 135 IBusText ibus_text; 136 ibus_text.mutable_selection_attributes()->push_back(selection_attribute); 137 ibus_text.set_text(kSampleString); 138 ibus_object_writer.AppendIBusText(ibus_text); 139 ibus_object_writer.CloseAll(); 140 141 // Read IBusText; 142 dbus::MessageReader reader(message.get()); 143 IBusObjectReader ibus_object_reader(kSampleTypeName, &reader); 144 IBusText result_text; 145 ASSERT_TRUE(ibus_object_reader.Init()); 146 ASSERT_TRUE(ibus_object_reader.PopIBusText(&result_text)); 147 EXPECT_FALSE(ibus_object_reader.HasMoreData()); 148 EXPECT_EQ(kSampleString, result_text.text()); 149 const std::vector<IBusText::SelectionAttribute>& selection_attributes = 150 result_text.selection_attributes(); 151 ASSERT_EQ(1UL, selection_attributes.size()); 152 EXPECT_EQ(selection_attribute.start_index, 153 selection_attributes[0].start_index); 154 EXPECT_EQ(selection_attribute.end_index, 155 selection_attributes[0].end_index); 156 } 157 158 TEST(IBusObjectTest, PopAppendStringAsIBusText) { 159 const char kSampleTypeName[] = "Empty IBusObject Name"; 160 const char kSampleString[] = "Sapmle String"; 161 scoped_ptr<dbus::Response> message(dbus::Response::CreateEmpty()); 162 163 // Write string as IBusText. 164 dbus::MessageWriter writer(message.get()); 165 IBusObjectWriter ibus_object_writer(kSampleTypeName, "v", &writer); 166 ibus_object_writer.CloseHeader(); 167 ibus_object_writer.AppendStringAsIBusText(kSampleString); 168 ibus_object_writer.CloseAll(); 169 170 // Read string from IBusText. 171 dbus::MessageReader reader(message.get()); 172 IBusObjectReader ibus_object_reader(kSampleTypeName, &reader); 173 std::string result_str; 174 ASSERT_TRUE(ibus_object_reader.Init()); 175 ASSERT_TRUE(ibus_object_reader.PopStringFromIBusText(&result_str)); 176 EXPECT_FALSE(ibus_object_reader.HasMoreData()); 177 EXPECT_EQ(kSampleString, result_str); 178 } 179 180 TEST(IBusObjectTest, PopAppendIBusPropertyTest) { 181 const char kSampleTypeName[] = "Empty IBusObject Name"; 182 const char kSampleKey[] = "Key"; 183 const IBusProperty::IBusPropertyType kSampleType = 184 IBusProperty::IBUS_PROPERTY_TYPE_MENU; 185 const char kSampleLabel[] = "Label"; 186 const char kSampleTooltip[] = "Tooltip"; 187 const bool kSampleVisible = true; 188 const bool kSampleChecked = false; 189 scoped_ptr<dbus::Response> response(dbus::Response::CreateEmpty()); 190 191 // Create IBusProperty. 192 IBusProperty property; 193 property.set_key(kSampleKey); 194 property.set_type(kSampleType); 195 property.set_label(kSampleLabel); 196 property.set_tooltip(kSampleTooltip); 197 property.set_visible(kSampleVisible); 198 property.set_checked(kSampleChecked); 199 200 // Write a IBusProperty. 201 dbus::MessageWriter writer(response.get()); 202 IBusObjectWriter ibus_object_writer(kSampleTypeName, "v", &writer); 203 ibus_object_writer.CloseHeader(); 204 ibus_object_writer.AppendIBusProperty(property); 205 ibus_object_writer.CloseAll(); 206 207 // Read string from IBusText. 208 dbus::MessageReader reader(response.get()); 209 IBusObjectReader ibus_object_reader(kSampleTypeName, &reader); 210 IBusProperty result_property; 211 ASSERT_TRUE(ibus_object_reader.Init()); 212 ASSERT_TRUE(ibus_object_reader.PopIBusProperty(&result_property)); 213 EXPECT_EQ(kSampleKey, result_property.key()); 214 EXPECT_EQ(kSampleType, result_property.type()); 215 EXPECT_EQ(kSampleLabel, result_property.label()); 216 EXPECT_EQ(kSampleTooltip, result_property.tooltip()); 217 EXPECT_EQ(kSampleVisible, result_property.visible()); 218 EXPECT_TRUE(kSampleChecked == result_property.checked()); 219 } 220 221 } // namespace chromeos 222