From 4edb58c594fbf9b2ecb970b5293b27263c9c778a Mon Sep 17 00:00:00 2001 From: Andrew Jeffery Date: Thu, 13 Apr 2017 15:10:15 +0930 Subject: test: Add write_window_dirty_erase Change-Id: I16d2488e75dde619da39d755e00666bc24778217 Signed-off-by: Andrew Jeffery --- test/write_window_dirty_erase.c | 167 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 167 insertions(+) create mode 100644 test/write_window_dirty_erase.c (limited to 'test/write_window_dirty_erase.c') diff --git a/test/write_window_dirty_erase.c b/test/write_window_dirty_erase.c new file mode 100644 index 0000000..c29c095 --- /dev/null +++ b/test/write_window_dirty_erase.c @@ -0,0 +1,167 @@ +/* + * MBox Daemon Test File + * + * Copyright 2017 IBM + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#include +#include + +#include "mbox.h" +#include "mboxd_msg.h" + +#include "test/mbox.h" +#include "test/system.h" + +static const uint8_t get_info[] = { + 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +}; + +static const uint8_t create_write_window[] = { + 0x06, 0x01, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +}; + +static const uint8_t mark_write_dirty_left[] = { + 0x07, 0x02, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +}; + +static const uint8_t mark_write_dirty_right[] = { + 0x07, 0x03, 0x02, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +}; + +static const uint8_t mark_write_erase_middle[] = { + 0x0a, 0x04, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +}; + +static const uint8_t mark_write_erase_left[] = { + 0x0a, 0x05, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +}; + +static const uint8_t mark_write_erase_right[] = { + 0x0a, 0x06, 0x02, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +}; + +static const uint8_t mark_write_dirty_middle[] = { + 0x07, 0x07, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +}; + +static const uint8_t write_flush[] = { + 0x08, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +}; + +static const uint8_t flush_response[] = { + 0x08, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 +}; + +const uint8_t start_data[] = { 0xaa, 0x55, 0xaa }; +const uint8_t flush_dirty_erased_dirty_data[] = { 0x55, 0xff, 0x55 }; +const uint8_t flush_erased_dirty_erased_data[] = { 0xff, 0x55, 0xff }; + +#define MEM_SIZE sizeof(start_data) +#define ERASE_SIZE 1 +#define N_WINDOWS 1 +#define WINDOW_SIZE sizeof(start_data) + +int main(void) +{ + struct mbox_context *ctx; + uint8_t *map; + int rc; + + system_set_reserved_size(MEM_SIZE); + system_set_mtd_sizes(MEM_SIZE, ERASE_SIZE); + + ctx = mbox_create_test_context(N_WINDOWS, WINDOW_SIZE); + rc = mbox_set_mtd_data(ctx, start_data, sizeof(start_data)); + assert(rc == 0); + + rc = mbox_command_dispatch(ctx, get_info, sizeof(get_info)); + assert(rc == 1); + + rc = mbox_command_dispatch(ctx, create_write_window, + sizeof(create_write_window)); + assert(rc == 1); + + /* { dirty, erased, dirty } */ + + ((uint8_t *)ctx->mem)[0] = 0x55; + + rc = mbox_command_dispatch(ctx, mark_write_dirty_left, + sizeof(mark_write_dirty_left)); + assert(rc == 1); + + ((uint8_t *)ctx->mem)[2] = 0x55; + + rc = mbox_command_dispatch(ctx, mark_write_dirty_right, + sizeof(mark_write_dirty_right)); + assert(rc == 1); + + rc = mbox_command_dispatch(ctx, mark_write_erase_middle, + sizeof(mark_write_erase_middle)); + assert(rc == 1); + + rc = mbox_command_dispatch(ctx, write_flush, sizeof(write_flush)); + assert(rc == 1); + + rc = mbox_cmp(ctx, flush_response, sizeof(flush_response)); + assert(rc == 0); + + map = mmap(NULL, MEM_SIZE, PROT_READ, MAP_PRIVATE, + ctx->fds[MTD_FD].fd, 0); + assert(map != MAP_FAILED); + + rc = memcmp(flush_dirty_erased_dirty_data, map, + sizeof(flush_dirty_erased_dirty_data)); + assert(rc == 0); + + /* { erased, dirty, erased } */ + + ((uint8_t *)ctx->mem)[1] = 0x55; + + rc = mbox_command_dispatch(ctx, mark_write_dirty_middle, + sizeof(mark_write_dirty_middle)); + assert(rc == 1); + + rc = mbox_command_dispatch(ctx, mark_write_erase_left, + sizeof(mark_write_erase_left)); + assert(rc == 1); + + rc = mbox_command_dispatch(ctx, mark_write_erase_right, + sizeof(mark_write_erase_right)); + assert(rc == 1); + + rc = mbox_command_dispatch(ctx, write_flush, sizeof(write_flush)); + assert(rc == 1); + + rc = mbox_cmp(ctx, flush_response, sizeof(flush_response)); + assert(rc == 0); + + rc = memcmp(flush_erased_dirty_erased_data, map, + sizeof(flush_erased_dirty_erased_data)); + assert(rc == 0); + + return rc; +} -- cgit v1.2.1