test: vpnor: Add toc_flags

Exercises the flags associated with FFS properties.

Change-Id: Id710784cbbf3115712f7ce55e1fd38c8889b2c1f
Signed-off-by: Andrew Jeffery <andrew@aj.id.au>
diff --git a/test/vpnor/Makefile.am.include b/test/vpnor/Makefile.am.include
index 68eeb7b..4defe01 100644
--- a/test/vpnor/Makefile.am.include
+++ b/test/vpnor/Makefile.am.include
@@ -100,6 +100,13 @@
 test_vpnor_toc_no_version_LDFLAGS = $(OESDK_TESTCASE_FLAGS)
 test_vpnor_toc_no_version_LDADD = $(VPNOR_LDADD)
 
+test_vpnor_toc_flags_SOURCES = \
+	common.c \
+	pnor_partition_table.cpp \
+	%reldir%/toc_flags.cpp
+test_vpnor_toc_flags_LDFLAGS = $(OESDK_TESTCASE_FLAGS)
+test_vpnor_toc_flags_LDADD = $(VPNOR_LDADD)
+
 if VIRTUAL_PNOR_ENABLED
 check_PROGRAMS += \
 	%reldir%/create_pnor_partition_table \
@@ -112,5 +119,8 @@
 	%reldir%/toc_start_gt_end \
 	%reldir%/toc_no_start \
 	%reldir%/toc_no_end \
-	%reldir%/toc_no_version
+	%reldir%/toc_no_version \
+	%reldir%/toc_flags
+
+XFAIL_TESTS += %reldir%/toc_flags
 endif
diff --git a/test/vpnor/toc_flags.cpp b/test/vpnor/toc_flags.cpp
new file mode 100644
index 0000000..6e134e5
--- /dev/null
+++ b/test/vpnor/toc_flags.cpp
@@ -0,0 +1,77 @@
+// SPDX-License-Identifier: Apache-2.0
+// Copyright (C) 2018 IBM Corp.
+
+#include "config.h"
+#include <assert.h>
+
+#include "common.h"
+#include "pnor_partition_defs.h"
+#include "pnor_partition_table.hpp"
+
+static constexpr auto BLOCK_SIZE = 4 * 1024;
+static constexpr auto DATA_MASK = ((1 << 24) - 1);
+
+int main()
+{
+    namespace vpnor = openpower::virtual_pnor;
+
+    struct pnor_partition part;
+    std::string line;
+
+    mbox_vlog = mbox_log_console;
+    verbosity = MBOX_LOG_DEBUG;
+
+    line = "partition01=FOO,00001000,00002000,80,ECC";
+    vpnor::parseTocLine(line, BLOCK_SIZE, part);
+    assert((part.data.user.data[0]) == PARTITION_ECC_PROTECTED);
+    assert(!(part.data.user.data[1] & DATA_MASK));
+
+    line = "partition01=FOO,00001000,00002000,80,PRESERVED";
+    vpnor::parseTocLine(line, BLOCK_SIZE, part);
+    assert(!(part.data.user.data[0]));
+    assert((part.data.user.data[1] & DATA_MASK) == PARTITION_PRESERVED);
+
+    line = "partition01=FOO,00001000,00002000,80,READONLY";
+    vpnor::parseTocLine(line, BLOCK_SIZE, part);
+    assert(!(part.data.user.data[0]));
+    assert((part.data.user.data[1] & DATA_MASK) == PARTITION_READONLY);
+
+    /* BACKUP is unimplemented */
+    line = "partition01=FOO,00001000,00002000,80,BACKUP";
+    vpnor::parseTocLine(line, BLOCK_SIZE, part);
+    assert(!(part.data.user.data[0]));
+    assert(!(part.data.user.data[1] & DATA_MASK));
+
+    line = "partition01=FOO,00001000,00002000,80,REPROVISION";
+    vpnor::parseTocLine(line, BLOCK_SIZE, part);
+    assert(!(part.data.user.data[0]));
+    assert((part.data.user.data[1] & DATA_MASK) == PARTITION_REPROVISION);
+
+    line = "partition01=FOO,00001000,00002000,80,VOLATILE";
+    vpnor::parseTocLine(line, BLOCK_SIZE, part);
+    assert(!(part.data.user.data[0]));
+    assert((part.data.user.data[1] & DATA_MASK) == PARTITION_VOLATILE);
+
+    line = "partition01=FOO,00001000,00002000,80,CLEARECC";
+    vpnor::parseTocLine(line, BLOCK_SIZE, part);
+    assert(!(part.data.user.data[0]));
+    assert((part.data.user.data[1] & DATA_MASK) == PARTITION_CLEARECC);
+
+    line = "partition01=FOO,00001000,00002000,80,READWRITE";
+    vpnor::parseTocLine(line, BLOCK_SIZE, part);
+    assert(!(part.data.user.data[0]));
+    assert(((part.data.user.data[1] & DATA_MASK) ^ PARTITION_READONLY) ==
+           PARTITION_READONLY);
+
+    line = "partition01=FOO,00001000,00002000,80,";
+    vpnor::parseTocLine(line, BLOCK_SIZE, part);
+    assert(!(part.data.user.data[0]));
+    assert(!(part.data.user.data[1] & DATA_MASK));
+
+    line = "partition01=FOO,00001000,00002000,80,junk";
+    vpnor::parseTocLine(line, BLOCK_SIZE, part);
+    assert(!(part.data.user.data[0]));
+    assert(!(part.data.user.data[1] & DATA_MASK));
+
+    return 0;
+}