blob: 62f4bfea3e3b351e57a57c87df24696b412ffbb7 [file] [log] [blame]
Alex Deymo23949d42014-02-05 15:20:59 -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 Deymoaab50e32014-11-10 19:55:35 -08005#include "update_engine/update_manager/boxed_value.h"
6
Alex Deymo23949d42014-02-05 15:20:59 -08007#include <gtest/gtest.h>
8#include <list>
9#include <map>
David Zeuthenfe225c12014-04-29 10:37:35 -070010#include <set>
Alex Deymo23949d42014-02-05 15:20:59 -080011#include <string>
12
David Zeuthenfe225c12014-04-29 10:37:35 -070013#include <base/strings/stringprintf.h>
14#include <base/time/time.h>
15
Alex Deymo63784a52014-05-28 10:46:14 -070016#include "update_engine/update_manager/shill_provider.h"
17#include "update_engine/update_manager/umtest_utils.h"
18#include "update_engine/update_manager/updater_provider.h"
Alex Deymo23949d42014-02-05 15:20:59 -080019
David Zeuthenfe225c12014-04-29 10:37:35 -070020using base::Time;
21using base::TimeDelta;
Alex Deymo23949d42014-02-05 15:20:59 -080022using std::list;
23using std::map;
Alex Deymo63784a52014-05-28 10:46:14 -070024using std::set;
Alex Deymo23949d42014-02-05 15:20:59 -080025using std::string;
26
Alex Deymo63784a52014-05-28 10:46:14 -070027namespace chromeos_update_manager {
Alex Deymo23949d42014-02-05 15:20:59 -080028
29// The DeleterMarker flags a bool variable when the class is destroyed.
30class DeleterMarker {
31 public:
Alex Vakulenko072359c2014-07-18 11:41:07 -070032 explicit DeleterMarker(bool* marker) : marker_(marker) { *marker_ = false; }
Alex Deymo23949d42014-02-05 15:20:59 -080033
34 ~DeleterMarker() { *marker_ = true; }
35
36 private:
David Zeuthenfe225c12014-04-29 10:37:35 -070037 friend string BoxedValue::ValuePrinter<DeleterMarker>(const void *);
38
Alex Deymo23949d42014-02-05 15:20:59 -080039 // Pointer to the bool marker.
40 bool* marker_;
41};
42
David Zeuthenfe225c12014-04-29 10:37:35 -070043template<>
44string BoxedValue::ValuePrinter<DeleterMarker>(const void *value) {
45 const DeleterMarker* val = reinterpret_cast<const DeleterMarker*>(value);
46 return base::StringPrintf("DeleterMarker:%s",
47 *val->marker_ ? "true" : "false");
48}
49
Alex Deymo63784a52014-05-28 10:46:14 -070050TEST(UmBoxedValueTest, Deleted) {
Alex Deymo23949d42014-02-05 15:20:59 -080051 bool marker = true;
52 const DeleterMarker* deleter_marker = new DeleterMarker(&marker);
53
54 EXPECT_FALSE(marker);
55 BoxedValue* box = new BoxedValue(deleter_marker);
56 EXPECT_FALSE(marker);
57 delete box;
58 EXPECT_TRUE(marker);
59}
60
Alex Deymo63784a52014-05-28 10:46:14 -070061TEST(UmBoxedValueTest, MoveConstructor) {
Alex Deymo23949d42014-02-05 15:20:59 -080062 bool marker = true;
63 const DeleterMarker* deleter_marker = new DeleterMarker(&marker);
64
65 BoxedValue* box = new BoxedValue(deleter_marker);
66 BoxedValue* new_box = new BoxedValue(std::move(*box));
67 // box is now undefined but valid.
68 delete box;
69 EXPECT_FALSE(marker);
70 // The deleter_marker gets deleted at this point.
71 delete new_box;
72 EXPECT_TRUE(marker);
73}
74
Alex Deymo63784a52014-05-28 10:46:14 -070075TEST(UmBoxedValueTest, MixedList) {
Alex Deymo23949d42014-02-05 15:20:59 -080076 list<BoxedValue> lst;
77 // This is mostly a compile test.
Gilad Arnoldec7f9162014-07-15 13:24:46 -070078 lst.emplace_back(new const int{42});
Alex Deymo23949d42014-02-05 15:20:59 -080079 lst.emplace_back(new const string("Hello world!"));
80 bool marker;
81 lst.emplace_back(new const DeleterMarker(&marker));
82 EXPECT_FALSE(marker);
83 lst.clear();
84 EXPECT_TRUE(marker);
85}
86
Alex Deymo63784a52014-05-28 10:46:14 -070087TEST(UmBoxedValueTest, MixedMap) {
Alex Deymo23949d42014-02-05 15:20:59 -080088 map<int, BoxedValue> m;
89 m.emplace(42, std::move(BoxedValue(new const string("Hola mundo!"))));
90
91 auto it = m.find(42);
92 ASSERT_NE(it, m.end());
Alex Vakulenko88b591f2014-08-28 16:48:57 -070093 EXPECT_NE(nullptr, it->second.value());
94 EXPECT_EQ(nullptr, m[33].value());
Alex Deymo23949d42014-02-05 15:20:59 -080095}
96
Alex Deymo63784a52014-05-28 10:46:14 -070097TEST(UmBoxedValueTest, StringToString) {
David Zeuthenfe225c12014-04-29 10:37:35 -070098 EXPECT_EQ("Hej Verden!",
99 BoxedValue(new string("Hej Verden!")).ToString());
100}
101
Alex Deymo63784a52014-05-28 10:46:14 -0700102TEST(UmBoxedValueTest, IntToString) {
David Zeuthenfe225c12014-04-29 10:37:35 -0700103 EXPECT_EQ("42", BoxedValue(new int(42)).ToString());
104}
105
Alex Deymo63784a52014-05-28 10:46:14 -0700106TEST(UmBoxedValueTest, Int64ToString) {
Alex Vakulenko072359c2014-07-18 11:41:07 -0700107 // -123456789012345 doesn't fit in 32-bit integers.
Alex Deymof967ebe2014-05-05 14:46:17 -0700108 EXPECT_EQ("-123456789012345", BoxedValue(
109 new int64_t(-123456789012345LL)).ToString());
110}
111
Alex Deymo63784a52014-05-28 10:46:14 -0700112TEST(UmBoxedValueTest, UnsignedIntToString) {
David Zeuthenfe225c12014-04-29 10:37:35 -0700113 // 4294967295 is the biggest possible 32-bit unsigned integer.
Alex Vakulenko072359c2014-07-18 11:41:07 -0700114 EXPECT_EQ("4294967295",
115 BoxedValue(new unsigned int(4294967295U)).ToString()); // NOLINT
David Zeuthenfe225c12014-04-29 10:37:35 -0700116}
117
Alex Deymo63784a52014-05-28 10:46:14 -0700118TEST(UmBoxedValueTest, UnsignedInt64ToString) {
David Zeuthenfe225c12014-04-29 10:37:35 -0700119 // 18446744073709551615 is the biggest possible 64-bit unsigned integer.
120 EXPECT_EQ("18446744073709551615", BoxedValue(
Alex Deymof967ebe2014-05-05 14:46:17 -0700121 new uint64_t(18446744073709551615ULL)).ToString());
David Zeuthenfe225c12014-04-29 10:37:35 -0700122}
123
Alex Deymo63784a52014-05-28 10:46:14 -0700124TEST(UmBoxedValueTest, BoolToString) {
David Zeuthenfe225c12014-04-29 10:37:35 -0700125 EXPECT_EQ("false", BoxedValue(new bool(false)).ToString());
126 EXPECT_EQ("true", BoxedValue(new bool(true)).ToString());
127}
128
Alex Deymo63784a52014-05-28 10:46:14 -0700129TEST(UmBoxedValueTest, DoubleToString) {
David Zeuthenfe225c12014-04-29 10:37:35 -0700130 EXPECT_EQ("1.501", BoxedValue(new double(1.501)).ToString());
131}
132
Alex Deymo63784a52014-05-28 10:46:14 -0700133TEST(UmBoxedValueTest, TimeToString) {
David Zeuthenfe225c12014-04-29 10:37:35 -0700134 // Tue Apr 29 22:30:55 UTC 2014 is 1398810655 seconds since the Unix Epoch.
135 EXPECT_EQ("4/29/2014 22:30:55 GMT",
136 BoxedValue(new Time(Time::FromTimeT(1398810655))).ToString());
137}
138
Alex Deymo63784a52014-05-28 10:46:14 -0700139TEST(UmBoxedValueTest, TimeDeltaToString) {
David Zeuthenfe225c12014-04-29 10:37:35 -0700140 // 12345 seconds is 3 hours, 25 minutes and 45 seconds.
141 EXPECT_EQ("3h25m45s",
142 BoxedValue(new TimeDelta(TimeDelta::FromSeconds(12345)))
143 .ToString());
144}
145
Alex Deymo63784a52014-05-28 10:46:14 -0700146TEST(UmBoxedValueTest, ConnectionTypeToString) {
David Zeuthenfe225c12014-04-29 10:37:35 -0700147 EXPECT_EQ("Ethernet",
148 BoxedValue(new ConnectionType(ConnectionType::kEthernet))
149 .ToString());
150 EXPECT_EQ("Wifi",
151 BoxedValue(new ConnectionType(ConnectionType::kWifi)).ToString());
152 EXPECT_EQ("Wimax",
153 BoxedValue(new ConnectionType(ConnectionType::kWimax)).ToString());
154 EXPECT_EQ("Bluetooth",
155 BoxedValue(new ConnectionType(ConnectionType::kBluetooth))
156 .ToString());
157 EXPECT_EQ("Cellular",
158 BoxedValue(new ConnectionType(ConnectionType::kCellular))
159 .ToString());
160 EXPECT_EQ("Unknown",
161 BoxedValue(new ConnectionType(ConnectionType::kUnknown))
162 .ToString());
163}
164
Alex Deymo63784a52014-05-28 10:46:14 -0700165TEST(UmBoxedValueTest, ConnectionTetheringToString) {
David Zeuthenfe225c12014-04-29 10:37:35 -0700166 EXPECT_EQ("Not Detected",
167 BoxedValue(new ConnectionTethering(
168 ConnectionTethering::kNotDetected)).ToString());
169 EXPECT_EQ("Suspected",
170 BoxedValue(new ConnectionTethering(ConnectionTethering::kSuspected))
171 .ToString());
172 EXPECT_EQ("Confirmed",
173 BoxedValue(new ConnectionTethering(ConnectionTethering::kConfirmed))
174 .ToString());
175 EXPECT_EQ("Unknown",
176 BoxedValue(new ConnectionTethering(ConnectionTethering::kUnknown))
177 .ToString());
178}
179
Alex Deymo63784a52014-05-28 10:46:14 -0700180TEST(UmBoxedValueTest, SetConnectionTypeToString) {
David Zeuthenfe225c12014-04-29 10:37:35 -0700181 set<ConnectionType>* set1 = new set<ConnectionType>;
182 set1->insert(ConnectionType::kWimax);
183 set1->insert(ConnectionType::kEthernet);
184 EXPECT_EQ("Ethernet,Wimax", BoxedValue(set1).ToString());
185
186 set<ConnectionType>* set2 = new set<ConnectionType>;
187 set2->insert(ConnectionType::kWifi);
188 EXPECT_EQ("Wifi", BoxedValue(set2).ToString());
189}
190
Alex Deymo63784a52014-05-28 10:46:14 -0700191TEST(UmBoxedValueTest, StageToString) {
David Zeuthenfe225c12014-04-29 10:37:35 -0700192 EXPECT_EQ("Idle",
193 BoxedValue(new Stage(Stage::kIdle)).ToString());
194 EXPECT_EQ("Checking For Update",
195 BoxedValue(new Stage(Stage::kCheckingForUpdate)).ToString());
196 EXPECT_EQ("Update Available",
197 BoxedValue(new Stage(Stage::kUpdateAvailable)).ToString());
198 EXPECT_EQ("Downloading",
199 BoxedValue(new Stage(Stage::kDownloading)).ToString());
200 EXPECT_EQ("Verifying",
201 BoxedValue(new Stage(Stage::kVerifying)).ToString());
202 EXPECT_EQ("Finalizing",
203 BoxedValue(new Stage(Stage::kFinalizing)).ToString());
204 EXPECT_EQ("Updated, Need Reboot",
205 BoxedValue(new Stage(Stage::kUpdatedNeedReboot)).ToString());
206 EXPECT_EQ("Reporting Error Event",
207 BoxedValue(new Stage(Stage::kReportingErrorEvent)).ToString());
208 EXPECT_EQ("Attempting Rollback",
209 BoxedValue(new Stage(Stage::kAttemptingRollback)).ToString());
210}
211
Alex Deymo63784a52014-05-28 10:46:14 -0700212TEST(UmBoxedValueTest, DeleterMarkerToString) {
David Zeuthenfe225c12014-04-29 10:37:35 -0700213 bool marker = false;
214 BoxedValue value = BoxedValue(new DeleterMarker(&marker));
215 EXPECT_EQ("DeleterMarker:false", value.ToString());
216 marker = true;
217 EXPECT_EQ("DeleterMarker:true", value.ToString());
218}
219
Alex Deymo63784a52014-05-28 10:46:14 -0700220} // namespace chromeos_update_manager