added more test cases, fixed negative integers bug

This commit is contained in:
Juri Glass 2011-07-08 15:20:35 +02:00
parent eb020c7cab
commit 709e2292b6
9 changed files with 257 additions and 38 deletions

View file

@ -22,8 +22,8 @@
#include <stdio.h>
u64 sml_number_parse(sml_buffer *buf, unsigned char type, int max_size) {
int l, i;
int l, i, j;
unsigned char b;
u64 n = 0;
if (sml_buf_get_next_type(buf) != type) {
buf->error = 1;
@ -36,13 +36,24 @@ u64 sml_number_parse(sml_buffer *buf, unsigned char type, int max_size) {
return 0;
}
// TODO: this doesn't work for integers (leading 1's)
// mathias runge: -> fixed bug in sml_value_parse for SML_TYPE_INTEGER -> see comment in sml_value.cpp
// maybe this one is fixed too?
for (i = 0; i < l; i++) {
n <<= 8;
n |= sml_buf_get_current_byte(buf);
sml_buf_update_bytes_read(buf, 1);
b = sml_buf_get_current_byte(buf);
// negative value with leading 1's
if (type == SML_TYPE_INTEGER && b & 128) {
n =~ n;
b = 0xFF;
for (i = 0; i < l; i++) {
n <<= 8;
n |= b;
n = (n & ~b) | sml_buf_get_current_byte(buf);
sml_buf_update_bytes_read(buf, 1);
}
}
else {
for (i = 0; i < l; i++) {
n <<= 8;
n |= sml_buf_get_current_byte(buf);
sml_buf_update_bytes_read(buf, 1);
}
}
return n;
}

View file

@ -6,12 +6,15 @@ UNITY = \
unity/unity_fixture.o
OBJS = \
src/test_sml_octet_string.o
src/test_helper.o \
src/sml_octet_string_test.o \
src/sml_buffer_test.o \
src/sml_number_test.o
test_run: libsml test
@./test
test : $(UNITY) $(OBJS)
test : $(UNITY) $(OBJS) $(LIBSML)
$(CC) $(CFLAGS) $(LIBSML) $^ test_main.c -o test
.PHONY: code
@ -24,7 +27,7 @@ libsml :
.PHONY: clean
clean :
@rm -f unity/*.o
@rm -f src/*.tst
@rm -f src/*.o

View file

@ -0,0 +1,34 @@
#include "../unity/unity_fixture.h"
#include <sml/sml_shared.h>
TEST_GROUP(sml_buffer);
int buffer_len = 512;
sml_buffer *buf;
TEST_SETUP(sml_buffer) {
buf = sml_buffer_init(buffer_len);
}
TEST_TEAR_DOWN(sml_buffer) {
}
TEST(sml_buffer, init_defaults) {
TEST_ASSERT_NOT_NULL(buf);
TEST_ASSERT_NOT_NULL(buf->buffer);
TEST_ASSERT_EQUAL(buffer_len, buf->buffer_len);
TEST_ASSERT_EQUAL(0, buf->cursor);
TEST_ASSERT_EQUAL(0, buf->error);
TEST_ASSERT_NULL(buf->error_msg);
}
TEST_GROUP_RUNNER(sml_buffer) {
RUN_TEST_CASE(sml_buffer, init_defaults);
}

101
test/src/sml_number_test.c Normal file
View file

@ -0,0 +1,101 @@
#include "../unity/unity_fixture.h"
#include "test_helper.h"
#include <sml/sml_number.h>
TEST_GROUP(sml_number);
sml_buffer *buf;
TEST_SETUP(sml_number) {
buf = sml_buffer_init(512);
}
TEST_TEAR_DOWN(sml_number) {
}
TEST(sml_number, parse_unsigned8) {
hex2binary("6201", sml_buf_get_current_buf(buf));
u8 n = sml_u8_parse(buf);
TEST_ASSERT_EQUAL(1, n);
}
TEST(sml_number, parse_unsigned16) {
hex2binary("630101", sml_buf_get_current_buf(buf));
u16 n = sml_u16_parse(buf);
TEST_ASSERT_EQUAL(257, n);
}
TEST(sml_number, parse_unsigned32) {
hex2binary("6500000001", sml_buf_get_current_buf(buf));
u32 n = sml_u32_parse(buf);
TEST_ASSERT_EQUAL(1, n);
}
TEST(sml_number, parse_unsigned32_fewer_bytes) {
hex2binary("64010001", sml_buf_get_current_buf(buf));
u32 n = sml_u32_parse(buf);
TEST_ASSERT_EQUAL(65537, n);
}
TEST(sml_number, parse_unsigned64) {
hex2binary("690000000000000001", sml_buf_get_current_buf(buf));
u64 n = sml_u64_parse(buf);
TEST_ASSERT_EQUAL(1, n);
}
TEST(sml_number, parse_unsigned64_fewer_bytes) {
hex2binary("67000000000001", sml_buf_get_current_buf(buf));
u64 n = sml_u64_parse(buf);
TEST_ASSERT_EQUAL(1, n);
}
TEST(sml_number, parse_int8) {
hex2binary("52FF", sml_buf_get_current_buf(buf));
i8 n = sml_i8_parse(buf);
TEST_ASSERT_EQUAL(-1, n);
}
TEST(sml_number, parse_int16) {
hex2binary("53EC78", sml_buf_get_current_buf(buf));
i16 n = sml_i16_parse(buf);
TEST_ASSERT_EQUAL(-5000, n);
}
TEST(sml_number, parse_int32) {
hex2binary("55FFFFFFFF", sml_buf_get_current_buf(buf));
i32 n = sml_i32_parse(buf);
TEST_ASSERT_EQUAL(-1, n);
}
TEST(sml_number, parse_int64) {
hex2binary("59FFFFFFFFFFFFFFFF", sml_buf_get_current_buf(buf));
i64 n = sml_i64_parse(buf);
TEST_ASSERT_EQUAL(-1, n);
}
TEST(sml_number, parse_int64_fewer_bytes) {
hex2binary("58FFFFFFFFFFEC78", sml_buf_get_current_buf(buf));
i64 n = sml_i64_parse(buf);
TEST_ASSERT_EQUAL(-5000, n);
}
TEST_GROUP_RUNNER(sml_number) {
RUN_TEST_CASE(sml_number, parse_unsigned8);
RUN_TEST_CASE(sml_number, parse_unsigned16);
RUN_TEST_CASE(sml_number, parse_unsigned32);
RUN_TEST_CASE(sml_number, parse_unsigned64);
RUN_TEST_CASE(sml_number, parse_unsigned32_fewer_bytes);
RUN_TEST_CASE(sml_number, parse_unsigned64_fewer_bytes);
RUN_TEST_CASE(sml_number, parse_int8);
RUN_TEST_CASE(sml_number, parse_int16);
RUN_TEST_CASE(sml_number, parse_int32);
RUN_TEST_CASE(sml_number, parse_int64);
RUN_TEST_CASE(sml_number, parse_int64_fewer_bytes);
}

View file

@ -0,0 +1,51 @@
#include "../unity/unity_fixture.h"
#include "test_helper.h"
#include <sml/sml_octet_string.h>
TEST_GROUP(sml_octet_string);
sml_buffer *buf;
void expected_octet_string(octet_string *str, char *content, int len) {
TEST_ASSERT_NOT_NULL(str);
TEST_ASSERT_EQUAL(len, str->len);
TEST_ASSERT_EQUAL_MEMORY(content, str->str, len);
}
TEST_SETUP(sml_octet_string) {
buf = sml_buffer_init(512);
}
TEST_TEAR_DOWN(sml_octet_string) {
}
TEST(sml_octet_string, init) {
octet_string *str = sml_octet_string_init((unsigned char *)"hallo", 5);
TEST_ASSERT_EQUAL(5, str->len);
TEST_ASSERT_EQUAL_MEMORY("hallo", str->str, 5);
}
TEST(sml_octet_string, parse) {
hex2binary("0648616C6C6F", sml_buf_get_current_buf(buf));
octet_string *str = sml_octet_string_parse(buf);
expected_octet_string(str, "Hallo", 5);
}
TEST(sml_octet_string, parse_multiple_tl_fields) {
hex2binary("8102616161616F6161616161616161616161", sml_buf_get_current_buf(buf));
octet_string *str = sml_octet_string_parse(buf);
expected_octet_string(str, "aaaaoaaaaaaaaaaa", 16);
}
TEST_GROUP_RUNNER(sml_octet_string) {
RUN_TEST_CASE(sml_octet_string, init);
RUN_TEST_CASE(sml_octet_string, parse);
RUN_TEST_CASE(sml_octet_string, parse_multiple_tl_fields);
}

36
test/src/test_helper.c Normal file
View file

@ -0,0 +1,36 @@
#include "test_helper.h"
#include <stdint.h>
#include <string.h>
uint8_t test_helper_ctoi(uint8_t c){
uint8_t ret = 0;
if((c >= '0') && (c <= '9')){
ret = c - '0';
} else if((c >= 'a') && (c <= 'f')){
ret = c - 'a' + 10;
} else if((c >= 'A') && (c <= 'F')){
ret = c - 'A' + 10;
}
return ret;
}
inline uint8_t test_helper_c2toi(uint8_t c1, uint8_t c2){
return test_helper_ctoi(c1) << 4 | test_helper_ctoi(c2);
}
inline uint8_t test_helper_c2ptoi(char* c){
return test_helper_ctoi((uint8_t)c[0]) << 4 | test_helper_ctoi((uint8_t)c[1]);
}
int hex2binary(char *hex, unsigned char *buf) {
int i;
int len = strlen(hex);
for (i = 0; i < (len /2); i++) {
buf[i] = test_helper_c2ptoi(&(hex[i * 2]));
}
return i;
}

7
test/src/test_helper.h Normal file
View file

@ -0,0 +1,7 @@
#ifndef TEST_HELPER_H_
#define TEST_HELPER_H_
int hex2binary(char *hex, unsigned char *buf);
#endif

View file

@ -1,26 +0,0 @@
#include "../unity/unity_fixture.h"
#include <sml/sml_octet_string.h>
TEST_GROUP(sml_octet_string);
TEST_SETUP(sml_octet_string) {
}
TEST_TEAR_DOWN(sml_octet_string) {
}
TEST(sml_octet_string, init) {
octet_string *str = sml_octet_string_init((unsigned char *)"hallo", 5);
TEST_ASSERT_TRUE(str->len == 5)
}
TEST_GROUP_RUNNER(sml_octet_string) {
RUN_TEST_CASE(sml_octet_string, init);
}

View file

@ -2,6 +2,8 @@
static void runAllTests() {
RUN_TEST_GROUP(sml_octet_string);
RUN_TEST_GROUP(sml_buffer);
RUN_TEST_GROUP(sml_number);
}
int main(int argc, char * argv[]) {