#include "../src/config.h"
#include "../src/main.h"
#include "../src/cfg_file.h"
#include "../src/memcached.h"
#include "tests.h"

static const u_char *buf = "test";

static void 
memcached_callback (memcached_ctx_t *ctx, memc_error_t error, void *data)
{
	struct timeval tv;

	switch (ctx->op) {
		case CMD_CONNECT:
			if (error != OK) {
				msg_warn ("Connect failed, skipping test");
				memc_close_ctx (ctx);
				tv.tv_sec = 0;
				tv.tv_usec = 0;
				event_loopexit (&tv);
			}
			msg_debug ("Connect ok");
			memc_set (ctx, ctx->param, 60);
			break;
		case CMD_READ:
			g_assert (error == OK);
			g_assert (!memcmp(ctx->param->buf, buf, ctx->param->bufsize));
			msg_debug ("Read ok");
			memc_close_ctx (ctx);
			tv.tv_sec = 0;
			tv.tv_usec = 0;
			event_loopexit (&tv);
			break;
		case CMD_WRITE:
			if (error != OK) {
				msg_warn ("Connect failed, skipping test");
				memc_close_ctx (ctx);
				tv.tv_sec = 0;
				tv.tv_usec = 0;
				event_loopexit (&tv);
			}
			msg_debug ("Write ok");
			ctx->param->buf = g_malloc (sizeof (buf));
			bzero (ctx->param->buf, sizeof (buf));
			memc_get (ctx, ctx->param);
			break;
		default:
			return;
	}
}
			
void
rspamd_memcached_test_func ()
{
	memcached_ctx_t *ctx;
	memcached_param_t *param;
	struct in_addr addr;

	ctx = g_malloc (sizeof (memcached_ctx_t));
	param = g_malloc (sizeof (memcached_param_t));
	bzero (ctx, sizeof (memcached_ctx_t));
	bzero (param, sizeof (memcached_param_t));

	event_init ();

	ctx->callback = memcached_callback;
	ctx->callback_data = (void *)param;
	ctx->protocol = TCP_TEXT;
	inet_aton ("127.0.0.1", &addr);
	memcpy (&ctx->addr, &addr, sizeof (struct in_addr));
	ctx->port = htons (11211);
	ctx->timeout.tv_sec = 1;
	ctx->timeout.tv_usec = 0;
	ctx->sock = -1;
	ctx->options = MEMC_OPT_DEBUG;
	rspamd_strlcpy (param->key, buf, sizeof (param->key));
	param->buf = buf;
	param->bufsize = strlen (buf);
	ctx->param = param;
	g_assert (memc_init_ctx (ctx) != -1);

	event_loop (0);
}