// Copyright (c) 2012 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 "shill/shims/certificates.h"

#include <sys/stat.h>

#include <base/file_path.h>
#include <base/file_util.h>
#include <base/scoped_temp_dir.h>
#include <gtest/gtest.h>

using std::string;
using testing::Test;

namespace shill {

namespace shims {

class CertificatesTest : public Test {
};

TEST_F(CertificatesTest, ConvertDERToPEM) {
  ByteString der_cert(
      string("01234567890123456789012345678901234567890123456789"), false);
  ByteString expected_pem_cert(
      string(
          "-----BEGIN CERTIFICATE-----\n"
          "MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3\r\n"
          "ODk=\n"
          "-----END CERTIFICATE-----\n"),
      false);
  ByteString pem_cert = Certificates::ConvertDERToPEM(der_cert);
  EXPECT_TRUE(expected_pem_cert.Equals(pem_cert));
}

TEST_F(CertificatesTest, Write) {
  string cert_str = "foo";
  ByteString cert(cert_str, false);
  ScopedTempDir temp_dir;
  ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
  FilePath certfile = temp_dir.path().Append("certfile");
  EXPECT_TRUE(Certificates::Write(cert, certfile));
  string contents;
  EXPECT_TRUE(file_util::ReadFileToString(certfile, &contents));
  EXPECT_EQ(cert_str, contents);
  struct stat buf;
  EXPECT_EQ(0, stat(certfile.value().c_str(), &buf));
  EXPECT_EQ(S_IFREG | S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH, buf.st_mode);

  EXPECT_FALSE(Certificates::Write(cert, temp_dir.path().Append("foo/bar")));
}

}  // namespace shims

}  // namespace shill
