blob: 7ed882f697c328a3d1c1dab67b09c77d46d39035 [file] [log] [blame]
// Copyright 2018 The Fuchsia 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 "src/logger/encoder.h"
#include <memory>
#include <string>
#include <tuple>
#include <vector>
#include <gtest/gtest.h>
#include "src/pb/observation.pb.h"
#include "src/public/lib/statusor/statusor.h"
namespace cobalt::logger::encoder {
using lib::statusor::StatusOr;
TEST(Encoder, EncodeIntegerObservationSingleValue) {
StatusOr<std::unique_ptr<Observation>> obs_or = EncodeIntegerObservation({{{1, 2, 3}, 4}});
ASSERT_EQ(obs_or.status(), Status::OkStatus());
std::unique_ptr<Observation> obs = std::move(obs_or.value());
ASSERT_TRUE(obs->has_integer());
ASSERT_EQ(obs->integer().values_size(), 1);
EXPECT_EQ(obs->integer().values(0).event_codes_size(), 3);
EXPECT_EQ(obs->integer().values(0).value(), 4);
}
TEST(Encoder, EncodeIntegerObservationMultipleValues) {
StatusOr<std::unique_ptr<Observation>> obs_or = EncodeIntegerObservation({
{{}, 1},
{{1}, 2},
{{1, 2}, 3},
{{1, 2, 3}, 4},
});
ASSERT_EQ(obs_or.status(), Status::OkStatus());
std::unique_ptr<Observation> obs = std::move(obs_or.value());
ASSERT_TRUE(obs->has_integer());
ASSERT_EQ(obs->integer().values_size(), 4);
for (int i = 0; i < 4; i++) {
EXPECT_EQ(obs->integer().values(i).event_codes_size(), i);
EXPECT_EQ(obs->integer().values(i).value(), i + 1);
}
}
TEST(Encoder, EncodeSumAndCountObservationSingleValue) {
StatusOr<std::unique_ptr<Observation>> obs_or = EncodeSumAndCountObservation({{{1, 2, 3}, 4, 5}});
ASSERT_EQ(obs_or.status(), Status::OkStatus());
std::unique_ptr<Observation> obs = std::move(obs_or.value());
ASSERT_TRUE(obs->has_sum_and_count());
ASSERT_EQ(obs->sum_and_count().sums_and_counts_size(), 1);
EXPECT_EQ(obs->sum_and_count().sums_and_counts(0).event_codes_size(), 3);
EXPECT_EQ(obs->sum_and_count().sums_and_counts(0).sum(), 4);
EXPECT_EQ(obs->sum_and_count().sums_and_counts(0).count(), 5u);
}
TEST(Encoder, EncodeSumAndCountObservationMultipleValues) {
StatusOr<std::unique_ptr<Observation>> obs_or =
EncodeSumAndCountObservation({{{}, 1, 2}, {{1}, 2, 3}, {{1, 2}, 3, 4}, {{1, 2, 3}, 4, 5}});
ASSERT_EQ(obs_or.status(), Status::OkStatus());
std::unique_ptr<Observation> obs = std::move(obs_or.value());
ASSERT_TRUE(obs->has_sum_and_count());
ASSERT_EQ(obs->sum_and_count().sums_and_counts_size(), 4);
for (int i = 0; i < 4; i++) {
EXPECT_EQ(obs->sum_and_count().sums_and_counts(i).event_codes_size(), i);
EXPECT_EQ(obs->sum_and_count().sums_and_counts(i).sum(), i + 1);
EXPECT_EQ(obs->sum_and_count().sums_and_counts(i).count(), static_cast<uint64_t>(i + 2));
}
}
TEST(Encoder, EncodeIndexHistogramObservationSingleValue) {
StatusOr<std::unique_ptr<Observation>> obs_or =
EncodeIndexHistogramObservation({{{1, 2, 3}, {{4, 5}}}});
ASSERT_EQ(obs_or.status(), Status::OkStatus());
std::unique_ptr<Observation> obs = std::move(obs_or.value());
ASSERT_TRUE(obs->has_index_histogram());
ASSERT_EQ(obs->index_histogram().index_histograms_size(), 1);
EXPECT_EQ(obs->index_histogram().index_histograms(0).event_codes_size(), 3);
ASSERT_EQ(obs->index_histogram().index_histograms(0).bucket_indices_size(), 1);
EXPECT_EQ(obs->index_histogram().index_histograms(0).bucket_indices(0), 4u);
ASSERT_EQ(obs->index_histogram().index_histograms(0).bucket_counts_size(), 1);
EXPECT_EQ(obs->index_histogram().index_histograms(0).bucket_counts(0), 5);
}
TEST(Encoder, EncodeIndexHistogramObservationMultipleValues) {
StatusOr<std::unique_ptr<Observation>> obs_or =
EncodeIndexHistogramObservation({{{}, {{1, 2}}},
{{1}, {{2, 3}, {4, 5}}},
{{1, 2}, {{3, 4}, {5, 6}, {7, 8}}},
{{1, 2, 3}, {{4, 5}, {6, 7}, {8, 9}, {10, 11}}}});
ASSERT_EQ(obs_or.status(), Status::OkStatus());
std::unique_ptr<Observation> obs = std::move(obs_or.value());
ASSERT_TRUE(obs->has_index_histogram());
ASSERT_EQ(obs->index_histogram().index_histograms_size(), 4);
for (int i = 0; i < 4; i++) {
EXPECT_EQ(obs->index_histogram().index_histograms(i).event_codes_size(), i);
ASSERT_EQ(obs->index_histogram().index_histograms(i).bucket_indices_size(), i + 1);
ASSERT_EQ(obs->index_histogram().index_histograms(i).bucket_counts_size(), i + 1);
for (int j = 0; j < i + 1; j++) {
EXPECT_EQ(obs->index_histogram().index_histograms(i).bucket_indices(j),
static_cast<uint32_t>(i + j * 2 + 1));
EXPECT_EQ(obs->index_histogram().index_histograms(i).bucket_counts(j), i + j * 2 + 2);
}
}
}
// TODO(https://fxbug.dev/322409910): Delete this test after clients stop using legacy hash.
TEST(Encoder, EncodeStringHistogramObservationSingleValueLegacy) {
StatusOr<std::unique_ptr<Observation>> obs_or =
EncodeStringHistogramObservation({"4"}, {{{1, 2, 3}, {{4, 5}}}}, /*use_legacy_hash=*/true);
ASSERT_EQ(obs_or.status(), Status::OkStatus());
std::unique_ptr<Observation> obs = std::move(obs_or.value());
ASSERT_TRUE(obs->has_string_histogram());
ASSERT_EQ(obs->string_histogram().string_hashes_size(), 1);
ASSERT_EQ(obs->string_histogram().string_hashes_ff64_size(), 0);
ASSERT_EQ(obs->string_histogram().string_hashes(0), "4");
ASSERT_EQ(obs->string_histogram().string_histograms_size(), 1);
EXPECT_EQ(obs->string_histogram().string_histograms(0).event_codes_size(), 3);
ASSERT_EQ(obs->string_histogram().string_histograms(0).bucket_indices_size(), 1);
EXPECT_EQ(obs->string_histogram().string_histograms(0).bucket_indices(0), 4u);
ASSERT_EQ(obs->string_histogram().string_histograms(0).bucket_counts_size(), 1);
EXPECT_EQ(obs->string_histogram().string_histograms(0).bucket_counts(0), 5);
}
TEST(Encoder, EncodeStringHistogramObservationSingleValueFF64) {
StatusOr<std::unique_ptr<Observation>> obs_or =
EncodeStringHistogramObservation({"4"}, {{{1, 2, 3}, {{4, 5}}}}, /*use_legacy_hash=*/false);
ASSERT_EQ(obs_or.status(), Status::OkStatus());
std::unique_ptr<Observation> obs = std::move(obs_or.value());
ASSERT_TRUE(obs->has_string_histogram());
ASSERT_EQ(obs->string_histogram().string_hashes_size(), 0);
ASSERT_EQ(obs->string_histogram().string_hashes_ff64_size(), 1);
ASSERT_EQ(obs->string_histogram().string_hashes_ff64(0), "4");
ASSERT_EQ(obs->string_histogram().string_histograms_size(), 1);
EXPECT_EQ(obs->string_histogram().string_histograms(0).event_codes_size(), 3);
ASSERT_EQ(obs->string_histogram().string_histograms(0).bucket_indices_size(), 1);
EXPECT_EQ(obs->string_histogram().string_histograms(0).bucket_indices(0), 4u);
ASSERT_EQ(obs->string_histogram().string_histograms(0).bucket_counts_size(), 1);
EXPECT_EQ(obs->string_histogram().string_histograms(0).bucket_counts(0), 5);
}
// TODO(https://fxbug.dev/322409910): Delete this test after clients stop using legacy hash.
TEST(Encoder, EncodeStringHistogramObservationMultipleValuesLegacy) {
StatusOr<std::unique_ptr<Observation>> obs_or =
EncodeStringHistogramObservation({"1", "2", "3", "4", "5", "6", "7", "8", "10"},
{{{}, {{1, 2}}},
{{1}, {{2, 3}, {4, 5}}},
{{1, 2}, {{3, 4}, {5, 6}, {7, 8}}},
{{1, 2, 3}, {{4, 5}, {6, 7}, {8, 9}, {10, 11}}}},
/*use_legacy_hash=*/true);
ASSERT_EQ(obs_or.status(), Status::OkStatus());
std::unique_ptr<Observation> obs = std::move(obs_or.value());
ASSERT_TRUE(obs->has_string_histogram());
ASSERT_EQ(obs->string_histogram().string_hashes_size(), 9);
ASSERT_EQ(obs->string_histogram().string_hashes_ff64_size(), 0);
ASSERT_EQ(obs->string_histogram().string_hashes(0), "1");
ASSERT_EQ(obs->string_histogram().string_histograms_size(), 4);
for (int i = 0; i < 4; i++) {
EXPECT_EQ(obs->string_histogram().string_histograms(i).event_codes_size(), i);
ASSERT_EQ(obs->string_histogram().string_histograms(i).bucket_indices_size(), i + 1);
ASSERT_EQ(obs->string_histogram().string_histograms(i).bucket_counts_size(), i + 1);
for (int j = 0; j < i + 1; j++) {
EXPECT_EQ(obs->string_histogram().string_histograms(i).bucket_indices(j),
static_cast<uint32_t>(i + j * 2 + 1));
EXPECT_EQ(obs->string_histogram().string_histograms(i).bucket_counts(j), i + j * 2 + 2);
}
}
}
TEST(Encoder, EncodeStringHistogramObservationMultipleValuesFF64) {
StatusOr<std::unique_ptr<Observation>> obs_or =
EncodeStringHistogramObservation({"1", "2", "3", "4", "5", "6", "7", "8", "10"},
{{{}, {{1, 2}}},
{{1}, {{2, 3}, {4, 5}}},
{{1, 2}, {{3, 4}, {5, 6}, {7, 8}}},
{{1, 2, 3}, {{4, 5}, {6, 7}, {8, 9}, {10, 11}}}},
/*use_legacy_hash=*/false);
ASSERT_EQ(obs_or.status(), Status::OkStatus());
std::unique_ptr<Observation> obs = std::move(obs_or.value());
ASSERT_TRUE(obs->has_string_histogram());
ASSERT_EQ(obs->string_histogram().string_hashes_size(), 0);
ASSERT_EQ(obs->string_histogram().string_hashes_ff64_size(), 9);
ASSERT_EQ(obs->string_histogram().string_hashes_ff64(0), "1");
ASSERT_EQ(obs->string_histogram().string_histograms_size(), 4);
for (int i = 0; i < 4; i++) {
EXPECT_EQ(obs->string_histogram().string_histograms(i).event_codes_size(), i);
ASSERT_EQ(obs->string_histogram().string_histograms(i).bucket_indices_size(), i + 1);
ASSERT_EQ(obs->string_histogram().string_histograms(i).bucket_counts_size(), i + 1);
for (int j = 0; j < i + 1; j++) {
EXPECT_EQ(obs->string_histogram().string_histograms(i).bucket_indices(j),
static_cast<uint32_t>(i + j * 2 + 1));
EXPECT_EQ(obs->string_histogram().string_histograms(i).bucket_counts(j), i + j * 2 + 2);
}
}
}
} // namespace cobalt::logger::encoder