blob: 8c0f0f187f7f0b0b5759e0532a061a6ef5ad0940 [file] [log] [blame]
Paul Stewart5baebb72013-03-14 11:43:29 -07001// Copyright (c) 2013 The Chromium OS Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "shill/certificate_file.h"
6
7#include <string>
Paul Stewarta9fbe5c2013-06-13 11:12:55 -07008#include <vector>
Paul Stewart5baebb72013-03-14 11:43:29 -07009
Ben Chana0ddf462014-02-06 11:32:42 -080010#include <base/files/file_path.h>
Ben Chan11c213f2014-09-05 08:21:06 -070011#include <base/files/file_util.h>
Paul Stewart5baebb72013-03-14 11:43:29 -070012#include <base/files/scoped_temp_dir.h>
Ben Chana0ddf462014-02-06 11:32:42 -080013#include <base/strings/stringprintf.h>
Paul Stewarteb713e82013-06-28 14:51:54 -070014#include <gmock/gmock.h>
Paul Stewart5baebb72013-03-14 11:43:29 -070015#include <gtest/gtest.h>
16
Paul Stewart5baebb72013-03-14 11:43:29 -070017using base::FilePath;
18using base::StringPrintf;
19using std::string;
Paul Stewarta9fbe5c2013-06-13 11:12:55 -070020using std::vector;
Paul Stewart5baebb72013-03-14 11:43:29 -070021using testing::_;
22using testing::Return;
23using testing::SetArgumentPointee;
24using testing::StrEq;
25
26namespace shill {
27
28class CertificateFileTest : public testing::Test {
29 public:
Paul Stewarteb713e82013-06-28 14:51:54 -070030 CertificateFileTest() {}
Paul Stewart5baebb72013-03-14 11:43:29 -070031
32 virtual void SetUp() {
33 CHECK(temp_dir_.CreateUniqueTempDir());
34 certificate_directory_ = temp_dir_.path().Append("certificates");
35 certificate_file_.set_root_directory(certificate_directory_);
36 }
37
38 protected:
39 static const char kDERData[];
40 static const char kPEMData[];
41
Paul Stewart3b30ca52015-06-16 13:13:10 -070042 string ExtractHexData(const std::string& pem_data) {
Paul Stewart5baebb72013-03-14 11:43:29 -070043 return CertificateFile::ExtractHexData(pem_data);
44 }
Paul Stewart3b30ca52015-06-16 13:13:10 -070045 const FilePath& GetOutputFile() { return certificate_file_.output_file_; }
46 const FilePath& GetRootDirectory() {
Paul Stewart5baebb72013-03-14 11:43:29 -070047 return certificate_file_.root_directory_;
48 }
Paul Stewart3b30ca52015-06-16 13:13:10 -070049 const char* GetPEMHeader() { return CertificateFile::kPEMHeader; }
50 const char* GetPEMFooter() { return CertificateFile::kPEMFooter; }
Paul Stewart5baebb72013-03-14 11:43:29 -070051
52 CertificateFile certificate_file_;
Paul Stewart5baebb72013-03-14 11:43:29 -070053 base::ScopedTempDir temp_dir_;
54 base::FilePath certificate_directory_;
55};
56
57const char CertificateFileTest::kDERData[] =
58 "This does not have to be a real certificate "
59 "since we are not testing its validity.";
60const char CertificateFileTest::kPEMData[] =
61 "VGhpcyBkb2VzIG5vdCBoYXZlIHRvIGJlIGEgcmVhbCBjZXJ0aWZpY2F0ZSBzaW5j\n"
62 "ZSB3ZSBhcmUgbm90IHRlc3RpbmcgaXRzIHZhbGlkaXR5Lgo=\n";
63
64
65TEST_F(CertificateFileTest, Construction) {
66 EXPECT_TRUE(GetRootDirectory() == certificate_directory_);
Ben Chana0ddf462014-02-06 11:32:42 -080067 EXPECT_FALSE(base::PathExists(GetRootDirectory()));
Paul Stewart5baebb72013-03-14 11:43:29 -070068 EXPECT_TRUE(GetOutputFile().empty());
69}
70
Paul Stewart0f9c9302013-06-14 15:41:28 -070071TEST_F(CertificateFileTest, CreatePEMFromStrings) {
Paul Stewart5baebb72013-03-14 11:43:29 -070072 // Create a formatted PEM file from the inner HEX data.
Paul Stewart0f9c9302013-06-14 15:41:28 -070073 const vector<string> kPEMVector0{ kPEMData };
74 FilePath outfile0 = certificate_file_.CreatePEMFromStrings(kPEMVector0);
Paul Stewart5baebb72013-03-14 11:43:29 -070075 EXPECT_FALSE(outfile0.empty());
Ben Chana0ddf462014-02-06 11:32:42 -080076 EXPECT_TRUE(base::PathExists(outfile0));
77 EXPECT_TRUE(certificate_directory_.IsParent(outfile0));
Paul Stewart5baebb72013-03-14 11:43:29 -070078 string file_string0;
Ben Chana0ddf462014-02-06 11:32:42 -080079 EXPECT_TRUE(base::ReadFileToString(outfile0, &file_string0));
Paul Stewart0f9c9302013-06-14 15:41:28 -070080 string expected_output0 = StringPrintf(
81 "%s\n%s%s\n", GetPEMHeader(), kPEMData, GetPEMFooter());
82 EXPECT_EQ(expected_output0, file_string0);
83
Paul Stewart5baebb72013-03-14 11:43:29 -070084 // Create a formatted PEM file from formatted PEM.
Paul Stewart0f9c9302013-06-14 15:41:28 -070085 const vector<string> kPEMVector1{ expected_output0, kPEMData };
86 FilePath outfile1 = certificate_file_.CreatePEMFromStrings(kPEMVector1);
Paul Stewart5baebb72013-03-14 11:43:29 -070087 EXPECT_FALSE(outfile1.empty());
Ben Chana0ddf462014-02-06 11:32:42 -080088 EXPECT_TRUE(base::PathExists(outfile1));
89 EXPECT_FALSE(base::PathExists(outfile0)); // Old file is deleted.
Paul Stewart5baebb72013-03-14 11:43:29 -070090 string file_string1;
Ben Chana0ddf462014-02-06 11:32:42 -080091 EXPECT_TRUE(base::ReadFileToString(outfile1, &file_string1));
Paul Stewart0f9c9302013-06-14 15:41:28 -070092 string expected_output1 = StringPrintf(
93 "%s%s", expected_output0.c_str(), expected_output0.c_str());
94 EXPECT_EQ(expected_output1, file_string1);
Paul Stewart5baebb72013-03-14 11:43:29 -070095
96 // Fail to create a PEM file. Old file should not have been deleted.
Paul Stewart0f9c9302013-06-14 15:41:28 -070097 const vector<string> kPEMVector2{ kPEMData, "" };
98 FilePath outfile2 = certificate_file_.CreatePEMFromStrings(kPEMVector2);
Paul Stewart5baebb72013-03-14 11:43:29 -070099 EXPECT_TRUE(outfile2.empty());
Ben Chana0ddf462014-02-06 11:32:42 -0800100 EXPECT_TRUE(base::PathExists(outfile1));
Paul Stewart5baebb72013-03-14 11:43:29 -0700101}
102
Paul Stewart5baebb72013-03-14 11:43:29 -0700103TEST_F(CertificateFileTest, ExtractHexData) {
104 EXPECT_EQ("", ExtractHexData(""));
105 EXPECT_EQ("foo\n", ExtractHexData("foo"));
106 EXPECT_EQ("foo\nbar\n", ExtractHexData("foo\r\n\t\n bar\n"));
107 EXPECT_EQ("", ExtractHexData(
108 StringPrintf("%s\nfoo\nbar\n%s\n", GetPEMFooter(), GetPEMHeader())));
109 EXPECT_EQ("", ExtractHexData(
110 StringPrintf("%s\nfoo\nbar\n%s\n", GetPEMHeader(), GetPEMHeader())));
111 EXPECT_EQ("", ExtractHexData(
112 StringPrintf("%s\nfoo\nbar\n", GetPEMHeader())));
113 EXPECT_EQ("", ExtractHexData(
114 StringPrintf("foo\nbar\n%s\n", GetPEMFooter())));
115 EXPECT_EQ("foo\nbar\n", ExtractHexData(
116 StringPrintf("%s\nfoo\nbar\n%s\n", GetPEMHeader(), GetPEMFooter())));
117 EXPECT_EQ("bar\n", ExtractHexData(
118 StringPrintf("foo\n%s\nbar\n%s\nbaz\n", GetPEMHeader(), GetPEMFooter())));
119}
120
121TEST_F(CertificateFileTest, Destruction) {
122 FilePath outfile;
123 {
Paul Stewarteb713e82013-06-28 14:51:54 -0700124 CertificateFile certificate_file;
Paul Stewart5baebb72013-03-14 11:43:29 -0700125 certificate_file.set_root_directory(temp_dir_.path());
Paul Stewart0f9c9302013-06-14 15:41:28 -0700126 outfile = certificate_file.CreatePEMFromStrings(vector<string>{ kPEMData });
Ben Chana0ddf462014-02-06 11:32:42 -0800127 EXPECT_TRUE(base::PathExists(outfile));
Paul Stewart5baebb72013-03-14 11:43:29 -0700128 }
129 // The output file should be deleted when certificate_file goes out-of-scope.
Ben Chana0ddf462014-02-06 11:32:42 -0800130 EXPECT_FALSE(base::PathExists(outfile));
Paul Stewart5baebb72013-03-14 11:43:29 -0700131}
132
133} // namespace shill