// Copyright 2021 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/peripheral.h"

#include <string>

#include <base/files/scoped_temp_dir.h>
#include <base/strings/stringprintf.h>
#include <gmock/gmock.h>
#include <gtest/gtest.h>

#include "typecd/test_constants.h"
#include "typecd/test_utils.h"

namespace typecd {

class PeripheralTest : public ::testing::Test {
 protected:
  void SetUp() override {
    ASSERT_TRUE(scoped_temp_dir_.CreateUniqueTempDir());
    temp_dir_ = scoped_temp_dir_.GetPath();
  }

 public:
  base::FilePath temp_dir_;
  base::ScopedTempDir scoped_temp_dir_;
};

TEST_F(PeripheralTest, CheckPDRevision) {
  // Set up fake sysfs paths.
  auto path = temp_dir_.Append(std::string("port0-fake_periheral"));
  ASSERT_TRUE(base::CreateDirectory(path));
  Peripheral p(path);
  EXPECT_EQ(p.GetPDRevision(), PDRevision::kNone);

  // Gibberish PD revision values should be rejected.
  auto pd_rev = base::StringPrintf("a.f");
  ASSERT_TRUE(base::WriteFile(path.Append("usb_power_delivery_revision"),
                              pd_rev.c_str(), pd_rev.length()));
  p.UpdatePDRevision();
  EXPECT_EQ(p.GetPDRevision(), PDRevision::kNone);

  pd_rev = base::StringPrintf("!*(&#@$>SC(&(*)(#@>C>");
  ASSERT_TRUE(base::WriteFile(path.Append("usb_power_delivery_revision"),
                              pd_rev.c_str(), pd_rev.length()));
  p.UpdatePDRevision();
  EXPECT_EQ(p.GetPDRevision(), PDRevision::kNone);

  // Legitimate PD revision values should be parsed correctly.
  pd_rev = base::StringPrintf("3.0");
  ASSERT_TRUE(base::WriteFile(path.Append("usb_power_delivery_revision"),
                              pd_rev.c_str(), pd_rev.length()));
  p.UpdatePDRevision();
  EXPECT_EQ(p.GetPDRevision(), PDRevision::k30);
}

}  // namespace typecd
