summary refs log blame commit diff stats
path: root/libotr/libotr-4.1.1/tests/unit/test_context.c
blob: 6e173cd252bd983e4163aedb270c4aa3c9d28afa (plain) (tree)





















































































































































































































                                                                                   
/*
 * Copyright (C) 2014 - Julien Voisin <julien.voisin@dustri.org>
 *
 * This program is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License, version 2 only, as
 * published by the Free Software Foundation.
 *
 * This program 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 General Public License for
 * more details.
 *
 * You should have received a copy of the GNU General Public License along with
 * this program; if not, write to the Free Software Foundation, Inc., 51
 * Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
 */

#include <limits.h>
#include <pthread.h>

#include <context.h>

#include <tap/tap.h>

#define NUM_TESTS 22

static void test_otrl_context_find_fingerprint(void)
{
	unsigned char fingerprint[20] = {0};
	int add_if_missing = 0, addedp = 0;

	ok(otrl_context_find_fingerprint(NULL, fingerprint,
			add_if_missing, &addedp) == NULL, "NULL context detected");
}

static ConnContext *new_context(const char *user, const char *account,
		const char *protocol)
{
	ConnContext *context;
	context = calloc(1, sizeof(ConnContext));
	context->username = strdup(user);
	context->accountname = strdup(account);
	context->protocol = strdup(protocol);
	context->m_context = context;
	context->active_fingerprint = calloc(1, sizeof(Fingerprint));
	context->context_priv = calloc(1, sizeof(ConnContextPriv));

	return context;
}

static void free_context(ConnContext *context)
{
	free(context->username);
	free(context->accountname);
	free(context->protocol);
	free(context);
}

static void test_otrl_context_find_recent_instance()
{
	ConnContext *context = new_context("main", "main", "main");
	ConnContext *context_child = new_context("child", "child", "child");
	ConnContext *context_rcvd = new_context("rcvd", "rcvd", "rcvd");
	ConnContext *context_sent = new_context("sent", "sent", "sent");
	ConnContext *tmp;

	context->recent_child = context_child;
	context->recent_rcvd_child = context_rcvd;
	context->recent_sent_child = context_sent;

	ok(otrl_context_find_recent_instance(NULL, OTRL_INSTAG_RECENT) == NULL,
			"NULL context detected");

	tmp = otrl_context_find_recent_instance(context, OTRL_INSTAG_RECENT);
	ok(strcmp(tmp->username, "child") == 0, "OTRL_INSTAG_RECENT ok");

	tmp = otrl_context_find_recent_instance(context,
			OTRL_INSTAG_RECENT_RECEIVED);
	ok(strcmp(tmp->username, "rcvd") == 0, "OTRL_INSTAG_RECENT_RECEIVED ok");

	tmp = otrl_context_find_recent_instance(context, OTRL_INSTAG_RECENT_SENT);
	ok(strcmp(tmp->username, "sent") == 0, "OTRL_INSTAG_RECENT_SENT ok");

	tmp = otrl_context_find_recent_instance(context, INT_MAX);
	ok(!tmp, "Invalid instag detected");

	free_context(context);
	free_context(context_child);
	free_context(context_rcvd);
	free_context(context_sent);
}

static void test_otrl_context_find_recent_secure_instance(void)
{
	ConnContext *context1 = new_context("1", "1", "1");
	ConnContext *context2 = new_context("2", "2", "2");
	ConnContext *tmp;

	ok(otrl_context_find_recent_secure_instance(NULL) == NULL,
			"NULL detected");

	context1->next = context2;
	context2->next = NULL;
	context2->m_context = context1;

	context1->msgstate = OTRL_MSGSTATE_PLAINTEXT;
	context2->msgstate = OTRL_MSGSTATE_PLAINTEXT;
	tmp = otrl_context_find_recent_secure_instance(context1);
	ok(tmp == context2, "Same msgstate");

	context1->msgstate = OTRL_MSGSTATE_PLAINTEXT;
	context2->msgstate = OTRL_MSGSTATE_FINISHED;
	tmp = otrl_context_find_recent_secure_instance(context1);
	ok(tmp == context2, "plaintext then finished");

	context1->msgstate = OTRL_MSGSTATE_PLAINTEXT;
	context2->msgstate = OTRL_MSGSTATE_ENCRYPTED;
	tmp = otrl_context_find_recent_secure_instance(context1);
	ok(tmp == context2, "Most secure context found");

	context1->msgstate = OTRL_MSGSTATE_ENCRYPTED;
	context2->msgstate = OTRL_MSGSTATE_ENCRYPTED;
	tmp = otrl_context_find_recent_secure_instance(context1);
	ok(tmp == context2, "Most secure context found");

	context1->msgstate = OTRL_MSGSTATE_PLAINTEXT;
	context2->msgstate = OTRL_MSGSTATE_PLAINTEXT;
	context2->active_fingerprint->trust = strdup("hello");
	tmp = otrl_context_find_recent_secure_instance(context1);
	ok(tmp == context2, "Most secure context found");
	free(context2->active_fingerprint);
	context2->active_fingerprint = NULL;

	context1->msgstate = OTRL_MSGSTATE_PLAINTEXT;
	context2->msgstate = OTRL_MSGSTATE_PLAINTEXT;
	context2->context_priv->lastrecv = 1;
	tmp = otrl_context_find_recent_secure_instance(context1);
	ok(tmp == context2, "Most secure context found");

	context1->msgstate = OTRL_MSGSTATE_PLAINTEXT;
	context1->context_priv->lastrecv = 2;
	context2->msgstate = OTRL_MSGSTATE_PLAINTEXT;
	tmp = otrl_context_find_recent_secure_instance(context1);
	ok(tmp == context1, "Most secure context found");

	free_context(context1);
	free_context(context2);
}

static void test_otrl_context_is_fingerprint_trusted()
{
	Fingerprint fprint;
	fprint.trust = NULL;

	ok(otrl_context_is_fingerprint_trusted(NULL) == 0,
			"NULL fingerprint detected");
	ok(otrl_context_is_fingerprint_trusted(&fprint) == 0,
			"NULL trust detected");
	fprint.trust = "1234";
	ok(otrl_context_is_fingerprint_trusted(&fprint) != 0,
			"Trusted fingerprint detected");
}

static void test_otrl_context_update_recent_child()
{
	ConnContext context1, context2;
	context1.m_context = &context1;
	context2.m_context = &context1;

	otrl_context_update_recent_child(&context1, 0);
	ok(context1.recent_rcvd_child == &context1 &&
			context1.recent_child == &context1,
			"Recent self rcvd set");

	otrl_context_update_recent_child(&context1, 1);
	ok(context1.recent_sent_child == &context1 &&
			context1.recent_child == &context1,
			"Recent self sent set");

	otrl_context_update_recent_child(&context2, 0);
	ok(context1.recent_rcvd_child == &context2 &&
			context1.recent_child == &context2,
			"Recent rcvd set");

	otrl_context_update_recent_child(&context2, 1);
	ok(context1.recent_sent_child == &context2 &&
			context1.recent_child == &context2,
			"Recent sent set");
}

static void test_otrl_context_set_trust(void)
{
	Fingerprint fprint;
	const char *trust = "I don't trust anyone.";

	fprint.trust = NULL;

	otrl_context_set_trust(&fprint, trust);
	ok(strcmp(fprint.trust, trust) == 0, "Fingerprint set with success");
}

int main(int argc, char **argv)
{
	plan_tests(NUM_TESTS);

	test_otrl_context_set_trust();
	test_otrl_context_find_recent_instance();
	test_otrl_context_find_fingerprint();
	test_otrl_context_find_recent_secure_instance();
	test_otrl_context_is_fingerprint_trusted();
	test_otrl_context_update_recent_child();

	return 0;
}