2017-04-12 13:58:29 +00:00
|
|
|
/*
|
|
|
|
* Copyright (C) 2017 Red Hat, Inc.
|
|
|
|
*
|
|
|
|
* This library is free software; you can redistribute it and/or
|
|
|
|
* modify it under the terms of the GNU Lesser General Public
|
|
|
|
* License as published by the Free Software Foundation; either
|
|
|
|
* version 2.1 of the License, or (at your option) any later version.
|
|
|
|
*
|
|
|
|
* This library 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
|
|
|
|
* Lesser General Public License for more details.
|
|
|
|
*
|
|
|
|
* You should have received a copy of the GNU Lesser General Public
|
|
|
|
* License along with this library. If not, see
|
|
|
|
* <http://www.gnu.org/licenses/>.
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
|
|
|
|
#include <config.h>
|
|
|
|
|
|
|
|
#include "testutils.h"
|
|
|
|
|
2018-06-04 09:12:29 +00:00
|
|
|
#include "virfile.h"
|
|
|
|
#include "virfilecache.h"
|
2017-04-12 13:58:29 +00:00
|
|
|
|
2018-05-15 11:01:58 +00:00
|
|
|
|
2018-06-04 09:12:29 +00:00
|
|
|
#define VIR_FROM_THIS VIR_FROM_NONE
|
2017-04-12 13:58:29 +00:00
|
|
|
|
|
|
|
|
|
|
|
struct _testFileCacheObj {
|
2018-04-13 11:51:23 +00:00
|
|
|
virObject parent;
|
2017-04-12 13:58:29 +00:00
|
|
|
char *data;
|
|
|
|
};
|
|
|
|
typedef struct _testFileCacheObj testFileCacheObj;
|
|
|
|
typedef testFileCacheObj *testFileCacheObjPtr;
|
|
|
|
|
|
|
|
|
|
|
|
static virClassPtr testFileCacheObjClass;
|
|
|
|
|
|
|
|
|
|
|
|
static void
|
|
|
|
testFileCacheObjDispose(void *opaque)
|
|
|
|
{
|
|
|
|
testFileCacheObjPtr obj = opaque;
|
|
|
|
VIR_FREE(obj->data);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
static int
|
|
|
|
testFileCacheObjOnceInit(void)
|
|
|
|
{
|
2018-04-17 15:42:33 +00:00
|
|
|
if (!VIR_CLASS_NEW(testFileCacheObj, virClassForObject()))
|
2017-04-12 13:58:29 +00:00
|
|
|
return -1;
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2019-01-20 17:23:29 +00:00
|
|
|
VIR_ONCE_GLOBAL_INIT(testFileCacheObj);
|
2017-04-12 13:58:29 +00:00
|
|
|
|
|
|
|
|
|
|
|
static testFileCacheObjPtr
|
|
|
|
testFileCacheObjNew(const char *data)
|
|
|
|
{
|
|
|
|
testFileCacheObjPtr obj;
|
|
|
|
|
|
|
|
if (testFileCacheObjInitialize() < 0)
|
|
|
|
return NULL;
|
|
|
|
|
|
|
|
if (!(obj = virObjectNew(testFileCacheObjClass)))
|
|
|
|
return NULL;
|
|
|
|
|
2019-10-20 11:49:46 +00:00
|
|
|
obj->data = g_strdup(data);
|
2017-04-12 13:58:29 +00:00
|
|
|
|
|
|
|
return obj;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
struct _testFileCachePriv {
|
|
|
|
bool dataSaved;
|
|
|
|
const char *newData;
|
|
|
|
const char *expectData;
|
|
|
|
};
|
|
|
|
typedef struct _testFileCachePriv testFileCachePriv;
|
|
|
|
typedef testFileCachePriv *testFileCachePrivPtr;
|
|
|
|
|
|
|
|
|
|
|
|
static bool
|
|
|
|
testFileCacheIsValid(void *data,
|
|
|
|
void *priv)
|
|
|
|
{
|
|
|
|
testFileCachePrivPtr testPriv = priv;
|
|
|
|
testFileCacheObjPtr obj = data;
|
|
|
|
|
|
|
|
return STREQ(testPriv->expectData, obj->data);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
static void *
|
2019-10-14 12:45:03 +00:00
|
|
|
testFileCacheNewData(const char *name G_GNUC_UNUSED,
|
2017-04-12 13:58:29 +00:00
|
|
|
void *priv)
|
|
|
|
{
|
|
|
|
testFileCachePrivPtr testPriv = priv;
|
|
|
|
|
|
|
|
return testFileCacheObjNew(testPriv->newData);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
static void *
|
|
|
|
testFileCacheLoadFile(const char *filename,
|
2019-10-14 12:45:03 +00:00
|
|
|
const char *name G_GNUC_UNUSED,
|
2020-06-18 13:44:16 +00:00
|
|
|
void *priv G_GNUC_UNUSED,
|
|
|
|
bool *outdated G_GNUC_UNUSED)
|
2017-04-12 13:58:29 +00:00
|
|
|
{
|
|
|
|
testFileCacheObjPtr obj;
|
|
|
|
char *data;
|
|
|
|
|
|
|
|
if (virFileReadAll(filename, 20, &data) < 0)
|
|
|
|
return NULL;
|
|
|
|
|
|
|
|
obj = testFileCacheObjNew(data);
|
|
|
|
|
|
|
|
VIR_FREE(data);
|
|
|
|
return obj;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
static int
|
2019-10-14 12:45:03 +00:00
|
|
|
testFileCacheSaveFile(void *data G_GNUC_UNUSED,
|
|
|
|
const char *filename G_GNUC_UNUSED,
|
2017-04-12 13:58:29 +00:00
|
|
|
void *priv)
|
|
|
|
{
|
|
|
|
testFileCachePrivPtr testPriv = priv;
|
|
|
|
|
|
|
|
testPriv->dataSaved = true;
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
virFileCacheHandlers testFileCacheHandlers = {
|
|
|
|
.isValid = testFileCacheIsValid,
|
|
|
|
.newData = testFileCacheNewData,
|
|
|
|
.loadFile = testFileCacheLoadFile,
|
|
|
|
.saveFile = testFileCacheSaveFile
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
struct _testFileCacheData {
|
|
|
|
virFileCachePtr cache;
|
|
|
|
const char *name;
|
|
|
|
const char *newData;
|
|
|
|
const char *expectData;
|
|
|
|
bool expectSave;
|
|
|
|
};
|
|
|
|
typedef struct _testFileCacheData testFileCacheData;
|
|
|
|
typedef testFileCacheData *testFileCacheDataPtr;
|
|
|
|
|
|
|
|
|
|
|
|
static int
|
|
|
|
testFileCache(const void *opaque)
|
|
|
|
{
|
|
|
|
int ret = -1;
|
|
|
|
const testFileCacheData *data = opaque;
|
|
|
|
testFileCacheObjPtr obj = NULL;
|
|
|
|
testFileCachePrivPtr testPriv = virFileCacheGetPriv(data->cache);
|
|
|
|
|
|
|
|
testPriv->dataSaved = false;
|
|
|
|
testPriv->newData = data->newData;
|
|
|
|
testPriv->expectData = data->expectData;
|
|
|
|
|
|
|
|
if (!(obj = virFileCacheLookup(data->cache, data->name))) {
|
|
|
|
fprintf(stderr, "Getting cached data failed.\n");
|
|
|
|
goto cleanup;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!obj->data || STRNEQ(data->expectData, obj->data)) {
|
|
|
|
fprintf(stderr, "Expect data '%s', loaded data '%s'.\n",
|
|
|
|
data->expectData, NULLSTR(obj->data));
|
|
|
|
goto cleanup;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (data->expectSave != testPriv->dataSaved) {
|
|
|
|
fprintf(stderr, "Expect data to be saved '%s', data saved '%s'.\n",
|
|
|
|
data->expectSave ? "yes" : "no",
|
|
|
|
testPriv->dataSaved ? "yes" : "no");
|
|
|
|
goto cleanup;
|
|
|
|
}
|
|
|
|
|
|
|
|
ret = 0;
|
|
|
|
|
|
|
|
cleanup:
|
|
|
|
virObjectUnref(obj);
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
static int
|
|
|
|
mymain(void)
|
|
|
|
{
|
|
|
|
int ret = 0;
|
|
|
|
testFileCachePriv testPriv = {0};
|
|
|
|
virFileCachePtr cache = NULL;
|
|
|
|
|
|
|
|
if (!(cache = virFileCacheNew(abs_srcdir "/virfilecachedata",
|
|
|
|
"cache", &testFileCacheHandlers)))
|
|
|
|
return EXIT_FAILURE;
|
|
|
|
|
|
|
|
virFileCacheSetPriv(cache, &testPriv);
|
|
|
|
|
2018-06-04 09:12:29 +00:00
|
|
|
#define TEST_RUN(name, newData, expectData, expectSave) \
|
2017-11-03 12:09:47 +00:00
|
|
|
do { \
|
|
|
|
testFileCacheData data = { \
|
|
|
|
cache, name, newData, expectData, expectSave \
|
|
|
|
}; \
|
|
|
|
if (virTestRun(name, testFileCache, &data) < 0) \
|
|
|
|
ret = -1; \
|
2017-04-12 13:58:29 +00:00
|
|
|
} while (0)
|
|
|
|
|
|
|
|
/* The cache file name is created using:
|
|
|
|
* '$ echo -n $TEST_NAME | sha256sum' */
|
|
|
|
TEST_RUN("cacheValid", NULL, "aaa\n", false);
|
|
|
|
TEST_RUN("cacheInvalid", "bbb\n", "bbb\n", true);
|
|
|
|
TEST_RUN("cacheMissing", "ccc\n", "ccc\n", true);
|
|
|
|
|
|
|
|
virObjectUnref(cache);
|
|
|
|
|
|
|
|
return ret != 0 ? EXIT_FAILURE : EXIT_SUCCESS;
|
|
|
|
}
|
|
|
|
|
2019-08-21 16:13:16 +00:00
|
|
|
VIR_TEST_MAIN_PRELOAD(mymain, VIR_TEST_MOCK("virfilecache"))
|