chromium/tools/mac/power/power_sampler/json_exporter_unittest.cc

// Copyright 2021 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "tools/mac/power/power_sampler/json_exporter.h"

#include "base/files/file_util.h"
#include "base/files/scoped_temp_dir.h"
#include "base/json/json_reader.h"
#include "base/time/time.h"
#include "testing/gtest/include/gtest/gtest.h"

namespace power_sampler {

class JsonExporterTest : public testing::Test {
 protected:
  void SetUp() override { ASSERT_TRUE(temp_dir_.CreateUniqueTempDir()); }

  base::ScopedTempDir temp_dir_;
};

TEST_F(JsonExporterTest, CreateFile) {
  base::FilePath file_path = temp_dir_.GetPath().Append("dummy.json");
  std::unique_ptr<JsonExporter> exporter =
      JsonExporter::Create(file_path, base::TimeTicks());

  base::File dummy(file_path, base::File::FLAG_OPEN | base::File::FLAG_READ);
  EXPECT_TRUE(dummy.IsValid());
}

TEST_F(JsonExporterTest, InvalidPath) {
  base::FilePath file_path =
      temp_dir_.GetPath().Append("invalid").Append("dummy.json");
  std::unique_ptr<JsonExporter> exporter =
      JsonExporter::Create(file_path, base::TimeTicks());
  EXPECT_EQ(nullptr, exporter);
}

TEST_F(JsonExporterTest, JSONFile) {
  // ScopedTempDir temp_dir;
  base::FilePath file_path = temp_dir_.GetPath().Append("output.json");
  std::unique_ptr<JsonExporter> exporter =
      JsonExporter::Create(file_path, base::TimeTicks());

  DataColumnKey speed1{"odometer", "speed"};
  DataColumnKey speed2{"satelite", "speed"};
  DataColumnKey height{"satelite", "height"};
  exporter->OnStartSession({
      {speed1, "m/s"},
      {speed2, "m/s"},
      {height, "km"},
  });

  EXPECT_EQ(base::JSONReader::Read(R"json(
    {
      "odometer_speed": "m/s",
      "satelite_speed": "m/s",
      "satelite_height": "km"
    }
    )json"),
            exporter->GetColumnLabelsForTesting());

  exporter->OnSample(base::TimeTicks() + base::Milliseconds(1),
                     {{speed1, 0.5}, {speed2, 1.0}});
  exporter->OnSample(base::TimeTicks() + base::Milliseconds(2),
                     {{speed2, 1.5}});

  EXPECT_EQ(base::JSONReader::Read(R"json(
    [ {
      "sample_time": 1000.0,
      "odometer_speed": 0.5,
      "satelite_speed": 1.0
    }, {
      "sample_time": 2000.0,
      "satelite_speed": 1.5
    } ]
    )json"),
            exporter->GetDataRowsForTesting());

  exporter->OnEndSession();

  std::string json_string;
  EXPECT_TRUE(base::ReadFileToString(file_path, &json_string));
  EXPECT_EQ(base::JSONReader::Read(R"json(
    {
      "column_labels": {
        "odometer_speed": "m/s",
        "satelite_height": "km",
        "satelite_speed": "m/s"
      },
      "data_rows": [ {
        "odometer_speed": 0.5,
        "sample_time": 1000.0,
        "satelite_speed": 1.0
      }, {
        "sample_time": 2000.0,
        "satelite_speed": 1.5
      } ]
    }
    )json"),
            base::JSONReader::Read(json_string));
}

}  // namespace power_sampler