8165698: Convert LogTagSet related internal tests to GTest

Reviewed-by: rehn, rprotacio
This commit is contained in:
Marcus Larsson 2016-09-08 15:24:52 +02:00
parent e3155ad3c3
commit c48b110f17
5 changed files with 115 additions and 79 deletions

View File

@ -50,13 +50,6 @@
#define assert_char_not_in(c, s) \
assert(strchr(s, c) == NULL, "Expected '%s' to *not* contain character '%c'", s, c)
void Test_log_tag_combinations_limit() {
assert(LogTagLevelExpression::MaxCombinations > LogTagSet::ntagsets(),
"Combination limit (" SIZE_FORMAT ") not sufficient "
"for configuring all available tag sets (" SIZE_FORMAT ")",
LogTagLevelExpression::MaxCombinations, LogTagSet::ntagsets());
}
// Read a complete line from fp and return it as a resource allocated string.
// Returns NULL on EOF.
static char* read_line(FILE* fp) {
@ -627,51 +620,6 @@ void Test_log_big() {
fclose(fp);
}
void Test_logtagset_duplicates() {
for (LogTagSet* ts = LogTagSet::first(); ts != NULL; ts = ts->next()) {
char ts_name[512];
ts->label(ts_name, sizeof(ts_name), ",");
// verify that NO_TAG is never followed by a real tag
for (size_t i = 0; i < LogTag::MaxTags; i++) {
if (ts->tag(i) == LogTag::__NO_TAG) {
for (i++; i < LogTag::MaxTags; i++) {
assert(ts->tag(i) == LogTag::__NO_TAG,
"NO_TAG was followed by a real tag (%s) in tagset %s",
LogTag::name(ts->tag(i)), ts_name);
}
}
}
// verify that there are no duplicate tagsets (same tags in different order)
for (LogTagSet* other = ts->next(); other != NULL; other = other->next()) {
if (ts->ntags() != other->ntags()) {
continue;
}
bool equal = true;
for (size_t i = 0; i < ts->ntags(); i++) {
LogTagType tag = ts->tag(i);
if (!other->contains(tag)) {
equal = false;
break;
}
}
// Since tagsets are implemented using template arguments, using both of
// the (logically equivalent) tagsets (t1, t2) and (t2, t1) somewhere will
// instantiate two different LogTagSetMappings. This causes multiple
// tagset instances to be created for the same logical set. We want to
// avoid this to save time, memory and prevent any confusion around it.
if (equal) {
char other_name[512];
other->label(other_name, sizeof(other_name), ",");
assert(false, "duplicate LogTagSets found: '%s' vs '%s' "
"(tags must always be specified in the same order for each tagset)",
ts_name, other_name);
}
}
}
}
#define Test_logtarget_string_literal "First line"
@ -953,28 +901,4 @@ void Test_invalid_log_file() {
remove(target_name);
}
// Ensure -Xlog:help and LogConfiguration::describe contain tagset descriptions
void Test_logtagset_descriptions() {
for (LogTagSetDescription* d = tagset_descriptions; d->tagset != NULL; d++) {
char expected[1024];
d->tagset->label(expected, sizeof(expected), "+");
jio_snprintf(expected + strlen(expected),
sizeof(expected) - strlen(expected),
": %s", d->descr);
ResourceMark rm;
stringStream ss;
LogConfiguration::describe(&ss);
assert(strstr(ss.as_string(), expected) != NULL,
"missing log tag set descriptions in LogConfiguration::describe");
TestLogFile file("log_tagset_descriptions");
FILE* fp = fopen(file.name(), "w+");
assert(fp != NULL, "File open error");
LogConfiguration::print_command_line_help(fp);
fclose(fp);
assert(number_of_lines_with_substring_in_file(file.name(), expected) > 0,
"missing log tag set descriptions in -Xlog:help output");
}
}
#endif // PRODUCT

View File

@ -59,7 +59,6 @@ void InternalVMTests::run() {
run_unit_test(TestOldSize_test);
run_unit_test(TestBitMap_test);
run_unit_test(ObjectMonitor_test);
run_unit_test(Test_log_tag_combinations_limit);
run_unit_test(Test_logtarget);
run_unit_test(Test_logstream);
run_unit_test(Test_loghandle);
@ -68,8 +67,6 @@ void InternalVMTests::run() {
run_unit_test(Test_logconfiguration_subscribe);
run_unit_test(Test_log_prefix);
run_unit_test(Test_log_big);
run_unit_test(Test_logtagset_duplicates);
run_unit_test(Test_logtagset_descriptions);
run_unit_test(Test_log_file_startup_rotation);
run_unit_test(Test_log_file_startup_truncation);
run_unit_test(Test_invalid_log_file);

View File

@ -28,6 +28,12 @@
#include "unittest.hpp"
#include "utilities/globalDefinitions.hpp"
TEST(LogTagLevelExpression, combination_limit) {
size_t max_combinations = LogTagLevelExpression::MaxCombinations;
EXPECT_GT(max_combinations, LogTagSet::ntagsets())
<< "Combination limit not sufficient for configuring all available tag sets";
}
TEST(LogTagLevelExpression, parse) {
char buf[256];
const char* invalid_substr[] = {

View File

@ -128,3 +128,46 @@ TEST(LogTagSet, label) {
ASSERT_NE(-1, ts2.label(buf, sizeof(buf)));
EXPECT_STREQ("logging", buf);
}
TEST(LogTagSet, duplicates) {
for (LogTagSet* ts = LogTagSet::first(); ts != NULL; ts = ts->next()) {
char ts_name[512];
ts->label(ts_name, sizeof(ts_name), ",");
// verify that NO_TAG is never followed by a real tag
for (size_t i = 0; i < LogTag::MaxTags; i++) {
if (ts->tag(i) == LogTag::__NO_TAG) {
for (i++; i < LogTag::MaxTags; i++) {
EXPECT_EQ(LogTag::__NO_TAG, ts->tag(i))
<< "NO_TAG was followed by a real tag (" << LogTag::name(ts->tag(i)) << ") in tagset " << ts_name;
}
}
}
// verify that there are no duplicate tagsets (same tags in different order)
for (LogTagSet* other = ts->next(); other != NULL; other = other->next()) {
if (ts->ntags() != other->ntags()) {
continue;
}
bool equal = true;
for (size_t i = 0; i < ts->ntags(); i++) {
LogTagType tag = ts->tag(i);
if (!other->contains(tag)) {
equal = false;
break;
}
}
// Since tagsets are implemented using template arguments, using both of
// the (logically equivalent) tagsets (t1, t2) and (t2, t1) somewhere will
// instantiate two different LogTagSetMappings. This causes multiple
// tagset instances to be created for the same logical set. We want to
// avoid this to save time, memory and prevent any confusion around it.
if (equal) {
char other_name[512];
other->label(other_name, sizeof(other_name), ",");
FAIL() << "duplicate LogTagSets found: '" << ts_name << "' vs '" << other_name << "' "
<< "(tags must always be specified in the same order for each tagset)";
}
}
}
}

View File

@ -0,0 +1,66 @@
/*
* Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* ac_heapanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*
*/
#include "precompiled.hpp"
#include "logTestUtils.inline.hpp"
#include "logging/logConfiguration.hpp"
#include "logging/logTagSet.hpp"
#include "logging/logTagSetDescriptions.hpp"
#include "memory/resourceArea.hpp"
#include "unittest.hpp"
#include "utilities/ostream.hpp"
TEST(LogTagSetDescriptions, describe) {
for (LogTagSetDescription* d = tagset_descriptions; d->tagset != NULL; d++) {
char expected[1 * K];
d->tagset->label(expected, sizeof(expected), "+");
jio_snprintf(expected + strlen(expected),
sizeof(expected) - strlen(expected),
": %s", d->descr);
ResourceMark rm;
stringStream stream;
LogConfiguration::describe(&stream);
EXPECT_PRED2(string_contains_substring, stream.as_string(), expected)
<< "missing log tag set descriptions in LogConfiguration::describe";
}
}
TEST(LogTagSetDescriptions, command_line_help) {
const char* filename = "logtagset_descriptions";
FILE* fp = fopen(filename, "w+");
ASSERT_NE((void*)NULL, fp);
LogConfiguration::print_command_line_help(fp);
fclose(fp);
for (LogTagSetDescription* d = tagset_descriptions; d->tagset != NULL; d++) {
char expected[1 * K];
d->tagset->label(expected, sizeof(expected), "+");
jio_snprintf(expected + strlen(expected),
sizeof(expected) - strlen(expected),
": %s", d->descr);
EXPECT_TRUE(file_contains_substring(filename, expected)) << "missing log tag set descriptions in -Xlog:help output";
}
delete_file(filename);
}