summaryrefslogtreecommitdiffstats
path: root/security/nss/gtests/sysinit_gtest
diff options
context:
space:
mode:
Diffstat (limited to 'security/nss/gtests/sysinit_gtest')
-rw-r--r--security/nss/gtests/sysinit_gtest/Makefile43
-rw-r--r--security/nss/gtests/sysinit_gtest/getUserDB_unittest.cc164
-rw-r--r--security/nss/gtests/sysinit_gtest/manifest.mn27
-rw-r--r--security/nss/gtests/sysinit_gtest/sysinit_gtest.cc9
-rw-r--r--security/nss/gtests/sysinit_gtest/sysinit_gtest.gyp35
5 files changed, 278 insertions, 0 deletions
diff --git a/security/nss/gtests/sysinit_gtest/Makefile b/security/nss/gtests/sysinit_gtest/Makefile
new file mode 100644
index 0000000000..0d547e0803
--- /dev/null
+++ b/security/nss/gtests/sysinit_gtest/Makefile
@@ -0,0 +1,43 @@
+#! gmake
+#
+# 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/.
+
+#######################################################################
+# (1) Include initial platform-independent assignments (MANDATORY). #
+#######################################################################
+
+include manifest.mn
+
+#######################################################################
+# (2) Include "global" configuration information. (OPTIONAL) #
+#######################################################################
+
+include $(CORE_DEPTH)/coreconf/config.mk
+
+#######################################################################
+# (3) Include "component" configuration information. (OPTIONAL) #
+#######################################################################
+
+
+#######################################################################
+# (4) Include "local" platform-dependent assignments (OPTIONAL). #
+#######################################################################
+
+include ../common/gtest.mk
+
+#######################################################################
+# (5) Execute "global" rules. (OPTIONAL) #
+#######################################################################
+
+include $(CORE_DEPTH)/coreconf/rules.mk
+
+#######################################################################
+# (6) Execute "component" rules. (OPTIONAL) #
+#######################################################################
+
+
+#######################################################################
+# (7) Execute "local" rules. (OPTIONAL). #
+#######################################################################
diff --git a/security/nss/gtests/sysinit_gtest/getUserDB_unittest.cc b/security/nss/gtests/sysinit_gtest/getUserDB_unittest.cc
new file mode 100644
index 0000000000..845b6e36e5
--- /dev/null
+++ b/security/nss/gtests/sysinit_gtest/getUserDB_unittest.cc
@@ -0,0 +1,164 @@
+/* -*- 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 "gtest/gtest.h"
+#include "prenv.h"
+#include "seccomon.h"
+
+#include <stdlib.h>
+#include <string>
+#include <unistd.h>
+#include <sys/stat.h>
+
+namespace nss_test {
+
+// Return the path to user's NSS database.
+extern "C" char *getUserDB(void);
+
+class Sysinit : public ::testing::Test {
+ protected:
+ void SetUp() {
+ home_var_ = PR_GetEnvSecure("HOME");
+ if (home_var_) {
+ old_home_dir_ = home_var_;
+ }
+ xdg_data_home_var_ = PR_GetEnvSecure("XDG_DATA_HOME");
+ if (xdg_data_home_var_) {
+ old_xdg_data_home_ = xdg_data_home_var_;
+ ASSERT_EQ(0, unsetenv("XDG_DATA_HOME"));
+ }
+ char tmp[] = "/tmp/nss-tmp.XXXXXX";
+ tmp_home_ = mkdtemp(tmp);
+ ASSERT_EQ(0, setenv("HOME", tmp_home_.c_str(), 1));
+ }
+
+ void TearDown() {
+ // Set HOME back to original
+ if (home_var_) {
+ ASSERT_EQ(0, setenv("HOME", old_home_dir_.c_str(), 1));
+ } else {
+ ASSERT_EQ(0, unsetenv("HOME"));
+ }
+ // Set XDG_DATA_HOME back to original
+ if (xdg_data_home_var_) {
+ ASSERT_EQ(0, setenv("XDG_DATA_HOME", old_xdg_data_home_.c_str(), 1));
+ }
+ // Remove test dirs.
+ if (!nssdir_.empty()) {
+ ASSERT_EQ(0, RemoveEmptyDirsFromStart(nssdir_, tmp_home_));
+ }
+ }
+
+ // Remove all dirs within @start from @path containing only empty dirs.
+ // Assumes @start already exists.
+ // Upon successful completion, return 0. Otherwise, -1.
+ static int RemoveEmptyDirsFromStart(std::string path, std::string start) {
+ if (path.find(start) == std::string::npos) {
+ return -1;
+ }
+ std::string temp = path;
+ if (rmdir(temp.c_str())) {
+ return -1;
+ }
+ for (size_t i = temp.length() - 1; i > start.length(); --i) {
+ if (temp[i] == '/') {
+ temp[i] = '\0';
+ if (rmdir(temp.c_str())) {
+ return -1;
+ }
+ }
+ }
+ if (rmdir(start.c_str())) {
+ return -1;
+ }
+ return 0;
+ }
+
+ // Create empty dirs appending @path to @start with mode @mode.
+ // Assumes @start already exists.
+ // Upon successful completion, return the string @start + @path.
+ static std::string CreateEmptyDirsFromStart(std::string start,
+ std::string path, mode_t mode) {
+ std::string temp = start + "/";
+ for (size_t i = 1; i < path.length(); ++i) {
+ if (path[i] == '/') {
+ EXPECT_EQ(0, mkdir(temp.c_str(), mode));
+ }
+ temp += path[i];
+ }
+ // We reach the end of string before the last dir is created
+ EXPECT_EQ(0, mkdir(temp.c_str(), mode));
+ return temp;
+ }
+
+ char *home_var_;
+ char *xdg_data_home_var_;
+ std::string old_home_dir_;
+ std::string old_xdg_data_home_;
+ std::string nssdir_;
+ std::string tmp_home_;
+};
+
+class SysinitSetXdgUserDataHome : public Sysinit {
+ protected:
+ void SetUp() {
+ Sysinit::SetUp();
+ ASSERT_EQ(0, setenv("XDG_DATA_HOME", tmp_home_.c_str(), 1));
+ }
+};
+
+class SysinitSetTrashXdgUserDataHome : public Sysinit {
+ protected:
+ void SetUp() {
+ Sysinit::SetUp();
+ std::string trashPath = tmp_home_ + "/this/path/does/not/exist";
+ ASSERT_EQ(0, setenv("XDG_DATA_HOME", trashPath.c_str(), 1));
+ }
+
+ void TearDown() {
+ ASSERT_EQ(0, rmdir(tmp_home_.c_str()));
+ Sysinit::TearDown();
+ }
+};
+
+// Check if $HOME/.pki/nssdb is used if it exists
+TEST_F(Sysinit, LegacyPath) {
+ nssdir_ = CreateEmptyDirsFromStart(tmp_home_, "/.pki/nssdb", 0760);
+ char *nssdb = getUserDB();
+ ASSERT_EQ(nssdir_, nssdb);
+ PORT_Free(nssdb);
+}
+
+// Check if $HOME/.local/share/pki/nssdb is used if:
+// - $HOME/.pki/nssdb does not exist;
+// - XDG_DATA_HOME is not set.
+TEST_F(Sysinit, XdgDefaultPath) {
+ nssdir_ = CreateEmptyDirsFromStart(tmp_home_, "/.local/share", 0755);
+ nssdir_ = CreateEmptyDirsFromStart(nssdir_, "/pki/nssdb", 0760);
+ char *nssdb = getUserDB();
+ ASSERT_EQ(nssdir_, nssdb);
+ PORT_Free(nssdb);
+}
+
+// Check if ${XDG_DATA_HOME}/pki/nssdb is used if:
+// - $HOME/.pki/nssdb does not exist;
+// - XDG_DATA_HOME is set and the path exists.
+TEST_F(SysinitSetXdgUserDataHome, XdgSetPath) {
+ // XDG_DATA_HOME is set to HOME
+ nssdir_ = CreateEmptyDirsFromStart(tmp_home_, "/pki/nssdb", 0760);
+ char *nssdb = getUserDB();
+ ASSERT_EQ(nssdir_, nssdb);
+ PORT_Free(nssdb);
+}
+
+// Check if it fails when:
+// - XDG_DATA_HOME is set to a path that does not exist;
+// - $HOME/.pki/nssdb also does not exist. */
+TEST_F(SysinitSetTrashXdgUserDataHome, XdgSetToTrashPath) {
+ char *nssdb = getUserDB();
+ ASSERT_EQ(nullptr, nssdb);
+}
+
+} // namespace nss_test
diff --git a/security/nss/gtests/sysinit_gtest/manifest.mn b/security/nss/gtests/sysinit_gtest/manifest.mn
new file mode 100644
index 0000000000..2fb8167aa3
--- /dev/null
+++ b/security/nss/gtests/sysinit_gtest/manifest.mn
@@ -0,0 +1,27 @@
+#
+# 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/.
+CORE_DEPTH = ../..
+DEPTH = ../..
+
+MODULE = nss
+
+CPPSRCS = \
+ getUserDB_unittest.cc \
+ sysinit_gtest.cc \
+ $(NULL)
+
+INCLUDES += -I$(CORE_DEPTH)/gtests/google_test/gtest/include \
+ -I$(CORE_DEPTH)/gtests/common
+
+REQUIRES = nspr nss libdbm gtest
+
+PROGRAM = sysinit_gtest
+
+EXTRA_LIBS = \
+ $(DIST)/lib/$(LIB_PREFIX)gtest.$(LIB_SUFFIX) $(EXTRA_OBJS) \
+ $(DIST)/lib/$(LIB_PREFIX)nsssysinit.$(LIB_SUFFIX) \
+ $(NULL)
+
+USE_STATIC_LIBS = 1
diff --git a/security/nss/gtests/sysinit_gtest/sysinit_gtest.cc b/security/nss/gtests/sysinit_gtest/sysinit_gtest.cc
new file mode 100644
index 0000000000..9f99e366d9
--- /dev/null
+++ b/security/nss/gtests/sysinit_gtest/sysinit_gtest.cc
@@ -0,0 +1,9 @@
+#define GTEST_HAS_RTTI 0
+#include "gtest/gtest.h"
+
+int main(int argc, char** argv) {
+ // Start the tests
+ ::testing::InitGoogleTest(&argc, argv);
+ int rv = RUN_ALL_TESTS();
+ return rv;
+}
diff --git a/security/nss/gtests/sysinit_gtest/sysinit_gtest.gyp b/security/nss/gtests/sysinit_gtest/sysinit_gtest.gyp
new file mode 100644
index 0000000000..1fcacfe7f8
--- /dev/null
+++ b/security/nss/gtests/sysinit_gtest/sysinit_gtest.gyp
@@ -0,0 +1,35 @@
+# 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/.
+{
+ 'includes': [
+ '../../coreconf/config.gypi',
+ '../common/gtest.gypi'
+ ],
+ 'targets': [
+ {
+ 'target_name': 'sysinit_gtest',
+ 'type': 'executable',
+ 'sources': [
+ 'sysinit_gtest.cc',
+ 'getUserDB_unittest.cc',
+ ],
+ 'dependencies': [
+ '<(DEPTH)/exports.gyp:nss_exports',
+ '<(DEPTH)/gtests/google_test/google_test.gyp:gtest',
+ '<(DEPTH)/lib/sysinit/sysinit.gyp:nsssysinit_static'
+ ]
+ }
+ ],
+ 'target_defaults': {
+ 'include_dirs': [
+ '../../lib/sysinit'
+ ],
+ 'defines': [
+ 'NSS_USE_STATIC_LIBS'
+ ]
+ },
+ 'variables': {
+ 'module': 'nss'
+ }
+}