14615e0d5aa416ab1a8596bde68f71f7ebe431b86Vitaly Buka// Copyright 2015 The Weave Authors. All rights reserved.
272410b2cd9056ac69c35db55eea6bb5b6cc8e342Vitaly Buka// Use of this source code is governed by a BSD-style license that can be
372410b2cd9056ac69c35db55eea6bb5b6cc8e342Vitaly Buka// found in the LICENSE file.
472410b2cd9056ac69c35db55eea6bb5b6cc8e342Vitaly Buka
52d16dfa768282b29f3fd5a905b52e3393a083e0dStefan Sauer#include "src/base_api_handler.h"
672410b2cd9056ac69c35db55eea6bb5b6cc8e342Vitaly Buka
772410b2cd9056ac69c35db55eea6bb5b6cc8e342Vitaly Buka#include <base/strings/string_number_conversions.h>
8ece713e1f51b6d9e7afda725ae258dc7e12f8c90Vitaly Buka#include <base/time/default_clock.h>
972410b2cd9056ac69c35db55eea6bb5b6cc8e342Vitaly Buka#include <base/values.h>
1072410b2cd9056ac69c35db55eea6bb5b6cc8e342Vitaly Buka#include <gtest/gtest.h>
1198d1fee994302f5e2ad7a7b60de2f2d74f35408bAlex Vakulenko#include <weave/provider/test/fake_task_runner.h>
121e3636732171afb8cceb9e5cb835ec6a93787dbaVitaly Buka#include <weave/provider/test/mock_config_store.h>
131e3636732171afb8cceb9e5cb835ec6a93787dbaVitaly Buka#include <weave/provider/test/mock_http_client.h>
14266e88b46c03657e0c55db7cd62596be88526400Vitaly Buka#include <weave/test/mock_device.h>
158a05bebb95f5f3f9bf6b72bd9e58b6ba6b8c9bddAlex Vakulenko#include <weave/test/unittest_utils.h>
1672410b2cd9056ac69c35db55eea6bb5b6cc8e342Vitaly Buka
17d91d625f29b752be035c5fb49bb29d7ee85fcb90Alex Vakulenko#include "src/component_manager_impl.h"
182d16dfa768282b29f3fd5a905b52e3393a083e0dStefan Sauer#include "src/config.h"
192d16dfa768282b29f3fd5a905b52e3393a083e0dStefan Sauer#include "src/device_registration_info.h"
2072410b2cd9056ac69c35db55eea6bb5b6cc8e342Vitaly Buka
216b61e5728bb6b014d16f9606a428deb6cbbbd10cVitaly Bukausing testing::_;
22695a5fb8b11519ae4c70e3c1a457824727974b93Vitaly Bukausing testing::AnyOf;
23695a5fb8b11519ae4c70e3c1a457824727974b93Vitaly Bukausing testing::Eq;
249acf8aa6176c1afaa587deac955acd6a7f9a46f4Vitaly Bukausing testing::Invoke;
256b61e5728bb6b014d16f9606a428deb6cbbbd10cVitaly Bukausing testing::Return;
2668af3873b48442656a359a95ac218a5d9939c06eVitaly Bukausing testing::ReturnRef;
279acf8aa6176c1afaa587deac955acd6a7f9a46f4Vitaly Bukausing testing::StrictMock;
286b61e5728bb6b014d16f9606a428deb6cbbbd10cVitaly Buka
29b6f015a1ef3caffbc2af53184c0ec5342e42e048Vitaly Bukanamespace weave {
3072410b2cd9056ac69c35db55eea6bb5b6cc8e342Vitaly Buka
3172410b2cd9056ac69c35db55eea6bb5b6cc8e342Vitaly Bukaclass BaseApiHandlerTest : public ::testing::Test {
3272410b2cd9056ac69c35db55eea6bb5b6cc8e342Vitaly Buka protected:
3372410b2cd9056ac69c35db55eea6bb5b6cc8e342Vitaly Buka  void SetUp() override {
34d91d625f29b752be035c5fb49bb29d7ee85fcb90Alex Vakulenko    EXPECT_CALL(device_, AddTraitDefinitionsFromJson(_))
3568af3873b48442656a359a95ac218a5d9939c06eVitaly Buka        .WillRepeatedly(Invoke([this](const std::string& json) {
36d91d625f29b752be035c5fb49bb29d7ee85fcb90Alex Vakulenko          EXPECT_TRUE(component_manager_.LoadTraits(json, nullptr));
3768af3873b48442656a359a95ac218a5d9939c06eVitaly Buka        }));
38d91d625f29b752be035c5fb49bb29d7ee85fcb90Alex Vakulenko    EXPECT_CALL(device_, SetStateProperties(_, _, _))
3934668e731bb194b443bc0e6029d6d3583f08de28Vitaly Buka        .WillRepeatedly(
4034668e731bb194b443bc0e6029d6d3583f08de28Vitaly Buka            Invoke(&component_manager_, &ComponentManager::SetStateProperties));
41d91d625f29b752be035c5fb49bb29d7ee85fcb90Alex Vakulenko    EXPECT_CALL(device_, SetStateProperty(_, _, _, _))
4234668e731bb194b443bc0e6029d6d3583f08de28Vitaly Buka        .WillRepeatedly(
4334668e731bb194b443bc0e6029d6d3583f08de28Vitaly Buka            Invoke(&component_manager_, &ComponentManager::SetStateProperty));
44d91d625f29b752be035c5fb49bb29d7ee85fcb90Alex Vakulenko    EXPECT_CALL(device_, AddComponent(_, _, _))
45d91d625f29b752be035c5fb49bb29d7ee85fcb90Alex Vakulenko        .WillRepeatedly(Invoke([this](const std::string& name,
46d91d625f29b752be035c5fb49bb29d7ee85fcb90Alex Vakulenko                                      const std::vector<std::string>& traits,
47d91d625f29b752be035c5fb49bb29d7ee85fcb90Alex Vakulenko                                      ErrorPtr* error) {
48d91d625f29b752be035c5fb49bb29d7ee85fcb90Alex Vakulenko          return component_manager_.AddComponent("", name, traits, error);
493110deb4d4e3e2cc0f38f23990ef68cdcf3d8301Vitaly Buka        }));
503110deb4d4e3e2cc0f38f23990ef68cdcf3d8301Vitaly Buka
5134668e731bb194b443bc0e6029d6d3583f08de28Vitaly Buka    EXPECT_CALL(device_,
5234668e731bb194b443bc0e6029d6d3583f08de28Vitaly Buka                AddCommandHandler(_, AnyOf("base.updateBaseConfiguration",
5334668e731bb194b443bc0e6029d6d3583f08de28Vitaly Buka                                           "base.updateDeviceInfo"),
5434668e731bb194b443bc0e6029d6d3583f08de28Vitaly Buka                                  _))
5534668e731bb194b443bc0e6029d6d3583f08de28Vitaly Buka        .WillRepeatedly(
5634668e731bb194b443bc0e6029d6d3583f08de28Vitaly Buka            Invoke(&component_manager_, &ComponentManager::AddCommandHandler));
57266e88b46c03657e0c55db7cd62596be88526400Vitaly Buka
58666b43e92729fa170bc53eab9040a4dfe58b8062Vitaly Buka    dev_reg_.reset(new DeviceRegistrationInfo(&config_, &component_manager_,
59666b43e92729fa170bc53eab9040a4dfe58b8062Vitaly Buka                                              nullptr, &http_client_, nullptr,
60666b43e92729fa170bc53eab9040a4dfe58b8062Vitaly Buka                                              nullptr));
6168af3873b48442656a359a95ac218a5d9939c06eVitaly Buka
6268af3873b48442656a359a95ac218a5d9939c06eVitaly Buka    EXPECT_CALL(device_, GetSettings())
6368af3873b48442656a359a95ac218a5d9939c06eVitaly Buka        .WillRepeatedly(ReturnRef(dev_reg_->GetSettings()));
6468af3873b48442656a359a95ac218a5d9939c06eVitaly Buka
65266e88b46c03657e0c55db7cd62596be88526400Vitaly Buka    handler_.reset(new BaseApiHandler{dev_reg_.get(), &device_});
6672410b2cd9056ac69c35db55eea6bb5b6cc8e342Vitaly Buka  }
6772410b2cd9056ac69c35db55eea6bb5b6cc8e342Vitaly Buka
6872410b2cd9056ac69c35db55eea6bb5b6cc8e342Vitaly Buka  void AddCommand(const std::string& command) {
69d91d625f29b752be035c5fb49bb29d7ee85fcb90Alex Vakulenko    std::string id;
70d91d625f29b752be035c5fb49bb29d7ee85fcb90Alex Vakulenko    auto command_instance = component_manager_.ParseCommandInstance(
71d91d625f29b752be035c5fb49bb29d7ee85fcb90Alex Vakulenko        *test::CreateDictionaryValue(command.c_str()), Command::Origin::kLocal,
72d91d625f29b752be035c5fb49bb29d7ee85fcb90Alex Vakulenko        UserRole::kOwner, &id, nullptr);
73d91d625f29b752be035c5fb49bb29d7ee85fcb90Alex Vakulenko    ASSERT_NE(nullptr, command_instance.get());
74d91d625f29b752be035c5fb49bb29d7ee85fcb90Alex Vakulenko    component_manager_.AddCommand(std::move(command_instance));
750209da4821a019d2805d417b513b2743b2e750caVitaly Buka    EXPECT_EQ(Command::State::kDone,
76d91d625f29b752be035c5fb49bb29d7ee85fcb90Alex Vakulenko              component_manager_.FindCommand(id)->GetState());
7772410b2cd9056ac69c35db55eea6bb5b6cc8e342Vitaly Buka  }
7872410b2cd9056ac69c35db55eea6bb5b6cc8e342Vitaly Buka
7968af3873b48442656a359a95ac218a5d9939c06eVitaly Buka  std::unique_ptr<base::DictionaryValue> GetBaseState() {
80d91d625f29b752be035c5fb49bb29d7ee85fcb90Alex Vakulenko    std::unique_ptr<base::DictionaryValue> state;
81d91d625f29b752be035c5fb49bb29d7ee85fcb90Alex Vakulenko    std::string path = component_manager_.FindComponentWithTrait("base");
82d91d625f29b752be035c5fb49bb29d7ee85fcb90Alex Vakulenko    EXPECT_FALSE(path.empty());
83d91d625f29b752be035c5fb49bb29d7ee85fcb90Alex Vakulenko    const auto* component = component_manager_.FindComponent(path, nullptr);
84d91d625f29b752be035c5fb49bb29d7ee85fcb90Alex Vakulenko    CHECK(component);
85d91d625f29b752be035c5fb49bb29d7ee85fcb90Alex Vakulenko    const base::DictionaryValue* base_state = nullptr;
86d91d625f29b752be035c5fb49bb29d7ee85fcb90Alex Vakulenko    if (component->GetDictionary("state.base", &base_state))
87d91d625f29b752be035c5fb49bb29d7ee85fcb90Alex Vakulenko      state.reset(base_state->DeepCopy());
88d91d625f29b752be035c5fb49bb29d7ee85fcb90Alex Vakulenko    else
89d91d625f29b752be035c5fb49bb29d7ee85fcb90Alex Vakulenko      state.reset(new base::DictionaryValue);
9068af3873b48442656a359a95ac218a5d9939c06eVitaly Buka    return state;
9168af3873b48442656a359a95ac218a5d9939c06eVitaly Buka  }
9268af3873b48442656a359a95ac218a5d9939c06eVitaly Buka
931e3636732171afb8cceb9e5cb835ec6a93787dbaVitaly Buka  provider::test::MockConfigStore config_store_;
94666b43e92729fa170bc53eab9040a4dfe58b8062Vitaly Buka  Config config_{&config_store_};
951e3636732171afb8cceb9e5cb835ec6a93787dbaVitaly Buka  StrictMock<provider::test::MockHttpClient> http_client_;
9672410b2cd9056ac69c35db55eea6bb5b6cc8e342Vitaly Buka  std::unique_ptr<DeviceRegistrationInfo> dev_reg_;
9798d1fee994302f5e2ad7a7b60de2f2d74f35408bAlex Vakulenko  StrictMock<provider::test::FakeTaskRunner> task_runner_;
9898d1fee994302f5e2ad7a7b60de2f2d74f35408bAlex Vakulenko  ComponentManagerImpl component_manager_{&task_runner_};
9972410b2cd9056ac69c35db55eea6bb5b6cc8e342Vitaly Buka  std::unique_ptr<BaseApiHandler> handler_;
100266e88b46c03657e0c55db7cd62596be88526400Vitaly Buka  StrictMock<test::MockDevice> device_;
10172410b2cd9056ac69c35db55eea6bb5b6cc8e342Vitaly Buka};
10272410b2cd9056ac69c35db55eea6bb5b6cc8e342Vitaly Buka
10380d66538455628c8389592a94252c34485ef3db6Vitaly BukaTEST_F(BaseApiHandlerTest, Initialization) {
104d91d625f29b752be035c5fb49bb29d7ee85fcb90Alex Vakulenko  const base::DictionaryValue* trait = nullptr;
105d91d625f29b752be035c5fb49bb29d7ee85fcb90Alex Vakulenko  ASSERT_TRUE(component_manager_.GetTraits().GetDictionary("base", &trait));
10680d66538455628c8389592a94252c34485ef3db6Vitaly Buka
10780d66538455628c8389592a94252c34485ef3db6Vitaly Buka  auto expected = R"({
108d91d625f29b752be035c5fb49bb29d7ee85fcb90Alex Vakulenko    "commands": {
10980d66538455628c8389592a94252c34485ef3db6Vitaly Buka      "updateBaseConfiguration": {
1107e894da1c5fcc4fafa6cc69b612c9c14f78aed51Alex Vakulenko        "minimalRole": "manager",
1117e894da1c5fcc4fafa6cc69b612c9c14f78aed51Alex Vakulenko        "parameters": {
1127e894da1c5fcc4fafa6cc69b612c9c14f78aed51Alex Vakulenko          "localAnonymousAccessMaxRole": {
1137e894da1c5fcc4fafa6cc69b612c9c14f78aed51Alex Vakulenko            "enum": [ "none", "viewer", "user" ],
1147e894da1c5fcc4fafa6cc69b612c9c14f78aed51Alex Vakulenko            "type": "string"
1157e894da1c5fcc4fafa6cc69b612c9c14f78aed51Alex Vakulenko          },
1167e894da1c5fcc4fafa6cc69b612c9c14f78aed51Alex Vakulenko          "localDiscoveryEnabled": {
1177e894da1c5fcc4fafa6cc69b612c9c14f78aed51Alex Vakulenko            "type": "boolean"
1187e894da1c5fcc4fafa6cc69b612c9c14f78aed51Alex Vakulenko          },
1197e894da1c5fcc4fafa6cc69b612c9c14f78aed51Alex Vakulenko          "localPairingEnabled": {
1207e894da1c5fcc4fafa6cc69b612c9c14f78aed51Alex Vakulenko            "type": "boolean"
1217e894da1c5fcc4fafa6cc69b612c9c14f78aed51Alex Vakulenko          }
1227e894da1c5fcc4fafa6cc69b612c9c14f78aed51Alex Vakulenko        }
12380d66538455628c8389592a94252c34485ef3db6Vitaly Buka      },
12480d66538455628c8389592a94252c34485ef3db6Vitaly Buka      "updateDeviceInfo": {
1257e894da1c5fcc4fafa6cc69b612c9c14f78aed51Alex Vakulenko        "minimalRole": "manager",
1267e894da1c5fcc4fafa6cc69b612c9c14f78aed51Alex Vakulenko        "parameters": {
1277e894da1c5fcc4fafa6cc69b612c9c14f78aed51Alex Vakulenko          "description": {
1287e894da1c5fcc4fafa6cc69b612c9c14f78aed51Alex Vakulenko            "type": "string"
1297e894da1c5fcc4fafa6cc69b612c9c14f78aed51Alex Vakulenko          },
1307e894da1c5fcc4fafa6cc69b612c9c14f78aed51Alex Vakulenko          "location": {
1317e894da1c5fcc4fafa6cc69b612c9c14f78aed51Alex Vakulenko            "type": "string"
1327e894da1c5fcc4fafa6cc69b612c9c14f78aed51Alex Vakulenko          },
1337e894da1c5fcc4fafa6cc69b612c9c14f78aed51Alex Vakulenko          "name": {
1347e894da1c5fcc4fafa6cc69b612c9c14f78aed51Alex Vakulenko            "type": "string"
1357e894da1c5fcc4fafa6cc69b612c9c14f78aed51Alex Vakulenko          }
1367e894da1c5fcc4fafa6cc69b612c9c14f78aed51Alex Vakulenko        }
1378d0cfefae24985025a934ea5461a51472c59cfc0Alex Vakulenko      },
1388d0cfefae24985025a934ea5461a51472c59cfc0Alex Vakulenko      "reboot": {
1398d0cfefae24985025a934ea5461a51472c59cfc0Alex Vakulenko        "minimalRole": "user",
1408d0cfefae24985025a934ea5461a51472c59cfc0Alex Vakulenko        "parameters": {},
1418d0cfefae24985025a934ea5461a51472c59cfc0Alex Vakulenko        "errors": ["notEnoughBattery"]
1428d0cfefae24985025a934ea5461a51472c59cfc0Alex Vakulenko      },
1438d0cfefae24985025a934ea5461a51472c59cfc0Alex Vakulenko      "identify": {
1448d0cfefae24985025a934ea5461a51472c59cfc0Alex Vakulenko        "minimalRole": "user",
1458d0cfefae24985025a934ea5461a51472c59cfc0Alex Vakulenko        "parameters": {}
14680d66538455628c8389592a94252c34485ef3db6Vitaly Buka      }
147d91d625f29b752be035c5fb49bb29d7ee85fcb90Alex Vakulenko    },
1488d0cfefae24985025a934ea5461a51472c59cfc0Alex Vakulenko    "state": {
1498d0cfefae24985025a934ea5461a51472c59cfc0Alex Vakulenko      "firmwareVersion": {
1508d0cfefae24985025a934ea5461a51472c59cfc0Alex Vakulenko        "type": "string",
1518d0cfefae24985025a934ea5461a51472c59cfc0Alex Vakulenko        "isRequired": true
1528d0cfefae24985025a934ea5461a51472c59cfc0Alex Vakulenko      },
1538d0cfefae24985025a934ea5461a51472c59cfc0Alex Vakulenko      "localDiscoveryEnabled": {
1548d0cfefae24985025a934ea5461a51472c59cfc0Alex Vakulenko        "type": "boolean",
1558d0cfefae24985025a934ea5461a51472c59cfc0Alex Vakulenko        "isRequired": true
1568d0cfefae24985025a934ea5461a51472c59cfc0Alex Vakulenko      },
1578d0cfefae24985025a934ea5461a51472c59cfc0Alex Vakulenko      "localAnonymousAccessMaxRole": {
1588d0cfefae24985025a934ea5461a51472c59cfc0Alex Vakulenko        "type": "string",
1598d0cfefae24985025a934ea5461a51472c59cfc0Alex Vakulenko        "enum": [ "none", "viewer", "user" ],
1608d0cfefae24985025a934ea5461a51472c59cfc0Alex Vakulenko        "isRequired": true
1618d0cfefae24985025a934ea5461a51472c59cfc0Alex Vakulenko      },
1628d0cfefae24985025a934ea5461a51472c59cfc0Alex Vakulenko      "localPairingEnabled": {
1638d0cfefae24985025a934ea5461a51472c59cfc0Alex Vakulenko        "type": "boolean",
1648d0cfefae24985025a934ea5461a51472c59cfc0Alex Vakulenko        "isRequired": true
1658d0cfefae24985025a934ea5461a51472c59cfc0Alex Vakulenko      },
1668d0cfefae24985025a934ea5461a51472c59cfc0Alex Vakulenko      "connectionStatus": {
1678d0cfefae24985025a934ea5461a51472c59cfc0Alex Vakulenko        "type": "string"
1688d0cfefae24985025a934ea5461a51472c59cfc0Alex Vakulenko      },
1698d0cfefae24985025a934ea5461a51472c59cfc0Alex Vakulenko      "network": {
1708d0cfefae24985025a934ea5461a51472c59cfc0Alex Vakulenko        "type": "object",
1718d0cfefae24985025a934ea5461a51472c59cfc0Alex Vakulenko        "additionalProperties": false,
1728d0cfefae24985025a934ea5461a51472c59cfc0Alex Vakulenko        "properties": {
1738d0cfefae24985025a934ea5461a51472c59cfc0Alex Vakulenko          "name": { "type": "string" }
1748d0cfefae24985025a934ea5461a51472c59cfc0Alex Vakulenko        }
1758d0cfefae24985025a934ea5461a51472c59cfc0Alex Vakulenko      }
1768d0cfefae24985025a934ea5461a51472c59cfc0Alex Vakulenko    }
17780d66538455628c8389592a94252c34485ef3db6Vitaly Buka  })";
178d91d625f29b752be035c5fb49bb29d7ee85fcb90Alex Vakulenko  EXPECT_JSON_EQ(expected, *trait);
17980d66538455628c8389592a94252c34485ef3db6Vitaly Buka}
18080d66538455628c8389592a94252c34485ef3db6Vitaly Buka
1812f7efdb7a0f3ad0923d61290534b37c6c8351cc8Vitaly BukaTEST_F(BaseApiHandlerTest, UpdateBaseConfiguration) {
1825cf12a3e1f9e8e01f9fdb5322277c34096afde8bVitaly Buka  const Settings& settings = dev_reg_->GetSettings();
1832f7efdb7a0f3ad0923d61290534b37c6c8351cc8Vitaly Buka
1842f7efdb7a0f3ad0923d61290534b37c6c8351cc8Vitaly Buka  AddCommand(R"({
1852f7efdb7a0f3ad0923d61290534b37c6c8351cc8Vitaly Buka    'name' : 'base.updateBaseConfiguration',
1868d0cfefae24985025a934ea5461a51472c59cfc0Alex Vakulenko    'component': 'base',
1872f7efdb7a0f3ad0923d61290534b37c6c8351cc8Vitaly Buka    'parameters': {
1882f7efdb7a0f3ad0923d61290534b37c6c8351cc8Vitaly Buka      'localDiscoveryEnabled': false,
1892f7efdb7a0f3ad0923d61290534b37c6c8351cc8Vitaly Buka      'localAnonymousAccessMaxRole': 'none',
1902f7efdb7a0f3ad0923d61290534b37c6c8351cc8Vitaly Buka      'localPairingEnabled': false
1912f7efdb7a0f3ad0923d61290534b37c6c8351cc8Vitaly Buka    }
1922f7efdb7a0f3ad0923d61290534b37c6c8351cc8Vitaly Buka  })");
193b624bc47fb70294185478e4c758657a54b859cb1Vitaly Buka  EXPECT_EQ(AuthScope::kNone, settings.local_anonymous_access_role);
1945cf12a3e1f9e8e01f9fdb5322277c34096afde8bVitaly Buka  EXPECT_FALSE(settings.local_discovery_enabled);
1955cf12a3e1f9e8e01f9fdb5322277c34096afde8bVitaly Buka  EXPECT_FALSE(settings.local_pairing_enabled);
1962f7efdb7a0f3ad0923d61290534b37c6c8351cc8Vitaly Buka
1972f7efdb7a0f3ad0923d61290534b37c6c8351cc8Vitaly Buka  auto expected = R"({
198d91d625f29b752be035c5fb49bb29d7ee85fcb90Alex Vakulenko    'firmwareVersion': 'TEST_FIRMWARE',
199d91d625f29b752be035c5fb49bb29d7ee85fcb90Alex Vakulenko    'localAnonymousAccessMaxRole': 'none',
200d91d625f29b752be035c5fb49bb29d7ee85fcb90Alex Vakulenko    'localDiscoveryEnabled': false,
201d91d625f29b752be035c5fb49bb29d7ee85fcb90Alex Vakulenko    'localPairingEnabled': false
2022f7efdb7a0f3ad0923d61290534b37c6c8351cc8Vitaly Buka  })";
20368af3873b48442656a359a95ac218a5d9939c06eVitaly Buka  EXPECT_JSON_EQ(expected, *GetBaseState());
2042f7efdb7a0f3ad0923d61290534b37c6c8351cc8Vitaly Buka
2052f7efdb7a0f3ad0923d61290534b37c6c8351cc8Vitaly Buka  AddCommand(R"({
2062f7efdb7a0f3ad0923d61290534b37c6c8351cc8Vitaly Buka    'name' : 'base.updateBaseConfiguration',
2078d0cfefae24985025a934ea5461a51472c59cfc0Alex Vakulenko    'component': 'base',
2082f7efdb7a0f3ad0923d61290534b37c6c8351cc8Vitaly Buka    'parameters': {
2092f7efdb7a0f3ad0923d61290534b37c6c8351cc8Vitaly Buka      'localDiscoveryEnabled': true,
2102f7efdb7a0f3ad0923d61290534b37c6c8351cc8Vitaly Buka      'localAnonymousAccessMaxRole': 'user',
2112f7efdb7a0f3ad0923d61290534b37c6c8351cc8Vitaly Buka      'localPairingEnabled': true
2122f7efdb7a0f3ad0923d61290534b37c6c8351cc8Vitaly Buka    }
2132f7efdb7a0f3ad0923d61290534b37c6c8351cc8Vitaly Buka  })");
214b624bc47fb70294185478e4c758657a54b859cb1Vitaly Buka  EXPECT_EQ(AuthScope::kUser, settings.local_anonymous_access_role);
2155cf12a3e1f9e8e01f9fdb5322277c34096afde8bVitaly Buka  EXPECT_TRUE(settings.local_discovery_enabled);
2165cf12a3e1f9e8e01f9fdb5322277c34096afde8bVitaly Buka  EXPECT_TRUE(settings.local_pairing_enabled);
2172f7efdb7a0f3ad0923d61290534b37c6c8351cc8Vitaly Buka  expected = R"({
218d91d625f29b752be035c5fb49bb29d7ee85fcb90Alex Vakulenko    'firmwareVersion': 'TEST_FIRMWARE',
219d91d625f29b752be035c5fb49bb29d7ee85fcb90Alex Vakulenko    'localAnonymousAccessMaxRole': 'user',
220d91d625f29b752be035c5fb49bb29d7ee85fcb90Alex Vakulenko    'localDiscoveryEnabled': true,
221d91d625f29b752be035c5fb49bb29d7ee85fcb90Alex Vakulenko    'localPairingEnabled': true
2222f7efdb7a0f3ad0923d61290534b37c6c8351cc8Vitaly Buka  })";
22368af3873b48442656a359a95ac218a5d9939c06eVitaly Buka  EXPECT_JSON_EQ(expected, *GetBaseState());
2244c808b2cc7c83fc0468a803d9933d1629a007a29Vitaly Buka
2254c808b2cc7c83fc0468a803d9933d1629a007a29Vitaly Buka  {
2265cf12a3e1f9e8e01f9fdb5322277c34096afde8bVitaly Buka    Config::Transaction change{dev_reg_->GetMutableConfig()};
227b624bc47fb70294185478e4c758657a54b859cb1Vitaly Buka    change.set_local_anonymous_access_role(AuthScope::kViewer);
2284c808b2cc7c83fc0468a803d9933d1629a007a29Vitaly Buka  }
2294c808b2cc7c83fc0468a803d9933d1629a007a29Vitaly Buka  expected = R"({
230d91d625f29b752be035c5fb49bb29d7ee85fcb90Alex Vakulenko    'firmwareVersion': 'TEST_FIRMWARE',
231d91d625f29b752be035c5fb49bb29d7ee85fcb90Alex Vakulenko    'localAnonymousAccessMaxRole': 'viewer',
232d91d625f29b752be035c5fb49bb29d7ee85fcb90Alex Vakulenko    'localDiscoveryEnabled': true,
233d91d625f29b752be035c5fb49bb29d7ee85fcb90Alex Vakulenko    'localPairingEnabled': true
2344c808b2cc7c83fc0468a803d9933d1629a007a29Vitaly Buka  })";
23568af3873b48442656a359a95ac218a5d9939c06eVitaly Buka  EXPECT_JSON_EQ(expected, *GetBaseState());
2362f7efdb7a0f3ad0923d61290534b37c6c8351cc8Vitaly Buka}
2372f7efdb7a0f3ad0923d61290534b37c6c8351cc8Vitaly Buka
23872410b2cd9056ac69c35db55eea6bb5b6cc8e342Vitaly BukaTEST_F(BaseApiHandlerTest, UpdateDeviceInfo) {
23972410b2cd9056ac69c35db55eea6bb5b6cc8e342Vitaly Buka  AddCommand(R"({
24072410b2cd9056ac69c35db55eea6bb5b6cc8e342Vitaly Buka    'name' : 'base.updateDeviceInfo',
2418d0cfefae24985025a934ea5461a51472c59cfc0Alex Vakulenko    'component': 'base',
24272410b2cd9056ac69c35db55eea6bb5b6cc8e342Vitaly Buka    'parameters': {
24372410b2cd9056ac69c35db55eea6bb5b6cc8e342Vitaly Buka      'name': 'testName',
24472410b2cd9056ac69c35db55eea6bb5b6cc8e342Vitaly Buka      'description': 'testDescription',
24572410b2cd9056ac69c35db55eea6bb5b6cc8e342Vitaly Buka      'location': 'testLocation'
24672410b2cd9056ac69c35db55eea6bb5b6cc8e342Vitaly Buka    }
24772410b2cd9056ac69c35db55eea6bb5b6cc8e342Vitaly Buka  })");
24872410b2cd9056ac69c35db55eea6bb5b6cc8e342Vitaly Buka
2495cf12a3e1f9e8e01f9fdb5322277c34096afde8bVitaly Buka  const Settings& config = dev_reg_->GetSettings();
2505cf12a3e1f9e8e01f9fdb5322277c34096afde8bVitaly Buka  EXPECT_EQ("testName", config.name);
2515cf12a3e1f9e8e01f9fdb5322277c34096afde8bVitaly Buka  EXPECT_EQ("testDescription", config.description);
2525cf12a3e1f9e8e01f9fdb5322277c34096afde8bVitaly Buka  EXPECT_EQ("testLocation", config.location);
2537e8df46a6608bd9b398f160caf4b626d8717e437Alex Vakulenko
2547e8df46a6608bd9b398f160caf4b626d8717e437Alex Vakulenko  AddCommand(R"({
2557e8df46a6608bd9b398f160caf4b626d8717e437Alex Vakulenko    'name' : 'base.updateDeviceInfo',
2568d0cfefae24985025a934ea5461a51472c59cfc0Alex Vakulenko    'component': 'base',
2577e8df46a6608bd9b398f160caf4b626d8717e437Alex Vakulenko    'parameters': {
2587e8df46a6608bd9b398f160caf4b626d8717e437Alex Vakulenko      'location': 'newLocation'
2597e8df46a6608bd9b398f160caf4b626d8717e437Alex Vakulenko    }
2607e8df46a6608bd9b398f160caf4b626d8717e437Alex Vakulenko  })");
2617e8df46a6608bd9b398f160caf4b626d8717e437Alex Vakulenko
2625cf12a3e1f9e8e01f9fdb5322277c34096afde8bVitaly Buka  EXPECT_EQ("testName", config.name);
2635cf12a3e1f9e8e01f9fdb5322277c34096afde8bVitaly Buka  EXPECT_EQ("testDescription", config.description);
2645cf12a3e1f9e8e01f9fdb5322277c34096afde8bVitaly Buka  EXPECT_EQ("newLocation", config.location);
26572410b2cd9056ac69c35db55eea6bb5b6cc8e342Vitaly Buka}
26672410b2cd9056ac69c35db55eea6bb5b6cc8e342Vitaly Buka
267b6f015a1ef3caffbc2af53184c0ec5342e42e048Vitaly Buka}  // namespace weave
268