// Copyright 2020 The Chromium OS 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 "typecd/test_utils.h"

#include <string>

#include <base/files/file_util.h>
#include <base/logging.h>
#include <base/strings/stringprintf.h>

namespace typecd {

bool CreateFakeAltMode(const base::FilePath& mode_path,
                       uint16_t svid,
                       uint32_t vdo,
                       uint32_t vdo_index) {
  if (!base::CreateDirectory(mode_path)) {
    PLOG(ERROR) << "Couldn't create directory: " << mode_path;
    return false;
  }

  auto mode_svid = base::StringPrintf("%x", svid);
  if (!base::WriteFile(mode_path.Append("svid"), mode_svid.c_str(),
                       mode_svid.length())) {
    PLOG(ERROR) << "Failed to create SVID in directory " << mode_path;
    return false;
  }

  auto mode_vdo = base::StringPrintf("%#x", vdo);
  if (!base::WriteFile(mode_path.Append("vdo"), mode_vdo.c_str(),
                       mode_vdo.length())) {
    PLOG(ERROR) << "Failed to create VDO in directory " << mode_path;
    return false;
  }

  auto mode_vdo_index = base::StringPrintf("%x", vdo_index);
  if (!base::WriteFile(mode_path.Append("mode"), mode_vdo_index.c_str(),
                       mode_vdo_index.length())) {
    PLOG(ERROR) << "Failed to create VDO mode index in directory " << mode_path;
    return false;
  }

  return true;
}

}  // namespace typecd
