mirror of
https://github.com/privatevoid-net/nix-super.git
synced 2024-11-22 14:06:16 +02:00
commit
d3d8186c9c
10 changed files with 639 additions and 32 deletions
1
Makefile
1
Makefile
|
@ -3,6 +3,7 @@ makefiles = \
|
||||||
local.mk \
|
local.mk \
|
||||||
nix-rust/local.mk \
|
nix-rust/local.mk \
|
||||||
src/libutil/local.mk \
|
src/libutil/local.mk \
|
||||||
|
src/libutil/tests/local.mk \
|
||||||
src/libstore/local.mk \
|
src/libstore/local.mk \
|
||||||
src/libfetchers/local.mk \
|
src/libfetchers/local.mk \
|
||||||
src/libmain/local.mk \
|
src/libmain/local.mk \
|
||||||
|
|
|
@ -1,36 +1,38 @@
|
||||||
AR = @AR@
|
AR = @AR@
|
||||||
BDW_GC_LIBS = @BDW_GC_LIBS@
|
BDW_GC_LIBS = @BDW_GC_LIBS@
|
||||||
|
BOOST_LDFLAGS = @BOOST_LDFLAGS@
|
||||||
BUILD_SHARED_LIBS = @BUILD_SHARED_LIBS@
|
BUILD_SHARED_LIBS = @BUILD_SHARED_LIBS@
|
||||||
CC = @CC@
|
CC = @CC@
|
||||||
CFLAGS = @CFLAGS@
|
CFLAGS = @CFLAGS@
|
||||||
CXX = @CXX@
|
CXX = @CXX@
|
||||||
CXXFLAGS = @CXXFLAGS@
|
CXXFLAGS = @CXXFLAGS@
|
||||||
LDFLAGS = @LDFLAGS@
|
EDITLINE_LIBS = @EDITLINE_LIBS@
|
||||||
ENABLE_S3 = @ENABLE_S3@
|
ENABLE_S3 = @ENABLE_S3@
|
||||||
HAVE_SODIUM = @HAVE_SODIUM@
|
GTEST_LIBS = @GTEST_LIBS@
|
||||||
HAVE_SECCOMP = @HAVE_SECCOMP@
|
HAVE_SECCOMP = @HAVE_SECCOMP@
|
||||||
BOOST_LDFLAGS = @BOOST_LDFLAGS@
|
HAVE_SODIUM = @HAVE_SODIUM@
|
||||||
|
LDFLAGS = @LDFLAGS@
|
||||||
|
LIBARCHIVE_LIBS = @LIBARCHIVE_LIBS@
|
||||||
|
LIBBROTLI_LIBS = @LIBBROTLI_LIBS@
|
||||||
LIBCURL_LIBS = @LIBCURL_LIBS@
|
LIBCURL_LIBS = @LIBCURL_LIBS@
|
||||||
|
LIBLZMA_LIBS = @LIBLZMA_LIBS@
|
||||||
OPENSSL_LIBS = @OPENSSL_LIBS@
|
OPENSSL_LIBS = @OPENSSL_LIBS@
|
||||||
PACKAGE_NAME = @PACKAGE_NAME@
|
PACKAGE_NAME = @PACKAGE_NAME@
|
||||||
PACKAGE_VERSION = @PACKAGE_VERSION@
|
PACKAGE_VERSION = @PACKAGE_VERSION@
|
||||||
SODIUM_LIBS = @SODIUM_LIBS@
|
SODIUM_LIBS = @SODIUM_LIBS@
|
||||||
LIBLZMA_LIBS = @LIBLZMA_LIBS@
|
|
||||||
SQLITE3_LIBS = @SQLITE3_LIBS@
|
SQLITE3_LIBS = @SQLITE3_LIBS@
|
||||||
LIBBROTLI_LIBS = @LIBBROTLI_LIBS@
|
|
||||||
LIBARCHIVE_LIBS = @LIBARCHIVE_LIBS@
|
|
||||||
EDITLINE_LIBS = @EDITLINE_LIBS@
|
|
||||||
bash = @bash@
|
bash = @bash@
|
||||||
bindir = @bindir@
|
bindir = @bindir@
|
||||||
lsof = @lsof@
|
|
||||||
datadir = @datadir@
|
datadir = @datadir@
|
||||||
datarootdir = @datarootdir@
|
datarootdir = @datarootdir@
|
||||||
|
doc_generate = @doc_generate@
|
||||||
docdir = @docdir@
|
docdir = @docdir@
|
||||||
exec_prefix = @exec_prefix@
|
exec_prefix = @exec_prefix@
|
||||||
includedir = @includedir@
|
includedir = @includedir@
|
||||||
libdir = @libdir@
|
libdir = @libdir@
|
||||||
libexecdir = @libexecdir@
|
libexecdir = @libexecdir@
|
||||||
localstatedir = @localstatedir@
|
localstatedir = @localstatedir@
|
||||||
|
lsof = @lsof@
|
||||||
mandir = @mandir@
|
mandir = @mandir@
|
||||||
pkglibdir = $(libdir)/$(PACKAGE_NAME)
|
pkglibdir = $(libdir)/$(PACKAGE_NAME)
|
||||||
prefix = @prefix@
|
prefix = @prefix@
|
||||||
|
@ -38,6 +40,5 @@ sandbox_shell = @sandbox_shell@
|
||||||
storedir = @storedir@
|
storedir = @storedir@
|
||||||
sysconfdir = @sysconfdir@
|
sysconfdir = @sysconfdir@
|
||||||
system = @system@
|
system = @system@
|
||||||
doc_generate = @doc_generate@
|
|
||||||
xmllint = @xmllint@
|
xmllint = @xmllint@
|
||||||
xsltproc = @xsltproc@
|
xsltproc = @xsltproc@
|
||||||
|
|
|
@ -266,6 +266,10 @@ if test "$gc" = yes; then
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
# Look for gtest.
|
||||||
|
PKG_CHECK_MODULES([GTEST], [gtest_main])
|
||||||
|
|
||||||
|
|
||||||
# documentation generation switch
|
# documentation generation switch
|
||||||
AC_ARG_ENABLE(doc-gen, AC_HELP_STRING([--disable-doc-gen],
|
AC_ARG_ENABLE(doc-gen, AC_HELP_STRING([--disable-doc-gen],
|
||||||
[disable documentation generation]),
|
[disable documentation generation]),
|
||||||
|
|
|
@ -35,24 +35,28 @@ define build-program
|
||||||
$$(trace-ld) $(CXX) -o $$@ $$(LDFLAGS) $$(GLOBAL_LDFLAGS) $$($(1)_OBJS) $$($(1)_LDFLAGS) $$(foreach lib, $$($(1)_LIBS), $$($$(lib)_LDFLAGS_USE))
|
$$(trace-ld) $(CXX) -o $$@ $$(LDFLAGS) $$(GLOBAL_LDFLAGS) $$($(1)_OBJS) $$($(1)_LDFLAGS) $$(foreach lib, $$($(1)_LIBS), $$($$(lib)_LDFLAGS_USE))
|
||||||
|
|
||||||
$(1)_INSTALL_DIR ?= $$(bindir)
|
$(1)_INSTALL_DIR ?= $$(bindir)
|
||||||
$(1)_INSTALL_PATH := $$($(1)_INSTALL_DIR)/$(1)
|
|
||||||
|
|
||||||
$$(eval $$(call create-dir, $$($(1)_INSTALL_DIR)))
|
ifdef $(1)_INSTALL_DIR
|
||||||
|
|
||||||
install: $(DESTDIR)$$($(1)_INSTALL_PATH)
|
$(1)_INSTALL_PATH := $$($(1)_INSTALL_DIR)/$(1)
|
||||||
|
|
||||||
ifeq ($(BUILD_SHARED_LIBS), 1)
|
$$(eval $$(call create-dir, $$($(1)_INSTALL_DIR)))
|
||||||
|
|
||||||
_libs_final := $$(foreach lib, $$($(1)_LIBS), $$($$(lib)_INSTALL_PATH))
|
install: $(DESTDIR)$$($(1)_INSTALL_PATH)
|
||||||
|
|
||||||
$(DESTDIR)$$($(1)_INSTALL_PATH): $$($(1)_OBJS) $$(_libs_final) | $(DESTDIR)$$($(1)_INSTALL_DIR)/
|
ifeq ($(BUILD_SHARED_LIBS), 1)
|
||||||
|
|
||||||
|
_libs_final := $$(foreach lib, $$($(1)_LIBS), $$($$(lib)_INSTALL_PATH))
|
||||||
|
|
||||||
|
$(DESTDIR)$$($(1)_INSTALL_PATH): $$($(1)_OBJS) $$(_libs_final) | $(DESTDIR)$$($(1)_INSTALL_DIR)/
|
||||||
$$(trace-ld) $(CXX) -o $$@ $$(LDFLAGS) $$(GLOBAL_LDFLAGS) $$($(1)_OBJS) $$($(1)_LDFLAGS) $$(foreach lib, $$($(1)_LIBS), $$($$(lib)_LDFLAGS_USE_INSTALLED))
|
$$(trace-ld) $(CXX) -o $$@ $$(LDFLAGS) $$(GLOBAL_LDFLAGS) $$($(1)_OBJS) $$($(1)_LDFLAGS) $$(foreach lib, $$($(1)_LIBS), $$($$(lib)_LDFLAGS_USE_INSTALLED))
|
||||||
|
|
||||||
else
|
else
|
||||||
|
|
||||||
$(DESTDIR)$$($(1)_INSTALL_PATH): $$($(1)_PATH) | $(DESTDIR)$$($(1)_INSTALL_DIR)/
|
$(DESTDIR)$$($(1)_INSTALL_PATH): $$($(1)_PATH) | $(DESTDIR)$$($(1)_INSTALL_DIR)/
|
||||||
install -t $(DESTDIR)$$($(1)_INSTALL_DIR) $$<
|
install -t $(DESTDIR)$$($(1)_INSTALL_DIR) $$<
|
||||||
|
|
||||||
|
endif
|
||||||
endif
|
endif
|
||||||
|
|
||||||
# Propagate CFLAGS and CXXFLAGS to the individual object files.
|
# Propagate CFLAGS and CXXFLAGS to the individual object files.
|
||||||
|
@ -76,4 +80,10 @@ define build-program
|
||||||
programs-list += $$($(1)_PATH)
|
programs-list += $$($(1)_PATH)
|
||||||
clean-files += $$($(1)_PATH) $$(_d)/*.o $$(_d)/.*.dep $$($(1)_DEPS) $$($(1)_OBJS)
|
clean-files += $$($(1)_PATH) $$(_d)/*.o $$(_d)/.*.dep $$($(1)_DEPS) $$($(1)_OBJS)
|
||||||
dist-files += $$(_srcs)
|
dist-files += $$(_srcs)
|
||||||
|
|
||||||
|
# Phony target to run this program (typically as a dependency of 'check').
|
||||||
|
.PHONY: $(1)_RUN
|
||||||
|
$(1)_RUN: $$($(1)_PATH)
|
||||||
|
$(trace-test) $$($(1)_PATH)
|
||||||
|
|
||||||
endef
|
endef
|
||||||
|
|
|
@ -11,6 +11,7 @@ ifeq ($(V), 0)
|
||||||
trace-javac = @echo " JAVAC " $@;
|
trace-javac = @echo " JAVAC " $@;
|
||||||
trace-jar = @echo " JAR " $@;
|
trace-jar = @echo " JAR " $@;
|
||||||
trace-mkdir = @echo " MKDIR " $@;
|
trace-mkdir = @echo " MKDIR " $@;
|
||||||
|
trace-test = @echo " TEST " $@;
|
||||||
|
|
||||||
suppress = @
|
suppress = @
|
||||||
|
|
||||||
|
|
|
@ -41,5 +41,5 @@ ifneq ($(OS), Darwin)
|
||||||
check: rust-tests
|
check: rust-tests
|
||||||
|
|
||||||
rust-tests:
|
rust-tests:
|
||||||
cd nix-rust && CARGO_HOME=$$(if [[ -d vendor ]]; then echo vendor; fi) cargo test --release $$(if [[ -d vendor ]]; then echo --offline; fi)
|
$(trace-test) cd nix-rust && CARGO_HOME=$$(if [[ -d vendor ]]; then echo vendor; fi) cargo test --release $$(if [[ -d vendor ]]; then echo --offline; fi)
|
||||||
endif
|
endif
|
||||||
|
|
|
@ -55,6 +55,7 @@ rec {
|
||||||
# Tests
|
# Tests
|
||||||
git
|
git
|
||||||
mercurial
|
mercurial
|
||||||
|
gmock
|
||||||
]
|
]
|
||||||
++ lib.optionals stdenv.isLinux [libseccomp utillinuxMinimal]
|
++ lib.optionals stdenv.isLinux [libseccomp utillinuxMinimal]
|
||||||
++ lib.optional (stdenv.isLinux || stdenv.isDarwin) libsodium
|
++ lib.optional (stdenv.isLinux || stdenv.isDarwin) libsodium
|
||||||
|
|
15
src/libutil/tests/local.mk
Normal file
15
src/libutil/tests/local.mk
Normal file
|
@ -0,0 +1,15 @@
|
||||||
|
check: libutil-tests_RUN
|
||||||
|
|
||||||
|
programs += libutil-tests
|
||||||
|
|
||||||
|
libutil-tests_DIR := $(d)
|
||||||
|
|
||||||
|
libutil-tests_INSTALL_DIR :=
|
||||||
|
|
||||||
|
libutil-tests_SOURCES := $(wildcard $(d)/*.cc)
|
||||||
|
|
||||||
|
libutil-tests_CXXFLAGS += -I src/libutil
|
||||||
|
|
||||||
|
libutil-tests_LIBS = libutil
|
||||||
|
|
||||||
|
libutil-tests_LDFLAGS := $(GTEST_LIBS)
|
585
src/libutil/tests/tests.cc
Normal file
585
src/libutil/tests/tests.cc
Normal file
|
@ -0,0 +1,585 @@
|
||||||
|
#include "util.hh"
|
||||||
|
#include "types.hh"
|
||||||
|
|
||||||
|
#include <gtest/gtest.h>
|
||||||
|
|
||||||
|
namespace nix {
|
||||||
|
|
||||||
|
/* ----------------------------------------------------------------------------
|
||||||
|
* absPath
|
||||||
|
* --------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
TEST(absPath, doesntChangeRoot) {
|
||||||
|
auto p = absPath("/");
|
||||||
|
|
||||||
|
ASSERT_EQ(p, "/");
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST(absPath, turnsEmptyPathIntoCWD) {
|
||||||
|
char cwd[PATH_MAX+1];
|
||||||
|
auto p = absPath("");
|
||||||
|
|
||||||
|
ASSERT_EQ(p, getcwd((char*)&cwd, PATH_MAX));
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST(absPath, usesOptionalBasePathWhenGiven) {
|
||||||
|
char _cwd[PATH_MAX+1];
|
||||||
|
char* cwd = getcwd((char*)&_cwd, PATH_MAX);
|
||||||
|
|
||||||
|
auto p = absPath("", cwd);
|
||||||
|
|
||||||
|
ASSERT_EQ(p, cwd);
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST(absPath, isIdempotent) {
|
||||||
|
char _cwd[PATH_MAX+1];
|
||||||
|
char* cwd = getcwd((char*)&_cwd, PATH_MAX);
|
||||||
|
auto p1 = absPath(cwd);
|
||||||
|
auto p2 = absPath(p1);
|
||||||
|
|
||||||
|
ASSERT_EQ(p1, p2);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
TEST(absPath, pathIsCanonicalised) {
|
||||||
|
auto path = "/some/path/with/trailing/dot/.";
|
||||||
|
auto p1 = absPath(path);
|
||||||
|
auto p2 = absPath(p1);
|
||||||
|
|
||||||
|
ASSERT_EQ(p1, "/some/path/with/trailing/dot");
|
||||||
|
ASSERT_EQ(p1, p2);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ----------------------------------------------------------------------------
|
||||||
|
* canonPath
|
||||||
|
* --------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
TEST(canonPath, removesTrailingSlashes) {
|
||||||
|
auto path = "/this/is/a/path//";
|
||||||
|
auto p = canonPath(path);
|
||||||
|
|
||||||
|
ASSERT_EQ(p, "/this/is/a/path");
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST(canonPath, removesDots) {
|
||||||
|
auto path = "/this/./is/a/path/./";
|
||||||
|
auto p = canonPath(path);
|
||||||
|
|
||||||
|
ASSERT_EQ(p, "/this/is/a/path");
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST(canonPath, removesDots2) {
|
||||||
|
auto path = "/this/a/../is/a////path/foo/..";
|
||||||
|
auto p = canonPath(path);
|
||||||
|
|
||||||
|
ASSERT_EQ(p, "/this/is/a/path");
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST(canonPath, requiresAbsolutePath) {
|
||||||
|
ASSERT_ANY_THROW(canonPath("."));
|
||||||
|
ASSERT_ANY_THROW(canonPath(".."));
|
||||||
|
ASSERT_ANY_THROW(canonPath("../"));
|
||||||
|
ASSERT_DEATH({ canonPath(""); }, "path != \"\"");
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ----------------------------------------------------------------------------
|
||||||
|
* dirOf
|
||||||
|
* --------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
TEST(dirOf, returnsEmptyStringForRoot) {
|
||||||
|
auto p = dirOf("/");
|
||||||
|
|
||||||
|
ASSERT_EQ(p, "/");
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST(dirOf, returnsFirstPathComponent) {
|
||||||
|
auto p1 = dirOf("/dir/");
|
||||||
|
ASSERT_EQ(p1, "/dir");
|
||||||
|
auto p2 = dirOf("/dir");
|
||||||
|
ASSERT_EQ(p2, "/");
|
||||||
|
auto p3 = dirOf("/dir/..");
|
||||||
|
ASSERT_EQ(p3, "/dir");
|
||||||
|
auto p4 = dirOf("/dir/../");
|
||||||
|
ASSERT_EQ(p4, "/dir/..");
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ----------------------------------------------------------------------------
|
||||||
|
* baseNameOf
|
||||||
|
* --------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
TEST(baseNameOf, emptyPath) {
|
||||||
|
auto p1 = baseNameOf("");
|
||||||
|
ASSERT_EQ(p1, "");
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST(baseNameOf, pathOnRoot) {
|
||||||
|
auto p1 = baseNameOf("/dir");
|
||||||
|
ASSERT_EQ(p1, "dir");
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST(baseNameOf, relativePath) {
|
||||||
|
auto p1 = baseNameOf("dir/foo");
|
||||||
|
ASSERT_EQ(p1, "foo");
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST(baseNameOf, pathWithTrailingSlashRoot) {
|
||||||
|
auto p1 = baseNameOf("/");
|
||||||
|
ASSERT_EQ(p1, "");
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST(baseNameOf, trailingSlash) {
|
||||||
|
auto p1 = baseNameOf("/dir/");
|
||||||
|
ASSERT_EQ(p1, "dir");
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ----------------------------------------------------------------------------
|
||||||
|
* isInDir
|
||||||
|
* --------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
TEST(isInDir, trivialCase) {
|
||||||
|
auto p1 = isInDir("/foo/bar", "/foo");
|
||||||
|
ASSERT_EQ(p1, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST(isInDir, notInDir) {
|
||||||
|
auto p1 = isInDir("/zes/foo/bar", "/foo");
|
||||||
|
ASSERT_EQ(p1, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
// XXX: hm, bug or feature? :) Looking at the implementation
|
||||||
|
// this might be problematic.
|
||||||
|
TEST(isInDir, emptyDir) {
|
||||||
|
auto p1 = isInDir("/zes/foo/bar", "");
|
||||||
|
ASSERT_EQ(p1, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ----------------------------------------------------------------------------
|
||||||
|
* isDirOrInDir
|
||||||
|
* --------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
TEST(isDirOrInDir, trueForSameDirectory) {
|
||||||
|
ASSERT_EQ(isDirOrInDir("/nix", "/nix"), true);
|
||||||
|
ASSERT_EQ(isDirOrInDir("/", "/"), true);
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST(isDirOrInDir, trueForEmptyPaths) {
|
||||||
|
ASSERT_EQ(isDirOrInDir("", ""), true);
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST(isDirOrInDir, falseForDisjunctPaths) {
|
||||||
|
ASSERT_EQ(isDirOrInDir("/foo", "/bar"), false);
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST(isDirOrInDir, relativePaths) {
|
||||||
|
ASSERT_EQ(isDirOrInDir("/foo/..", "/foo"), true);
|
||||||
|
}
|
||||||
|
|
||||||
|
// XXX: while it is possible to use "." or ".." in the
|
||||||
|
// first argument this doesn't seem to work in the second.
|
||||||
|
TEST(isDirOrInDir, DISABLED_shouldWork) {
|
||||||
|
ASSERT_EQ(isDirOrInDir("/foo/..", "/foo/."), true);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ----------------------------------------------------------------------------
|
||||||
|
* pathExists
|
||||||
|
* --------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
TEST(pathExists, rootExists) {
|
||||||
|
ASSERT_TRUE(pathExists("/"));
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST(pathExists, cwdExists) {
|
||||||
|
ASSERT_TRUE(pathExists("."));
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST(pathExists, bogusPathDoesNotExist) {
|
||||||
|
ASSERT_FALSE(pathExists("/home/schnitzel/darmstadt/pommes"));
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ----------------------------------------------------------------------------
|
||||||
|
* concatStringsSep
|
||||||
|
* --------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
TEST(concatStringsSep, buildCommaSeparatedString) {
|
||||||
|
Strings strings;
|
||||||
|
strings.push_back("this");
|
||||||
|
strings.push_back("is");
|
||||||
|
strings.push_back("great");
|
||||||
|
|
||||||
|
ASSERT_EQ(concatStringsSep(",", strings), "this,is,great");
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST(concatStringsSep, buildStringWithEmptySeparator) {
|
||||||
|
Strings strings;
|
||||||
|
strings.push_back("this");
|
||||||
|
strings.push_back("is");
|
||||||
|
strings.push_back("great");
|
||||||
|
|
||||||
|
ASSERT_EQ(concatStringsSep("", strings), "thisisgreat");
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST(concatStringsSep, buildSingleString) {
|
||||||
|
Strings strings;
|
||||||
|
strings.push_back("this");
|
||||||
|
|
||||||
|
ASSERT_EQ(concatStringsSep(",", strings), "this");
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ----------------------------------------------------------------------------
|
||||||
|
* hasPrefix
|
||||||
|
* --------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
TEST(hasPrefix, emptyStringHasNoPrefix) {
|
||||||
|
ASSERT_FALSE(hasPrefix("", "foo"));
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST(hasPrefix, emptyStringIsAlwaysPrefix) {
|
||||||
|
ASSERT_TRUE(hasPrefix("foo", ""));
|
||||||
|
ASSERT_TRUE(hasPrefix("jshjkfhsadf", ""));
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST(hasPrefix, trivialCase) {
|
||||||
|
ASSERT_TRUE(hasPrefix("foobar", "foo"));
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ----------------------------------------------------------------------------
|
||||||
|
* hasSuffix
|
||||||
|
* --------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
TEST(hasSuffix, emptyStringHasNoSuffix) {
|
||||||
|
ASSERT_FALSE(hasSuffix("", "foo"));
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST(hasSuffix, trivialCase) {
|
||||||
|
ASSERT_TRUE(hasSuffix("foo", "foo"));
|
||||||
|
ASSERT_TRUE(hasSuffix("foobar", "bar"));
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ----------------------------------------------------------------------------
|
||||||
|
* base64Encode
|
||||||
|
* --------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
TEST(base64Encode, emptyString) {
|
||||||
|
ASSERT_EQ(base64Encode(""), "");
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST(base64Encode, encodesAString) {
|
||||||
|
ASSERT_EQ(base64Encode("quod erat demonstrandum"), "cXVvZCBlcmF0IGRlbW9uc3RyYW5kdW0=");
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST(base64Encode, encodeAndDecode) {
|
||||||
|
auto s = "quod erat demonstrandum";
|
||||||
|
auto encoded = base64Encode(s);
|
||||||
|
auto decoded = base64Decode(encoded);
|
||||||
|
|
||||||
|
ASSERT_EQ(decoded, s);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ----------------------------------------------------------------------------
|
||||||
|
* base64Decode
|
||||||
|
* --------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
TEST(base64Decode, emptyString) {
|
||||||
|
ASSERT_EQ(base64Decode(""), "");
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST(base64Decode, decodeAString) {
|
||||||
|
ASSERT_EQ(base64Decode("cXVvZCBlcmF0IGRlbW9uc3RyYW5kdW0="), "quod erat demonstrandum");
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ----------------------------------------------------------------------------
|
||||||
|
* toLower
|
||||||
|
* --------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
TEST(toLower, emptyString) {
|
||||||
|
ASSERT_EQ(toLower(""), "");
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST(toLower, nonLetters) {
|
||||||
|
auto s = "!@(*$#)(@#=\\234_";
|
||||||
|
ASSERT_EQ(toLower(s), s);
|
||||||
|
}
|
||||||
|
|
||||||
|
// std::tolower() doesn't handle unicode characters. In the context of
|
||||||
|
// store paths this isn't relevant but doesn't hurt to record this behavior
|
||||||
|
// here.
|
||||||
|
TEST(toLower, umlauts) {
|
||||||
|
auto s = "ÄÖÜ";
|
||||||
|
ASSERT_EQ(toLower(s), "ÄÖÜ");
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ----------------------------------------------------------------------------
|
||||||
|
* string2Float
|
||||||
|
* --------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
TEST(string2Float, emptyString) {
|
||||||
|
double n;
|
||||||
|
ASSERT_EQ(string2Float("", n), false);
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST(string2Float, trivialConversions) {
|
||||||
|
double n;
|
||||||
|
ASSERT_EQ(string2Float("1.0", n), true);
|
||||||
|
ASSERT_EQ(n, 1.0);
|
||||||
|
|
||||||
|
ASSERT_EQ(string2Float("0.0", n), true);
|
||||||
|
ASSERT_EQ(n, 0.0);
|
||||||
|
|
||||||
|
ASSERT_EQ(string2Float("-100.25", n), true);
|
||||||
|
ASSERT_EQ(n, (-100.25));
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ----------------------------------------------------------------------------
|
||||||
|
* string2Int
|
||||||
|
* --------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
TEST(string2Int, emptyString) {
|
||||||
|
double n;
|
||||||
|
ASSERT_EQ(string2Int("", n), false);
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST(string2Int, trivialConversions) {
|
||||||
|
double n;
|
||||||
|
ASSERT_EQ(string2Int("1", n), true);
|
||||||
|
ASSERT_EQ(n, 1);
|
||||||
|
|
||||||
|
ASSERT_EQ(string2Int("0", n), true);
|
||||||
|
ASSERT_EQ(n, 0);
|
||||||
|
|
||||||
|
ASSERT_EQ(string2Int("-100", n), true);
|
||||||
|
ASSERT_EQ(n, (-100));
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ----------------------------------------------------------------------------
|
||||||
|
* statusOk
|
||||||
|
* --------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
TEST(statusOk, zeroIsOk) {
|
||||||
|
ASSERT_EQ(statusOk(0), true);
|
||||||
|
ASSERT_EQ(statusOk(1), false);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* ----------------------------------------------------------------------------
|
||||||
|
* rewriteStrings
|
||||||
|
* --------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
TEST(rewriteStrings, emptyString) {
|
||||||
|
StringMap rewrites;
|
||||||
|
rewrites["this"] = "that";
|
||||||
|
|
||||||
|
ASSERT_EQ(rewriteStrings("", rewrites), "");
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST(rewriteStrings, emptyRewrites) {
|
||||||
|
StringMap rewrites;
|
||||||
|
|
||||||
|
ASSERT_EQ(rewriteStrings("this and that", rewrites), "this and that");
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST(rewriteStrings, successfulRewrite) {
|
||||||
|
StringMap rewrites;
|
||||||
|
rewrites["this"] = "that";
|
||||||
|
|
||||||
|
ASSERT_EQ(rewriteStrings("this and that", rewrites), "that and that");
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST(rewriteStrings, doesntOccur) {
|
||||||
|
StringMap rewrites;
|
||||||
|
rewrites["foo"] = "bar";
|
||||||
|
|
||||||
|
ASSERT_EQ(rewriteStrings("this and that", rewrites), "this and that");
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ----------------------------------------------------------------------------
|
||||||
|
* replaceStrings
|
||||||
|
* --------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
TEST(replaceStrings, emptyString) {
|
||||||
|
ASSERT_EQ(replaceStrings("", "this", "that"), "");
|
||||||
|
ASSERT_EQ(replaceStrings("this and that", "", ""), "this and that");
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST(replaceStrings, successfulReplace) {
|
||||||
|
ASSERT_EQ(replaceStrings("this and that", "this", "that"), "that and that");
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST(replaceStrings, doesntOccur) {
|
||||||
|
ASSERT_EQ(replaceStrings("this and that", "foo", "bar"), "this and that");
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ----------------------------------------------------------------------------
|
||||||
|
* trim
|
||||||
|
* --------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
TEST(trim, emptyString) {
|
||||||
|
ASSERT_EQ(trim(""), "");
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST(trim, removesWhitespace) {
|
||||||
|
ASSERT_EQ(trim("foo"), "foo");
|
||||||
|
ASSERT_EQ(trim(" foo "), "foo");
|
||||||
|
ASSERT_EQ(trim(" foo bar baz"), "foo bar baz");
|
||||||
|
ASSERT_EQ(trim(" \t foo bar baz\n"), "foo bar baz");
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ----------------------------------------------------------------------------
|
||||||
|
* chomp
|
||||||
|
* --------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
TEST(chomp, emptyString) {
|
||||||
|
ASSERT_EQ(chomp(""), "");
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST(chomp, removesWhitespace) {
|
||||||
|
ASSERT_EQ(chomp("foo"), "foo");
|
||||||
|
ASSERT_EQ(chomp("foo "), "foo");
|
||||||
|
ASSERT_EQ(chomp(" foo "), " foo");
|
||||||
|
ASSERT_EQ(chomp(" foo bar baz "), " foo bar baz");
|
||||||
|
ASSERT_EQ(chomp("\t foo bar baz\n"), "\t foo bar baz");
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ----------------------------------------------------------------------------
|
||||||
|
* quoteStrings
|
||||||
|
* --------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
TEST(quoteStrings, empty) {
|
||||||
|
Strings s = { };
|
||||||
|
Strings expected = { };
|
||||||
|
|
||||||
|
ASSERT_EQ(quoteStrings(s), expected);
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST(quoteStrings, emptyStrings) {
|
||||||
|
Strings s = { "", "", "" };
|
||||||
|
Strings expected = { "''", "''", "''" };
|
||||||
|
ASSERT_EQ(quoteStrings(s), expected);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST(quoteStrings, trivialQuote) {
|
||||||
|
Strings s = { "foo", "bar", "baz" };
|
||||||
|
Strings expected = { "'foo'", "'bar'", "'baz'" };
|
||||||
|
|
||||||
|
ASSERT_EQ(quoteStrings(s), expected);
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST(quoteStrings, quotedStrings) {
|
||||||
|
Strings s = { "'foo'", "'bar'", "'baz'" };
|
||||||
|
Strings expected = { "''foo''", "''bar''", "''baz''" };
|
||||||
|
|
||||||
|
ASSERT_EQ(quoteStrings(s), expected);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ----------------------------------------------------------------------------
|
||||||
|
* tokenizeString
|
||||||
|
* --------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
TEST(tokenizeString, empty) {
|
||||||
|
Strings expected = { };
|
||||||
|
|
||||||
|
ASSERT_EQ(tokenizeString<Strings>(""), expected);
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST(tokenizeString, tokenizeSpacesWithDefaults) {
|
||||||
|
auto s = "foo bar baz";
|
||||||
|
Strings expected = { "foo", "bar", "baz" };
|
||||||
|
|
||||||
|
ASSERT_EQ(tokenizeString<Strings>(s), expected);
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST(tokenizeString, tokenizeTabsWithDefaults) {
|
||||||
|
auto s = "foo\tbar\tbaz";
|
||||||
|
Strings expected = { "foo", "bar", "baz" };
|
||||||
|
|
||||||
|
ASSERT_EQ(tokenizeString<Strings>(s), expected);
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST(tokenizeString, tokenizeTabsSpacesWithDefaults) {
|
||||||
|
auto s = "foo\t bar\t baz";
|
||||||
|
Strings expected = { "foo", "bar", "baz" };
|
||||||
|
|
||||||
|
ASSERT_EQ(tokenizeString<Strings>(s), expected);
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST(tokenizeString, tokenizeTabsSpacesNewlineWithDefaults) {
|
||||||
|
auto s = "foo\t\n bar\t\n baz";
|
||||||
|
Strings expected = { "foo", "bar", "baz" };
|
||||||
|
|
||||||
|
ASSERT_EQ(tokenizeString<Strings>(s), expected);
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST(tokenizeString, tokenizeTabsSpacesNewlineRetWithDefaults) {
|
||||||
|
auto s = "foo\t\n\r bar\t\n\r baz";
|
||||||
|
Strings expected = { "foo", "bar", "baz" };
|
||||||
|
|
||||||
|
ASSERT_EQ(tokenizeString<Strings>(s), expected);
|
||||||
|
|
||||||
|
auto s2 = "foo \t\n\r bar \t\n\r baz";
|
||||||
|
Strings expected2 = { "foo", "bar", "baz" };
|
||||||
|
|
||||||
|
ASSERT_EQ(tokenizeString<Strings>(s2), expected2);
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST(tokenizeString, tokenizeWithCustomSep) {
|
||||||
|
auto s = "foo\n,bar\n,baz\n";
|
||||||
|
Strings expected = { "foo\n", "bar\n", "baz\n" };
|
||||||
|
|
||||||
|
ASSERT_EQ(tokenizeString<Strings>(s, ","), expected);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ----------------------------------------------------------------------------
|
||||||
|
* get
|
||||||
|
* --------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
TEST(get, emptyContainer) {
|
||||||
|
StringMap s = { };
|
||||||
|
auto expected = std::nullopt;
|
||||||
|
|
||||||
|
ASSERT_EQ(get(s, "one"), expected);
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST(get, getFromContainer) {
|
||||||
|
StringMap s;
|
||||||
|
s["one"] = "yi";
|
||||||
|
s["two"] = "er";
|
||||||
|
auto expected = "yi";
|
||||||
|
|
||||||
|
ASSERT_EQ(get(s, "one"), expected);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ----------------------------------------------------------------------------
|
||||||
|
* filterANSIEscapes
|
||||||
|
* --------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
TEST(filterANSIEscapes, emptyString) {
|
||||||
|
auto s = "";
|
||||||
|
auto expected = "";
|
||||||
|
|
||||||
|
ASSERT_EQ(filterANSIEscapes(s), expected);
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST(filterANSIEscapes, doesntChangePrintableChars) {
|
||||||
|
auto s = "09 2q304ruyhr slk2-19024 kjsadh sar f";
|
||||||
|
|
||||||
|
ASSERT_EQ(filterANSIEscapes(s), s);
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST(filterANSIEscapes, filtersColorCodes) {
|
||||||
|
auto s = "\u001b[30m A \u001b[31m B \u001b[32m C \u001b[33m D \u001b[0m";
|
||||||
|
|
||||||
|
ASSERT_EQ(filterANSIEscapes(s, true, 2), " A" );
|
||||||
|
ASSERT_EQ(filterANSIEscapes(s, true, 3), " A " );
|
||||||
|
ASSERT_EQ(filterANSIEscapes(s, true, 4), " A " );
|
||||||
|
ASSERT_EQ(filterANSIEscapes(s, true, 5), " A B" );
|
||||||
|
ASSERT_EQ(filterANSIEscapes(s, true, 8), " A B C" );
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST(filterANSIEscapes, expandsTabs) {
|
||||||
|
auto s = "foo\tbar\tbaz";
|
||||||
|
|
||||||
|
ASSERT_EQ(filterANSIEscapes(s, true), "foo bar baz" );
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -58,12 +58,12 @@ Path canonPath(const Path & path, bool resolveSymlinks = false);
|
||||||
|
|
||||||
/* Return the directory part of the given canonical path, i.e.,
|
/* Return the directory part of the given canonical path, i.e.,
|
||||||
everything before the final `/'. If the path is the root or an
|
everything before the final `/'. If the path is the root or an
|
||||||
immediate child thereof (e.g., `/foo'), this means an empty string
|
immediate child thereof (e.g., `/foo'), this means `/'
|
||||||
is returned. */
|
is returned.*/
|
||||||
Path dirOf(const Path & path);
|
Path dirOf(const Path & path);
|
||||||
|
|
||||||
/* Return the base name of the given canonical path, i.e., everything
|
/* Return the base name of the given canonical path, i.e., everything
|
||||||
following the final `/'. */
|
following the final `/' (trailing slashes are removed). */
|
||||||
std::string_view baseNameOf(std::string_view path);
|
std::string_view baseNameOf(std::string_view path);
|
||||||
|
|
||||||
/* Check whether 'path' is a descendant of 'dir'. */
|
/* Check whether 'path' is a descendant of 'dir'. */
|
||||||
|
@ -389,17 +389,6 @@ string replaceStrings(const std::string & s,
|
||||||
std::string rewriteStrings(const std::string & s, const StringMap & rewrites);
|
std::string rewriteStrings(const std::string & s, const StringMap & rewrites);
|
||||||
|
|
||||||
|
|
||||||
/* If a set contains 'from', remove it and insert 'to'. */
|
|
||||||
template<typename T>
|
|
||||||
void replaceInSet(std::set<T> & set, const T & from, const T & to)
|
|
||||||
{
|
|
||||||
auto i = set.find(from);
|
|
||||||
if (i == set.end()) return;
|
|
||||||
set.erase(i);
|
|
||||||
set.insert(to);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/* Convert the exit status of a child as returned by wait() into an
|
/* Convert the exit status of a child as returned by wait() into an
|
||||||
error string. */
|
error string. */
|
||||||
string statusToString(int status);
|
string statusToString(int status);
|
||||||
|
|
Loading…
Reference in a new issue