136204fdf742cabc074617648a5b2cf62409dc40bSimon Glass/*
236204fdf742cabc074617648a5b2cf62409dc40bSimon Glass * Copyright 2011 The Chromium Authors, All Rights Reserved.
336204fdf742cabc074617648a5b2cf62409dc40bSimon Glass *
436204fdf742cabc074617648a5b2cf62409dc40bSimon Glass * utilfdt_test - Tests for utilfdt library
536204fdf742cabc074617648a5b2cf62409dc40bSimon Glass *
636204fdf742cabc074617648a5b2cf62409dc40bSimon Glass * This library is free software; you can redistribute it and/or
736204fdf742cabc074617648a5b2cf62409dc40bSimon Glass * modify it under the terms of the GNU Lesser General Public License
836204fdf742cabc074617648a5b2cf62409dc40bSimon Glass * as published by the Free Software Foundation; either version 2.1 of
936204fdf742cabc074617648a5b2cf62409dc40bSimon Glass * the License, or (at your option) any later version.
1036204fdf742cabc074617648a5b2cf62409dc40bSimon Glass *
1136204fdf742cabc074617648a5b2cf62409dc40bSimon Glass * This library is distributed in the hope that it will be useful, but
1236204fdf742cabc074617648a5b2cf62409dc40bSimon Glass * WITHOUT ANY WARRANTY; without even the implied warranty of
1336204fdf742cabc074617648a5b2cf62409dc40bSimon Glass * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
1436204fdf742cabc074617648a5b2cf62409dc40bSimon Glass * Lesser General Public License for more details.
1536204fdf742cabc074617648a5b2cf62409dc40bSimon Glass *
1636204fdf742cabc074617648a5b2cf62409dc40bSimon Glass * You should have received a copy of the GNU Lesser General Public
1736204fdf742cabc074617648a5b2cf62409dc40bSimon Glass * License along with this library; if not, write to the Free Software
1836204fdf742cabc074617648a5b2cf62409dc40bSimon Glass * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
1936204fdf742cabc074617648a5b2cf62409dc40bSimon Glass */
2036204fdf742cabc074617648a5b2cf62409dc40bSimon Glass#include <assert.h>
2136204fdf742cabc074617648a5b2cf62409dc40bSimon Glass#include <stdlib.h>
2236204fdf742cabc074617648a5b2cf62409dc40bSimon Glass#include <stdio.h>
2336204fdf742cabc074617648a5b2cf62409dc40bSimon Glass#include <string.h>
2436204fdf742cabc074617648a5b2cf62409dc40bSimon Glass#include <stdint.h>
2536204fdf742cabc074617648a5b2cf62409dc40bSimon Glass#include <stdarg.h>
2636204fdf742cabc074617648a5b2cf62409dc40bSimon Glass
2736204fdf742cabc074617648a5b2cf62409dc40bSimon Glass#include <libfdt.h>
2836204fdf742cabc074617648a5b2cf62409dc40bSimon Glass#include <util.h>
2936204fdf742cabc074617648a5b2cf62409dc40bSimon Glass
3036204fdf742cabc074617648a5b2cf62409dc40bSimon Glass#include "tests.h"
3136204fdf742cabc074617648a5b2cf62409dc40bSimon Glass#include "testdata.h"
3236204fdf742cabc074617648a5b2cf62409dc40bSimon Glass
3336204fdf742cabc074617648a5b2cf62409dc40bSimon Glassstatic void check(const char *fmt, int expect_type, int expect_size)
3436204fdf742cabc074617648a5b2cf62409dc40bSimon Glass{
3536204fdf742cabc074617648a5b2cf62409dc40bSimon Glass	int type;
3636204fdf742cabc074617648a5b2cf62409dc40bSimon Glass	int size;
3736204fdf742cabc074617648a5b2cf62409dc40bSimon Glass
3836204fdf742cabc074617648a5b2cf62409dc40bSimon Glass	if (utilfdt_decode_type(fmt, &type, &size))
3936204fdf742cabc074617648a5b2cf62409dc40bSimon Glass		FAIL("format '%s': valid format string returned failure", fmt);
4036204fdf742cabc074617648a5b2cf62409dc40bSimon Glass	if (expect_type != type)
4136204fdf742cabc074617648a5b2cf62409dc40bSimon Glass		FAIL("format '%s': expected type='%c', got type='%c'", fmt,
4236204fdf742cabc074617648a5b2cf62409dc40bSimon Glass		     expect_type, type);
4336204fdf742cabc074617648a5b2cf62409dc40bSimon Glass	if (expect_size != size)
4436204fdf742cabc074617648a5b2cf62409dc40bSimon Glass		FAIL("format '%s': expected size=%d, got size=%d", fmt,
4536204fdf742cabc074617648a5b2cf62409dc40bSimon Glass		     expect_size, size);
4636204fdf742cabc074617648a5b2cf62409dc40bSimon Glass}
4736204fdf742cabc074617648a5b2cf62409dc40bSimon Glass
4836204fdf742cabc074617648a5b2cf62409dc40bSimon Glassstatic void checkfail(const char *fmt)
4936204fdf742cabc074617648a5b2cf62409dc40bSimon Glass{
5036204fdf742cabc074617648a5b2cf62409dc40bSimon Glass	int type;
5136204fdf742cabc074617648a5b2cf62409dc40bSimon Glass	int size;
5236204fdf742cabc074617648a5b2cf62409dc40bSimon Glass
5336204fdf742cabc074617648a5b2cf62409dc40bSimon Glass	if (!utilfdt_decode_type(fmt, &type, &size))
5436204fdf742cabc074617648a5b2cf62409dc40bSimon Glass		FAIL("format '%s': invalid format string returned success",
5536204fdf742cabc074617648a5b2cf62409dc40bSimon Glass		     fmt);
5636204fdf742cabc074617648a5b2cf62409dc40bSimon Glass}
5736204fdf742cabc074617648a5b2cf62409dc40bSimon Glass
5836204fdf742cabc074617648a5b2cf62409dc40bSimon Glass/**
5936204fdf742cabc074617648a5b2cf62409dc40bSimon Glass * Add the given modifier to each of the valid sizes, and check that we get
6036204fdf742cabc074617648a5b2cf62409dc40bSimon Glass * correct values.
6136204fdf742cabc074617648a5b2cf62409dc40bSimon Glass *
6236204fdf742cabc074617648a5b2cf62409dc40bSimon Glass * \param modifier	Modifer string to use as a prefix
6336204fdf742cabc074617648a5b2cf62409dc40bSimon Glass * \param expected_size	The size (in bytes) that we expect (ignored for
6436204fdf742cabc074617648a5b2cf62409dc40bSimon Glass *			strings)
6536204fdf742cabc074617648a5b2cf62409dc40bSimon Glass */
6636204fdf742cabc074617648a5b2cf62409dc40bSimon Glassstatic void check_sizes(char *modifier, int expected_size)
6736204fdf742cabc074617648a5b2cf62409dc40bSimon Glass{
6836204fdf742cabc074617648a5b2cf62409dc40bSimon Glass	char fmt[10], *ptr;
6936204fdf742cabc074617648a5b2cf62409dc40bSimon Glass
7036204fdf742cabc074617648a5b2cf62409dc40bSimon Glass	/* set up a string with a hole in it for the format character */
7136204fdf742cabc074617648a5b2cf62409dc40bSimon Glass	if (strlen(modifier) + 2 >= sizeof(fmt))
7236204fdf742cabc074617648a5b2cf62409dc40bSimon Glass		FAIL("modifier string '%s' too long", modifier);
7336204fdf742cabc074617648a5b2cf62409dc40bSimon Glass	strcpy(fmt, modifier);
7436204fdf742cabc074617648a5b2cf62409dc40bSimon Glass	ptr = fmt + strlen(fmt);
7536204fdf742cabc074617648a5b2cf62409dc40bSimon Glass	ptr[1] = '\0';
7636204fdf742cabc074617648a5b2cf62409dc40bSimon Glass
7736204fdf742cabc074617648a5b2cf62409dc40bSimon Glass	/* now try each format character in turn */
7836204fdf742cabc074617648a5b2cf62409dc40bSimon Glass	*ptr = 'i';
7936204fdf742cabc074617648a5b2cf62409dc40bSimon Glass	check(fmt, 'i', expected_size);
8036204fdf742cabc074617648a5b2cf62409dc40bSimon Glass
8136204fdf742cabc074617648a5b2cf62409dc40bSimon Glass	*ptr = 'u';
8236204fdf742cabc074617648a5b2cf62409dc40bSimon Glass	check(fmt, 'u', expected_size);
8336204fdf742cabc074617648a5b2cf62409dc40bSimon Glass
8436204fdf742cabc074617648a5b2cf62409dc40bSimon Glass	*ptr = 'x';
8536204fdf742cabc074617648a5b2cf62409dc40bSimon Glass	check(fmt, 'x', expected_size);
8636204fdf742cabc074617648a5b2cf62409dc40bSimon Glass
8736204fdf742cabc074617648a5b2cf62409dc40bSimon Glass	*ptr = 's';
8836204fdf742cabc074617648a5b2cf62409dc40bSimon Glass	check(fmt, 's', -1);
8936204fdf742cabc074617648a5b2cf62409dc40bSimon Glass}
9036204fdf742cabc074617648a5b2cf62409dc40bSimon Glass
9136204fdf742cabc074617648a5b2cf62409dc40bSimon Glassstatic void test_utilfdt_decode_type(void)
9236204fdf742cabc074617648a5b2cf62409dc40bSimon Glass{
9336204fdf742cabc074617648a5b2cf62409dc40bSimon Glass	char fmt[10];
9436204fdf742cabc074617648a5b2cf62409dc40bSimon Glass	int ch;
9536204fdf742cabc074617648a5b2cf62409dc40bSimon Glass
9636204fdf742cabc074617648a5b2cf62409dc40bSimon Glass	/* check all the valid modifiers and sizes */
9736204fdf742cabc074617648a5b2cf62409dc40bSimon Glass	check_sizes("", -1);
9836204fdf742cabc074617648a5b2cf62409dc40bSimon Glass	check_sizes("b", 1);
9936204fdf742cabc074617648a5b2cf62409dc40bSimon Glass	check_sizes("hh", 1);
10036204fdf742cabc074617648a5b2cf62409dc40bSimon Glass	check_sizes("h", 2);
10136204fdf742cabc074617648a5b2cf62409dc40bSimon Glass	check_sizes("l", 4);
10236204fdf742cabc074617648a5b2cf62409dc40bSimon Glass
10336204fdf742cabc074617648a5b2cf62409dc40bSimon Glass	/* try every other character */
10436204fdf742cabc074617648a5b2cf62409dc40bSimon Glass	checkfail("");
10536204fdf742cabc074617648a5b2cf62409dc40bSimon Glass	for (ch = ' '; ch < 127; ch++) {
10636204fdf742cabc074617648a5b2cf62409dc40bSimon Glass		if (!strchr("iuxs", ch)) {
10736204fdf742cabc074617648a5b2cf62409dc40bSimon Glass			*fmt = ch;
10836204fdf742cabc074617648a5b2cf62409dc40bSimon Glass			fmt[1] = '\0';
10936204fdf742cabc074617648a5b2cf62409dc40bSimon Glass			checkfail(fmt);
11036204fdf742cabc074617648a5b2cf62409dc40bSimon Glass		}
11136204fdf742cabc074617648a5b2cf62409dc40bSimon Glass	}
11236204fdf742cabc074617648a5b2cf62409dc40bSimon Glass
11336204fdf742cabc074617648a5b2cf62409dc40bSimon Glass	/* try a few modifiers at the end */
11436204fdf742cabc074617648a5b2cf62409dc40bSimon Glass	checkfail("sx");
11536204fdf742cabc074617648a5b2cf62409dc40bSimon Glass	checkfail("ihh");
11636204fdf742cabc074617648a5b2cf62409dc40bSimon Glass	checkfail("xb");
11736204fdf742cabc074617648a5b2cf62409dc40bSimon Glass
11836204fdf742cabc074617648a5b2cf62409dc40bSimon Glass	/* and one for the doomsday archives */
11936204fdf742cabc074617648a5b2cf62409dc40bSimon Glass	checkfail("He has all the virtues I dislike and none of the vices "
12036204fdf742cabc074617648a5b2cf62409dc40bSimon Glass			"I admire.");
12136204fdf742cabc074617648a5b2cf62409dc40bSimon Glass}
12236204fdf742cabc074617648a5b2cf62409dc40bSimon Glass
12336204fdf742cabc074617648a5b2cf62409dc40bSimon Glassint main(int argc, char *argv[])
12436204fdf742cabc074617648a5b2cf62409dc40bSimon Glass{
12536204fdf742cabc074617648a5b2cf62409dc40bSimon Glass	test_utilfdt_decode_type();
12636204fdf742cabc074617648a5b2cf62409dc40bSimon Glass	PASS();
12736204fdf742cabc074617648a5b2cf62409dc40bSimon Glass}
128