diff options
Diffstat (limited to 'nss/gtests/util_gtest')
-rw-r--r-- | nss/gtests/util_gtest/manifest.mn | 3 | ||||
-rw-r--r-- | nss/gtests/util_gtest/util_b64_unittest.cc | 81 | ||||
-rw-r--r-- | nss/gtests/util_gtest/util_gtest.gyp | 27 | ||||
-rw-r--r-- | nss/gtests/util_gtest/util_pkcs11uri_unittest.cc | 179 |
4 files changed, 286 insertions, 4 deletions
diff --git a/nss/gtests/util_gtest/manifest.mn b/nss/gtests/util_gtest/manifest.mn index fd49251..c6fb60e 100644 --- a/nss/gtests/util_gtest/manifest.mn +++ b/nss/gtests/util_gtest/manifest.mn @@ -8,11 +8,14 @@ MODULE = nss CPPSRCS = \ util_utf8_unittest.cc \ + util_b64_unittest.cc \ + util_pkcs11uri_unittest.cc \ $(NULL) INCLUDES += \ -I$(CORE_DEPTH)/gtests/google_test/gtest/include \ -I$(CORE_DEPTH)/gtests/common \ + -I$(CORE_DEPTH)/cpputil \ $(NULL) REQUIRES = nspr gtest diff --git a/nss/gtests/util_gtest/util_b64_unittest.cc b/nss/gtests/util_gtest/util_b64_unittest.cc new file mode 100644 index 0000000..097fde2 --- /dev/null +++ b/nss/gtests/util_gtest/util_b64_unittest.cc @@ -0,0 +1,81 @@ +/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* vim: set ts=2 et sw=2 tw=80: */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this file, + * You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#include <climits> +#include <memory> +#include "nssb64.h" + +#include "gtest/gtest.h" +#include "scoped_ptrs.h" + +namespace nss_test { + +class B64EncodeDecodeTest : public ::testing::Test { + public: + void TestDecodeStr(const std::string &str) { + ScopedSECItem tmp( + NSSBase64_DecodeBuffer(nullptr, nullptr, str.c_str(), str.size())); + ASSERT_TRUE(tmp); + char *out = NSSBase64_EncodeItem(nullptr, nullptr, 0, tmp.get()); + ASSERT_TRUE(out); + ASSERT_EQ(std::string(out), str); + PORT_Free(out); + } + bool TestEncodeItem(SECItem *item) { + bool rv = true; + char *out = NSSBase64_EncodeItem(nullptr, nullptr, 0, item); + rv = !!out; + if (out) { + ScopedSECItem tmp( + NSSBase64_DecodeBuffer(nullptr, nullptr, out, strlen(out))); + EXPECT_TRUE(tmp); + EXPECT_EQ(SECEqual, SECITEM_CompareItem(item, tmp.get())); + PORT_Free(out); + } + return rv; + } + bool TestFakeDecode(size_t str_len) { + std::string str(str_len, 'A'); + ScopedSECItem tmp( + NSSBase64_DecodeBuffer(nullptr, nullptr, str.c_str(), str.size())); + return !!tmp; + } + bool TestFakeEncode(size_t len) { + std::vector<uint8_t> data(len, 0x30); + SECItem tmp = {siBuffer, data.data(), + static_cast<unsigned int>(data.size())}; + return TestEncodeItem(&tmp); + } + + protected: +}; + +TEST_F(B64EncodeDecodeTest, DecEncTest) { TestDecodeStr("VGhpcyBpcyBOU1Mh"); } + +TEST_F(B64EncodeDecodeTest, EncDecTest) { + uint8_t data[] = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09}; + SECItem tmp = {siBuffer, data, sizeof(data)}; + TestEncodeItem(&tmp); +} + +TEST_F(B64EncodeDecodeTest, FakeDecTest) { EXPECT_TRUE(TestFakeDecode(100)); } + +TEST_F(B64EncodeDecodeTest, FakeEncDecTest) { + EXPECT_TRUE(TestFakeEncode(100)); +} + +// These takes a while ... +TEST_F(B64EncodeDecodeTest, DISABLED_LongFakeDecTest1) { + EXPECT_TRUE(TestFakeDecode(0x66666666)); +} +TEST_F(B64EncodeDecodeTest, DISABLED_LongFakeEncDecTest1) { + TestFakeEncode(0x3fffffff); +} +TEST_F(B64EncodeDecodeTest, DISABLED_LongFakeEncDecTest2) { + EXPECT_FALSE(TestFakeEncode(0x40000000)); +} + +} // namespace nss_test diff --git a/nss/gtests/util_gtest/util_gtest.gyp b/nss/gtests/util_gtest/util_gtest.gyp index 9ad5cc6..d0ea99e 100644 --- a/nss/gtests/util_gtest/util_gtest.gyp +++ b/nss/gtests/util_gtest/util_gtest.gyp @@ -12,19 +12,38 @@ 'type': 'executable', 'sources': [ 'util_utf8_unittest.cc', - '<(DEPTH)/gtests/common/gtests.cc' + 'util_b64_unittest.cc', + 'util_pkcs11uri_unittest.cc', + '<(DEPTH)/gtests/common/gtests.cc', ], 'dependencies': [ '<(DEPTH)/exports.gyp:nss_exports', '<(DEPTH)/gtests/google_test/google_test.gyp:gtest', '<(DEPTH)/lib/util/util.gyp:nssutil', - ] + '<(DEPTH)/lib/nss/nss.gyp:nss_static', + '<(DEPTH)/lib/pk11wrap/pk11wrap.gyp:pk11wrap_static', + '<(DEPTH)/lib/cryptohi/cryptohi.gyp:cryptohi', + '<(DEPTH)/lib/certhigh/certhigh.gyp:certhi', + '<(DEPTH)/lib/certdb/certdb.gyp:certdb', + '<(DEPTH)/lib/base/base.gyp:nssb', + '<(DEPTH)/lib/dev/dev.gyp:nssdev', + '<(DEPTH)/lib/pki/pki.gyp:nsspki', + '<(DEPTH)/lib/ssl/ssl.gyp:ssl', + ], + 'conditions': [ + [ 'OS=="win"', { + 'libraries': [ + 'advapi32.lib', + ], + }], + ], + 'defines': [ + 'NSS_USE_STATIC_LIBS' + ], } ], 'target_defaults': { 'include_dirs': [ - '../../gtests/google_test/gtest/include', - '../../gtests/common', '../../lib/util' ] }, diff --git a/nss/gtests/util_gtest/util_pkcs11uri_unittest.cc b/nss/gtests/util_gtest/util_pkcs11uri_unittest.cc new file mode 100644 index 0000000..e64d8a7 --- /dev/null +++ b/nss/gtests/util_gtest/util_pkcs11uri_unittest.cc @@ -0,0 +1,179 @@ +/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* vim: set ts=2 et sw=2 tw=80: */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this file, + * You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#include <climits> +#include <memory> +#include "pkcs11uri.h" + +#include "gtest/gtest.h" +#include "scoped_ptrs.h" + +namespace nss_test { + +class PK11URITest : public ::testing::Test { + public: + bool TestCreate(const PK11URIAttribute *pattrs, size_t num_pattrs, + const PK11URIAttribute *qattrs, size_t num_qattrs) { + ScopedPK11URI tmp( + PK11URI_CreateURI(pattrs, num_pattrs, qattrs, num_qattrs)); + return tmp != nullptr; + } + + void TestCreateRetrieve(const PK11URIAttribute *pattrs, size_t num_pattrs, + const PK11URIAttribute *qattrs, size_t num_qattrs) { + ScopedPK11URI tmp( + PK11URI_CreateURI(pattrs, num_pattrs, qattrs, num_qattrs)); + ASSERT_TRUE(tmp); + + size_t i; + for (i = 0; i < num_pattrs; i++) { + const char *value = PK11URI_GetPathAttribute(tmp.get(), pattrs[i].name); + EXPECT_TRUE(value); + if (value) { + EXPECT_EQ(std::string(value), std::string(pattrs[i].value)); + } + } + for (i = 0; i < num_qattrs; i++) { + const char *value = PK11URI_GetQueryAttribute(tmp.get(), qattrs[i].name); + EXPECT_TRUE(value); + if (value) { + EXPECT_EQ(std::string(value), std::string(qattrs[i].value)); + } + } + } + + void TestCreateFormat(const PK11URIAttribute *pattrs, size_t num_pattrs, + const PK11URIAttribute *qattrs, size_t num_qattrs, + const std::string &formatted) { + ScopedPK11URI tmp( + PK11URI_CreateURI(pattrs, num_pattrs, qattrs, num_qattrs)); + ASSERT_TRUE(tmp); + char *out = PK11URI_FormatURI(nullptr, tmp.get()); + EXPECT_TRUE(out); + if (out) { + EXPECT_EQ(std::string(out), formatted); + } + PORT_Free(out); + } + + bool TestParse(const std::string &str) { + ScopedPK11URI tmp(PK11URI_ParseURI(str.c_str())); + return tmp != nullptr; + } + + void TestParseRetrieve(const std::string &str, const PK11URIAttribute *pattrs, + size_t num_pattrs, const PK11URIAttribute *qattrs, + size_t num_qattrs) { + ScopedPK11URI tmp(PK11URI_ParseURI(str.c_str())); + ASSERT_TRUE(tmp); + + size_t i; + for (i = 0; i < num_pattrs; i++) { + const char *value = PK11URI_GetPathAttribute(tmp.get(), pattrs[i].name); + EXPECT_TRUE(value); + if (value) { + EXPECT_EQ(std::string(value), std::string(pattrs[i].value)); + } + } + for (i = 0; i < num_qattrs; i++) { + const char *value = PK11URI_GetQueryAttribute(tmp.get(), qattrs[i].name); + EXPECT_TRUE(value); + if (value) { + EXPECT_EQ(std::string(value), std::string(qattrs[i].value)); + } + } + } + + void TestParseFormat(const std::string &str, const std::string &formatted) { + ScopedPK11URI tmp(PK11URI_ParseURI(str.c_str())); + ASSERT_TRUE(tmp); + char *out = PK11URI_FormatURI(nullptr, tmp.get()); + EXPECT_TRUE(out); + if (out) { + EXPECT_EQ(std::string(out), formatted); + PORT_Free(out); + } + } + + protected: +}; + +const PK11URIAttribute pattrs[] = { + {"token", "aaa"}, {"manufacturer", "bbb"}, {"vendor", "ccc"}}; + +const PK11URIAttribute qattrs[] = {{"pin-source", "|grep foo /etc/passwd"}, + {"pin-value", "secret"}, + {"vendor", "ddd"}}; + +const PK11URIAttribute pattrs_invalid[] = {{"token", "aaa"}, + {"manufacturer", "bbb"}, + {"vendor", "ccc"}, + {"$%*&", "invalid"}, + {"", "empty"}}; + +const PK11URIAttribute qattrs_invalid[] = { + {"pin-source", "|grep foo /etc/passwd"}, + {"pin-value", "secret"}, + {"vendor", "ddd"}, + {"$%*&", "invalid"}, + {"", "empty"}}; + +TEST_F(PK11URITest, CreateTest) { + EXPECT_TRUE( + TestCreate(pattrs, PR_ARRAY_SIZE(pattrs), qattrs, PR_ARRAY_SIZE(qattrs))); + EXPECT_FALSE(TestCreate(pattrs_invalid, PR_ARRAY_SIZE(pattrs_invalid), qattrs, + PR_ARRAY_SIZE(qattrs))); + EXPECT_FALSE(TestCreate(pattrs, PR_ARRAY_SIZE(pattrs), qattrs_invalid, + PR_ARRAY_SIZE(qattrs_invalid))); + EXPECT_FALSE(TestCreate(pattrs_invalid, PR_ARRAY_SIZE(pattrs_invalid), + qattrs_invalid, PR_ARRAY_SIZE(qattrs_invalid))); +} + +TEST_F(PK11URITest, CreateRetrieveTest) { + TestCreateRetrieve(pattrs, PR_ARRAY_SIZE(pattrs), qattrs, + PR_ARRAY_SIZE(qattrs)); +} + +TEST_F(PK11URITest, CreateFormatTest) { + TestCreateFormat(pattrs, PR_ARRAY_SIZE(pattrs), qattrs, PR_ARRAY_SIZE(qattrs), + "pkcs11:token=aaa;manufacturer=bbb;vendor=ccc?pin-source=|" + "grep%20foo%20/etc/passwd&pin-value=secret&vendor=ddd"); +} + +TEST_F(PK11URITest, ParseTest) { + EXPECT_FALSE(TestParse("pkcs11:token=aaa;token=bbb")); + EXPECT_FALSE(TestParse("pkcs11:dup=aaa;dup=bbb")); + EXPECT_FALSE(TestParse("pkcs11:?pin-value=aaa&pin-value=bbb")); + EXPECT_FALSE(TestParse("pkcs11:=empty")); + EXPECT_FALSE(TestParse("pkcs11:token=%2;manufacturer=aaa")); +} + +TEST_F(PK11URITest, ParseRetrieveTest) { + TestParseRetrieve( + "pkcs11:token=aaa;manufacturer=bbb;vendor=ccc?pin-source=|" + "grep%20foo%20/etc/passwd&pin-value=secret&vendor=ddd", + pattrs, PR_ARRAY_SIZE(pattrs), qattrs, PR_ARRAY_SIZE(qattrs)); +} + +TEST_F(PK11URITest, ParseFormatTest) { + TestParseFormat("pkcs11:", "pkcs11:"); + TestParseFormat("pkcs11:token=aaa", "pkcs11:token=aaa"); + TestParseFormat("pkcs11:token=aaa;manufacturer=bbb", + "pkcs11:token=aaa;manufacturer=bbb"); + TestParseFormat("pkcs11:manufacturer=bbb;token=aaa", + "pkcs11:token=aaa;manufacturer=bbb"); + TestParseFormat("pkcs11:manufacturer=bbb;token=aaa;vendor2=ddd;vendor1=ccc", + "pkcs11:token=aaa;manufacturer=bbb;vendor1=ccc;vendor2=ddd"); + TestParseFormat("pkcs11:?pin-value=secret", "pkcs11:?pin-value=secret"); + TestParseFormat("pkcs11:?dup=aaa&dup=bbb", "pkcs11:?dup=aaa&dup=bbb"); + TestParseFormat( + "pkcs11:?pin-source=|grep%20foo%20/etc/passwd&pin-value=secret", + "pkcs11:?pin-source=|grep%20foo%20/etc/passwd&pin-value=secret"); + TestParseFormat("pkcs11:token=aaa?pin-value=secret", + "pkcs11:token=aaa?pin-value=secret"); +} + +} // namespace nss_test |