Make tests independent of structures in header files

This commit is contained in:
Thomas Lovén 2018-02-15 09:20:29 +01:00
parent 9dbbc7013c
commit 79ca4681ff
4 changed files with 39 additions and 30 deletions

View File

@ -10,8 +10,7 @@ void kmain(uint64_t multiboot_magic, void *multiboot_data)
vga_init(); vga_init();
debug_info("kernel loaded\n"); debug_info("kernel loaded\n");
multiboot_init(multiboot_magic, P2V(multiboot_data));
parse_multiboot(multiboot_magic, P2V(multiboot_data));
debug_info("Kernel was loaded with command line \"%s\", by <%s>\n", kernel_boot_data.commandline, kernel_boot_data.bootloader); debug_info("Kernel was loaded with command line \"%s\", by <%s>\n", kernel_boot_data.commandline, kernel_boot_data.bootloader);

View File

@ -28,7 +28,7 @@ int parse_multiboot2(struct mboot2_taglist *tags)
return 0; return 0;
} }
int parse_multiboot(uint64_t magic, void *mboot_info) int multiboot_init(uint64_t magic, void *mboot_info)
{ {
if(magic == MBOOT_REPLY) if(magic == MBOOT_REPLY)
{ {

View File

@ -2,11 +2,8 @@
#include <ttest.h> #include <ttest.h>
#include <debug.h> #include <debug.h>
#include <memory.h>
#undef debug #undef debug
#define debug(...) #define debug(...)
#undef P2V
#define P2V(addr) (void *)((uintptr_t)(addr))
#include "multiboot.c" #include "multiboot.c"
#include <string.h> #include <string.h>
@ -14,11 +11,24 @@
#define MAGIC 0x36D76289 #define MAGIC 0x36D76289
struct mboot2_tag *generate_tag(uint32_t type, void *data, uint32_t data_size) struct tag_st
{ {
struct mboot2_tag *tag = calloc(1, sizeof(struct mboot2_tag) + data_size); uint32_t type;
uint32_t size;
uint8_t data[];
}__attribute__((packed));
struct header
{
uint32_t size;
uint32_t _;
}__attribute__((packed));
struct tag_st *generate_tag(uint32_t type, void *data, uint32_t data_size)
{
struct tag_st *tag = calloc(1, sizeof(struct tag_st) + data_size);
tag->type = type; tag->type = type;
tag->size = sizeof(struct mboot2_tag) + data_size; tag->size = sizeof(struct tag_st) + data_size;
if(data_size) if(data_size)
memcpy(tag->data, data, data_size); memcpy(tag->data, data, data_size);
return tag; return tag;
@ -26,20 +36,20 @@ struct mboot2_tag *generate_tag(uint32_t type, void *data, uint32_t data_size)
#define padded_size(tag) (tag->size + ((tag->size%8)?(8-(tag->size%8)):0)) #define padded_size(tag) (tag->size + ((tag->size%8)?(8-(tag->size%8)):0))
struct mboot2_taglist *generate_taglist(int num, ...) struct header *generate_taglist(int num, ...)
{ {
va_list args; va_list args;
va_start(args, num); va_start(args, num);
uint32_t total_size = sizeof(struct mboot2_taglist); uint32_t total_size = sizeof(struct header);
struct mboot2_tag **tags = calloc(num, sizeof(struct mboot2_tag *)); struct tag_st **tags = calloc(num, sizeof(struct tag_st *));
for(int i = 0; i < num; i++) for(int i = 0; i < num; i++)
{ {
tags[i] = va_arg(args, struct mboot2_tag *); tags[i] = va_arg(args, struct tag_st *);
total_size += padded_size(tags[i]); total_size += padded_size(tags[i]);
} }
struct mboot2_taglist *taglist = calloc(1, total_size); struct header *taglist = calloc(1, total_size);
taglist->total_size = total_size; taglist->size = total_size;
int pos = 8; int pos = 8;
uint8_t *p = (uint8_t *)taglist; uint8_t *p = (uint8_t *)taglist;
@ -57,46 +67,46 @@ struct mboot2_taglist *generate_taglist(int num, ...)
TEST(correctly_identifies_multiboot2_magic) TEST(correctly_identifies_multiboot2_magic)
{ {
uint32_t tags[] = {16, 0, 0, 8}; uint32_t tags[] = {16, 0, 0, 8};
parse_multiboot(MAGIC, tags); multiboot_init(MAGIC, tags);
ASSERT_EQ_INT(kernel_boot_data.multiboot_version, 2); ASSERT_EQ_INT(kernel_boot_data.multiboot_version, 2);
} }
TEST(reads_boot_loader_name) TEST(reads_boot_loader_name)
{ {
char *name = "ttest"; char *name = "ttest";
struct mboot2_taglist *tags = generate_taglist(2, void *tags = generate_taglist(2,
generate_tag(2, name, strlen(name) + 1), generate_tag(2, name, strlen(name) + 1),
generate_tag(0,0,0)); generate_tag(0,0,0));
parse_multiboot(MAGIC, tags); multiboot_init(MAGIC, tags);
ASSERT_EQ_STR(kernel_boot_data.bootloader, name, strlen(name)); ASSERT_EQ_STR(kernel_boot_data.bootloader, name, strlen(name));
free(tags); free(tags);
} }
TEST(reads_kernel_commandline) TEST(reads_kernel_commandline)
{ {
char *cmd = "mittos64-kern boot"; char *cmd = "mittos64-kern boot";
struct mboot2_taglist *tags = generate_taglist(2, void *tags = generate_taglist(2,
generate_tag(1, cmd, strlen(cmd) + 1), generate_tag(1, cmd, strlen(cmd) + 1),
generate_tag(0,0,0)); generate_tag(0,0,0));
parse_multiboot(MAGIC, tags); multiboot_init(MAGIC, tags);
ASSERT_EQ_STR(kernel_boot_data.commandline, cmd, strlen(cmd)); ASSERT_EQ_STR(kernel_boot_data.commandline, cmd, strlen(cmd));
free(tags); free(tags);
} }
// Here are four very simmilar tests // Here are four very similar tests
// The difference is what values are checked and the order of the tags // The difference is what values are checked and the order of the tags
// Their existence is based on experience - helped me actually find a bug // Their existence is based on experience - helped me actually find a bug
TEST(reads_multiple_tags_1) TEST(reads_multiple_tags_1)
{ {
char *cmd = "mittos64-kern boot"; char *cmd = "mittos64-kern boot";
char *name = "ttest"; char *name = "ttest";
struct mboot2_taglist *tags = generate_taglist(3, void *tags = generate_taglist(3,
generate_tag(1, cmd, strlen(cmd) + 1), generate_tag(1, cmd, strlen(cmd) + 1),
generate_tag(2, name, strlen(name) + 1), generate_tag(2, name, strlen(name) + 1),
generate_tag(0,0,0) generate_tag(0,0,0)
); );
parse_multiboot(MAGIC, tags); multiboot_init(MAGIC, tags);
ASSERT_EQ_STR(kernel_boot_data.commandline, cmd, strlen(cmd)); ASSERT_EQ_STR(kernel_boot_data.commandline, cmd, strlen(cmd));
free(tags); free(tags);
} }
@ -104,13 +114,13 @@ TEST(reads_multiple_tags_2)
{ {
char *cmd = "mittos64-kern boot"; char *cmd = "mittos64-kern boot";
char *name = "ttest"; char *name = "ttest";
struct mboot2_taglist *tags = generate_taglist(3, void *tags = generate_taglist(3,
generate_tag(1, cmd, strlen(cmd) + 1), generate_tag(1, cmd, strlen(cmd) + 1),
generate_tag(2, name, strlen(name) + 1), generate_tag(2, name, strlen(name) + 1),
generate_tag(0,0,0) generate_tag(0,0,0)
); );
parse_multiboot(MAGIC, tags); multiboot_init(MAGIC, tags);
ASSERT_EQ_STR(kernel_boot_data.bootloader, name, strlen(name)); ASSERT_EQ_STR(kernel_boot_data.bootloader, name, strlen(name));
free(tags); free(tags);
} }
@ -118,13 +128,13 @@ TEST(reads_multiple_tags_3)
{ {
char *cmd = "mittos64-kern boot"; char *cmd = "mittos64-kern boot";
char *name = "ttest"; char *name = "ttest";
struct mboot2_taglist *tags = generate_taglist(3, void *tags = generate_taglist(3,
generate_tag(2, name, strlen(name) + 1), generate_tag(2, name, strlen(name) + 1),
generate_tag(1, cmd, strlen(cmd) + 1), generate_tag(1, cmd, strlen(cmd) + 1),
generate_tag(0,0,0) generate_tag(0,0,0)
); );
parse_multiboot(MAGIC, tags); multiboot_init(MAGIC, tags);
ASSERT_EQ_STR(kernel_boot_data.commandline, cmd, strlen(cmd)); ASSERT_EQ_STR(kernel_boot_data.commandline, cmd, strlen(cmd));
free(tags); free(tags);
} }
@ -132,13 +142,13 @@ TEST(reads_multiple_tags_4)
{ {
char *cmd = "mittos64-kern boot"; char *cmd = "mittos64-kern boot";
char *name = "ttest"; char *name = "ttest";
struct mboot2_taglist *tags = generate_taglist(3, void *tags = generate_taglist(3,
generate_tag(2, name, strlen(name) + 1), generate_tag(2, name, strlen(name) + 1),
generate_tag(1, cmd, strlen(cmd) + 1), generate_tag(1, cmd, strlen(cmd) + 1),
generate_tag(0,0,0) generate_tag(0,0,0)
); );
parse_multiboot(MAGIC, tags); multiboot_init(MAGIC, tags);
ASSERT_EQ_STR(kernel_boot_data.bootloader, name, strlen(name)); ASSERT_EQ_STR(kernel_boot_data.bootloader, name, strlen(name));
free(tags); free(tags);
} }

View File

@ -22,4 +22,4 @@ struct mboot2_tag {
#define MBOOT2_COMMANDLINE 1 #define MBOOT2_COMMANDLINE 1
#define MBOOT2_BOOTLOADER 2 #define MBOOT2_BOOTLOADER 2
int parse_multiboot(uint64_t magic, void *mboot_info); int multiboot_init(uint64_t magic, void *mboot_info);