/*
 * Copyright (C) 2018 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#include <map>
#include <string>
#include <vector>

#include <android-base/file.h>
#include <android-base/strings.h>
#include <android-base/test_utils.h>
#include <gtest/gtest.h>

#include "otautil/parse_install_logs.h"

TEST(ParseInstallLogsTest, EmptyFile) {
  TemporaryFile last_install;

  auto metrics = ParseLastInstall(last_install.path);
  ASSERT_TRUE(metrics.empty());
}

TEST(ParseInstallLogsTest, SideloadSmoke) {
  TemporaryFile last_install;
  ASSERT_TRUE(android::base::WriteStringToFile("/cache/recovery/ota.zip\n0\n", last_install.path));
  auto metrics = ParseLastInstall(last_install.path);
  ASSERT_EQ(metrics.end(), metrics.find("ota_sideload"));

  ASSERT_TRUE(android::base::WriteStringToFile("/sideload/package.zip\n0\n", last_install.path));
  metrics = ParseLastInstall(last_install.path);
  ASSERT_NE(metrics.end(), metrics.find("ota_sideload"));
}

TEST(ParseInstallLogsTest, ParseRecoveryUpdateMetrics) {
  std::vector<std::string> lines = {
    "/sideload/package.zip",
    "0",
    "time_total: 300",
    "uncrypt_time: 40",
    "source_build: 4973410",
    "bytes_written_system: " + std::to_string(1200 * 1024 * 1024),
    "bytes_stashed_system: " + std::to_string(300 * 1024 * 1024),
    "bytes_written_vendor: " + std::to_string(40 * 1024 * 1024),
    "bytes_stashed_vendor: " + std::to_string(50 * 1024 * 1024),
    "temperature_start: 37000",
    "temperature_end: 38000",
    "temperature_max: 39000",
    "error: 22",
    "cause: 55",
  };

  auto metrics = ParseRecoveryUpdateMetrics(lines);

  std::map<std::string, int64_t> expected_result = {
    { "ota_time_total", 300 },         { "ota_uncrypt_time", 40 },
    { "ota_source_version", 4973410 }, { "ota_written_in_MiBs", 1240 },
    { "ota_stashed_in_MiBs", 350 },    { "ota_temperature_start", 37000 },
    { "ota_temperature_end", 38000 },  { "ota_temperature_max", 39000 },
    { "ota_non_ab_error_code", 22 },   { "ota_non_ab_cause_code", 55 },
  };

  ASSERT_EQ(expected_result, metrics);
}
