15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chromeos/dbus/ibus/ibus_property.h"
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string>
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/compiler_specific.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
11868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string_number_conversions.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chromeos/dbus/ibus/ibus_object.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "dbus/message.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gmock/include/gmock/gmock.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace chromeos {
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kSampleKey[] = "Key";
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const IBusProperty::IBusPropertyType kSampleType =
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IBusProperty::IBUS_PROPERTY_TYPE_RADIO;
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kSampleLabel[] = "Label";
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kSampleTooltip[] = "Tooltip";
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const bool kSampleVisible = true;
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const bool kSampleChecked = false;
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Sets testing data to |property| with |prefix|.
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This function clears IBusProperty::sub_properties_ and does not add any
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// entries into it. The testing data can be checked with CheckProperty function
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// with same |prefix|.
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SetProperty(const std::string& prefix, IBusProperty* property) {
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  property->set_key(prefix + kSampleKey);
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  property->set_type(kSampleType);
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  property->set_label(prefix + kSampleLabel);
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  property->set_tooltip(prefix + kSampleTooltip);
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  property->set_visible(kSampleVisible);
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  property->set_checked(kSampleChecked);
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  property->mutable_sub_properties()->clear();
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks testing data in |property| with |prefix|.
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This function does not check IBusProperty::sub_properties_.
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool CheckProperty(const std::string& prefix, const IBusProperty& property) {
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if ((prefix + kSampleKey) != property.key()) {
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LOG(ERROR) << "Does not match IBusProperty::key value: " << std::endl
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               << "Expected: " << (prefix + kSampleKey) << std::endl
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               << "Actual: " << property.key();
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (kSampleType != property.type()) {
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LOG(ERROR) << "Does not match IBusProperty::type value: " << std::endl
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               << "Expected: " << kSampleType << std::endl
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               << "Actual: " << property.type();
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if ((prefix + kSampleLabel) != property.label()) {
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LOG(ERROR) << "Does not match IBusProperty::label value: " << std::endl
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               << "Expected: " << (prefix + kSampleLabel) << std::endl
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               << "Actual: " << property.label();
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if ((prefix + kSampleTooltip) != property.tooltip()) {
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LOG(ERROR) << "Does not match IBusProperty::tooltip value: " << std::endl
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               << "Expected: " << (prefix + kSampleTooltip) << std::endl
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               << "Actual: " << property.tooltip();
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (kSampleVisible != property.visible()) {
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LOG(ERROR) << "Does not match IBusProperty::visible value: " << std::endl
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               << "Expected: " << kSampleVisible << std::endl
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               << "Actual: " << property.visible();
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (kSampleChecked != property.checked()) {
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LOG(ERROR) << "Does not match IBusProperty::state value: " << std::endl
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               << "Expected: " << kSampleChecked << std::endl
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               << "Actual: " << property.checked();
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(IBusPropertyListTest, WriteReadIBusPropertyTest) {
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const size_t kSubPropertyCount = 16;
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Create a IBusProperty.
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IBusProperty property;
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetProperty("Root_", &property);
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < kSubPropertyCount; ++i) {
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string prefix = "Sub" + base::Uint64ToString(i);
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IBusProperty* sub_property = new IBusProperty;
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetProperty(prefix, sub_property);
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    property.mutable_sub_properties()->push_back(sub_property);
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Write a IBusProperty.
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<dbus::Response> response(dbus::Response::CreateEmpty());
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dbus::MessageWriter writer(response.get());
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AppendIBusProperty(property, &writer);
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Read a IBusProperty.
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IBusProperty target_property;
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dbus::MessageReader reader(response.get());
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PopIBusProperty(&reader, &target_property);
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check a result.
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(CheckProperty("Root_", target_property));
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const IBusPropertyList& sub_properties = target_property.sub_properties();
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(kSubPropertyCount, sub_properties.size());
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < kSubPropertyCount; ++i) {
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string prefix = "Sub" + base::Uint64ToString(i);
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(CheckProperty(prefix, *(sub_properties[i])));
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace chromeos
120