Home | History | Annotate | Download | only in update_engine
      1 //
      2 // Copyright (C) 2017 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/image_properties.h"
     18 
     19 #include <string>
     20 
     21 #include <base/files/file_util.h>
     22 #include <base/files/scoped_temp_dir.h>
     23 #include <gtest/gtest.h>
     24 
     25 #include "update_engine/common/constants.h"
     26 #include "update_engine/common/fake_prefs.h"
     27 #include "update_engine/common/test_utils.h"
     28 #include "update_engine/fake_system_state.h"
     29 
     30 using chromeos_update_engine::test_utils::WriteFileString;
     31 using std::string;
     32 
     33 namespace chromeos_update_engine {
     34 
     35 class ImagePropertiesTest : public ::testing::Test {
     36  protected:
     37   void SetUp() override {
     38     // Create a uniquely named test directory.
     39     ASSERT_TRUE(tempdir_.CreateUniqueTempDir());
     40     osrelease_dir_ = tempdir_.GetPath().Append("etc/os-release.d");
     41     EXPECT_TRUE(base::CreateDirectory(osrelease_dir_));
     42     test::SetImagePropertiesRootPrefix(tempdir_.GetPath().value().c_str());
     43   }
     44 
     45   void WriteOsRelease(const string& key, const string& value) {
     46     ASSERT_TRUE(WriteFileString(osrelease_dir_.Append(key).value(), value));
     47   }
     48 
     49   void WriteChannel(const string& channel) {
     50     string misc(2080, '\0');
     51     misc += channel;
     52     misc.resize(4096);
     53     ASSERT_TRUE(
     54         WriteFileString(tempdir_.GetPath().Append("misc").value(), misc));
     55   }
     56 
     57   FakeSystemState fake_system_state_;
     58 
     59   base::ScopedTempDir tempdir_;
     60   base::FilePath osrelease_dir_;
     61 };
     62 
     63 TEST_F(ImagePropertiesTest, SimpleTest) {
     64   WriteOsRelease("product_id", "abc");
     65   WriteOsRelease("system_id", "def");
     66   WriteOsRelease("product_version", "1.2.3.4");
     67   WriteOsRelease("system_version", "5.6.7.8");
     68   ImageProperties props = LoadImageProperties(&fake_system_state_);
     69   EXPECT_EQ("abc", props.product_id);
     70   EXPECT_EQ("def", props.system_id);
     71   EXPECT_EQ("1.2.3.4", props.version);
     72   EXPECT_EQ("5.6.7.8", props.system_version);
     73   EXPECT_EQ("stable-channel", props.current_channel);
     74   EXPECT_EQ(constants::kOmahaDefaultProductionURL, props.omaha_url);
     75 }
     76 
     77 TEST_F(ImagePropertiesTest, IDPrefixTest) {
     78   WriteOsRelease("product_id", "abc:def");
     79   WriteOsRelease("system_id", "foo:bar");
     80   ImageProperties props = LoadImageProperties(&fake_system_state_);
     81   EXPECT_EQ("abc:def", props.product_id);
     82   EXPECT_EQ("abc:bar", props.system_id);
     83 }
     84 
     85 TEST_F(ImagePropertiesTest, IDInvalidPrefixTest) {
     86   WriteOsRelease("product_id", "def");
     87   WriteOsRelease("system_id", "foo:bar");
     88   ImageProperties props = LoadImageProperties(&fake_system_state_);
     89   EXPECT_EQ("def", props.product_id);
     90   EXPECT_EQ("foo:bar", props.system_id);
     91 
     92   WriteOsRelease("product_id", "abc:def");
     93   WriteOsRelease("system_id", "bar");
     94   props = LoadImageProperties(&fake_system_state_);
     95   EXPECT_EQ("abc:def", props.product_id);
     96   EXPECT_EQ("bar", props.system_id);
     97 }
     98 
     99 TEST_F(ImagePropertiesTest, LoadChannelTest) {
    100   WriteChannel("unittest-channel");
    101   ImageProperties props = LoadImageProperties(&fake_system_state_);
    102   EXPECT_EQ("unittest-channel", props.current_channel);
    103 }
    104 
    105 TEST_F(ImagePropertiesTest, DefaultStableChannelTest) {
    106   WriteChannel("");
    107   ImageProperties props = LoadImageProperties(&fake_system_state_);
    108   EXPECT_EQ("stable-channel", props.current_channel);
    109 }
    110 
    111 TEST_F(ImagePropertiesTest, StoreLoadMutableChannelTest) {
    112   FakePrefs prefs;
    113   fake_system_state_.set_prefs(&prefs);
    114   WriteChannel("previous-channel");
    115   MutableImageProperties props;
    116   props.target_channel = "new-channel";
    117   EXPECT_TRUE(StoreMutableImageProperties(&fake_system_state_, props));
    118   MutableImageProperties loaded_props =
    119       LoadMutableImageProperties(&fake_system_state_);
    120   EXPECT_EQ(props.target_channel, loaded_props.target_channel);
    121 }
    122 
    123 }  // namespace chromeos_update_engine
    124