| Index: network_property_test.cc
|
| diff --git a/network_property_test.cc b/network_property_test.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..5b7f89170d0b1d44aecdd14b58e6593878ac8c94
|
| --- /dev/null
|
| +++ b/network_property_test.cc
|
| @@ -0,0 +1,159 @@
|
| +// Copyright (c) 2009 The Chromium OS Authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
| +
|
| +#include <dlfcn.h>
|
| +#include <glib-object.h>
|
| +#include <map>
|
| +#include <vector>
|
| +
|
| +#include <base/logging.h>
|
| +#include <base/time.h>
|
| +#include <base/values.h>
|
| +
|
| +#include "chromeos_cros_api.h" // NOLINT
|
| +#include "chromeos_network.h" // NOLINT
|
| +#include "chromeos/dbus/dbus.h" // NOLINT
|
| +#include "chromeos/glib/object.h" // NOLINT
|
| +#include "monitor_utils.h" //NOLINT
|
| +
|
| +static void PrintProperty(const char* path,
|
| + const char* key,
|
| + const Value* value) {
|
| + std::string prelude("PropertyChanged [");
|
| + prelude += path;
|
| + prelude += "] ";
|
| + prelude += key;
|
| + prelude += " : ";
|
| + if (value->IsType(Value::TYPE_STRING)) {
|
| + std::string strval;
|
| + value->GetAsString(&strval);
|
| + LOG(INFO) << prelude << "\"" << strval << "\"";
|
| + } else if (value->IsType(Value::TYPE_BOOLEAN)) {
|
| + bool boolval;
|
| + value->GetAsBoolean(&boolval);
|
| + LOG(INFO) << prelude << boolval;
|
| + } else if (value->IsType(Value::TYPE_INTEGER)) {
|
| + int intval;
|
| + value->GetAsInteger(&intval);
|
| + LOG(INFO) << prelude << intval;
|
| + } else if (value->IsType(Value::TYPE_LIST)) {
|
| + const ListValue* list = static_cast<const ListValue*>(value);
|
| + Value *itemval;
|
| + std::string liststr;
|
| + size_t index = 0;
|
| + while (list->Get(index, &itemval)) {
|
| + if (!itemval->IsType(Value::TYPE_STRING)) {
|
| + ++index;
|
| + continue;
|
| + }
|
| + std::string itemstr;
|
| + itemval->GetAsString(&itemstr);
|
| + liststr += itemstr;
|
| + ++index;
|
| + if (index < list->GetSize())
|
| + liststr += ", ";
|
| + }
|
| + LOG(INFO) << prelude << "\"" << liststr << "\"";
|
| + } else if (value->IsType(Value::TYPE_DICTIONARY)) {
|
| + const DictionaryValue* dict = static_cast<const DictionaryValue*>(value);
|
| + std::string items;
|
| + std::string itemval;
|
| + size_t n = 0;
|
| + DictionaryValue::key_iterator iter = dict->begin_keys();
|
| + while (iter != dict->end_keys()) {
|
| + std::string key = *iter;
|
| + items += "{'" + key + "': '";
|
| + if (dict->GetStringWithoutPathExpansion(key, &itemval))
|
| + items += itemval + "'}";
|
| + else
|
| + items += "<not-a-string>'}";
|
| + if (n < dict->size())
|
| + items += ", ";
|
| + ++iter;
|
| + ++n;
|
| + }
|
| + LOG(INFO) << prelude << items;
|
| + } else
|
| + LOG(INFO) << prelude << "<type " << value->GetType() << ">";
|
| +}
|
| +
|
| +class CallbackMonitorNetwork {
|
| + public:
|
| + static void Run(void *object,
|
| + const char *path,
|
| + const char *key,
|
| + const Value* value) {
|
| + PrintProperty(path, key, value);
|
| + }
|
| +};
|
| +
|
| +// A simple program exercising the {Set,Clear}{Device,Service}Property methods.
|
| +int main(int argc, const char** argv) {
|
| + ::g_type_init();
|
| + GMainLoop* loop = ::g_main_loop_new(NULL, false);
|
| +
|
| + DCHECK(loop) << "Failed to create main loop";
|
| + if (!LoadCrosLibrary(argv))
|
| + LOG(INFO) << "Failed to load cros .so";
|
| +
|
| + if (argc != 4) {
|
| + LOG(INFO) << "Usage: " << argv[0] << " <path> <property> <string-value>";
|
| + LOG(INFO) << " " << argv[0] << " -c <path> <property>";
|
| + return 1;
|
| + }
|
| +
|
| + bool clear;
|
| + const char *path, *property, *value;
|
| + if (strcmp(argv[1], "-c") == 0) {
|
| + clear = true;
|
| + path = argv[2];
|
| + property = argv[3];
|
| + value = NULL;
|
| + } else {
|
| + clear = false;
|
| + path = argv[1];
|
| + property = argv[2];
|
| + value = argv[3];
|
| + }
|
| +
|
| + chromeos::PropertyChangeMonitor device_mon;
|
| + if (strncmp(path, "/service/", 9) == 0) {
|
| + LOG(INFO) << "Requesting properties messages on service '" << path << "'";
|
| + device_mon = chromeos::MonitorNetworkService(&CallbackMonitorNetwork::Run,
|
| + path, NULL);
|
| + if (clear) {
|
| + LOG(INFO) << "Clearing property '" << property << "' on '" << path << "'";
|
| + chromeos::ClearNetworkServiceProperty(path, property);
|
| + } else {
|
| + LOG(INFO) << "Setting property '" << property << "' on '" << path << "'";
|
| + chromeos::SetNetworkServiceProperty(path, property,
|
| + Value::CreateStringValue(value));
|
| + }
|
| + } else if (strncmp(path, "/device/", 8) == 0) {
|
| + LOG(INFO) << "Requesting properties messages on device '" << path << "'";
|
| + device_mon = chromeos::MonitorNetworkDevice(&CallbackMonitorNetwork::Run,
|
| + path, NULL);
|
| + if (clear) {
|
| + LOG(INFO) << "Clearing property '" << property << "' on '" << path << "'";
|
| + chromeos::ClearNetworkDeviceProperty(path, property);
|
| + } else {
|
| + LOG(INFO) << "Setting property '" << property << "' on '" << path << "'";
|
| + chromeos::SetNetworkDeviceProperty(path, property,
|
| + Value::CreateStringValue(value));
|
| + }
|
| + } else {
|
| + LOG(INFO) << "Don't know what to do with path '" << path << "' "
|
| + << "neither a device nor a service";
|
| + return 1;
|
| + }
|
| +
|
| + LOG(INFO) << "Starting g_main_loop.";
|
| +
|
| + ::g_main_loop_run(loop);
|
| +
|
| + LOG(INFO) << "Shutting down.";
|
| +
|
| + chromeos::DisconnectPropertyChangeMonitor(device_mon);
|
| + return 0;
|
| +}
|
|
|