blob: bc63d63952f0dba145ddbca7f988d1737766d325 [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
10#include <base/file_path.h>
11#include <base/file_util.h>
12#include <base/files/scoped_temp_dir.h>
13#include <base/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
42 string ExtractHexData(const std::string &pem_data) {
43 return CertificateFile::ExtractHexData(pem_data);
44 }
45 const FilePath &GetOutputFile() { return certificate_file_.output_file_; }
46 const FilePath &GetRootDirectory() {
47 return certificate_file_.root_directory_;
48 }
49 const char *GetPEMHeader() { return CertificateFile::kPEMHeader; }
50 const char *GetPEMFooter() { return CertificateFile::kPEMFooter; }
51
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_);
67 EXPECT_FALSE(file_util::PathExists(GetRootDirectory()));
68 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());
76 EXPECT_TRUE(file_util::PathExists(outfile0));
77 EXPECT_TRUE(file_util::ContainsPath(certificate_directory_, outfile0));
78 string file_string0;
Paul Stewart5baebb72013-03-14 11:43:29 -070079 EXPECT_TRUE(file_util::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());
88 EXPECT_TRUE(file_util::PathExists(outfile1));
89 EXPECT_FALSE(file_util::PathExists(outfile0)); // Old file is deleted.
90 string file_string1;
91 EXPECT_TRUE(file_util::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());
100 EXPECT_TRUE(file_util::PathExists(outfile1));
101}
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 });
Paul Stewart5baebb72013-03-14 11:43:29 -0700127 EXPECT_TRUE(file_util::PathExists(outfile));
128 }
129 // The output file should be deleted when certificate_file goes out-of-scope.
130 EXPECT_FALSE(file_util::PathExists(outfile));
131}
132
133} // namespace shill