blob: dbd210afa0ff4c671fbfe9576b6b255c5dac023d [file] [log] [blame]
// Copyright 2013 The Flutter 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 <cstdio>
#include <thread>
#include "flutter/fml/macros.h"
#include "flutter/testing/testing.h"
#include "impeller/archivist/archive.h"
#include "impeller/archivist/archive_location.h"
#include "impeller/archivist/archivist_fixture.h"
namespace impeller {
namespace testing {
static int64_t LastSample = 0;
class Sample : public Archivable {
public:
explicit Sample(uint64_t count = 42) : some_data_(count) {}
Sample(Sample&&) = default;
uint64_t GetSomeData() const { return some_data_; }
// |Archivable|
PrimaryKey GetPrimaryKey() const override { return name_; }
// |Archivable|
bool Write(ArchiveLocation& item) const override {
return item.Write("some_data", some_data_);
};
// |Archivable|
bool Read(ArchiveLocation& item) override {
name_ = item.GetPrimaryKey();
return item.Read("some_data", some_data_);
};
static const ArchiveDef kArchiveDefinition;
private:
uint64_t some_data_;
PrimaryKey name_ = ++LastSample;
FML_DISALLOW_COPY_AND_ASSIGN(Sample);
};
const ArchiveDef Sample::kArchiveDefinition = {
.table_name = "Sample",
.members = {"some_data"},
};
class SampleWithVector : public Archivable {
public:
SampleWithVector() = default;
// |Archivable|
PrimaryKey GetPrimaryKey() const override { return std::nullopt; }
// |Archivable|
bool Write(ArchiveLocation& item) const override {
std::vector<Sample> samples;
for (size_t i = 0; i < 50u; i++) {
samples.emplace_back(Sample{1988 + i});
}
return item.Write("hello", "world") && item.Write("samples", samples);
};
// |Archivable|
bool Read(ArchiveLocation& item) override {
std::string str;
auto str_result = item.Read("hello", str);
std::vector<Sample> samples;
auto vec_result = item.Read("samples", samples);
if (!str_result || str != "world" || !vec_result || samples.size() != 50) {
return false;
}
size_t current = 1988;
for (const auto& sample : samples) {
if (sample.GetSomeData() != current++) {
return false;
}
}
return true;
};
static const ArchiveDef kArchiveDefinition;
private:
std::vector<Sample> samples_;
FML_DISALLOW_COPY_AND_ASSIGN(SampleWithVector);
};
const ArchiveDef SampleWithVector::kArchiveDefinition = {
.table_name = "SampleWithVector",
.members = {"hello", "samples"},
};
using ArchiveTest = ArchivistFixture;
TEST_F(ArchiveTest, SimpleInitialization) {
Archive archive(GetArchiveFileName().c_str());
ASSERT_TRUE(archive.IsValid());
}
TEST_F(ArchiveTest, AddStorageClass) {
Archive archive(GetArchiveFileName().c_str());
ASSERT_TRUE(archive.IsValid());
}
TEST_F(ArchiveTest, AddData) {
Archive archive(GetArchiveFileName().c_str());
ASSERT_TRUE(archive.IsValid());
Sample sample;
ASSERT_TRUE(archive.Write(sample));
}
TEST_F(ArchiveTest, AddDataMultiple) {
Archive archive(GetArchiveFileName().c_str());
ASSERT_TRUE(archive.IsValid());
for (size_t i = 0; i < 100; i++) {
Sample sample(i + 1);
ASSERT_TRUE(archive.Write(sample));
}
}
TEST_F(ArchiveTest, ReadData) {
Archive archive(GetArchiveFileName().c_str());
ASSERT_TRUE(archive.IsValid());
size_t count = 50;
std::vector<PrimaryKey::value_type> keys;
std::vector<uint64_t> values;
for (size_t i = 0; i < count; i++) {
Sample sample(i + 1);
keys.push_back(sample.GetPrimaryKey().value());
values.push_back(sample.GetSomeData());
ASSERT_TRUE(archive.Write(sample));
}
for (size_t i = 0; i < count; i++) {
Sample sample;
ASSERT_TRUE(archive.Read(keys[i], sample));
ASSERT_EQ(values[i], sample.GetSomeData());
}
}
TEST_F(ArchiveTest, ReadDataWithNames) {
Archive archive(GetArchiveFileName().c_str());
ASSERT_TRUE(archive.IsValid());
size_t count = 8;
std::vector<PrimaryKey::value_type> keys;
std::vector<uint64_t> values;
keys.reserve(count);
values.reserve(count);
for (size_t i = 0; i < count; i++) {
Sample sample(i + 1);
keys.push_back(sample.GetPrimaryKey().value());
values.push_back(sample.GetSomeData());
ASSERT_TRUE(archive.Write(sample));
}
for (size_t i = 0; i < count; i++) {
Sample sample;
ASSERT_TRUE(archive.Read(keys[i], sample));
ASSERT_EQ(values[i], sample.GetSomeData());
ASSERT_EQ(keys[i], sample.GetPrimaryKey());
}
}
TEST_F(ArchiveTest, CanReadWriteVectorOfArchivables) {
Archive archive(GetArchiveFileName().c_str());
ASSERT_TRUE(archive.IsValid());
SampleWithVector sample_with_vector;
ASSERT_TRUE(archive.Write(sample_with_vector));
bool read_success = false;
ASSERT_EQ(
archive.Read<SampleWithVector>([&](ArchiveLocation& location) -> bool {
SampleWithVector other_sample_with_vector;
read_success = other_sample_with_vector.Read(location);
return true; // Always keep continuing but assert that we only get one.
}),
1u);
ASSERT_TRUE(read_success);
}
} // namespace testing
} // namespace impeller