blob: 82ca8b91196770844400bfd09fa889acc53f1fb8 [file] [log] [blame]
// Copyright 2017 The Chromium OS Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "modemfwd/firmware_directory.h"
#include <memory>
#include <string>
#include <utility>
#include <vector>
#include <base/files/file_path.h>
#include <base/files/file_util.h>
#include <base/files/scoped_temp_dir.h>
#include <gtest/gtest.h>
namespace {
constexpr char kDeviceId[] = "device-id";
constexpr char kMainFirmwareFile[] = "NAND_10.20.30.40.fls";
constexpr char kMainFirmwareVersion[] = "10.20.30.40";
constexpr char kCarrierA[] = "CarrierA";
constexpr char kCarrierFirmwareFile1[] = "CarrierA_40.30.20.10.fls";
constexpr char kCarrierFirmwareVersion1[] = "40.30.20.10";
constexpr char kCarrierB[] = "CarrierB";
constexpr char kCarrierFirmwareFile2[] = "Custom_B_50_60.fls";
constexpr char kCarrierFirmwareVersion2[] = "50.60.70.80";
constexpr char kCarrierC[] = "CarrierC";
constexpr char kGenericCarrierFirmwareFile[] = "Generic_V1.59.3.fls";
constexpr char kGenericCarrierFirmwareVersion[] = "V1.59.3";
} // namespace
namespace modemfwd {
class FirmwareDirectoryTest : public ::testing::Test {
public:
FirmwareDirectoryTest() { CHECK(temp_dir_.CreateUniqueTempDir()); }
~FirmwareDirectoryTest() override = default;
protected:
void SetUpDirectory(const base::FilePath& manifest) {
base::FilePath manifest_in_dir =
temp_dir_.GetPath().Append("firmware_manifest.prototxt");
CHECK(base::CopyFile(manifest, manifest_in_dir));
firmware_directory_ = CreateFirmwareDirectory(temp_dir_.GetPath());
CHECK(firmware_directory_);
}
std::unique_ptr<FirmwareDirectory> firmware_directory_;
private:
base::ScopedTempDir temp_dir_;
};
TEST_F(FirmwareDirectoryTest, FindFirmware) {
const base::FilePath kManifest("test_protos/find_firmware.prototxt");
SetUpDirectory(kManifest);
FirmwareFileInfo info;
EXPECT_TRUE(firmware_directory_->FindMainFirmware(kDeviceId, &info));
EXPECT_EQ(kMainFirmwareFile, info.firmware_path.BaseName().value());
EXPECT_EQ(kMainFirmwareVersion, info.version);
std::string carrier_a(kCarrierA);
EXPECT_TRUE(
firmware_directory_->FindCarrierFirmware(kDeviceId, &carrier_a, &info));
EXPECT_EQ(kCarrierA, carrier_a);
EXPECT_EQ(kCarrierFirmwareFile1, info.firmware_path.BaseName().value());
EXPECT_EQ(kCarrierFirmwareVersion1, info.version);
}
TEST_F(FirmwareDirectoryTest, NoFirmwareForDevice) {
const base::FilePath kManifest("/dev/null");
SetUpDirectory(kManifest);
FirmwareFileInfo info;
EXPECT_FALSE(firmware_directory_->FindMainFirmware(kDeviceId, &info));
std::string carrier_a(kCarrierA);
EXPECT_FALSE(
firmware_directory_->FindCarrierFirmware(kDeviceId, &carrier_a, &info));
}
TEST_F(FirmwareDirectoryTest, FirmwareForDifferentCarrier) {
const base::FilePath kManifest(
"test_protos/firmware_for_different_carrier.prototxt");
SetUpDirectory(kManifest);
FirmwareFileInfo info;
std::string carrier_b(kCarrierB);
EXPECT_FALSE(
firmware_directory_->FindCarrierFirmware(kDeviceId, &carrier_b, &info));
}
TEST_F(FirmwareDirectoryTest, FirmwareForDifferentDevice) {
const base::FilePath kManifest(
"test_protos/firmware_for_different_device.prototxt");
SetUpDirectory(kManifest);
FirmwareFileInfo info;
EXPECT_FALSE(firmware_directory_->FindMainFirmware(kDeviceId, &info));
}
TEST_F(FirmwareDirectoryTest, MultipleCarrierFirmware) {
const base::FilePath kManifest(
"test_protos/multiple_carrier_firmware.prototxt");
SetUpDirectory(kManifest);
FirmwareFileInfo info;
std::string carrier_a(kCarrierA);
EXPECT_TRUE(
firmware_directory_->FindCarrierFirmware(kDeviceId, &carrier_a, &info));
EXPECT_EQ(kCarrierA, carrier_a);
EXPECT_EQ(kCarrierFirmwareFile1, info.firmware_path.BaseName().value());
EXPECT_EQ(kCarrierFirmwareVersion1, info.version);
std::string carrier_b(kCarrierB);
EXPECT_TRUE(
firmware_directory_->FindCarrierFirmware(kDeviceId, &carrier_b, &info));
EXPECT_EQ(kCarrierB, carrier_b);
EXPECT_EQ(kCarrierFirmwareFile2, info.firmware_path.BaseName().value());
EXPECT_EQ(kCarrierFirmwareVersion2, info.version);
}
TEST_F(FirmwareDirectoryTest, GenericFirmware) {
const base::FilePath kManifest("test_protos/generic_firmware.prototxt");
SetUpDirectory(kManifest);
FirmwareFileInfo info;
std::string carrier_a(kCarrierA);
EXPECT_TRUE(
firmware_directory_->FindCarrierFirmware(kDeviceId, &carrier_a, &info));
EXPECT_EQ(FirmwareDirectory::kGenericCarrierId, carrier_a);
EXPECT_EQ(kGenericCarrierFirmwareFile, info.firmware_path.BaseName().value());
EXPECT_EQ(kGenericCarrierFirmwareVersion, info.version);
}
TEST_F(FirmwareDirectoryTest, SpecificBeforeGeneric) {
const base::FilePath kManifest(
"test_protos/specific_before_generic.prototxt");
SetUpDirectory(kManifest);
FirmwareFileInfo info;
std::string carrier_a(kCarrierA);
EXPECT_TRUE(
firmware_directory_->FindCarrierFirmware(kDeviceId, &carrier_a, &info));
EXPECT_EQ(kCarrierA, carrier_a);
EXPECT_EQ(kCarrierFirmwareFile1, info.firmware_path.BaseName().value());
EXPECT_EQ(kCarrierFirmwareVersion1, info.version);
}
TEST_F(FirmwareDirectoryTest, FirmwareSupportsTwoCarriers) {
const base::FilePath kManifest("test_protos/two_carrier_firmware.prototxt");
SetUpDirectory(kManifest);
FirmwareFileInfo info;
std::string carrier_a(kCarrierA);
EXPECT_TRUE(
firmware_directory_->FindCarrierFirmware(kDeviceId, &carrier_a, &info));
EXPECT_EQ(kCarrierA, carrier_a);
EXPECT_EQ(kCarrierFirmwareFile1, info.firmware_path.BaseName().value());
EXPECT_EQ(kCarrierFirmwareVersion1, info.version);
std::string carrier_b(kCarrierB);
EXPECT_TRUE(
firmware_directory_->FindCarrierFirmware(kDeviceId, &carrier_b, &info));
EXPECT_EQ(kCarrierB, carrier_b);
EXPECT_EQ(kCarrierFirmwareFile1, info.firmware_path.BaseName().value());
EXPECT_EQ(kCarrierFirmwareVersion1, info.version);
std::string carrier_c(kCarrierC);
EXPECT_FALSE(
firmware_directory_->FindCarrierFirmware(kDeviceId, &carrier_c, &info));
}
TEST_F(FirmwareDirectoryTest, MalformedMainEntry) {
const base::FilePath kManifest(
"test_protos/malformed_main_firmware.prototxt");
SetUpDirectory(kManifest);
FirmwareFileInfo info;
EXPECT_FALSE(firmware_directory_->FindMainFirmware(kDeviceId, &info));
}
TEST_F(FirmwareDirectoryTest, MalformedCarrierEntry) {
const base::FilePath kManifest(
"test_protos/malformed_carrier_firmware.prototxt");
SetUpDirectory(kManifest);
FirmwareFileInfo info;
std::string carrier_a(kCarrierA);
EXPECT_FALSE(
firmware_directory_->FindCarrierFirmware(kDeviceId, &carrier_a, &info));
}
} // namespace modemfwd