blob: 573b4d51935f91978c3dec5044f94a01bde68e7d [file] [log] [blame]
/*
* Copyright (C) 2020 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include <filesystem>
#include <fstream>
#include <string>
#include <errno.h>
#include <android-base/file.h>
#include <android-base/result.h>
#include <android-base/scopeguard.h>
#include <android-base/stringprintf.h>
#include <gtest/gtest.h>
#include "apexd_session.h"
#include "apexd_test_utils.h"
#include "apexd_utils.h"
#include "session_state.pb.h"
namespace android {
namespace apex {
namespace {
using android::apex::testing::IsOk;
using android::base::make_scope_guard;
// TODO(b/170329726): add unit tests for apexd_sessions.h
TEST(ApexdSessionTest, GetSessionsDirSessionsStoredInMetadata) {
if (access("/metadata", F_OK) != 0) {
GTEST_SKIP() << "Device doesn't have /metadata partition";
}
std::string result = ApexSession::GetSessionsDir();
ASSERT_EQ(result, "/metadata/apex/sessions");
}
TEST(ApexdSessionTest, GetSessionsDirNoMetadataPartitionFallbackToData) {
if (access("/metadata", F_OK) == 0) {
GTEST_SKIP() << "Device has /metadata partition";
}
std::string result = ApexSession::GetSessionsDir();
ASSERT_EQ(result, "/data/apex/sessions");
}
TEST(ApexdSessionTest, MigrateToMetadataSessionsDir) {
namespace fs = std::filesystem;
if (access("/metadata", F_OK) != 0) {
GTEST_SKIP() << "Device doesn't have /metadata partition";
}
// This is a very ugly test set up, but to have something better we need to
// refactor ApexSession class.
class TestApexSession {
public:
TestApexSession(int id, const SessionState::State& state) {
path_ = "/data/apex/sessions/" + std::to_string(id);
if (auto status = CreateDirIfNeeded(path_, 0700); !status.ok()) {
ADD_FAILURE() << "Failed to create " << path_ << " : "
<< status.error();
}
SessionState session;
session.set_id(id);
session.set_state(state);
std::fstream state_file(
path_ + "/state", std::ios::out | std::ios::trunc | std::ios::binary);
if (!session.SerializeToOstream(&state_file)) {
ADD_FAILURE() << "Failed to write to " << path_;
}
}
~TestApexSession() { fs::remove_all(path_); }
private:
std::string path_;
};
auto deleter = make_scope_guard([&]() {
fs::remove_all("/metadata/apex/sessions/239");
fs::remove_all("/metadata/apex/sessions/1543");
});
TestApexSession session1(239, SessionState::SUCCESS);
TestApexSession session2(1543, SessionState::ACTIVATION_FAILED);
ASSERT_TRUE(IsOk(ApexSession::MigrateToMetadataSessionsDir()));
ASSERT_EQ(2u, ApexSession::GetSessions().size());
auto migrated_session_1 = ApexSession::GetSession(239);
ASSERT_TRUE(IsOk(migrated_session_1));
ASSERT_EQ(SessionState::SUCCESS, migrated_session_1->GetState());
auto migrated_session_2 = ApexSession::GetSession(1543);
ASSERT_TRUE(IsOk(migrated_session_2));
ASSERT_EQ(SessionState::ACTIVATION_FAILED, migrated_session_2->GetState());
}
} // namespace
} // namespace apex
} // namespace android