blob: 1ce130def8d65d6d4fcd95b31a135bc6389254fb [file] [log] [blame]
Alex Vakulenko07216fe2014-09-19 15:31:09 -07001// Copyright 2014 The Chromium OS 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
5
6#include <base/values.h>
7#include <gtest/gtest.h>
8
9#include "buffet/commands/schema_constants.h"
10#include "buffet/commands/unittest_utils.h"
11#include "buffet/states/error_codes.h"
12#include "buffet/states/state_manager.h"
13
14using buffet::unittests::CreateDictionaryValue;
15using buffet::unittests::ValueToString;
16
17namespace buffet {
18
19namespace {
20std::unique_ptr<base::DictionaryValue> GetTestSchema() {
21 return CreateDictionaryValue(R"({
22 'base': {
23 'manufacturer':'string',
24 'serialNumber':'string'
25 },
26 'terminator': {
27 'target':'string'
28 }
29 })");
30}
31
32std::unique_ptr<base::DictionaryValue> GetTestValues() {
33 return CreateDictionaryValue(R"({
34 'base': {
35 'manufacturer':'Skynet',
36 'serialNumber':'T1000'
37 }
38 })");
39}
40} // anonymous namespace
41
42class StateManagerTest : public ::testing::Test {
43 public:
44 void SetUp() override {
45 mgr_.reset(new StateManager);
46 LoadStateDefinition(GetTestSchema().get(), "default", nullptr);
47 ASSERT_TRUE(mgr_->LoadStateDefaults(*GetTestValues().get(), nullptr));
48 }
49 void TearDown() override {
50 mgr_.reset();
51 }
52
53 void LoadStateDefinition(const base::DictionaryValue* json,
54 const std::string& category,
55 chromeos::ErrorPtr* error) {
56 ASSERT_TRUE(mgr_->LoadStateDefinition(*json, category, error));
57 }
58
59 std::unique_ptr<StateManager> mgr_;
60};
61
62TEST(StateManager, Empty) {
63 StateManager manager;
64 EXPECT_TRUE(manager.GetCategories().empty());
65}
66
67TEST_F(StateManagerTest, Initialized) {
68 EXPECT_EQ(std::set<std::string>{"default"}, mgr_->GetCategories());
69 EXPECT_EQ("{'base':{'manufacturer':'Skynet','serialNumber':'T1000'},"
70 "'terminator':{'target':''}}",
71 ValueToString(mgr_->GetStateValuesAsJson(nullptr).get()));
72}
73
74TEST_F(StateManagerTest, LoadStateDefinition) {
75 auto dict = CreateDictionaryValue(R"({
76 'power': {
77 'battery_level':'integer'
78 }
79 })");
80 LoadStateDefinition(dict.get(), "powerd", nullptr);
81 EXPECT_EQ((std::set<std::string>{"default", "powerd"}),
82 mgr_->GetCategories());
83 EXPECT_EQ("{'base':{'manufacturer':'Skynet','serialNumber':'T1000'},"
84 "'power':{'battery_level':0},"
85 "'terminator':{'target':''}}",
86 ValueToString(mgr_->GetStateValuesAsJson(nullptr).get()));
87}
88
89TEST_F(StateManagerTest, SetPropertyValue) {
90 ASSERT_TRUE(mgr_->SetPropertyValue("terminator.target",
91 std::string{"John Connor"}, nullptr));
92 EXPECT_EQ("{'base':{'manufacturer':'Skynet','serialNumber':'T1000'},"
93 "'terminator':{'target':'John Connor'}}",
94 ValueToString(mgr_->GetStateValuesAsJson(nullptr).get()));
95}
96
97TEST_F(StateManagerTest, SetPropertyValue_Error_NoName) {
98 chromeos::ErrorPtr error;
99 ASSERT_FALSE(mgr_->SetPropertyValue("", int{0}, &error));
100 EXPECT_EQ(errors::state::kDomain, error->GetDomain());
101 EXPECT_EQ(errors::state::kPropertyNameMissing, error->GetCode());
102 EXPECT_EQ("Property name is missing", error->GetMessage());
103}
104
105TEST_F(StateManagerTest, SetPropertyValue_Error_NoPackage) {
106 chromeos::ErrorPtr error;
107 ASSERT_FALSE(mgr_->SetPropertyValue("target", int{0}, &error));
108 EXPECT_EQ(errors::state::kDomain, error->GetDomain());
109 EXPECT_EQ(errors::state::kPackageNameMissing, error->GetCode());
110 EXPECT_EQ("Package name is missing in the property name",
111 error->GetMessage());
112}
113
114TEST_F(StateManagerTest, SetPropertyValue_Error_UnknownPackage) {
115 chromeos::ErrorPtr error;
116 ASSERT_FALSE(mgr_->SetPropertyValue("power.level", int{0}, &error));
117 EXPECT_EQ(errors::state::kDomain, error->GetDomain());
118 EXPECT_EQ(errors::state::kPropertyNotDefined, error->GetCode());
119 EXPECT_EQ("Unknown state property package 'power'", error->GetMessage());
120}
121
122TEST_F(StateManagerTest, SetPropertyValue_Error_UnknownProperty) {
123 chromeos::ErrorPtr error;
124 ASSERT_FALSE(mgr_->SetPropertyValue("base.level", int{0}, &error));
125 EXPECT_EQ(errors::state::kDomain, error->GetDomain());
126 EXPECT_EQ(errors::state::kPropertyNotDefined, error->GetCode());
127 EXPECT_EQ("State property 'base.level' is not defined", error->GetMessage());
128}
129
130} // namespace buffet