buffet: Add base.updateBaseConfiguration implementation

Required base command handled by buffet.

BUG=brillo:810
TEST=`FEATURES=test emerge-gizmo buffet`

Change-Id: I97ecd9f5d792cc636e76bbff92899a7ddfa4a605
Reviewed-on: https://chromium-review.googlesource.com/273618
Reviewed-by: Vitaly Buka <vitalybuka@chromium.org>
Commit-Queue: Vitaly Buka <vitalybuka@chromium.org>
Tested-by: Vitaly Buka <vitalybuka@chromium.org>
diff --git a/buffet/base_api_handler_unittest.cc b/buffet/base_api_handler_unittest.cc
index d1de49f..cde0c41 100644
--- a/buffet/base_api_handler_unittest.cc
+++ b/buffet/base_api_handler_unittest.cc
@@ -25,13 +25,37 @@
     transport_ = std::make_shared<chromeos::http::fake::Transport>();
     command_manager_ = std::make_shared<CommandManager>();
     state_manager_ = std::make_shared<StateManager>(&mock_state_change_queue_);
-    state_manager_->Startup();
+    auto state_definition = unittests::CreateDictionaryValue(R"({
+      'base': {
+        'firmwareVersion': 'string',
+        'localDiscoveryEnabled': 'boolean',
+        'localAnonymousAccessMaxRole': [ 'none', 'viewer', 'user' ],
+        'localPairingEnabled': 'boolean',
+        'network': {
+          'properties': {
+            'name': 'string'
+          }
+        }
+      }
+    })");
+    auto state_defaults = unittests::CreateDictionaryValue(R"({
+      'base': {
+        'firmwareVersion': '123123',
+        'localDiscoveryEnabled': false,
+        'localAnonymousAccessMaxRole': 'none',
+        'localPairingEnabled': false
+      }
+    })");
+    ASSERT_TRUE(state_manager_->LoadStateDefinition(*state_definition, "base",
+                                                    nullptr));
+    ASSERT_TRUE(state_manager_->LoadStateDefaults(*state_defaults, nullptr));
     dev_reg_.reset(new DeviceRegistrationInfo(
         command_manager_, state_manager_,
         std::unique_ptr<BuffetConfig>{new BuffetConfig{
             std::unique_ptr<StorageInterface>{new MemStorage}}},
         transport_, true));
-    handler_.reset(new BaseApiHandler{dev_reg_->AsWeakPtr(), command_manager_});
+    handler_.reset(new BaseApiHandler{
+        dev_reg_->AsWeakPtr(), state_manager_, command_manager_});
   }
 
   void LoadCommands(const std::string& command_definitions) {
@@ -63,6 +87,68 @@
   int command_id_{0};
 };
 
+TEST_F(BaseApiHandlerTest, UpdateBaseConfiguration) {
+  LoadCommands(R"({
+    'base': {
+      'updateBaseConfiguration': {
+        'parameters': {
+          'localDiscoveryEnabled': 'boolean',
+          'localAnonymousAccessMaxRole': [ 'none', 'viewer', 'user' ],
+          'localPairingEnabled': 'boolean'
+         },
+         'results': {}
+      }
+    }
+  })");
+
+  const BuffetConfig& config{dev_reg_->GetConfig()};
+
+  AddCommand(R"({
+    'name' : 'base.updateBaseConfiguration',
+    'parameters': {
+      'localDiscoveryEnabled': false,
+      'localAnonymousAccessMaxRole': 'none',
+      'localPairingEnabled': false
+    }
+  })");
+  EXPECT_EQ("none", config.local_anonymous_access_role());
+  EXPECT_FALSE(config.local_discovery_enabled());
+  EXPECT_FALSE(config.local_pairing_enabled());
+
+  auto expected = R"({
+    'base': {
+      'firmwareVersion': '123123',
+      'localAnonymousAccessMaxRole': 'none',
+      'localDiscoveryEnabled': false,
+      'localPairingEnabled': false,
+      'network': {}
+    }
+  })";
+  EXPECT_JSON_EQ(expected, *state_manager_->GetStateValuesAsJson(nullptr));
+
+  AddCommand(R"({
+    'name' : 'base.updateBaseConfiguration',
+    'parameters': {
+      'localDiscoveryEnabled': true,
+      'localAnonymousAccessMaxRole': 'user',
+      'localPairingEnabled': true
+    }
+  })");
+  EXPECT_EQ("user", config.local_anonymous_access_role());
+  EXPECT_TRUE(config.local_discovery_enabled());
+  EXPECT_TRUE(config.local_pairing_enabled());
+  expected = R"({
+    'base': {
+      'firmwareVersion': '123123',
+      'localAnonymousAccessMaxRole': 'user',
+      'localDiscoveryEnabled': true,
+      'localPairingEnabled': true,
+      'network': {}
+    }
+  })";
+  EXPECT_JSON_EQ(expected, *state_manager_->GetStateValuesAsJson(nullptr));
+}
+
 TEST_F(BaseApiHandlerTest, UpdateDeviceInfo) {
   LoadCommands(R"({
     'base': {