mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2024-09-09 01:04:59 +00:00
The source code base needs to be adapted as well. Some files include virutil.h just for the string related functions (here, the include is substituted to match the new file), some include virutil.h without any need (here, the include is removed), and some require both.
289 lines
7.5 KiB
C
289 lines
7.5 KiB
C
#include <config.h>
|
|
|
|
#include "testutils.h"
|
|
|
|
#ifdef WITH_ESX
|
|
|
|
# include <stdio.h>
|
|
# include <string.h>
|
|
# include <unistd.h>
|
|
|
|
# include "internal.h"
|
|
# include "viralloc.h"
|
|
# include "vmx/vmx.h"
|
|
# include "esx/esx_util.h"
|
|
# include "esx/esx_vi_types.h"
|
|
|
|
|
|
static void
|
|
testQuietError(void *userData ATTRIBUTE_UNUSED,
|
|
virErrorPtr error ATTRIBUTE_UNUSED)
|
|
{
|
|
/* nothing */
|
|
}
|
|
|
|
|
|
|
|
struct testPath {
|
|
const char *datastorePath;
|
|
int result;
|
|
const char *datastoreName;
|
|
const char *directoryName;
|
|
const char *directoryAndFileName;
|
|
};
|
|
|
|
static struct testPath paths[] = {
|
|
{ "[datastore] directory/file", 0, "datastore", "directory",
|
|
"directory/file" },
|
|
{ "[datastore] directory1/directory2/file", 0, "datastore",
|
|
"directory1/directory2", "directory1/directory2/file" },
|
|
{ "[datastore] file", 0, "datastore", "file", "file" },
|
|
{ "[datastore] directory/", 0, "datastore", "directory", "directory/" },
|
|
{ "[datastore]", 0, "datastore", "", "" },
|
|
{ "[] directory/file", -1, NULL, NULL, NULL },
|
|
{ "directory/file", -1, NULL, NULL, NULL },
|
|
};
|
|
|
|
static int
|
|
testParseDatastorePath(const void *data ATTRIBUTE_UNUSED)
|
|
{
|
|
int i, result = 0;
|
|
char *datastoreName = NULL;
|
|
char *directoryName = NULL;
|
|
char *directoryAndFileName = NULL;
|
|
|
|
for (i = 0; i < ARRAY_CARDINALITY(paths); ++i) {
|
|
VIR_FREE(datastoreName);
|
|
VIR_FREE(directoryName);
|
|
VIR_FREE(directoryAndFileName);
|
|
|
|
if (esxUtil_ParseDatastorePath
|
|
(paths[i].datastorePath, &datastoreName, &directoryName,
|
|
&directoryAndFileName) != paths[i].result) {
|
|
goto failure;
|
|
}
|
|
|
|
if (paths[i].result < 0) {
|
|
continue;
|
|
}
|
|
|
|
if (STRNEQ(paths[i].datastoreName, datastoreName)) {
|
|
virtTestDifference(stderr, paths[i].datastoreName, datastoreName);
|
|
goto failure;
|
|
}
|
|
|
|
if (STRNEQ(paths[i].directoryName, directoryName)) {
|
|
virtTestDifference(stderr, paths[i].directoryName, directoryName);
|
|
goto failure;
|
|
}
|
|
|
|
if (STRNEQ(paths[i].directoryAndFileName, directoryAndFileName)) {
|
|
virtTestDifference(stderr, paths[i].directoryAndFileName,
|
|
directoryAndFileName);
|
|
goto failure;
|
|
}
|
|
}
|
|
|
|
cleanup:
|
|
VIR_FREE(datastoreName);
|
|
VIR_FREE(directoryName);
|
|
VIR_FREE(directoryAndFileName);
|
|
|
|
return result;
|
|
|
|
failure:
|
|
result = -1;
|
|
|
|
goto cleanup;
|
|
}
|
|
|
|
|
|
|
|
struct testDateTime {
|
|
const char *dateTime;
|
|
long long calendarTime;
|
|
};
|
|
|
|
static struct testDateTime times[] = {
|
|
/* different timezones */
|
|
{ "2010-04-08T05:45:11-07:00", 1270730711 },
|
|
{ "2010-04-08T07:45:11-05:00", 1270730711 },
|
|
{ "2010-04-08T12:45:11+00:00", 1270730711 },
|
|
{ "2010-04-08T14:45:11+02:00", 1270730711 },
|
|
{ "2010-04-08T22:15:11+09:30", 1270730711 },
|
|
{ "2010-04-09T01:30:11+12:45", 1270730711 },
|
|
|
|
/* optional parts */
|
|
{ "2010-04-08T12:45:11Z", 1270730711 },
|
|
{ "2010-04-08T12:45:11", 1270730711 },
|
|
{ "-2010-04-08T14:45:11+02:00", 0 },
|
|
{ "2010-04-08T14:45:11.529576+02:00", 1270730711 },
|
|
|
|
/* borders */
|
|
{ "1970-01-01T00:00:00+00:00", 0 },
|
|
{ "2038-01-19T03:14:07+00:00", 2147483647 },
|
|
|
|
/* random */
|
|
{ "1999-08-02T01:19:55+02:00", 933549595 },
|
|
{ "2004-03-07T23:23:55+02:00", 1078694635 },
|
|
{ "1984-10-27T14:33:45+02:00", 467728425 },
|
|
{ "1970-01-12T16:11:04+02:00", 1001464 },
|
|
{ "2014-07-20T13:35:38+02:00", 1405856138 },
|
|
{ "2032-06-24T17:04:49+02:00", 1971702289 },
|
|
};
|
|
|
|
static int
|
|
testConvertDateTimeToCalendarTime(const void *data ATTRIBUTE_UNUSED)
|
|
{
|
|
int i;
|
|
esxVI_DateTime dateTime;
|
|
long long calendarTime;
|
|
|
|
for (i = 0; i < ARRAY_CARDINALITY(times); ++i) {
|
|
dateTime.value = (char *)times[i].dateTime;
|
|
|
|
if (esxVI_DateTime_ConvertToCalendarTime(&dateTime,
|
|
&calendarTime) < 0) {
|
|
return -1;
|
|
}
|
|
|
|
if (times[i].calendarTime != calendarTime) {
|
|
return -1;
|
|
}
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
|
|
|
|
struct testDatastoreItem {
|
|
const char *string;
|
|
const char *escaped;
|
|
};
|
|
|
|
static struct testDatastoreItem datastoreItems[] = {
|
|
{ "normal", "normal" },
|
|
{ /* "Aä1ö2ü3ß4#5~6!7§8/9%Z" */
|
|
"A\303\2441\303\2662\303\2743\303\2374#5~6!7\302\2478/9%Z",
|
|
"A+w6Q-1+w7Y-2+w7w-3+w58-4+Iw-5+fg-6+IQ-7+wqc-8+JQ-2f9+JQ-25Z" },
|
|
{ /* "Z~6!7§8/9%0#1\"2'3`4&A" */ "Z~6!7\302\2478/9%0#1\"2'3`4&A",
|
|
"Z+fg-6+IQ-7+wqc-8+JQ-2f9+JQ-250+Iw-1_2'3+YA-4+Jg-A" },
|
|
{ /* "標準語" */ "\346\250\231\346\272\226\350\252\236", "+5qiZ5rqW6Kqe" },
|
|
{ "!\"#$%&'()*+,-./0123456789:;<=>?",
|
|
"+IQ-_+IyQl-25+Jg-'()_+Kw-,-.+JQ-2f0123456789_+Ow-_+PQ-__" },
|
|
{ "A Z[\\]^_B", "A Z+WyU-5c+XV4-_B" },
|
|
{ "A`B@{|}~DEL", "A+YA-B+QHs-_+fX4-DEL" },
|
|
{ /* "hÀÁÂÃÄÅH" */ "h\303\200\303\201\303\202\303\203\303\204\303\205H",
|
|
"h+w4DDgcOCw4PDhMOF-H" },
|
|
{ /* "A쿀Z" */ "A\354\277\200Z", "A+7L+A-Z" },
|
|
{ /* "!쿀A" */ "!\354\277\200A", "+Iey,gA-A" },
|
|
{ "~~~", "+fn5+" },
|
|
{ "~~~A", "+fn5+-A" },
|
|
{ "K%U/H\\Z", "K+JQ-25U+JQ-2fH+JQ-5cZ" },
|
|
{ "vvv<A\"B\"C>zzz", "vvv_A_B_C_zzz" },
|
|
};
|
|
|
|
static int
|
|
testEscapeDatastoreItem(const void *data ATTRIBUTE_UNUSED)
|
|
{
|
|
int i;
|
|
char *escaped = NULL;
|
|
|
|
for (i = 0; i < ARRAY_CARDINALITY(datastoreItems); ++i) {
|
|
VIR_FREE(escaped);
|
|
|
|
escaped = esxUtil_EscapeDatastoreItem(datastoreItems[i].string);
|
|
|
|
if (escaped == NULL) {
|
|
return -1;
|
|
}
|
|
|
|
if (STRNEQ(datastoreItems[i].escaped, escaped)) {
|
|
VIR_FREE(escaped);
|
|
return -1;
|
|
}
|
|
}
|
|
|
|
VIR_FREE(escaped);
|
|
return 0;
|
|
}
|
|
|
|
|
|
|
|
struct testWindows1252ToUTF8 {
|
|
const char *windows1252;
|
|
const char *utf8;
|
|
};
|
|
|
|
static struct testWindows1252ToUTF8 windows1252ToUTF8[] = {
|
|
{ "normal", "normal" },
|
|
{ /* "A€Z" */ "A\200Z", "A\342\202\254Z" },
|
|
{ /* "Aä1ö2ü3ß4#5~6!7§8/9%Z" */ "A\3441\3662\3743\3374#5~6!7\2478/9%Z",
|
|
"A\303\2441\303\2662\303\2743\303\2374#5~6!7\302\2478/9%Z" },
|
|
{ /* "hÀÁÂÃÄÅH" */ "h\300\301\302\303\304\305H",
|
|
"h\303\200\303\201\303\202\303\203\303\204\303\205H" },
|
|
};
|
|
|
|
static int
|
|
testConvertWindows1252ToUTF8(const void *data ATTRIBUTE_UNUSED)
|
|
{
|
|
int i;
|
|
char *utf8 = NULL;
|
|
|
|
for (i = 0; i < ARRAY_CARDINALITY(windows1252ToUTF8); ++i) {
|
|
VIR_FREE(utf8);
|
|
|
|
utf8 = virVMXConvertToUTF8("Windows-1252",
|
|
windows1252ToUTF8[i].windows1252);
|
|
|
|
if (utf8 == NULL) {
|
|
return -1;
|
|
}
|
|
|
|
if (STRNEQ(windows1252ToUTF8[i].utf8, utf8)) {
|
|
VIR_FREE(utf8);
|
|
return -1;
|
|
}
|
|
}
|
|
|
|
VIR_FREE(utf8);
|
|
return 0;
|
|
}
|
|
|
|
|
|
|
|
static int
|
|
mymain(void)
|
|
{
|
|
int result = 0;
|
|
|
|
virSetErrorFunc(NULL, testQuietError);
|
|
|
|
# define DO_TEST(_name) \
|
|
do { \
|
|
if (virtTestRun("VMware "#_name, 1, test##_name, \
|
|
NULL) < 0) { \
|
|
result = -1; \
|
|
} \
|
|
} while (0)
|
|
|
|
DO_TEST(ParseDatastorePath);
|
|
DO_TEST(ConvertDateTimeToCalendarTime);
|
|
DO_TEST(EscapeDatastoreItem);
|
|
DO_TEST(ConvertWindows1252ToUTF8);
|
|
|
|
return result == 0 ? EXIT_SUCCESS : EXIT_FAILURE;
|
|
}
|
|
|
|
VIRT_TEST_MAIN(mymain)
|
|
|
|
#else
|
|
|
|
int main(void)
|
|
{
|
|
return EXIT_AM_SKIP;
|
|
}
|
|
|
|
#endif /* WITH_ESX */
|