Home | History | Annotate | Download | only in update_manager
      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:
     44   explicit DeleterMarker(bool* marker) : marker_(marker) { *marker_ = false; }
     45 
     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<>
     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 
     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 
     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 
     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 
     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 
    109 TEST(UmBoxedValueTest, StringToString) {
    110   EXPECT_EQ("Hej Verden!",
    111             BoxedValue(new string("Hej Verden!")).ToString());
    112 }
    113 
    114 TEST(UmBoxedValueTest, IntToString) {
    115   EXPECT_EQ("42", BoxedValue(new int(42)).ToString());
    116 }
    117 
    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 
    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 
    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 
    136 TEST(UmBoxedValueTest, BoolToString) {
    137   EXPECT_EQ("false", BoxedValue(new bool(false)).ToString());
    138   EXPECT_EQ("true", BoxedValue(new bool(true)).ToString());
    139 }
    140 
    141 TEST(UmBoxedValueTest, DoubleToString) {
    142   EXPECT_EQ("1.501", BoxedValue(new double(1.501)).ToString());
    143 }
    144 
    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 
    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 
    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 
    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 
    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 
    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 
    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