blob: 5c957a0cffe6bfdfe0054796a8ba79f7ad2a37fe [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>
14#include <gtest/gtest.h>
15
16#include "shill/mock_glib.h"
17
18using base::FilePath;
19using base::StringPrintf;
20using std::string;
Paul Stewarta9fbe5c2013-06-13 11:12:55 -070021using std::vector;
Paul Stewart5baebb72013-03-14 11:43:29 -070022using testing::_;
23using testing::Return;
24using testing::SetArgumentPointee;
25using testing::StrEq;
26
27namespace shill {
28
29class CertificateFileTest : public testing::Test {
30 public:
31 CertificateFileTest() : certificate_file_(&glib_) {}
32
33 virtual void SetUp() {
34 CHECK(temp_dir_.CreateUniqueTempDir());
35 certificate_directory_ = temp_dir_.path().Append("certificates");
36 certificate_file_.set_root_directory(certificate_directory_);
37 }
38
39 protected:
40 static const char kDERData[];
41 static const char kPEMData[];
42
43 string ExtractHexData(const std::string &pem_data) {
44 return CertificateFile::ExtractHexData(pem_data);
45 }
46 const FilePath &GetOutputFile() { return certificate_file_.output_file_; }
47 const FilePath &GetRootDirectory() {
48 return certificate_file_.root_directory_;
49 }
50 const char *GetPEMHeader() { return CertificateFile::kPEMHeader; }
51 const char *GetPEMFooter() { return CertificateFile::kPEMFooter; }
52
53 CertificateFile certificate_file_;
54 MockGLib glib_;
55 base::ScopedTempDir temp_dir_;
56 base::FilePath certificate_directory_;
57};
58
59const char CertificateFileTest::kDERData[] =
60 "This does not have to be a real certificate "
61 "since we are not testing its validity.";
62const char CertificateFileTest::kPEMData[] =
63 "VGhpcyBkb2VzIG5vdCBoYXZlIHRvIGJlIGEgcmVhbCBjZXJ0aWZpY2F0ZSBzaW5j\n"
64 "ZSB3ZSBhcmUgbm90IHRlc3RpbmcgaXRzIHZhbGlkaXR5Lgo=\n";
65
66
67TEST_F(CertificateFileTest, Construction) {
68 EXPECT_TRUE(GetRootDirectory() == certificate_directory_);
69 EXPECT_FALSE(file_util::PathExists(GetRootDirectory()));
70 EXPECT_TRUE(GetOutputFile().empty());
71}
72
Paul Stewart0f9c9302013-06-14 15:41:28 -070073TEST_F(CertificateFileTest, CreatePEMFromStrings) {
Paul Stewart5baebb72013-03-14 11:43:29 -070074 // Create a formatted PEM file from the inner HEX data.
Paul Stewart0f9c9302013-06-14 15:41:28 -070075 const vector<string> kPEMVector0{ kPEMData };
76 FilePath outfile0 = certificate_file_.CreatePEMFromStrings(kPEMVector0);
Paul Stewart5baebb72013-03-14 11:43:29 -070077 EXPECT_FALSE(outfile0.empty());
78 EXPECT_TRUE(file_util::PathExists(outfile0));
79 EXPECT_TRUE(file_util::ContainsPath(certificate_directory_, outfile0));
80 string file_string0;
Paul Stewart5baebb72013-03-14 11:43:29 -070081 EXPECT_TRUE(file_util::ReadFileToString(outfile0, &file_string0));
Paul Stewart0f9c9302013-06-14 15:41:28 -070082 string expected_output0 = StringPrintf(
83 "%s\n%s%s\n", GetPEMHeader(), kPEMData, GetPEMFooter());
84 EXPECT_EQ(expected_output0, file_string0);
85
Paul Stewart5baebb72013-03-14 11:43:29 -070086 // Create a formatted PEM file from formatted PEM.
Paul Stewart0f9c9302013-06-14 15:41:28 -070087 const vector<string> kPEMVector1{ expected_output0, kPEMData };
88 FilePath outfile1 = certificate_file_.CreatePEMFromStrings(kPEMVector1);
Paul Stewart5baebb72013-03-14 11:43:29 -070089 EXPECT_FALSE(outfile1.empty());
90 EXPECT_TRUE(file_util::PathExists(outfile1));
91 EXPECT_FALSE(file_util::PathExists(outfile0)); // Old file is deleted.
92 string file_string1;
93 EXPECT_TRUE(file_util::ReadFileToString(outfile1, &file_string1));
Paul Stewart0f9c9302013-06-14 15:41:28 -070094 string expected_output1 = StringPrintf(
95 "%s%s", expected_output0.c_str(), expected_output0.c_str());
96 EXPECT_EQ(expected_output1, file_string1);
Paul Stewart5baebb72013-03-14 11:43:29 -070097
98 // Fail to create a PEM file. Old file should not have been deleted.
Paul Stewart0f9c9302013-06-14 15:41:28 -070099 const vector<string> kPEMVector2{ kPEMData, "" };
100 FilePath outfile2 = certificate_file_.CreatePEMFromStrings(kPEMVector2);
Paul Stewart5baebb72013-03-14 11:43:29 -0700101 EXPECT_TRUE(outfile2.empty());
102 EXPECT_TRUE(file_util::PathExists(outfile1));
103}
104
105TEST_F(CertificateFileTest, CreateDERFromString) {
106 // Create a DER file from the inner HEX data.
107 const string kPEMString = kPEMData;
Christopher Wiley0f3eab32013-03-21 11:55:41 -0700108 const string fake_data("this is a fake");
109
110 EXPECT_CALL(glib_, B64Decode(StrEq(kPEMString), _))
111 .WillOnce(Return(false))
112 .WillOnce(DoAll(SetArgumentPointee<1>(fake_data),
113 Return(true)));
Paul Stewart5baebb72013-03-14 11:43:29 -0700114 EXPECT_TRUE(certificate_file_.CreateDERFromString(kPEMData).empty());
115
116 FilePath outfile = certificate_file_.CreateDERFromString(kPEMData);
117 EXPECT_FALSE(outfile.empty());
118 EXPECT_TRUE(file_util::PathExists(outfile));
119 string file_string;
120 EXPECT_TRUE(file_util::ReadFileToString(outfile, &file_string));
Christopher Wiley0f3eab32013-03-21 11:55:41 -0700121 EXPECT_EQ(fake_data, file_string);
Paul Stewart5baebb72013-03-14 11:43:29 -0700122}
123
124TEST_F(CertificateFileTest, ExtractHexData) {
125 EXPECT_EQ("", ExtractHexData(""));
126 EXPECT_EQ("foo\n", ExtractHexData("foo"));
127 EXPECT_EQ("foo\nbar\n", ExtractHexData("foo\r\n\t\n bar\n"));
128 EXPECT_EQ("", ExtractHexData(
129 StringPrintf("%s\nfoo\nbar\n%s\n", GetPEMFooter(), GetPEMHeader())));
130 EXPECT_EQ("", ExtractHexData(
131 StringPrintf("%s\nfoo\nbar\n%s\n", GetPEMHeader(), GetPEMHeader())));
132 EXPECT_EQ("", ExtractHexData(
133 StringPrintf("%s\nfoo\nbar\n", GetPEMHeader())));
134 EXPECT_EQ("", ExtractHexData(
135 StringPrintf("foo\nbar\n%s\n", GetPEMFooter())));
136 EXPECT_EQ("foo\nbar\n", ExtractHexData(
137 StringPrintf("%s\nfoo\nbar\n%s\n", GetPEMHeader(), GetPEMFooter())));
138 EXPECT_EQ("bar\n", ExtractHexData(
139 StringPrintf("foo\n%s\nbar\n%s\nbaz\n", GetPEMHeader(), GetPEMFooter())));
140}
141
142TEST_F(CertificateFileTest, Destruction) {
143 FilePath outfile;
144 {
145 CertificateFile certificate_file(&glib_);
146 certificate_file.set_root_directory(temp_dir_.path());
Paul Stewart0f9c9302013-06-14 15:41:28 -0700147 outfile = certificate_file.CreatePEMFromStrings(vector<string>{ kPEMData });
Paul Stewart5baebb72013-03-14 11:43:29 -0700148 EXPECT_TRUE(file_util::PathExists(outfile));
149 }
150 // The output file should be deleted when certificate_file goes out-of-scope.
151 EXPECT_FALSE(file_util::PathExists(outfile));
152}
153
154} // namespace shill