// Copyright 2015 The Chromium 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 "apps/benchmark/event.h"

#include <string>
#include <vector>

#include "base/strings/string_util.h"
#include "testing/gtest/include/gtest/gtest.h"

namespace benchmark {

namespace {

TEST(GetEventsTest, Empty) {
  std::vector<Event> events;
  EXPECT_TRUE(GetEvents("[]", &events));
  EXPECT_EQ(0u, events.size());
}

TEST(GetEventsTest, Invalid) {
  std::vector<Event> events;
  EXPECT_FALSE(GetEvents("", &events));
  EXPECT_FALSE(GetEvents("[", &events));
  EXPECT_FALSE(GetEvents("]", &events));
  EXPECT_FALSE(GetEvents("[,]", &events));
}

TEST(GetEventsTest, Typical) {
  std::string event1 =
      "{\"pid\":7845,\"tid\":7845,\"ts\":1988539886444,"
      "\"ph\":\"X\",\"cat\":\"toplevel\",\"name\":\"MessageLoop::RunTask\","
      "\"args\":{\"src_file\":\"../../mojo/message_pump/handle_watcher.cc\","
      "\"src_func\":\"RemoveAndNotify\"},\"dur\":647,\"tdur\":633,"
      "\"tts\":25295}";
  std::string event2 =
      "{\"pid\":8238,\"tid\":8264,\"ts\":1988975370433,\"ph\":\"X\","
      "\"cat\":\"gpu\",\"name\":\"GLES2::WaitForCmd\",\"args\":{},\"dur\":7288,"
      "\"tdur\":212,\"tts\":6368}";

  std::string trace_json = "[" + event1 + "," + event2 + "]";
  std::vector<Event> events;
  ASSERT_TRUE(GetEvents(trace_json, &events));
  ASSERT_EQ(2u, events.size());

  EXPECT_EQ(EventType::COMPLETE, events[0].type);
  EXPECT_EQ("MessageLoop::RunTask", events[0].name);
  EXPECT_EQ("toplevel", events[0].categories);
  EXPECT_EQ(base::TimeTicks::FromInternalValue(1988539886444),
            events[0].timestamp);
  EXPECT_EQ(base::TimeDelta::FromInternalValue(647), events[0].duration);

  EXPECT_EQ(EventType::COMPLETE, events[1].type);
  EXPECT_EQ("GLES2::WaitForCmd", events[1].name);
  EXPECT_EQ("gpu", events[1].categories);
  EXPECT_EQ(base::TimeTicks::FromInternalValue(1988975370433),
            events[1].timestamp);
  EXPECT_EQ(base::TimeDelta::FromInternalValue(7288), events[1].duration);
}

TEST(GetEventsTest, InstantEvent) {
  std::string event =
      "{\"pid\":19309,\"tid\":8,\"ts\":2949822399148,\"ph\":\"I\","
      "\"cat\":\"cc\",\"name\":\"Scheduler::BeginRetroFrames all expired\","
      "\"args\":{},\"tts\":375966,\"s\":\"t\"}";

  std::string trace_json = "[" + event + "]";
  std::vector<Event> events;
  ASSERT_TRUE(GetEvents(trace_json, &events));
  ASSERT_EQ(1u, events.size());

  EXPECT_EQ(EventType::INSTANT, events[0].type);
  EXPECT_EQ("Scheduler::BeginRetroFrames all expired", events[0].name);
  EXPECT_EQ("cc", events[0].categories);
  EXPECT_EQ(base::TimeTicks::FromInternalValue(2949822399148),
            events[0].timestamp);
  EXPECT_EQ(base::TimeDelta::FromInternalValue(0), events[0].duration);
}

TEST(GetEventsTest, DurationEventsSameThread) {
  std::vector<std::string> event_specs(6);
  event_specs[0] =
    "{\"tid\":1,\"ts\":1,\"ph\":\"B\",\"cat\":\"cc\",\"name\":\"Outer event\"}";
  event_specs[1] =
    "{\"tid\":1,\"ts\":2,\"ph\":\"B\",\"cat\":\"cc\",\"name\":\"Inner event\"}";
  event_specs[2] =
    "{\"tid\":1,\"ts\":3,\"ph\":\"E\"}";
  event_specs[3] =
    "{\"tid\":1,\"ts\":4,\"ph\":\"E\"}";
  event_specs[4] =
    "{\"tid\":1,\"ts\":5,\"ph\":\"B\",\"cat\":\"cc\",\"name\":\"Next event\"}";
  event_specs[5] =
    "{\"tid\":1,\"ts\":6,\"ph\":\"E\"}";

  std::string trace_json = "[" + JoinString(event_specs, ',') + "]";
  std::vector<Event> events;
  ASSERT_TRUE(GetEvents(trace_json, &events));
  ASSERT_EQ(3u, events.size());

  EXPECT_EQ(EventType::COMPLETE, events[0].type);
  EXPECT_EQ("Outer event", events[0].name);
  EXPECT_EQ("cc", events[0].categories);
  EXPECT_EQ(base::TimeTicks::FromInternalValue(1), events[0].timestamp);
  EXPECT_EQ(base::TimeDelta::FromInternalValue(3), events[0].duration);

  EXPECT_EQ(EventType::COMPLETE, events[1].type);
  EXPECT_EQ("Inner event", events[1].name);
  EXPECT_EQ("cc", events[1].categories);
  EXPECT_EQ(base::TimeTicks::FromInternalValue(2), events[1].timestamp);
  EXPECT_EQ(base::TimeDelta::FromInternalValue(1), events[1].duration);

  EXPECT_EQ(EventType::COMPLETE, events[2].type);
  EXPECT_EQ("Next event", events[2].name);
  EXPECT_EQ("cc", events[2].categories);
  EXPECT_EQ(base::TimeTicks::FromInternalValue(5), events[2].timestamp);
  EXPECT_EQ(base::TimeDelta::FromInternalValue(1), events[2].duration);
}

TEST(GetEventsTest, DurationEventsTwoThreads) {
  std::vector<std::string> event_specs(4);
  event_specs[0] =
    "{\"tid\":1,\"ts\":1,\"ph\":\"B\",\"cat\":\"cc\",\"name\":\"t1 event\"}";
  event_specs[1] =
    "{\"tid\":2,\"ts\":2,\"ph\":\"B\",\"cat\":\"cc\",\"name\":\"t2 event\"}";
  event_specs[2] =
    "{\"tid\":1,\"ts\":3,\"ph\":\"E\"}";
  event_specs[3] =
    "{\"tid\":2,\"ts\":4,\"ph\":\"E\"}";

  std::string trace_json = "[" + JoinString(event_specs, ',') + "]";
  std::vector<Event> events;
  ASSERT_TRUE(GetEvents(trace_json, &events));
  ASSERT_EQ(2u, events.size());

  EXPECT_EQ(EventType::COMPLETE, events[0].type);
  EXPECT_EQ("t1 event", events[0].name);
  EXPECT_EQ("cc", events[0].categories);
  EXPECT_EQ(base::TimeTicks::FromInternalValue(1), events[0].timestamp);
  EXPECT_EQ(base::TimeDelta::FromInternalValue(2), events[0].duration);

  EXPECT_EQ(EventType::COMPLETE, events[1].type);
  EXPECT_EQ("t2 event", events[1].name);
  EXPECT_EQ("cc", events[1].categories);
  EXPECT_EQ(base::TimeTicks::FromInternalValue(2), events[1].timestamp);
  EXPECT_EQ(base::TimeDelta::FromInternalValue(2), events[1].duration);
}

}  // namespace

}  // namespace benchmark
