Blame trust/test-utf8.c

Packit Service 3749ba
/*
Packit Service 3749ba
 * Copyright (c) 2013, Red Hat Inc.
Packit Service 3749ba
 *
Packit Service 3749ba
 * Redistribution and use in source and binary forms, with or without
Packit Service 3749ba
 * modification, are permitted provided that the following conditions
Packit Service 3749ba
 * are met:
Packit Service 3749ba
 *
Packit Service 3749ba
 *     * Redistributions of source code must retain the above
Packit Service 3749ba
 *       copyright notice, this list of conditions and the
Packit Service 3749ba
 *       following disclaimer.
Packit Service 3749ba
 *     * Redistributions in binary form must reproduce the
Packit Service 3749ba
 *       above copyright notice, this list of conditions and
Packit Service 3749ba
 *       the following disclaimer in the documentation and/or
Packit Service 3749ba
 *       other materials provided with the distribution.
Packit Service 3749ba
 *     * The names of contributors to this software may not be
Packit Service 3749ba
 *       used to endorse or promote products derived from this
Packit Service 3749ba
 *       software without specific prior written permission.
Packit Service 3749ba
 *
Packit Service 3749ba
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
Packit Service 3749ba
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
Packit Service 3749ba
 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
Packit Service 3749ba
 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
Packit Service 3749ba
 * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
Packit Service 3749ba
 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
Packit Service 3749ba
 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
Packit Service 3749ba
 * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
Packit Service 3749ba
 * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
Packit Service 3749ba
 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
Packit Service 3749ba
 * THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
Packit Service 3749ba
 * DAMAGE.
Packit Service 3749ba
 *
Packit Service 3749ba
 * Author: Stef Walter <stefw@collabora.co.uk>
Packit Service 3749ba
 */
Packit Service 3749ba
Packit Service 3749ba
#include "config.h"
Packit Service 3749ba
#include "test.h"
Packit Service 3749ba
Packit Service 3749ba
#include "utf8.h"
Packit Service 3749ba
Packit Service 3749ba
#include <stdio.h>
Packit Service 3749ba
#include <stdlib.h>
Packit Service 3749ba
Packit Service 3749ba
#define ELEMS(x) (sizeof (x) / sizeof (x[0]))
Packit Service 3749ba
Packit Service 3749ba
static void
Packit Service 3749ba
test_ucs2be (void)
Packit Service 3749ba
{
Packit Service 3749ba
	char *output;
Packit Service 3749ba
	size_t length;
Packit Service 3749ba
	int i;
Packit Service 3749ba
Packit Service 3749ba
	struct {
Packit Service 3749ba
		const char *output;
Packit Service 3749ba
		size_t output_len;
Packit Service 3749ba
		const unsigned char input[100];
Packit Service 3749ba
		size_t input_len;
Packit Service 3749ba
	} fixtures[] = {
Packit Service 3749ba
		{ "This is a test", 14,
Packit Service 3749ba
		  { 0x00, 'T', 0x00, 'h', 0x00, 'i', 0x00, 's', 0x00, ' ', 0x00, 'i', 0x00, 's', 0x00, ' ',
Packit Service 3749ba
		    0x00, 'a', 0x00, ' ', 0x00, 't', 0x00, 'e', 0x00, 's', 0x00, 't' }, 28,
Packit Service 3749ba
		},
Packit Service 3749ba
		{ "V\303\266gel", 6,
Packit Service 3749ba
		  { 0x00, 'V', 0x00, 0xF6, 0x00, 'g', 0x00, 'e', 0x00, 'l' }, 10,
Packit Service 3749ba
		},
Packit Service 3749ba
		{ "M\303\244nwich \340\264\205", 12,
Packit Service 3749ba
		  { 0x00, 'M', 0x00, 0xE4, 0x00, 'n', 0x00, 'w', 0x00, 'i', 0x00, 'c', 0x00, 'h',
Packit Service 3749ba
		    0x00, ' ', 0x0D, 0x05 }, 18,
Packit Service 3749ba
		}
Packit Service 3749ba
	};
Packit Service 3749ba
Packit Service 3749ba
	for (i = 0; i < ELEMS (fixtures); i++) {
Packit Service 3749ba
		output = p11_utf8_for_ucs2be (fixtures[i].input,
Packit Service 3749ba
		                              fixtures[i].input_len,
Packit Service 3749ba
		                              &length);
Packit Service 3749ba
Packit Service 3749ba
		assert_num_eq (fixtures[i].output_len, length);
Packit Service 3749ba
		assert_str_eq (fixtures[i].output, output);
Packit Service 3749ba
		free (output);
Packit Service 3749ba
	}
Packit Service 3749ba
}
Packit Service 3749ba
Packit Service 3749ba
static void
Packit Service 3749ba
test_ucs2be_fail (void)
Packit Service 3749ba
{
Packit Service 3749ba
	char *output;
Packit Service 3749ba
	size_t length;
Packit Service 3749ba
	int i;
Packit Service 3749ba
Packit Service 3749ba
	struct {
Packit Service 3749ba
		const unsigned char input[100];
Packit Service 3749ba
		size_t input_len;
Packit Service 3749ba
	} fixtures[] = {
Packit Service 3749ba
		{ { 0x00, 'T', 0x00, 'h', 0x00, 'i', 0x00, }, 7 /* truncated */ }
Packit Service 3749ba
	};
Packit Service 3749ba
Packit Service 3749ba
	for (i = 0; i < ELEMS (fixtures); i++) {
Packit Service 3749ba
		output = p11_utf8_for_ucs2be (fixtures[i].input,
Packit Service 3749ba
		                              fixtures[i].input_len,
Packit Service 3749ba
		                              &length);
Packit Service 3749ba
		assert_ptr_eq (NULL, output);
Packit Service 3749ba
	}
Packit Service 3749ba
}
Packit Service 3749ba
Packit Service 3749ba
static void
Packit Service 3749ba
test_ucs4be (void)
Packit Service 3749ba
{
Packit Service 3749ba
	char *output;
Packit Service 3749ba
	size_t length;
Packit Service 3749ba
	int i;
Packit Service 3749ba
Packit Service 3749ba
	struct {
Packit Service 3749ba
		const char *output;
Packit Service 3749ba
		size_t output_len;
Packit Service 3749ba
		const unsigned char input[100];
Packit Service 3749ba
		size_t input_len;
Packit Service 3749ba
	} fixtures[] = {
Packit Service 3749ba
		{ "This is a test", 14,
Packit Service 3749ba
		  { 0x00, 0x00, 0x00, 'T',
Packit Service 3749ba
		    0x00, 0x00, 0x00, 'h',
Packit Service 3749ba
		    0x00, 0x00, 0x00, 'i',
Packit Service 3749ba
		    0x00, 0x00, 0x00, 's',
Packit Service 3749ba
		    0x00, 0x00, 0x00, ' ',
Packit Service 3749ba
		    0x00, 0x00, 0x00, 'i',
Packit Service 3749ba
		    0x00, 0x00, 0x00, 's',
Packit Service 3749ba
		    0x00, 0x00, 0x00, ' ',
Packit Service 3749ba
		    0x00, 0x00, 0x00, 'a',
Packit Service 3749ba
		    0x00, 0x00, 0x00, ' ',
Packit Service 3749ba
		    0x00, 0x00, 0x00, 't',
Packit Service 3749ba
		    0x00, 0x00, 0x00, 'e',
Packit Service 3749ba
		    0x00, 0x00, 0x00, 's',
Packit Service 3749ba
		    0x00, 0x00, 0x00, 't',
Packit Service 3749ba
		  }, 56,
Packit Service 3749ba
		},
Packit Service 3749ba
		{ "Fun \360\220\214\231", 8,
Packit Service 3749ba
		  { 0x00, 0x00, 0x00, 'F',
Packit Service 3749ba
		    0x00, 0x00, 0x00, 'u',
Packit Service 3749ba
		    0x00, 0x00, 0x00, 'n',
Packit Service 3749ba
		    0x00, 0x00, 0x00, ' ',
Packit Service 3749ba
		    0x00, 0x01, 0x03, 0x19, /* U+10319: looks like an antenna */
Packit Service 3749ba
		  }, 20,
Packit Service 3749ba
		}
Packit Service 3749ba
	};
Packit Service 3749ba
Packit Service 3749ba
	for (i = 0; i < ELEMS (fixtures); i++) {
Packit Service 3749ba
		output = p11_utf8_for_ucs4be (fixtures[i].input,
Packit Service 3749ba
		                              fixtures[i].input_len,
Packit Service 3749ba
		                              &length);
Packit Service 3749ba
Packit Service 3749ba
		assert_num_eq (fixtures[i].output_len, length);
Packit Service 3749ba
		assert_str_eq (fixtures[i].output, output);
Packit Service 3749ba
Packit Service 3749ba
		free (output);
Packit Service 3749ba
	}
Packit Service 3749ba
}
Packit Service 3749ba
Packit Service 3749ba
static void
Packit Service 3749ba
test_ucs4be_fail (void)
Packit Service 3749ba
{
Packit Service 3749ba
	char *output;
Packit Service 3749ba
	size_t length;
Packit Service 3749ba
	int i;
Packit Service 3749ba
Packit Service 3749ba
	struct {
Packit Service 3749ba
		const unsigned char input[100];
Packit Service 3749ba
		size_t input_len;
Packit Service 3749ba
	} fixtures[] = {
Packit Service 3749ba
		{ { 0x00, 0x00, 'T',
Packit Service 3749ba
		  }, 7 /* truncated */ },
Packit Service 3749ba
		{ { 0x00, 0x00, 0x00, 'F',
Packit Service 3749ba
		    0x00, 0x00, 0x00, 'u',
Packit Service 3749ba
		    0x00, 0x00, 0x00, 'n',
Packit Service 3749ba
		    0x00, 0x00, 0x00, ' ',
Packit Service 3749ba
		    0xD8, 0x00, 0xDF, 0x19,
Packit Service 3749ba
		  }, 20,
Packit Service 3749ba
		}
Packit Service 3749ba
	};
Packit Service 3749ba
Packit Service 3749ba
	for (i = 0; i < ELEMS (fixtures); i++) {
Packit Service 3749ba
		output = p11_utf8_for_ucs4be (fixtures[i].input,
Packit Service 3749ba
		                              fixtures[i].input_len,
Packit Service 3749ba
		                              &length);
Packit Service 3749ba
		assert_ptr_eq (NULL, output);
Packit Service 3749ba
	}
Packit Service 3749ba
}
Packit Service 3749ba
Packit Service 3749ba
static void
Packit Service 3749ba
test_utf8 (void)
Packit Service 3749ba
{
Packit Service 3749ba
	bool ret;
Packit Service 3749ba
	int i;
Packit Service 3749ba
Packit Service 3749ba
	struct {
Packit Service 3749ba
		const char *input;
Packit Service 3749ba
		size_t input_len;
Packit Service 3749ba
	} fixtures[] = {
Packit Service 3749ba
		{ "This is a test", 14 },
Packit Service 3749ba
		{ "Good news everyone", -1 },
Packit Service 3749ba
		{ "Fun \360\220\214\231", -1 },
Packit Service 3749ba
		{ "Fun invalid here: \xfe", 4 }, /* but limited length */
Packit Service 3749ba
		{ "V\303\266gel", 6, },
Packit Service 3749ba
	};
Packit Service 3749ba
Packit Service 3749ba
	for (i = 0; i < ELEMS (fixtures); i++) {
Packit Service 3749ba
		ret = p11_utf8_validate (fixtures[i].input,
Packit Service 3749ba
		                         fixtures[i].input_len);
Packit Service 3749ba
		assert_num_eq (true, ret);
Packit Service 3749ba
	}
Packit Service 3749ba
}
Packit Service 3749ba
Packit Service 3749ba
static void
Packit Service 3749ba
test_utf8_fail (void)
Packit Service 3749ba
{
Packit Service 3749ba
	bool ret;
Packit Service 3749ba
	int i;
Packit Service 3749ba
Packit Service 3749ba
	struct {
Packit Service 3749ba
		const char *input;
Packit Service 3749ba
		size_t input_len;
Packit Service 3749ba
	} fixtures[] = {
Packit Service 3749ba
		{ "This is a test\x80", 15 },
Packit Service 3749ba
		{ "Good news everyone\x88", -1 },
Packit Service 3749ba
		{ "Bad \xe0v following chars should be |0x80", -1 },
Packit Service 3749ba
		{ "Truncated \xe0", -1 },
Packit Service 3749ba
		{ "Surrogate \xed\xa0\x80", -1, },
Packit Service 3749ba
		{ "Out of range \xf4\x90\x80\x80", -1, },
Packit Service 3749ba
	};
Packit Service 3749ba
Packit Service 3749ba
	for (i = 0; i < ELEMS (fixtures); i++) {
Packit Service 3749ba
		ret = p11_utf8_validate (fixtures[i].input,
Packit Service 3749ba
		                         fixtures[i].input_len);
Packit Service 3749ba
		assert_num_eq (false, ret);
Packit Service 3749ba
	}
Packit Service 3749ba
}
Packit Service 3749ba
Packit Service 3749ba
int
Packit Service 3749ba
main (int argc,
Packit Service 3749ba
      char *argv[])
Packit Service 3749ba
{
Packit Service 3749ba
	p11_test (test_ucs2be, "/utf8/ucs2be");
Packit Service 3749ba
	p11_test (test_ucs2be_fail, "/utf8/ucs2be_fail");
Packit Service 3749ba
	p11_test (test_ucs4be, "/utf8/ucs4be");
Packit Service 3749ba
	p11_test (test_ucs4be_fail, "/utf8/ucs4be_fail");
Packit Service 3749ba
	p11_test (test_utf8, "/utf8/utf8");
Packit Service 3749ba
	p11_test (test_utf8_fail, "/utf8/utf8_fail");
Packit Service 3749ba
	return p11_test_run (argc, argv);
Packit Service 3749ba
}