// 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 <zircon/compiler.h>

#include "gtest/gtest.h"
#include "lib/fxl/strings/split_string.h"
#include "rapidjson/error/en.h"
#include "rapidjson/filereadstream.h"
#include "rapidjson/filewritestream.h"
#include "rapidjson/prettywriter.h"

#include "converter.h"

namespace {

void CheckParseResult(rapidjson::ParseResult parse_result) {
  EXPECT_TRUE(parse_result) << "JSON parse error: "
                            << rapidjson::GetParseError_En(parse_result.Code())
                            << " (offset " << parse_result.Offset() << ")";
}

void TestConverter(const char* json_input_string, rapidjson::Document* output) {
  rapidjson::Document input;
  CheckParseResult(input.Parse(json_input_string));

  ConverterArgs args;
  // Test a timestamp value that does not fit into a 32-bit int type.
  args.timestamp = 123004005006;
  args.masters = "example_masters";
  args.bots = "example_bots";
  args.log_url = "https://ci.example.com/build/100";
  args.use_test_guids = true;
  Convert(&input, output, &args);

  // Check that the output serializes successfully as JSON.  The rapidjson
  // library allows rapidjson::Values to contain invalid JSON, such as NaN
  // or infinite floating point values, which are not allowed in JSON.
  rapidjson::StringBuffer buf;
  rapidjson::PrettyWriter<rapidjson::StringBuffer> writer(buf);
  output->Accept(writer);
  EXPECT_TRUE(writer.IsComplete());
}

// This function checks that the JSON value |actual| is a number that is
// approximately equal to |expected|.
//
// This changes |actual| to be a placeholder string value so that later
// comparisons can ignore the numeric value.
//
// The reason for doing an approximate check is that rapidjson does not
// always preserve exact floating point numbers across a write+read+write:
// The last significant digit of a number will sometimes change across a
// read+write round-trip, even for JSON data that rapidjson previously
// wrote.
void AssertApproxEqual(rapidjson::Document* document, rapidjson::Value* actual,
                       double expected) {
  ASSERT_TRUE(actual->IsNumber());
  double actual_val = actual->GetDouble();
  double tolerance = 1.0001;
  double expected_min = expected * tolerance;
  double expected_max = expected / tolerance;
  if (expected_min > expected_max) {
    // Handle negative values.
    std::swap(expected_min, expected_max);
  }
  EXPECT_TRUE(expected_min <= actual_val && actual_val <= expected_max)
      << "Got value " << actual_val << ", but expected value close to "
      << expected << " (between " << expected_min << " and " << expected_max
      << ")";
  actual->SetString("compared_elsewhere", document->GetAllocator());
}

std::vector<std::string> SplitLines(const char* str) {
  return fxl::SplitStringCopy(fxl::StringView(str), "\n", fxl::kKeepWhitespace,
                              fxl::kSplitWantAll);
}

void PrintLines(const std::vector<std::string>& lines, size_t start, size_t end,
                char prefix) {
  for (size_t i = start; i < end; ++i) {
    printf("%c%s\n", prefix, lines[i].c_str());
  }
}

// Print a simple line-based diff comparing the given strings.  This uses a
// primitive diff algorithm that only discounts matching lines at the
// starts and ends of the string.
void PrintDiff(const char* str1, const char* str2) {
  std::vector<std::string> lines1 = SplitLines(str1);
  std::vector<std::string> lines2 = SplitLines(str2);
  size_t i = 0;
  size_t j = 0;
  // Searching from the start, find the first lines that differ.
  while (lines1[i] == lines2[i])
    ++i;
  // Searching from the end, find the first lines that differ.
  while (lines1[lines1.size() - j - 1] == lines2[lines2.size() - j - 1])
    ++j;
  // Print the common lines at the start.
  PrintLines(lines1, 0, i, ' ');
  // Print the differing lines.
  PrintLines(lines1, i, lines1.size() - j, '-');
  PrintLines(lines2, i, lines2.size() - j, '+');
  // Print the common lines at the end.
  PrintLines(lines1, lines1.size() - j, lines1.size(), ' ');
}

void AssertJsonEqual(const rapidjson::Document& doc1,
                     const rapidjson::Document& doc2) {
  rapidjson::StringBuffer buf1;
  rapidjson::PrettyWriter<rapidjson::StringBuffer> writer1(buf1);
  doc1.Accept(writer1);

  rapidjson::StringBuffer buf2;
  rapidjson::PrettyWriter<rapidjson::StringBuffer> writer2(buf2);
  doc2.Accept(writer2);

  EXPECT_EQ(doc1, doc2);
  if (doc1 != doc2) {
    printf("Comparison:\n");
    PrintDiff(buf1.GetString(), buf2.GetString());
  }
}

TEST(TestTools, SplitLines) {
  auto lines = SplitLines(" aa \n  bb\n\ncc \n");
  ASSERT_EQ(lines.size(), 5u);
  EXPECT_STREQ(lines[0].c_str(), " aa ");
  EXPECT_STREQ(lines[1].c_str(), "  bb");
  EXPECT_STREQ(lines[2].c_str(), "");
  EXPECT_STREQ(lines[3].c_str(), "cc ");
  EXPECT_STREQ(lines[4].c_str(), "");
}

// Test the basic case that does not set split_first=true.  This covers
// multiple time units.  This covers converting spaces to underscores in
// the test name.
TEST(CatapultConverter, Convert) {
  const char* input_str = R"JSON(
[
    {
        "label": "ExampleNullSyscall",
        "test_suite": "my_test_suite",
        "values": [101.0, 102.0, 103.0, 104.0, 105.0],
        "unit": "nanoseconds"
    },
    {
        "label": "Example Other Test",
        "test_suite": "my_test_suite",
        "values": [200, 6, 100, 110],
        "unit": "ms"
    }
]
)JSON";

  const char* expected_output_str = R"JSON(
[
    {
        "guid": "dummy_guid_0",
        "type": "GenericSet",
        "values": [
            123004005006
        ]
    },
    {
        "guid": "dummy_guid_1",
        "type": "GenericSet",
        "values": [
            "example_bots"
        ]
    },
    {
        "guid": "dummy_guid_2",
        "type": "GenericSet",
        "values": [
            "example_masters"
        ]
    },
    {
        "guid": "dummy_guid_3",
        "type": "GenericSet",
        "values": [
            [
                "Build Log",
                "https://ci.example.com/build/100"
            ]
        ]
    },
    {
        "guid": "dummy_guid_4",
        "type": "GenericSet",
        "values": [
            "my_test_suite"
        ]
    },
    {
        "name": "ExampleNullSyscall",
        "unit": "ms_smallerIsBetter",
        "description": "",
        "diagnostics": {
            "pointId": "dummy_guid_0",
            "bots": "dummy_guid_1",
            "masters": "dummy_guid_2",
            "logUrls": "dummy_guid_3",
            "benchmarks": "dummy_guid_4"
        },
        "running": [
            5,
            "compared_elsewhere",
            "compared_elsewhere",
            "compared_elsewhere",
            "compared_elsewhere",
            "compared_elsewhere",
            "compared_elsewhere"
        ],
        "guid": "dummy_guid_5",
        "maxNumSampleValues": 5,
        "numNans": 0
    },
    {
        "name": "Example_Other_Test",
        "unit": "ms_smallerIsBetter",
        "description": "",
        "diagnostics": {
            "pointId": "dummy_guid_0",
            "bots": "dummy_guid_1",
            "masters": "dummy_guid_2",
            "logUrls": "dummy_guid_3",
            "benchmarks": "dummy_guid_4"
        },
        "running": [
            4,
            "compared_elsewhere",
            "compared_elsewhere",
            "compared_elsewhere",
            "compared_elsewhere",
            "compared_elsewhere",
            "compared_elsewhere"
        ],
        "guid": "dummy_guid_6",
        "maxNumSampleValues": 4,
        "numNans": 0
    }
]
)JSON";

  rapidjson::Document expected_output;
  CheckParseResult(expected_output.Parse(expected_output_str));

  rapidjson::Document output;
  TestConverter(input_str, &output);

  AssertApproxEqual(&output, &output[5]["running"][1], 0.000105);
  AssertApproxEqual(&output, &output[5]["running"][2], -9.180875);
  AssertApproxEqual(&output, &output[5]["running"][3], 0.000103);
  AssertApproxEqual(&output, &output[5]["running"][4], 0.000101);
  AssertApproxEqual(&output, &output[5]["running"][5], 0.000515);
  AssertApproxEqual(&output, &output[5]["running"][6], 2.5e-12);

  AssertApproxEqual(&output, &output[6]["running"][1], 200);
  AssertApproxEqual(&output, &output[6]["running"][2], 4.098931);
  AssertApproxEqual(&output, &output[6]["running"][3], 104);
  AssertApproxEqual(&output, &output[6]["running"][4], 6);
  AssertApproxEqual(&output, &output[6]["running"][5], 416);
  AssertApproxEqual(&output, &output[6]["running"][6], 6290.666);

  AssertJsonEqual(output, expected_output);
}

TEST(CatapultConverter, ConvertWithSplitFirst) {
  const char* input_str = R"JSON(
[
    {
        "label": "ExampleTest",
        "test_suite": "my_test_suite",
        "values": [101.0, 102.0, 103.0, 104.0, 105.0],
        "unit": "nanoseconds",
        "split_first": true
    }
]
)JSON";

  const char* expected_output_str = R"JSON(
[
    {
        "guid": "dummy_guid_0",
        "type": "GenericSet",
        "values": [
            123004005006
        ]
    },
    {
        "guid": "dummy_guid_1",
        "type": "GenericSet",
        "values": [
            "example_bots"
        ]
    },
    {
        "guid": "dummy_guid_2",
        "type": "GenericSet",
        "values": [
            "example_masters"
        ]
    },
    {
        "guid": "dummy_guid_3",
        "type": "GenericSet",
        "values": [
            [
                "Build Log",
                "https://ci.example.com/build/100"
            ]
        ]
    },
    {
        "guid": "dummy_guid_4",
        "type": "GenericSet",
        "values": [
            "my_test_suite"
        ]
    },
    {
        "name": "ExampleTest_samples_0_to_0",
        "unit": "ms_smallerIsBetter",
        "description": "",
        "diagnostics": {
            "pointId": "dummy_guid_0",
            "bots": "dummy_guid_1",
            "masters": "dummy_guid_2",
            "logUrls": "dummy_guid_3",
            "benchmarks": "dummy_guid_4"
        },
        "running": [
            1,
            "compared_elsewhere",
            "compared_elsewhere",
            "compared_elsewhere",
            "compared_elsewhere",
            "compared_elsewhere",
            "compared_elsewhere"
        ],
        "guid": "dummy_guid_5",
        "maxNumSampleValues": 1,
        "numNans": 0
    },
    {
        "name": "ExampleTest_samples_1_to_4",
        "unit": "ms_smallerIsBetter",
        "description": "",
        "diagnostics": {
            "pointId": "dummy_guid_0",
            "bots": "dummy_guid_1",
            "masters": "dummy_guid_2",
            "logUrls": "dummy_guid_3",
            "benchmarks": "dummy_guid_4"
        },
        "running": [
            4,
            "compared_elsewhere",
            "compared_elsewhere",
            "compared_elsewhere",
            "compared_elsewhere",
            "compared_elsewhere",
            "compared_elsewhere"
        ],
        "guid": "dummy_guid_6",
        "maxNumSampleValues": 4,
        "numNans": 0
    }
]
)JSON";

  rapidjson::Document expected_output;
  CheckParseResult(expected_output.Parse(expected_output_str));

  rapidjson::Document output;
  TestConverter(input_str, &output);

  AssertApproxEqual(&output, &output[5]["running"][1], .000101);
  AssertApproxEqual(&output, &output[5]["running"][2], -9.2003900411230148);
  AssertApproxEqual(&output, &output[5]["running"][3], 0.000101);
  AssertApproxEqual(&output, &output[5]["running"][4], 0.000101);
  AssertApproxEqual(&output, &output[5]["running"][5], 0.000101);
  AssertApproxEqual(&output, &output[5]["running"][6], 0);

  AssertApproxEqual(&output, &output[6]["running"][1], 0.000105);
  AssertApproxEqual(&output, &output[6]["running"][2], -9.175997295261073);
  AssertApproxEqual(&output, &output[6]["running"][3], 0.0001035);
  AssertApproxEqual(&output, &output[6]["running"][4], 0.000102);
  AssertApproxEqual(&output, &output[6]["running"][5], 0.000414);
  AssertApproxEqual(&output, &output[6]["running"][6], 1.6666666666666712e-12);

  AssertJsonEqual(output, expected_output);
}

TEST(CatapultConverter, ConvertThroughputUnits) {
  // The example value here is 99 * 1024 * 1024 (99 mebibytes/second).
  const char* input_str = R"JSON(
[
    {
        "label": "ExampleThroughput",
        "test_suite": "my_test_suite",
        "values": [103809024],
        "unit": "bytes/second"
    }
]
)JSON";

  const char* expected_output_str = R"JSON(
[
    {
        "guid": "dummy_guid_0",
        "type": "GenericSet",
        "values": [
            123004005006
        ]
    },
    {
        "guid": "dummy_guid_1",
        "type": "GenericSet",
        "values": [
            "example_bots"
        ]
    },
    {
        "guid": "dummy_guid_2",
        "type": "GenericSet",
        "values": [
            "example_masters"
        ]
    },
    {
        "guid": "dummy_guid_3",
        "type": "GenericSet",
        "values": [
            [
                "Build Log",
                "https://ci.example.com/build/100"
            ]
        ]
    },
    {
        "guid": "dummy_guid_4",
        "type": "GenericSet",
        "values": [
            "my_test_suite"
        ]
    },
    {
        "name": "ExampleThroughput",
        "unit": "unitless_biggerIsBetter",
        "description": "",
        "diagnostics": {
            "pointId": "dummy_guid_0",
            "bots": "dummy_guid_1",
            "masters": "dummy_guid_2",
            "logUrls": "dummy_guid_3",
            "benchmarks": "dummy_guid_4"
        },
        "running": [
            1,
            "compared_elsewhere",
            "compared_elsewhere",
            "compared_elsewhere",
            "compared_elsewhere",
            "compared_elsewhere",
            "compared_elsewhere"
        ],
        "guid": "dummy_guid_5",
        "maxNumSampleValues": 1,
        "numNans": 0
    }
]
)JSON";

  rapidjson::Document expected_output;
  CheckParseResult(expected_output.Parse(expected_output_str));

  rapidjson::Document output;
  TestConverter(input_str, &output);

  AssertApproxEqual(&output, &output[5]["running"][1], 99);
  AssertApproxEqual(&output, &output[5]["running"][2], 4.595119);
  AssertApproxEqual(&output, &output[5]["running"][3], 99);
  AssertApproxEqual(&output, &output[5]["running"][4], 99);
  AssertApproxEqual(&output, &output[5]["running"][5], 99);
  AssertApproxEqual(&output, &output[5]["running"][6], 0);

  AssertJsonEqual(output, expected_output);
}

TEST(CatapultConverter, ConvertBytesUnit) {
  const char* input_str = R"JSON(
[
    {
        "label": "ExampleWithBytes",
        "test_suite": "my_test_suite",
        "values": [200, 6, 100, 110],
        "unit": "bytes"
    }
]
)JSON";

  const char* expected_output_str = R"JSON(
[
    {
        "guid": "dummy_guid_0",
        "type": "GenericSet",
        "values": [
            123004005006
        ]
    },
    {
        "guid": "dummy_guid_1",
        "type": "GenericSet",
        "values": [
            "example_bots"
        ]
    },
    {
        "guid": "dummy_guid_2",
        "type": "GenericSet",
        "values": [
            "example_masters"
        ]
    },
    {
        "guid": "dummy_guid_3",
        "type": "GenericSet",
        "values": [
            [
                "Build Log",
                "https://ci.example.com/build/100"
            ]
        ]
    },
    {
        "guid": "dummy_guid_4",
        "type": "GenericSet",
        "values": [
            "my_test_suite"
        ]
    },
    {
        "name": "ExampleWithBytes",
        "unit": "sizeInBytes",
        "description": "",
        "diagnostics": {
            "pointId": "dummy_guid_0",
            "bots": "dummy_guid_1",
            "masters": "dummy_guid_2",
            "logUrls": "dummy_guid_3",
            "benchmarks": "dummy_guid_4"
        },
        "running": [
            4,
            "compared_elsewhere",
            "compared_elsewhere",
            "compared_elsewhere",
            "compared_elsewhere",
            "compared_elsewhere",
            "compared_elsewhere"
        ],
        "guid": "dummy_guid_5",
        "maxNumSampleValues": 4,
        "numNans": 0
    }]
)JSON";

  rapidjson::Document expected_output;
  CheckParseResult(expected_output.Parse(expected_output_str));

  rapidjson::Document output;
  TestConverter(input_str, &output);

  AssertApproxEqual(&output, &output[5]["running"][1], 200);
  AssertApproxEqual(&output, &output[5]["running"][2], 4.098931);
  AssertApproxEqual(&output, &output[5]["running"][3], 104);
  AssertApproxEqual(&output, &output[5]["running"][4], 6);
  AssertApproxEqual(&output, &output[5]["running"][5], 416);
  AssertApproxEqual(&output, &output[5]["running"][6], 6290.666);

  AssertJsonEqual(output, expected_output);
}

// Test handling of zero values.  The meanlogs field in the output should
// be 'null' in this case.
TEST(CatapultConverter, ZeroValues) {
  const char* input_str = R"JSON(
[
    {
        "label": "ExampleValues",
        "test_suite": "my_test_suite",
        "values": [0],
        "unit": "milliseconds"
    }
]
)JSON";

  rapidjson::Document output;
  TestConverter(input_str, &output);

  rapidjson::Value null;
  rapidjson::Value& meanlogs_field = output[5]["running"][2];
  EXPECT_EQ(meanlogs_field, null);
}

// Test handling of negative values.  The meanlogs field in the output
// should be 'null' in this case.
TEST(CatapultConverter, NegativeValues) {
  const char* input_str = R"JSON(
[
    {
        "label": "ExampleValues",
        "test_suite": "my_test_suite",
        "values": [-1],
        "unit": "milliseconds"
    }
]
)JSON";

  rapidjson::Document output;
  TestConverter(input_str, &output);

  rapidjson::Value null;
  rapidjson::Value& meanlogs_field = output[5]["running"][2];
  EXPECT_EQ(meanlogs_field, null);
}

class TempFile {
 public:
  TempFile(const char* contents) {
    int fd = mkstemp(pathname_);
    EXPECT_GE(fd, 0);
    ssize_t len = strlen(contents);
    EXPECT_EQ(write(fd, contents, len), len);
    EXPECT_EQ(close(fd), 0);
  }
  ~TempFile() { EXPECT_EQ(unlink(pathname_), 0); }
  const char* pathname() { return pathname_; }

 private:
  char pathname_[26] = "/tmp/catapult_test_XXXXXX";
};

// Test the ConverterMain() entry point.  This does not check the contents
// of the JSON output; it only checks that the output is valid JSON.
TEST(CatapultConverter, ConverterMain) {
  TempFile input_file("[]");
  TempFile output_file("");

  const char* args[] = {
      "unused_argv0",
      "--input",
      input_file.pathname(),
      "--output",
      output_file.pathname(),
      "--execution-timestamp-ms",
      "3456",
      "--masters",
      "example_arg_masters",
      "--log-url",
      "https://ci.example.com/build/300",
      "--bots",
      "example_arg_bots",
  };
  EXPECT_EQ(ConverterMain(countof(args), const_cast<char**>(args)), 0);

  // Check just that the output file contains valid JSON.
  FILE* fp = fopen(output_file.pathname(), "r");
  ASSERT_TRUE(fp);
  char buffer[100];
  rapidjson::FileReadStream input_stream(fp, buffer, sizeof(buffer));
  rapidjson::Document input;
  rapidjson::ParseResult parse_result = input.ParseStream(input_stream);
  EXPECT_TRUE(parse_result);
  fclose(fp);
}

}  // namespace
