libvirt/tests/utiltest.c
Michal Privoznik d07ce21610 tests: Always put a '\n' after each debug print
There is an inconsistency with VIR_TEST_DEBUG() calls. One half
(roughly) of calls does have the newline character the other one
doesn't. Well, it doesn't have it because it assumed blindly that
new line will be printed, which is not the case.

Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
Reviewed-by: Ján Tomko <jtomko@redhat.com>
2019-08-27 15:49:48 +02:00

285 lines
8.2 KiB
C

#include <config.h>
#include <unistd.h>
#include "internal.h"
#include "viralloc.h"
#include "testutils.h"
#include "virutil.h"
static const char* diskNames[] = {
"sda", "sdb", "sdc", "sdd", "sde", "sdf", "sdg", "sdh", "sdi", "sdj", "sdk", "sdl", "sdm", "sdn", "sdo", "sdp", "sdq", "sdr", "sds", "sdt", "sdu", "sdv", "sdw", "sdx", "sdy", "sdz",
"sdaa", "sdab", "sdac", "sdad", "sdae", "sdaf", "sdag", "sdah", "sdai", "sdaj", "sdak", "sdal", "sdam", "sdan", "sdao", "sdap", "sdaq", "sdar", "sdas", "sdat", "sdau", "sdav", "sdaw", "sdax", "sday", "sdaz",
"sdba", "sdbb", "sdbc", "sdbd", "sdbe", "sdbf", "sdbg", "sdbh", "sdbi", "sdbj", "sdbk", "sdbl", "sdbm", "sdbn", "sdbo", "sdbp", "sdbq", "sdbr", "sdbs", "sdbt", "sdbu", "sdbv", "sdbw", "sdbx", "sdby", "sdbz",
"sdca", "sdcb", "sdcc", "sdcd", "sdce", "sdcf", "sdcg", "sdch", "sdci", "sdcj", "sdck", "sdcl", "sdcm", "sdcn", "sdco", "sdcp", "sdcq", "sdcr", "sdcs", "sdct", "sdcu", "sdcv", "sdcw", "sdcx", "sdcy", "sdcz",
"sdda", "sddb", "sddc", "sddd", "sdde", "sddf", "sddg", "sddh", "sddi", "sddj", "sddk", "sddl", "sddm", "sddn", "sddo", "sddp", "sddq", "sddr", "sdds", "sddt", "sddu", "sddv", "sddw", "sddx", "sddy", "sddz",
"sdea", "sdeb", "sdec", "sded", "sdee", "sdef", "sdeg", "sdeh", "sdei", "sdej", "sdek", "sdel", "sdem", "sden", "sdeo", "sdep", "sdeq", "sder", "sdes", "sdet", "sdeu", "sdev", "sdew", "sdex", "sdey", "sdez",
"sdfa", "sdfb", "sdfc", "sdfd", "sdfe", "sdff", "sdfg", "sdfh", "sdfi", "sdfj", "sdfk", "sdfl", "sdfm", "sdfn", "sdfo", "sdfp", "sdfq", "sdfr", "sdfs", "sdft", "sdfu", "sdfv", "sdfw", "sdfx", "sdfy", "sdfz",
"sdga", "sdgb", "sdgc", "sdgd", "sdge", "sdgf", "sdgg", "sdgh", "sdgi", "sdgj", "sdgk", "sdgl", "sdgm", "sdgn", "sdgo", "sdgp", "sdgq", "sdgr", "sdgs", "sdgt", "sdgu", "sdgv", "sdgw", "sdgx", "sdgy", "sdgz",
"sdha", "sdhb", "sdhc", "sdhd", "sdhe", "sdhf", "sdhg", "sdhh", "sdhi", "sdhj", "sdhk", "sdhl", "sdhm", "sdhn", "sdho", "sdhp", "sdhq", "sdhr", "sdhs", "sdht", "sdhu", "sdhv", "sdhw", "sdhx", "sdhy", "sdhz",
"sdia", "sdib", "sdic", "sdid", "sdie", "sdif", "sdig", "sdih", "sdii", "sdij", "sdik", "sdil", "sdim", "sdin", "sdio", "sdip", "sdiq", "sdir", "sdis", "sdit", "sdiu", "sdiv", "sdiw", "sdix", "sdiy", "sdiz"
};
struct testDiskName
{
const char *name;
int idx;
int partition;
};
static struct testDiskName diskNamesPart[] = {
{"sda0", 0, 0},
{"sdb10", 1, 10},
{"sdc2147483647", 2, 2147483647},
};
static const char* diskNamesInvalid[] = {
"sda00", "sda01", "sdb-1",
"vd2"
};
static int
testIndexToDiskName(const void *data ATTRIBUTE_UNUSED)
{
size_t i;
char *diskName = NULL;
for (i = 0; i < ARRAY_CARDINALITY(diskNames); ++i) {
VIR_FREE(diskName);
diskName = virIndexToDiskName(i, "sd");
if (STRNEQ(diskNames[i], diskName)) {
virTestDifference(stderr, diskNames[i], diskName);
VIR_FREE(diskName);
return -1;
}
}
VIR_FREE(diskName);
return 0;
}
static int
testDiskNameToIndex(const void *data ATTRIBUTE_UNUSED)
{
size_t i;
int idx;
char *diskName = NULL;
for (i = 0; i < 100000; ++i) {
VIR_FREE(diskName);
diskName = virIndexToDiskName(i, "sd");
idx = virDiskNameToIndex(diskName);
if (idx < 0 || idx != i) {
VIR_TEST_DEBUG("\nExpect [%zu]", i);
VIR_TEST_DEBUG("Actual [%d]", idx);
VIR_FREE(diskName);
return -1;
}
}
VIR_FREE(diskName);
return 0;
}
static int
testDiskNameParse(const void *data ATTRIBUTE_UNUSED)
{
size_t i;
int idx;
int partition;
struct testDiskName *disk = NULL;
for (i = 0; i < ARRAY_CARDINALITY(diskNamesPart); ++i) {
disk = &diskNamesPart[i];
if (virDiskNameParse(disk->name, &idx, &partition))
return -1;
if (disk->idx != idx) {
VIR_TEST_DEBUG("\nExpect [%d]", disk->idx);
VIR_TEST_DEBUG("Actual [%d]", idx);
return -1;
}
if (disk->partition != partition) {
VIR_TEST_DEBUG("\nExpect [%d]", disk->partition);
VIR_TEST_DEBUG("Actual [%d]", partition);
return -1;
}
}
for (i = 0; i < ARRAY_CARDINALITY(diskNamesInvalid); ++i) {
if (!virDiskNameParse(diskNamesInvalid[i], &idx, &partition)) {
VIR_TEST_DEBUG("Should Fail [%s]", diskNamesInvalid[i]);
return -1;
}
}
return 0;
}
struct testVersionString
{
const char *string;
bool allowMissing;
int result;
unsigned long version;
};
static struct testVersionString versions[] = {
{ "2.6.38-8-generic", false, 0, 1000000 * 2 + 1000 * 6 + 38 },
{ "3.0-1-virtual", true, 0, 1000000 * 3 + 1000 * 0 + 0 },
{ "5", true, 0, 1000000 * 5 + 1000 * 0 + 0 },
{ "4.1.0", false, 0, 1000000 * 4 + 1000 * 1 + 0 },
{ "12.345.678", false, 0, 1000000 * 12 + 1000 * 345 + 678 },
{ "1.234.5678", false, -1, 0 },
{ "1.2345.678", false, -1, 0 },
{ "12345.6.78", false, -1, 0 },
{ "123456789", true, -1, 0 },
{ "3.0-2-virtual", false, -1, 0 },
{ "no-number-here", false, -1, 0 },
};
static int
testParseVersionString(const void *data ATTRIBUTE_UNUSED)
{
int result;
size_t i;
unsigned long version;
for (i = 0; i < ARRAY_CARDINALITY(versions); ++i) {
result = virParseVersionString(versions[i].string, &version,
versions[i].allowMissing);
if (result != versions[i].result) {
VIR_TEST_DEBUG("\nVersion string [%s]", versions[i].string);
VIR_TEST_DEBUG("Expect result [%d]", versions[i].result);
VIR_TEST_DEBUG("Actual result [%d]", result);
return -1;
}
if (result < 0)
continue;
if (version != versions[i].version) {
VIR_TEST_DEBUG("\nVersion string [%s]", versions[i].string);
VIR_TEST_DEBUG("Expect version [%lu]", versions[i].version);
VIR_TEST_DEBUG("Actual version [%lu]", version);
return -1;
}
}
return 0;
}
struct testRoundData {
unsigned int input;
unsigned int output;
};
static struct testRoundData roundData[] = {
{ 0, 0 },
{ 1, 1 },
{ 1000, 1024 },
{ 1024, 1024 },
{ 1025, 2048 },
{ UINT_MAX, 0 },
};
static int
testRoundValueToPowerOfTwo(const void *data ATTRIBUTE_UNUSED)
{
unsigned int result;
size_t i;
for (i = 0; i < ARRAY_CARDINALITY(roundData); i++) {
result = VIR_ROUND_UP_POWER_OF_TWO(roundData[i].input);
if (roundData[i].output != result) {
VIR_TEST_DEBUG("\nInput number [%u]", roundData[i].input);
VIR_TEST_DEBUG("Expected number [%u]", roundData[i].output);
VIR_TEST_DEBUG("Actual number [%u]", result);
return -1;
}
}
return 0;
}
#define TEST_OVERFLOW(var, val, expect) \
tmp = val; \
if (VIR_ASSIGN_IS_OVERFLOW(var, tmp) != expect) { \
fprintf(stderr, "\noverflow check failed: " \
"var: " #var " val: " #val "\n"); \
return -1; \
}
static int
testOverflowCheckMacro(const void *data ATTRIBUTE_UNUSED)
{
long long tmp;
uint8_t luchar;
int8_t lchar;
TEST_OVERFLOW(luchar, 254, false);
TEST_OVERFLOW(luchar, 255, false);
TEST_OVERFLOW(luchar, 256, true);
TEST_OVERFLOW(luchar, 767, true);
TEST_OVERFLOW(lchar, 127, false);
TEST_OVERFLOW(lchar, -128, false);
TEST_OVERFLOW(lchar, -129, true);
TEST_OVERFLOW(lchar, 128, true);
return 0;
}
static int
mymain(void)
{
int result = 0;
virTestQuiesceLibvirtErrors(true);
#define DO_TEST(_name) \
do { \
if (virTestRun("Util "#_name, test##_name, \
NULL) < 0) { \
result = -1; \
} \
} while (0)
DO_TEST(IndexToDiskName);
DO_TEST(DiskNameToIndex);
DO_TEST(DiskNameParse);
DO_TEST(ParseVersionString);
DO_TEST(RoundValueToPowerOfTwo);
DO_TEST(OverflowCheckMacro);
return result == 0 ? EXIT_SUCCESS : EXIT_FAILURE;
}
VIR_TEST_MAIN(mymain)