blob: b935ff7ea88eda540c26a5dcccd4dd6164a50cc2 [file] [log] [blame]
// Copyright 2020 The ChromiumOS Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "federated/utils.h"
#include <memory>
#include <gmock/gmock.h>
#include <gtest/gtest.h>
#include "federated/mojom/example.mojom.h"
#include "federated/protos/example.pb.h"
#include "federated/protos/feature.pb.h"
#include "federated/test_utils.h"
namespace federated {
namespace {
using ::chromeos::federated::mojom::Example;
using ::chromeos::federated::mojom::ExamplePtr;
using ::chromeos::federated::mojom::Features;
using ::testing::ElementsAre;
TEST(UtilsTest, ConvertToTensorFlowExampleProto) {
const auto example = CreateExamplePtr();
const tensorflow::Example tf_example_converted =
ConvertToTensorFlowExampleProto(example);
const auto& tf_feature_map = tf_example_converted.features().feature();
EXPECT_EQ(tf_feature_map.size(), 4);
EXPECT_TRUE(tf_feature_map.contains("int_feature1"));
const auto& int_feature1 = tf_feature_map.at("int_feature1");
EXPECT_TRUE(int_feature1.has_int64_list() && !int_feature1.has_float_list() &&
!int_feature1.has_bytes_list());
EXPECT_THAT(int_feature1.int64_list().value(), ElementsAre(1, 2, 3, 4, 5));
EXPECT_TRUE(tf_feature_map.contains("int_feature2"));
const auto& int_feature2 = tf_feature_map.at("int_feature2");
EXPECT_TRUE(int_feature2.has_int64_list() && !int_feature2.has_float_list() &&
!int_feature2.has_bytes_list());
EXPECT_THAT(int_feature2.int64_list().value(),
ElementsAre(10, 20, 30, 40, 50));
EXPECT_TRUE(tf_feature_map.contains("float_feature1"));
const auto& float_feature = tf_feature_map.at("float_feature1");
EXPECT_TRUE(!float_feature.has_int64_list() &&
float_feature.has_float_list() &&
!float_feature.has_bytes_list());
EXPECT_THAT(float_feature.float_list().value(),
ElementsAre(1.1, 2.1, 3.1, 4.1, 5.1));
EXPECT_TRUE(tf_feature_map.contains("string_feature1"));
const auto& string_feature = tf_feature_map.at("string_feature1");
EXPECT_TRUE(!string_feature.has_int64_list() &&
!string_feature.has_float_list() &&
string_feature.has_bytes_list());
EXPECT_THAT(string_feature.bytes_list().value(),
ElementsAre("abc", "123", "xyz"));
}
TEST(UtilsTest, FilePaths) {
const std::string sanitized_username = "foo";
const std::string client_name = "bar";
EXPECT_EQ(GetDatabasePath(sanitized_username).value(),
"/run/daemon-store/federated/foo/examples.db");
EXPECT_EQ(GetBaseDir(sanitized_username, client_name).value(),
"/run/daemon-store/federated/foo/bar");
}
TEST(UtilsTest, ValidBrellaLibVersion) {
// Valid release versions.
auto brella_lib_version = ConvertBrellaLibVersion("15217.0.0");
EXPECT_TRUE(brella_lib_version.has_value());
EXPECT_EQ(brella_lib_version.value(), "chromeos_152170000000000");
brella_lib_version = ConvertBrellaLibVersion("15217.123.4");
EXPECT_TRUE(brella_lib_version.has_value());
EXPECT_EQ(brella_lib_version.value(), "chromeos_152170001230004");
brella_lib_version = ConvertBrellaLibVersion("123456789.123456.7890");
EXPECT_TRUE(brella_lib_version.has_value());
EXPECT_EQ(brella_lib_version.value(), "chromeos_1234567891234567890");
}
TEST(UtilsTest, InValidClientVersion) {
// Major version is too long.
EXPECT_EQ(ConvertBrellaLibVersion("1521715127.12345.67"), std::nullopt);
// Minor version is too long.
EXPECT_EQ(ConvertBrellaLibVersion("15217.1234567.8"), std::nullopt);
// Sub version is too long.
EXPECT_EQ(ConvertBrellaLibVersion("15217.123.45678"), std::nullopt);
// Malformed patterns
EXPECT_EQ(ConvertBrellaLibVersion("15217.123"), std::nullopt);
EXPECT_EQ(ConvertBrellaLibVersion("15217.123.4.5"), std::nullopt);
EXPECT_EQ(ConvertBrellaLibVersion("R109-15217.123.4"), std::nullopt);
}
} // namespace
} // namespace federated