// 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 "garnet/lib/measure/argument_value.h"

#include <string>
#include <vector>

#include <gtest/gtest.h>

#include "garnet/lib/measure/test_events.h"

namespace tracing {
namespace measure {
namespace {

TEST(MeasureArgumentValueTest, ArgumentValue) {
  std::vector<ArgumentValueSpec> specs = {
      ArgumentValueSpec({42u, {"event_foo", "category_bar"}, "arg_foo", "unit_bar"})};

  MeasureArgumentValue measure(std::move(specs));

  fbl::Vector<trace::Argument> arguments;
  arguments.push_back(trace::Argument("arg_foo", trace::ArgumentValue::MakeUint64(149)));
  measure.Process(test::Instant("event_foo", "category_bar", 10u, std::move(arguments)));

  auto results = measure.results();
  EXPECT_EQ(1u, results.size());
  EXPECT_EQ(std::vector<uint64_t>({149u}), results[42u]);
}

TEST(MeasureArgumentValueTest, ArgumentValueDoesNotMatchSpec) {
  std::vector<ArgumentValueSpec> specs = {
      ArgumentValueSpec({42u, {"event_foo", "category_bar"}, "arg_foo", "unit_bar"})};

  MeasureArgumentValue measure(std::move(specs));

  fbl::Vector<trace::Argument> arguments;
  arguments.push_back(trace::Argument("bytes", trace::ArgumentValue::MakeUint64(149)));
  measure.Process(test::Instant("event_baz", "category_bar", 10u, std::move(arguments)));

  auto results = measure.results();
  EXPECT_EQ(0u, results.size());
}

TEST(MeasureArgumentValueTest, ArgumentValueArgumentNotFound) {
  std::vector<ArgumentValueSpec> specs = {
      ArgumentValueSpec({42u, {"event_foo", "category_bar"}, "arg", "bytes"})};

  MeasureArgumentValue measure(std::move(specs));

  fbl::Vector<trace::Argument> arguments;
  // Right argument type, wrong argument name.
  arguments.push_back(trace::Argument("foo", trace::ArgumentValue::MakeUint64(149)));
  // Right argument name, wrong argument type.
  arguments.push_back(trace::Argument("arg", trace::ArgumentValue::MakeDouble(149)));
  measure.Process(test::Instant("event_foo", "category_bar", 10u, std::move(arguments)));

  auto results = measure.results();
  EXPECT_EQ(0u, results.size());
}

}  // namespace

}  // namespace measure
}  // namespace tracing
