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