Blame tests/filter/wildcard.c

Packit ae9e2a
#include "clar_libgit2.h"
Packit ae9e2a
#include "posix.h"
Packit ae9e2a
#include "blob.h"
Packit ae9e2a
#include "filter.h"
Packit ae9e2a
#include "buf_text.h"
Packit ae9e2a
#include "git2/sys/filter.h"
Packit ae9e2a
#include "git2/sys/repository.h"
Packit ae9e2a
#include "custom_helpers.h"
Packit ae9e2a
Packit ae9e2a
static git_repository *g_repo = NULL;
Packit ae9e2a
Packit ae9e2a
static git_filter *create_wildcard_filter(void);
Packit ae9e2a
Packit ae9e2a
#define DATA_LEN 32
Packit ae9e2a
Packit ae9e2a
static unsigned char input[] = {
Packit ae9e2a
	0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
Packit ae9e2a
	0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
Packit ae9e2a
	0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
Packit ae9e2a
	0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
Packit ae9e2a
};
Packit ae9e2a
Packit ae9e2a
static unsigned char reversed[] = {
Packit ae9e2a
	0x1f, 0x1e, 0x1d, 0x1c, 0x1b, 0x1a, 0x19, 0x18,
Packit ae9e2a
	0x17, 0x16, 0x15, 0x14, 0x13, 0x12, 0x11, 0x10,
Packit ae9e2a
	0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08,
Packit ae9e2a
	0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00,
Packit ae9e2a
};
Packit ae9e2a
Packit ae9e2a
static unsigned char flipped[] = {
Packit ae9e2a
	0xff, 0xfe, 0xfd, 0xfc, 0xfb, 0xfa, 0xf9, 0xf8,
Packit ae9e2a
	0xf7, 0xf6, 0xf5, 0xf4, 0xf3, 0xf2, 0xf1, 0xf0,
Packit ae9e2a
	0xef, 0xee, 0xed, 0xec, 0xeb, 0xea, 0xe9, 0xe8,
Packit ae9e2a
	0xe7, 0xe6, 0xe5, 0xe4, 0xe3, 0xe2, 0xe1, 0xe0,
Packit ae9e2a
};
Packit ae9e2a
Packit ae9e2a
void test_filter_wildcard__initialize(void)
Packit ae9e2a
{
Packit ae9e2a
	cl_git_pass(git_filter_register(
Packit ae9e2a
		"wildcard", create_wildcard_filter(), GIT_FILTER_DRIVER_PRIORITY));
Packit ae9e2a
Packit ae9e2a
	g_repo = cl_git_sandbox_init("empty_standard_repo");
Packit ae9e2a
Packit ae9e2a
	cl_git_rewritefile(
Packit ae9e2a
		"empty_standard_repo/.gitattributes",
Packit ae9e2a
		"* binary\n"
Packit ae9e2a
		"hero-flip-* filter=wcflip\n"
Packit ae9e2a
		"hero-reverse-* filter=wcreverse\n"
Packit ae9e2a
		"none-* filter=unregistered\n");
Packit ae9e2a
}
Packit ae9e2a
Packit ae9e2a
void test_filter_wildcard__cleanup(void)
Packit ae9e2a
{
Packit ae9e2a
	cl_git_pass(git_filter_unregister("wildcard"));
Packit ae9e2a
Packit ae9e2a
	cl_git_sandbox_cleanup();
Packit ae9e2a
	g_repo = NULL;
Packit ae9e2a
}
Packit ae9e2a
Packit ae9e2a
static int wildcard_filter_check(
Packit ae9e2a
	git_filter  *self,
Packit ae9e2a
	void **payload,
Packit ae9e2a
	const git_filter_source *src,
Packit ae9e2a
	const char **attr_values)
Packit ae9e2a
{
Packit ae9e2a
	GIT_UNUSED(self);
Packit ae9e2a
	GIT_UNUSED(src);
Packit ae9e2a
Packit ae9e2a
	if (strcmp(attr_values[0], "wcflip") == 0 ||
Packit ae9e2a
		strcmp(attr_values[0], "wcreverse") == 0) {
Packit ae9e2a
		*payload = git__strdup(attr_values[0]);
Packit ae9e2a
		GITERR_CHECK_ALLOC(*payload);
Packit ae9e2a
		return 0;
Packit ae9e2a
	}
Packit ae9e2a
Packit ae9e2a
	return GIT_PASSTHROUGH;
Packit ae9e2a
}
Packit ae9e2a
Packit ae9e2a
static int wildcard_filter_apply(
Packit ae9e2a
	git_filter     *self,
Packit ae9e2a
	void          **payload,
Packit ae9e2a
	git_buf        *to,
Packit ae9e2a
	const git_buf  *from,
Packit ae9e2a
	const git_filter_source *source)
Packit ae9e2a
{
Packit ae9e2a
	const char *filtername = *payload;
Packit ae9e2a
Packit ae9e2a
	if (filtername && strcmp(filtername, "wcflip") == 0)
Packit ae9e2a
		return bitflip_filter_apply(self, payload, to, from, source);
Packit ae9e2a
	else if (filtername && strcmp(filtername, "wcreverse") == 0)
Packit ae9e2a
		return reverse_filter_apply(self, payload, to, from, source);
Packit ae9e2a
Packit ae9e2a
	cl_fail("Unexpected attribute");
Packit ae9e2a
	return GIT_PASSTHROUGH;
Packit ae9e2a
}
Packit ae9e2a
Packit ae9e2a
static void wildcard_filter_cleanup(git_filter *self, void *payload)
Packit ae9e2a
{
Packit ae9e2a
	GIT_UNUSED(self);
Packit ae9e2a
	git__free(payload);
Packit ae9e2a
}
Packit ae9e2a
Packit ae9e2a
static void wildcard_filter_free(git_filter *f)
Packit ae9e2a
{
Packit ae9e2a
	git__free(f);
Packit ae9e2a
}
Packit ae9e2a
Packit ae9e2a
static git_filter *create_wildcard_filter(void)
Packit ae9e2a
{
Packit ae9e2a
	git_filter *filter = git__calloc(1, sizeof(git_filter));
Packit ae9e2a
	cl_assert(filter);
Packit ae9e2a
Packit ae9e2a
	filter->version = GIT_FILTER_VERSION;
Packit ae9e2a
	filter->attributes = "filter=*";
Packit ae9e2a
	filter->check = wildcard_filter_check;
Packit ae9e2a
	filter->apply = wildcard_filter_apply;
Packit ae9e2a
	filter->cleanup = wildcard_filter_cleanup;
Packit ae9e2a
	filter->shutdown = wildcard_filter_free;
Packit ae9e2a
Packit ae9e2a
	return filter;
Packit ae9e2a
}
Packit ae9e2a
Packit ae9e2a
void test_filter_wildcard__reverse(void)
Packit ae9e2a
{
Packit ae9e2a
	git_filter_list *fl;
Packit ae9e2a
	git_buf in = GIT_BUF_INIT, out = GIT_BUF_INIT;
Packit ae9e2a
Packit ae9e2a
	cl_git_pass(git_filter_list_load(
Packit ae9e2a
		&fl, g_repo, NULL, "hero-reverse-foo", GIT_FILTER_TO_ODB, 0));
Packit ae9e2a
Packit ae9e2a
	cl_git_pass(git_buf_put(&in, (char *)input, DATA_LEN));
Packit ae9e2a
	cl_git_pass(git_filter_list_apply_to_data(&out, fl, &in);;
Packit ae9e2a
Packit ae9e2a
	cl_assert_equal_i(DATA_LEN, out.size);
Packit ae9e2a
Packit ae9e2a
	cl_assert_equal_i(
Packit ae9e2a
		0, memcmp(reversed, out.ptr, out.size));
Packit ae9e2a
Packit ae9e2a
	git_filter_list_free(fl);
Packit ae9e2a
	git_buf_free(&out;;
Packit ae9e2a
	git_buf_free(&in);
Packit ae9e2a
}
Packit ae9e2a
Packit ae9e2a
void test_filter_wildcard__flip(void)
Packit ae9e2a
{
Packit ae9e2a
	git_filter_list *fl;
Packit ae9e2a
	git_buf in = GIT_BUF_INIT, out = GIT_BUF_INIT;
Packit ae9e2a
Packit ae9e2a
	cl_git_pass(git_filter_list_load(
Packit ae9e2a
		&fl, g_repo, NULL, "hero-flip-foo", GIT_FILTER_TO_ODB, 0));
Packit ae9e2a
Packit ae9e2a
	cl_git_pass(git_buf_put(&in, (char *)input, DATA_LEN));
Packit ae9e2a
	cl_git_pass(git_filter_list_apply_to_data(&out, fl, &in);;
Packit ae9e2a
Packit ae9e2a
	cl_assert_equal_i(DATA_LEN, out.size);
Packit ae9e2a
Packit ae9e2a
	cl_assert_equal_i(
Packit ae9e2a
		0, memcmp(flipped, out.ptr, out.size));
Packit ae9e2a
Packit ae9e2a
	git_filter_list_free(fl);
Packit ae9e2a
	git_buf_free(&out;;
Packit ae9e2a
	git_buf_free(&in);
Packit ae9e2a
}
Packit ae9e2a
Packit ae9e2a
void test_filter_wildcard__none(void)
Packit ae9e2a
{
Packit ae9e2a
	git_filter_list *fl;
Packit ae9e2a
	git_buf in = GIT_BUF_INIT, out = GIT_BUF_INIT;
Packit ae9e2a
Packit ae9e2a
	cl_git_pass(git_filter_list_load(
Packit ae9e2a
		&fl, g_repo, NULL, "none-foo", GIT_FILTER_TO_ODB, 0));
Packit ae9e2a
Packit ae9e2a
	cl_git_pass(git_buf_put(&in, (char *)input, DATA_LEN));
Packit ae9e2a
	cl_git_pass(git_filter_list_apply_to_data(&out, fl, &in);;
Packit ae9e2a
Packit ae9e2a
	cl_assert_equal_i(DATA_LEN, out.size);
Packit ae9e2a
Packit ae9e2a
	cl_assert_equal_i(
Packit ae9e2a
		0, memcmp(input, out.ptr, out.size));
Packit ae9e2a
Packit ae9e2a
	git_filter_list_free(fl);
Packit ae9e2a
	git_buf_free(&out;;
Packit ae9e2a
	git_buf_free(&in);
Packit ae9e2a
}