test: vpnor: Add create_write_window_unmapped

Deny attempts to open write windows to flash space that is unmapped in
the ToC. This gives explicit feedback that any data written would not be
persisted if it were possible create the write window in the first
place.

Change-Id: I0e7967247b122aa8d0c1de38af43162ba0ccc8fa
Signed-off-by: Andrew Jeffery <andrew@aj.id.au>
diff --git a/test/vpnor/Makefile.am.include b/test/vpnor/Makefile.am.include
index 96f0421..0abb82c 100644
--- a/test/vpnor/Makefile.am.include
+++ b/test/vpnor/Makefile.am.include
@@ -315,6 +315,19 @@
 test_vpnor_create_write_window_rw_partition_LDFLAGS = $(OESDK_TESTCASE_FLAGS)
 test_vpnor_create_write_window_rw_partition_LDADD = $(VPNOR_LDADD)
 
+test_vpnor_create_write_window_unmapped_SOURCES = \
+	$(TEST_MBOX_VPNOR_SRCS) $(TEST_MOCK_SRCS) \
+	mboxd_msg.c \
+	mboxd_windows.c \
+	mboxd_lpc.c \
+	mboxd_lpc_virtual.cpp \
+	mboxd_pnor_partition_table.cpp \
+	mboxd_flash_virtual.cpp \
+	pnor_partition.cpp \
+	%reldir%/create_write_window_unmapped.cpp
+test_vpnor_create_write_window_unmapped_LDFLAGS = $(OESDK_TESTCASE_FLAGS)
+test_vpnor_create_write_window_unmapped_LDADD = $(VPNOR_LDADD)
+
 if VIRTUAL_PNOR_ENABLED
 check_PROGRAMS += \
 	%reldir%/create_pnor_partition_table \
@@ -343,7 +356,9 @@
 	%reldir%/create_read_window_size \
 	%reldir%/create_read_window_remap \
 	%reldir%/create_write_window_ro_partition \
-	%reldir%/create_write_window_rw_partition
+	%reldir%/create_write_window_rw_partition \
+	%reldir%/create_write_window_unmapped
 
 XFAIL_TESTS += %reldir%/create_write_window_ro_partition
+XFAIL_TESTS += %reldir%/create_write_window_unmapped
 endif
diff --git a/test/vpnor/create_write_window_unmapped.cpp b/test/vpnor/create_write_window_unmapped.cpp
new file mode 100644
index 0000000..b493fad
--- /dev/null
+++ b/test/vpnor/create_write_window_unmapped.cpp
@@ -0,0 +1,65 @@
+// SPDX-License-Identifier: Apache-2.0
+// Copyright (C) 2018 IBM Corp.
+
+#include <assert.h>
+
+#include "config.h"
+#include "mboxd_pnor_partition_table.h"
+
+extern "C" {
+#include "test/mbox.h"
+#include "test/system.h"
+}
+
+#include "test/vpnor/tmpd.hpp"
+
+static constexpr auto BLOCK_SIZE = 0x1000;
+static constexpr auto ERASE_SIZE = BLOCK_SIZE;
+static constexpr auto N_WINDOWS = 1;
+static constexpr auto WINDOW_SIZE = BLOCK_SIZE;
+static constexpr auto MEM_SIZE = WINDOW_SIZE;
+static constexpr auto PNOR_SIZE = 3 * BLOCK_SIZE;
+
+const std::string toc[] = {
+    "partition01=HBB,00001000,00002000,80,ECC,READWRITE",
+};
+
+static const uint8_t get_info[] = {0x02, 0x00, 0x02, 0x00, 0x00, 0x00,
+                                   0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+                                   0x00, 0x00, 0x00, 0x00};
+
+// offset 0x100 and size 6
+static const uint8_t create_write_window[] = {
+    0x06, 0x01, 0x02, 0x00, 0x01, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
+
+static const uint8_t response[] = {0x06, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
+                                   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07};
+
+namespace test = openpower::virtual_pnor::test;
+
+int main()
+{
+    struct mbox_context *ctx;
+
+    system_set_reserved_size(MEM_SIZE);
+    system_set_mtd_sizes(PNOR_SIZE, ERASE_SIZE);
+
+    ctx = mbox_create_test_context(N_WINDOWS, WINDOW_SIZE);
+
+    test::VpnorRoot root(ctx, toc, BLOCK_SIZE);
+
+    init_vpnor_from_paths(ctx);
+
+    int rc = mbox_command_dispatch(ctx, get_info, sizeof(get_info));
+    assert(rc == MBOX_R_SUCCESS);
+
+    rc = mbox_command_dispatch(ctx, create_write_window,
+                               sizeof(create_write_window));
+    assert(rc == MBOX_R_WINDOW_ERROR);
+
+    rc = mbox_cmp(ctx, response, sizeof(response));
+    assert(rc == 0);
+
+    return rc;
+}