blob: 2a6824ae40a04bc72ea46b64b16808533a186923 [file] [log] [blame]
Alex Deymo391ad9f2014-01-29 14:36:20 -08001// Copyright (c) 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
Alex Deymoa07a1232014-02-25 14:19:50 -08005#include <vector>
6
Alex Deymo391ad9f2014-01-29 14:36:20 -08007#include <gtest/gtest.h>
8
Alex Deymo6e97bb22014-02-05 16:46:16 -08009#include "update_engine/policy_manager/variable.h"
Alex Deymo391ad9f2014-01-29 14:36:20 -080010
Alex Deymoa8033932014-02-25 10:33:13 -080011using base::TimeDelta;
Alex Deymo391ad9f2014-01-29 14:36:20 -080012using std::string;
Alex Deymoa07a1232014-02-25 14:19:50 -080013using std::vector;
Alex Deymo391ad9f2014-01-29 14:36:20 -080014
15namespace chromeos_policy_manager {
16
17// Variable class that returns a value constructed with the default value.
18template <typename T>
19class DefaultVariable : public Variable<T> {
20 public:
Alex Deymo0e433692014-02-20 07:23:03 -080021 DefaultVariable(const string& name, VariableMode mode)
22 : Variable<T>(name, mode) {}
Alex Deymoa8033932014-02-25 10:33:13 -080023 DefaultVariable(const string& name, const TimeDelta& poll_interval)
24 : Variable<T>(name, poll_interval) {}
Alex Deymo391ad9f2014-01-29 14:36:20 -080025 virtual ~DefaultVariable() {}
26
27 protected:
28 virtual const T* GetValue(base::TimeDelta /* timeout */,
29 string* /* errmsg */) {
30 return new T();
31 }
32
33 private:
34 DISALLOW_COPY_AND_ASSIGN(DefaultVariable);
35};
36
37TEST(PmBaseVariableTest, GetNameTest) {
Alex Deymo0e433692014-02-20 07:23:03 -080038 DefaultVariable<int> var("var", kVariableModeConst);
Alex Deymo391ad9f2014-01-29 14:36:20 -080039 EXPECT_EQ(var.GetName(), string("var"));
40}
41
Alex Deymo0e433692014-02-20 07:23:03 -080042TEST(PmBaseVariableTest, GetModeTest) {
43 DefaultVariable<int> var("var", kVariableModeConst);
44 EXPECT_EQ(var.GetMode(), kVariableModeConst);
45 DefaultVariable<int> other_var("other_var", kVariableModePoll);
46 EXPECT_EQ(other_var.GetMode(), kVariableModePoll);
47}
48
Alex Deymoa8033932014-02-25 10:33:13 -080049TEST(PmBaseVariableTest, DefaultPollIntervalTest) {
50 DefaultVariable<int> const_var("const_var", kVariableModeConst);
51 EXPECT_EQ(const_var.GetPollInterval(), TimeDelta());
52 DefaultVariable<int> poll_var("poll_var", kVariableModePoll);
53 EXPECT_EQ(poll_var.GetPollInterval(), TimeDelta::FromMinutes(5));
54}
55
56TEST(PmBaseVariableTest, GetPollIntervalTest) {
57 DefaultVariable<int> var("var", TimeDelta::FromMinutes(3));
58 EXPECT_EQ(var.GetMode(), kVariableModePoll);
59 EXPECT_EQ(var.GetPollInterval(), TimeDelta::FromMinutes(3));
60}
61
Alex Deymoa07a1232014-02-25 14:19:50 -080062class BaseVariableObserver : public BaseVariable::Observer {
63 public:
64 void ValueChanged(BaseVariable* variable) {
65 calls_.push_back(variable);
66 }
67
68 // List of called functions.
69 vector<BaseVariable*> calls_;
70};
71
72TEST(PmBaseVariableTest, RepeatedObserverTest) {
73 DefaultVariable<int> var("var", kVariableModeAsync);
74 BaseVariableObserver observer;
75 var.AddObserver(&observer);
76 EXPECT_EQ(var.observer_list_.size(), 1);
77 var.AddObserver(&observer);
78 EXPECT_EQ(var.observer_list_.size(), 1);
79 var.RemoveObserver(&observer);
80 EXPECT_EQ(var.observer_list_.size(), 0);
81 var.RemoveObserver(&observer);
82 EXPECT_EQ(var.observer_list_.size(), 0);
83}
84
85TEST(PmBaseVariableTest, NotifyValueChangedTest) {
86 DefaultVariable<int> var("var", kVariableModeAsync);
87 BaseVariableObserver observer1;
88 var.AddObserver(&observer1);
89 // Simulate a value change on the variable's implementation.
90 var.NotifyValueChanged();
91
92 ASSERT_EQ(observer1.calls_.size(), 1);
93 // Check that the observer is called with the right argument.
94 EXPECT_EQ(observer1.calls_[0], &var);
95
96 BaseVariableObserver observer2;
97 var.AddObserver(&observer2);
98 var.NotifyValueChanged();
99
100 // Check that all the observers are called.
101 EXPECT_EQ(observer1.calls_.size(), 2);
102 EXPECT_EQ(observer2.calls_.size(), 1);
103}
104
Alex Deymo391ad9f2014-01-29 14:36:20 -0800105} // namespace chromeos_policy_manager