1 // 2 // Copyright (C) 2014 The Android Open Source Project 3 // 4 // Licensed under the Apache License, Version 2.0 (the "License"); 5 // you may not use this file except in compliance with the License. 6 // You may obtain a copy of the License at 7 // 8 // http://www.apache.org/licenses/LICENSE-2.0 9 // 10 // Unless required by applicable law or agreed to in writing, software 11 // distributed under the License is distributed on an "AS IS" BASIS, 12 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 // See the License for the specific language governing permissions and 14 // limitations under the License. 15 // 16 17 #include "update_engine/update_manager/boxed_value.h" 18 19 #include <gtest/gtest.h> 20 #include <list> 21 #include <map> 22 #include <set> 23 #include <string> 24 25 #include <base/strings/stringprintf.h> 26 #include <base/time/time.h> 27 28 #include "update_engine/update_manager/shill_provider.h" 29 #include "update_engine/update_manager/umtest_utils.h" 30 #include "update_engine/update_manager/updater_provider.h" 31 32 using base::Time; 33 using base::TimeDelta; 34 using std::list; 35 using std::map; 36 using std::set; 37 using std::string; 38 39 namespace chromeos_update_manager { 40 41 // The DeleterMarker flags a bool variable when the class is destroyed. 42 class DeleterMarker { 43 public: DeleterMarker(bool * marker)44 explicit DeleterMarker(bool* marker) : marker_(marker) { *marker_ = false; } 45 ~DeleterMarker()46 ~DeleterMarker() { *marker_ = true; } 47 48 private: 49 friend string BoxedValue::ValuePrinter<DeleterMarker>(const void *); 50 51 // Pointer to the bool marker. 52 bool* marker_; 53 }; 54 55 template<> ValuePrinter(const void * value)56 string BoxedValue::ValuePrinter<DeleterMarker>(const void *value) { 57 const DeleterMarker* val = reinterpret_cast<const DeleterMarker*>(value); 58 return base::StringPrintf("DeleterMarker:%s", 59 *val->marker_ ? "true" : "false"); 60 } 61 TEST(UmBoxedValueTest,Deleted)62 TEST(UmBoxedValueTest, Deleted) { 63 bool marker = true; 64 const DeleterMarker* deleter_marker = new DeleterMarker(&marker); 65 66 EXPECT_FALSE(marker); 67 BoxedValue* box = new BoxedValue(deleter_marker); 68 EXPECT_FALSE(marker); 69 delete box; 70 EXPECT_TRUE(marker); 71 } 72 TEST(UmBoxedValueTest,MoveConstructor)73 TEST(UmBoxedValueTest, MoveConstructor) { 74 bool marker = true; 75 const DeleterMarker* deleter_marker = new DeleterMarker(&marker); 76 77 BoxedValue* box = new BoxedValue(deleter_marker); 78 BoxedValue* new_box = new BoxedValue(std::move(*box)); 79 // box is now undefined but valid. 80 delete box; 81 EXPECT_FALSE(marker); 82 // The deleter_marker gets deleted at this point. 83 delete new_box; 84 EXPECT_TRUE(marker); 85 } 86 TEST(UmBoxedValueTest,MixedList)87 TEST(UmBoxedValueTest, MixedList) { 88 list<BoxedValue> lst; 89 // This is mostly a compile test. 90 lst.emplace_back(new const int{42}); 91 lst.emplace_back(new const string("Hello world!")); 92 bool marker; 93 lst.emplace_back(new const DeleterMarker(&marker)); 94 EXPECT_FALSE(marker); 95 lst.clear(); 96 EXPECT_TRUE(marker); 97 } 98 TEST(UmBoxedValueTest,MixedMap)99 TEST(UmBoxedValueTest, MixedMap) { 100 map<int, BoxedValue> m; 101 m.emplace(42, BoxedValue(new const string("Hola mundo!"))); 102 103 auto it = m.find(42); 104 ASSERT_NE(it, m.end()); 105 EXPECT_NE(nullptr, it->second.value()); 106 EXPECT_EQ(nullptr, m[33].value()); 107 } 108 TEST(UmBoxedValueTest,StringToString)109 TEST(UmBoxedValueTest, StringToString) { 110 EXPECT_EQ("Hej Verden!", 111 BoxedValue(new string("Hej Verden!")).ToString()); 112 } 113 TEST(UmBoxedValueTest,IntToString)114 TEST(UmBoxedValueTest, IntToString) { 115 EXPECT_EQ("42", BoxedValue(new int(42)).ToString()); 116 } 117 TEST(UmBoxedValueTest,Int64ToString)118 TEST(UmBoxedValueTest, Int64ToString) { 119 // -123456789012345 doesn't fit in 32-bit integers. 120 EXPECT_EQ("-123456789012345", BoxedValue( 121 new int64_t(-123456789012345LL)).ToString()); 122 } 123 TEST(UmBoxedValueTest,UnsignedIntToString)124 TEST(UmBoxedValueTest, UnsignedIntToString) { 125 // 4294967295 is the biggest possible 32-bit unsigned integer. 126 EXPECT_EQ("4294967295", 127 BoxedValue(new unsigned int(4294967295U)).ToString()); // NOLINT 128 } 129 TEST(UmBoxedValueTest,UnsignedInt64ToString)130 TEST(UmBoxedValueTest, UnsignedInt64ToString) { 131 // 18446744073709551615 is the biggest possible 64-bit unsigned integer. 132 EXPECT_EQ("18446744073709551615", BoxedValue( 133 new uint64_t(18446744073709551615ULL)).ToString()); 134 } 135 TEST(UmBoxedValueTest,BoolToString)136 TEST(UmBoxedValueTest, BoolToString) { 137 EXPECT_EQ("false", BoxedValue(new bool(false)).ToString()); 138 EXPECT_EQ("true", BoxedValue(new bool(true)).ToString()); 139 } 140 TEST(UmBoxedValueTest,DoubleToString)141 TEST(UmBoxedValueTest, DoubleToString) { 142 EXPECT_EQ("1.501", BoxedValue(new double(1.501)).ToString()); 143 } 144 TEST(UmBoxedValueTest,TimeToString)145 TEST(UmBoxedValueTest, TimeToString) { 146 // Tue Apr 29 22:30:55 UTC 2014 is 1398810655 seconds since the Unix Epoch. 147 EXPECT_EQ("4/29/2014 22:30:55 GMT", 148 BoxedValue(new Time(Time::FromTimeT(1398810655))).ToString()); 149 } 150 TEST(UmBoxedValueTest,TimeDeltaToString)151 TEST(UmBoxedValueTest, TimeDeltaToString) { 152 // 12345 seconds is 3 hours, 25 minutes and 45 seconds. 153 EXPECT_EQ("3h25m45s", 154 BoxedValue(new TimeDelta(TimeDelta::FromSeconds(12345))) 155 .ToString()); 156 } 157 TEST(UmBoxedValueTest,ConnectionTypeToString)158 TEST(UmBoxedValueTest, ConnectionTypeToString) { 159 EXPECT_EQ("Ethernet", 160 BoxedValue(new ConnectionType(ConnectionType::kEthernet)) 161 .ToString()); 162 EXPECT_EQ("Wifi", 163 BoxedValue(new ConnectionType(ConnectionType::kWifi)).ToString()); 164 EXPECT_EQ("Wimax", 165 BoxedValue(new ConnectionType(ConnectionType::kWimax)).ToString()); 166 EXPECT_EQ("Bluetooth", 167 BoxedValue(new ConnectionType(ConnectionType::kBluetooth)) 168 .ToString()); 169 EXPECT_EQ("Cellular", 170 BoxedValue(new ConnectionType(ConnectionType::kCellular)) 171 .ToString()); 172 EXPECT_EQ("Unknown", 173 BoxedValue(new ConnectionType(ConnectionType::kUnknown)) 174 .ToString()); 175 } 176 TEST(UmBoxedValueTest,ConnectionTetheringToString)177 TEST(UmBoxedValueTest, ConnectionTetheringToString) { 178 EXPECT_EQ("Not Detected", 179 BoxedValue(new ConnectionTethering( 180 ConnectionTethering::kNotDetected)).ToString()); 181 EXPECT_EQ("Suspected", 182 BoxedValue(new ConnectionTethering(ConnectionTethering::kSuspected)) 183 .ToString()); 184 EXPECT_EQ("Confirmed", 185 BoxedValue(new ConnectionTethering(ConnectionTethering::kConfirmed)) 186 .ToString()); 187 EXPECT_EQ("Unknown", 188 BoxedValue(new ConnectionTethering(ConnectionTethering::kUnknown)) 189 .ToString()); 190 } 191 TEST(UmBoxedValueTest,SetConnectionTypeToString)192 TEST(UmBoxedValueTest, SetConnectionTypeToString) { 193 set<ConnectionType>* set1 = new set<ConnectionType>; 194 set1->insert(ConnectionType::kWimax); 195 set1->insert(ConnectionType::kEthernet); 196 EXPECT_EQ("Ethernet,Wimax", BoxedValue(set1).ToString()); 197 198 set<ConnectionType>* set2 = new set<ConnectionType>; 199 set2->insert(ConnectionType::kWifi); 200 EXPECT_EQ("Wifi", BoxedValue(set2).ToString()); 201 } 202 TEST(UmBoxedValueTest,StageToString)203 TEST(UmBoxedValueTest, StageToString) { 204 EXPECT_EQ("Idle", 205 BoxedValue(new Stage(Stage::kIdle)).ToString()); 206 EXPECT_EQ("Checking For Update", 207 BoxedValue(new Stage(Stage::kCheckingForUpdate)).ToString()); 208 EXPECT_EQ("Update Available", 209 BoxedValue(new Stage(Stage::kUpdateAvailable)).ToString()); 210 EXPECT_EQ("Downloading", 211 BoxedValue(new Stage(Stage::kDownloading)).ToString()); 212 EXPECT_EQ("Verifying", 213 BoxedValue(new Stage(Stage::kVerifying)).ToString()); 214 EXPECT_EQ("Finalizing", 215 BoxedValue(new Stage(Stage::kFinalizing)).ToString()); 216 EXPECT_EQ("Updated, Need Reboot", 217 BoxedValue(new Stage(Stage::kUpdatedNeedReboot)).ToString()); 218 EXPECT_EQ("Reporting Error Event", 219 BoxedValue(new Stage(Stage::kReportingErrorEvent)).ToString()); 220 EXPECT_EQ("Attempting Rollback", 221 BoxedValue(new Stage(Stage::kAttemptingRollback)).ToString()); 222 } 223 TEST(UmBoxedValueTest,DeleterMarkerToString)224 TEST(UmBoxedValueTest, DeleterMarkerToString) { 225 bool marker = false; 226 BoxedValue value = BoxedValue(new DeleterMarker(&marker)); 227 EXPECT_EQ("DeleterMarker:false", value.ToString()); 228 marker = true; 229 EXPECT_EQ("DeleterMarker:true", value.ToString()); 230 } 231 232 } // namespace chromeos_update_manager 233