Skip to content

Commit

Permalink
gtest: list handling of the config parser
Browse files Browse the repository at this point in the history
Tests if the varios types of config directives
correctly read multiple values.

Also document the limitations of the CFG_TYPE_STR type:
When a CFG_TYPE_STR config directive is used,
only the first entry from the last directive is used.
All other entry are silently ignored.
  • Loading branch information
joergsteffens committed Oct 15, 2020
1 parent 69eb8f0 commit fba1195
Show file tree
Hide file tree
Showing 9 changed files with 320 additions and 0 deletions.
@@ -0,0 +1,46 @@
Director {
Name = "bareos-dir"
Password = "secret"
}

Job {
Name = "job01"
}

Job {
Name = "job02"
}

Job {
Name = "job11"
}

Job {
Name = "job12"
}

Job {
Name = "job21"
}

Job {
Name = "job22"
}

Job {
Name = "job31"
}

Job {
Name = "job32"
}


Job {
Name = "resultjob"

Base = job01,job02 # 2 entries
Base = job11, job12 # 2 entries
Base = job21, "job22" # 2 entries
Base = "job31", "job32" # 2 entries
}
@@ -0,0 +1,32 @@
Director {
Name = "bareos-dir"
Password = "secret"
}

Job {
Name = "job1"

Run = item01,item02 # 2 entries
Run = item11, item12 # 2 entries
Run = item21, "item22" # 2 entries
Run = "item31", "item32" # 2 entries
}

JobDefs {
Name = "jobdefs2"

Run = jobdef01,jobdef02 # 2 entries
Run = jobdef11, jobdef12 # 2 entries
Run = jobdef21, "jobdef22" # 2 entries
Run = "jobdef31", "jobdef32" # 2 entries
}

Job {
Name = "job2"
JobDefs = "jobdefs2"

Run = item01,item02 # 2 entries
Run = item11, item12 # 2 entries
Run = item21, "item22" # 2 entries
Run = "item31", "item32" # 2 entries
}
@@ -0,0 +1,9 @@
Director {
Name = "bareos-dir"
Password = "secret"

AuditEvents = item01,item02 # 2 entries
AuditEvents = item11, item12 # 2 entries
AuditEvents = item21, "item22" # 2 entries
AuditEvents = "item31", "item32" # 2 entries
}
@@ -0,0 +1,37 @@
Director {
Name = "bareos-dir"
Password = "secret"
}

FileSet {
Name = "fileset1"
Description = "test fileset"
Include {
Options {
Signature = "MD5"
}
File = /tmp/dir1
File = "/tmp/dir2"

File = <includefile-server1
File = "<includefile-server2"

File = |command-server1
File = "|command-server2"

# File = \<includefile-client1 # parse error
# File = \\<includefile-client2 # parse error
# File = "\<includefile-client3" # backslash will be removed
File = "\\<includefile-client4"

# File = \|command-client1 # parse error
# File = \\|command-client2 # parse error
# File = "\|command-client3" # backslash will be removed
File = "\\|command-client4"

File = "\<includefile-server1"
File = "\<includefile-server2"
File = "\\\<includefile-client4"
File = "\\|command-client4"
}
}
@@ -0,0 +1,11 @@
Director {
Name = "bareos-dir"
Password = "secret"

PluginNames = plugin11, plugin12 # 2 entries
PluginNames = "plugin21", "plugin22" # 2 entries
PluginNames = "plugin31:plugin32" # 2 entries
PluginNames = plugin41:plugin42, plugin43, plugin44 # 4 entries
PluginNames = plugin51:plugin52, "plugin53:plugin54", plugin55, plugin56 # 6 entries

}
@@ -0,0 +1,9 @@
Director {
Name = "bareos-dir"
Password = "secret"

Description = item01,item02 # 2 entries
Description = item11, item12 # 2 entries
Description = item21, "item22" # 2 entries
Description = "item31", "item32" # 2 entries
}
@@ -0,0 +1,9 @@
Director {
Name = "bareos-dir"
Password = "secret"

TlsAllowedCn = cn01,cn02 # 2 entries
TlsAllowedCn = cn11, cn12 # 2 entries
TlsAllowedCn = cn21, "cn22" # 2 entries
TlsAllowedCn = "cn31", "cn32" # 2 entries
}
@@ -0,0 +1,10 @@
Director {
Name = "bareos-dir"
Password = "secret"

BackendDirectory = @PATH_BAREOS_BACKENDDIR@ # default value, 1 entry
BackendDirectory = item01,item02 # 2 entries
BackendDirectory = item11, item12 # 2 entries
BackendDirectory = item21, "item22" # 2 entries
BackendDirectory = "item31", "item32" # 2 entries
}
157 changes: 157 additions & 0 deletions core/src/tests/test_config_parser_dir.cc
Expand Up @@ -68,4 +68,161 @@ TEST(ConfigParser_Dir, runscript_test)
CloseMemoryPool(); /* release free memory in pool */
}

void test_config_directive_type(
std::function<void(DirectorResource*)> test_func)
{
std::string test_name = std::string(
::testing::UnitTest::GetInstance()->current_test_info()->name());

OSDependentInit();
InitMsg(NULL, NULL); /* initialize message handler */

std::string path_to_config_file =
std::string(RELATIVE_PROJECT_SOURCE_DIR
"/configs/bareos-configparser-tests/bareos-dir-") +
test_name + std::string(".conf");
my_config = InitDirConfig(path_to_config_file.c_str(), M_ERROR_TERM);
my_config->ParseConfig();

my_config->DumpResources(PrintMessage, NULL);

const char* dir_resource_name = "bareos-dir";

DirectorResource* me =
(DirectorResource*)my_config->GetNextRes(R_DIRECTOR, NULL);
EXPECT_STREQ(dir_resource_name, me->resource_name_);

test_func(me);

delete my_config;

TermMsg(); /* Terminate message handler */
CloseMemoryPool(); /* release free memory in pool */
}


void test_CFG_TYPE_AUDIT(DirectorResource* me)
{
char* val = nullptr;
foreach_alist (val, me->audit_events) {
printf("AuditEvents = %s\n", val);
}
EXPECT_EQ(me->audit_events->size(), 8);
}

TEST(ConfigParser_Dir, CFG_TYPE_AUDIT)
{
test_config_directive_type(test_CFG_TYPE_AUDIT);
}


void test_CFG_TYPE_PLUGIN_NAMES(DirectorResource* me)
{
char* val = nullptr;
foreach_alist (val, me->plugin_names) {
printf("PluginNames = %s\n", val);
}
EXPECT_EQ(me->plugin_names->size(), 16);
}

TEST(ConfigParser_Dir, CFG_TYPE_PLUGIN_NAMES)
{
test_config_directive_type(test_CFG_TYPE_PLUGIN_NAMES);
}


void test_CFG_TYPE_STR_VECTOR(DirectorResource* me)
{
EXPECT_EQ(me->tls_cert_.allowed_certificate_common_names_.size(), 8);
}

TEST(ConfigParser_Dir, CFG_TYPE_STR_VECTOR)
{
test_config_directive_type(test_CFG_TYPE_STR_VECTOR);
}

void test_CFG_TYPE_STR_VECTOR_OF_DIRS(DirectorResource* me)
{
EXPECT_EQ(me->backend_directories.size(), 9);
EXPECT_EQ(me->backend_directories.at(0), PATH_BAREOS_BACKENDDIR);
}

TEST(ConfigParser_Dir, CFG_TYPE_STR_VECTOR_OF_DIRS)
{
test_config_directive_type(test_CFG_TYPE_STR_VECTOR_OF_DIRS);
}


void test_CFG_TYPE_ALIST_STR(DirectorResource* me)
{
JobResource* job1 = (JobResource*)my_config->GetResWithName(R_JOB, "job1");
EXPECT_STREQ("job1", job1->resource_name_);
EXPECT_EQ(job1->run_cmds->size(), 8);

JobResource* jobdefs2 =
(JobResource*)my_config->GetResWithName(R_JOBDEFS, "jobdefs2");
EXPECT_STREQ("jobdefs2", jobdefs2->resource_name_);
EXPECT_EQ(jobdefs2->run_cmds->size(), 8);

JobResource* job2 = (JobResource*)my_config->GetResWithName(R_JOB, "job2");
EXPECT_STREQ("job2", job2->resource_name_);
EXPECT_EQ(job2->run_cmds->size(), 8);
}

TEST(ConfigParser_Dir, CFG_TYPE_ALIST_STR)
{
test_config_directive_type(test_CFG_TYPE_ALIST_STR);
}


void test_CFG_TYPE_ALIST_RES(DirectorResource* me)
{
JobResource* job1 =
(JobResource*)my_config->GetResWithName(R_JOB, "resultjob");
EXPECT_STREQ("resultjob", job1->resource_name_);
EXPECT_EQ(job1->base->size(), 8);
}

TEST(ConfigParser_Dir, CFG_TYPE_ALIST_RES)
{
test_config_directive_type(test_CFG_TYPE_ALIST_RES);
}


void test_CFG_TYPE_STR(DirectorResource* me)
{
/*
* Only the first entry from the last "Description" config directive is taken.
* This can be considered as a bug.
*/
EXPECT_STREQ(me->description_, "item31");
}

TEST(ConfigParser_Dir, CFG_TYPE_STR)
{
test_config_directive_type(test_CFG_TYPE_STR);
}


void test_CFG_TYPE_FNAME(DirectorResource* me)
{
FilesetResource* fileset1 =
(FilesetResource*)my_config->GetResWithName(R_FILESET, "fileset1");
EXPECT_STREQ("fileset1", fileset1->resource_name_);
EXPECT_EQ(fileset1->exclude_items.size(), 0);
EXPECT_EQ(fileset1->include_items.size(), 1);

alist* files = std::addressof(fileset1->include_items.at(0)->name_list);
char* val = nullptr;
foreach_alist (val, files) {
printf("Files = %s\n", val);
}
}

TEST(ConfigParser_Dir, CFG_TYPE_FNAME)
{
test_config_directive_type(test_CFG_TYPE_FNAME);
}


} // namespace directordaemon

0 comments on commit fba1195

Please sign in to comment.