1296434Sjilles/*- 2296434Sjilles * Copyright (c) 2016 Jilles Tjoelker <jilles@FreeBSD.org> 3296434Sjilles * All rights reserved. 4296434Sjilles * 5296434Sjilles * Redistribution and use in source and binary forms, with or without 6296434Sjilles * modification, are permitted provided that the following conditions 7296434Sjilles * are met: 8296434Sjilles * 1. Redistributions of source code must retain the above copyright 9296434Sjilles * notice, this list of conditions and the following disclaimer. 10296434Sjilles * 2. Redistributions in binary form must reproduce the above copyright 11296434Sjilles * notice, this list of conditions and the following disclaimer in the 12296434Sjilles * documentation and/or other materials provided with the distribution. 13296434Sjilles * 14296434Sjilles * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 15296434Sjilles * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 16296434Sjilles * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 17296434Sjilles * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 18296434Sjilles * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 19296434Sjilles * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 20296434Sjilles * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 21296434Sjilles * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 22296434Sjilles * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 23296434Sjilles * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 24296434Sjilles * SUCH DAMAGE. 25296434Sjilles */ 26296434Sjilles 27296434Sjilles#include <sys/cdefs.h> 28296434Sjilles__FBSDID("$FreeBSD$"); 29296434Sjilles 30296434Sjilles#include <assert.h> 31296434Sjilles#include <stdio.h> 32296434Sjilles#include <stdlib.h> 33296434Sjilles#include <string.h> 34296434Sjilles 35296434Sjilles#include <atf-c.h> 36296434Sjilles 37296434SjillesATF_TC_WITHOUT_HEAD(zero); 38296434SjillesATF_TC_BODY(zero, tc) 39296434Sjilles{ 40296434Sjilles 41296434Sjilles assert(memcmp("a", "b", 0) == 0); 42296434Sjilles assert(memcmp("", "", 0) == 0); 43296434Sjilles} 44296434Sjilles 45296434SjillesATF_TC_WITHOUT_HEAD(eq); 46296434SjillesATF_TC_BODY(eq, tc) 47296434Sjilles{ 48296434Sjilles unsigned char data1[256], data2[256]; 49296434Sjilles int i; 50296434Sjilles 51296434Sjilles for (i = 0; i < 256; i++) 52296434Sjilles data1[i] = data2[i] = i ^ 0x55; 53296434Sjilles for (i = 1; i < 256; i++) 54296434Sjilles assert(memcmp(data1, data2, i) == 0); 55296434Sjilles for (i = 1; i < 256; i++) 56296434Sjilles assert(memcmp(data1 + i, data2 + i, 256 - i) == 0); 57296434Sjilles} 58296434Sjilles 59296434SjillesATF_TC_WITHOUT_HEAD(neq); 60296434SjillesATF_TC_BODY(neq, tc) 61296434Sjilles{ 62296434Sjilles unsigned char data1[256], data2[256]; 63296434Sjilles int i; 64296434Sjilles 65296434Sjilles for (i = 0; i < 256; i++) { 66296434Sjilles data1[i] = i; 67296434Sjilles data2[i] = i ^ 0x55; 68296434Sjilles } 69296434Sjilles for (i = 1; i < 256; i++) 70296434Sjilles assert(memcmp(data1, data2, i) != 0); 71296434Sjilles for (i = 1; i < 256; i++) 72296434Sjilles assert(memcmp(data1 + i, data2 + i, 256 - i) != 0); 73296434Sjilles} 74296434Sjilles 75296434SjillesATF_TC_WITHOUT_HEAD(diff); 76296434SjillesATF_TC_BODY(diff, tc) 77296434Sjilles{ 78296434Sjilles unsigned char data1[256], data2[256]; 79296434Sjilles int i; 80296434Sjilles 81296434Sjilles memset(data1, 'a', sizeof(data1)); 82296434Sjilles memset(data2, 'a', sizeof(data2)); 83296434Sjilles data1[128] = 255; 84296434Sjilles data2[128] = 0; 85296434Sjilles for (i = 1; i < 66; i++) { 86296434Sjilles assert(memcmp(data1 + 128, data2 + 128, i) == 255); 87296434Sjilles assert(memcmp(data2 + 128, data1 + 128, i) == -255); 88296434Sjilles assert(memcmp(data1 + 129 - i, data2 + 129 - i, i) == 255); 89296434Sjilles assert(memcmp(data2 + 129 - i, data1 + 129 - i, i) == -255); 90296434Sjilles assert(memcmp(data1 + 129 - i, data2 + 129 - i, i * 2) == 255); 91296434Sjilles assert(memcmp(data2 + 129 - i, data1 + 129 - i, i * 2) == -255); 92296434Sjilles } 93296434Sjilles data1[128] = 'c'; 94296434Sjilles data2[128] = 'e'; 95296434Sjilles for (i = 1; i < 66; i++) { 96296434Sjilles assert(memcmp(data1 + 128, data2 + 128, i) == -2); 97296434Sjilles assert(memcmp(data2 + 128, data1 + 128, i) == 2); 98296434Sjilles assert(memcmp(data1 + 129 - i, data2 + 129 - i, i) == -2); 99296434Sjilles assert(memcmp(data2 + 129 - i, data1 + 129 - i, i) == 2); 100296434Sjilles assert(memcmp(data1 + 129 - i, data2 + 129 - i, i * 2) == -2); 101296434Sjilles assert(memcmp(data2 + 129 - i, data1 + 129 - i, i * 2) == 2); 102296434Sjilles } 103296434Sjilles memset(data1 + 129, 'A', sizeof(data1) - 129); 104296434Sjilles memset(data2 + 129, 'Z', sizeof(data2) - 129); 105296434Sjilles for (i = 1; i < 66; i++) { 106296434Sjilles assert(memcmp(data1 + 128, data2 + 128, i) == -2); 107296434Sjilles assert(memcmp(data2 + 128, data1 + 128, i) == 2); 108296434Sjilles assert(memcmp(data1 + 129 - i, data2 + 129 - i, i) == -2); 109296434Sjilles assert(memcmp(data2 + 129 - i, data1 + 129 - i, i) == 2); 110296434Sjilles assert(memcmp(data1 + 129 - i, data2 + 129 - i, i * 2) == -2); 111296434Sjilles assert(memcmp(data2 + 129 - i, data1 + 129 - i, i * 2) == 2); 112296434Sjilles } 113296434Sjilles} 114296434Sjilles 115296434SjillesATF_TP_ADD_TCS(tp) 116296434Sjilles{ 117296434Sjilles 118296434Sjilles ATF_TP_ADD_TC(tp, zero); 119296434Sjilles ATF_TP_ADD_TC(tp, eq); 120296434Sjilles ATF_TP_ADD_TC(tp, neq); 121296434Sjilles ATF_TP_ADD_TC(tp, diff); 122296434Sjilles 123296434Sjilles return (atf_no_error()); 124296434Sjilles} 125