diff options
author | Andrew Jeffery <andrew@aj.id.au> | 2018-02-22 15:19:04 +1030 |
---|---|---|
committer | Andrew Jeffery <andrew@aj.id.au> | 2018-03-24 13:59:32 +1030 |
commit | fe5cc8f6af4a17cda55d4c4d05c5a193023b9cdf (patch) | |
tree | 822d0a87c79ab473bde86f9a28443759f7d8b07a /test | |
parent | 097495c6278d3139dfd41f7a1265c004fe34d454 (diff) | |
download | phosphor-mboxd-fe5cc8f6af4a17cda55d4c4d05c5a193023b9cdf.tar.gz phosphor-mboxd-fe5cc8f6af4a17cda55d4c4d05c5a193023b9cdf.zip |
test: write_flash_vpnor: Integrate VpnorRoot
Change-Id: I5d49a090482d280317e75c7a7e2dc68d7fa265e2
Signed-off-by: Andrew Jeffery <andrew@aj.id.au>
Diffstat (limited to 'test')
-rw-r--r-- | test/vpnor/write_flash_vpnor.cpp | 107 |
1 files changed, 30 insertions, 77 deletions
diff --git a/test/vpnor/write_flash_vpnor.cpp b/test/vpnor/write_flash_vpnor.cpp index 049cb94..384c13a 100644 --- a/test/vpnor/write_flash_vpnor.cpp +++ b/test/vpnor/write_flash_vpnor.cpp @@ -37,6 +37,8 @@ extern "C" { #include <sys/ioctl.h> #include <fcntl.h> +#include "test/vpnor/tmpd.hpp" + uint8_t data[8] = {0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7}; #define BLOCK_SIZE 4096 @@ -46,61 +48,29 @@ uint8_t data[8] = {0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7}; #define ERASE_SIZE BLOCK_SIZE #define BLOCK_SIZE_SHIFT 12 -void init(struct mbox_context* ctx) -{ - - namespace fs = std::experimental::filesystem; - using namespace std::string_literals; - - std::string tocData = - "partition01=TEST1,00001000,00001400,ECC,READONLY\n"s + - "partition02=TEST2,00002000,00002008,ECC,READWRITE\n"s + - "partition03=TEST3,00003000,00003400,ECC,PRESERVED"s; - - std::vector<std::string> templatePaths = { - "/tmp/ro.XXXXXX", "/tmp/rw.XXXXXX", "/tmp/prsv.XXXXXX", - "/tmp/patch.XXXXXX"}; - - std::vector<std::string> partitions = {"TEST1", "TEST2", "TEST3"}; - - // create various partition directory - - std::string tmpROdir = mkdtemp(const_cast<char*>(templatePaths[0].c_str())); - assert(tmpROdir.length() != 0); +const std::string toc[] = { + "partition01=TEST1,00001000,00001400,ECC,READONLY", + "partition02=TEST2,00002000,00002008,ECC,READWRITE", + "partition03=TEST3,00003000,00003400,ECC,PRESERVED", +}; - std::string tmpRWdir = mkdtemp(const_cast<char*>(templatePaths[1].c_str())); - assert(tmpRWdir.length() != 0); +std::vector<std::string> partitions = {"TEST1", "TEST2", "TEST3"}; - std::string tmpPRSVdir = - mkdtemp(const_cast<char*>(templatePaths[2].c_str())); - assert(tmpPRSVdir.length() != 0); +namespace test = openpower::virtual_pnor::test; - std::string tmpPATCHdir = - mkdtemp(const_cast<char*>(templatePaths[3].c_str())); - assert(tmpPATCHdir.length() != 0); - - // create the toc file - fs::path tocFilePath = tmpROdir; - - tocFilePath /= PARTITION_TOC_FILE; - std::ofstream tocFile(tocFilePath.c_str()); - tocFile.write(tocData.c_str(), static_cast<int>(tocData.length())); - tocFile.close(); +void init(struct mbox_context* ctx, test::VpnorRoot& root) +{ + namespace fs = std::experimental::filesystem; + using namespace std::string_literals; // create the partition files in the ro directory for (auto partition : partitions) { - fs::path partitionFilePath{tmpROdir}; - partitionFilePath /= partition; - std::ofstream partitionFile(partitionFilePath.c_str()); - partitionFile.write(reinterpret_cast<char*>(data), sizeof(data)); - partitionFile.close(); + root.write(partition, data, sizeof(data)); } // copy partition2 file from ro to rw - std::string roFile = tmpROdir + "/" + "TEST2"; - std::string rwFile = tmpRWdir + "/" + "TEST2"; - assert(fs::copy_file(roFile, rwFile) == true); + assert(fs::copy_file(root.ro() / "TEST2", root.rw() / "TEST2")); mbox_vlog = &mbox_log_console; verbosity = (verbose)2; @@ -111,10 +81,10 @@ void init(struct mbox_context* ctx) ctx->flash_bmap = reinterpret_cast<uint8_t*>( calloc(MEM_SIZE >> ctx->erase_size_shift, sizeof(*ctx->flash_bmap))); - strcpy(ctx->paths.ro_loc, tmpROdir.c_str()); - strcpy(ctx->paths.rw_loc, tmpRWdir.c_str()); - strcpy(ctx->paths.prsv_loc, tmpPRSVdir.c_str()); - strcpy(ctx->paths.patch_loc, tmpPATCHdir.c_str()); + strcpy(ctx->paths.ro_loc, root.ro().c_str()); + strcpy(ctx->paths.rw_loc, root.rw().c_str()); + strcpy(ctx->paths.prsv_loc, root.prsv().c_str()); + strcpy(ctx->paths.patch_loc, root.patch().c_str()); } int main(void) @@ -127,16 +97,13 @@ int main(void) struct mbox_context* ctx = &context; memset(ctx, 0, sizeof(mbox_context)); - // Initialize the context before running the test case. - init(ctx); + test::VpnorRoot root(toc, BLOCK_SIZE); - std::string tmpROdir = ctx->paths.ro_loc; - std::string tmpRWdir = ctx->paths.rw_loc; - std::string tmpPRSVdir = ctx->paths.prsv_loc; - std::string tmpPATCHdir = ctx->paths.patch_loc; + // Initialize the context before running the test case. + init(ctx, root); // create the partition table - vpnor_create_partition_table_from_path(ctx, tmpROdir.c_str()); + vpnor_create_partition_table_from_path(ctx, root.ro().c_str()); // Write to psrv partition @@ -148,7 +115,7 @@ int main(void) rc = write_flash(ctx, (OFFSET * 3), src, sizeof(src)); assert(rc == 0); - auto fd = open((tmpPRSVdir + "/" + "TEST3").c_str(), O_RDONLY); + auto fd = open((root.prsv() / "TEST3").c_str(), O_RDONLY); auto map = mmap(NULL, MEM_SIZE, PROT_READ, MAP_PRIVATE, fd, 0); assert(map != MAP_FAILED); @@ -160,7 +127,7 @@ int main(void) // Write to the RO partition memset(src, 0x55, sizeof(src)); - fd = open((tmpROdir + "/" + "TEST1").c_str(), O_RDONLY); + fd = open((root.ro() / "TEST1").c_str(), O_RDONLY); map = mmap(NULL, MEM_SIZE, PROT_READ, MAP_PRIVATE, fd, 0); assert(map != MAP_FAILED); rc = write_flash(ctx, (OFFSET), src, sizeof(src)); @@ -172,7 +139,7 @@ int main(void) // Write to the RW partition memset(src, 0xbb, sizeof(src)); - fd = open((tmpRWdir + "/" + "TEST2").c_str(), O_RDONLY); + fd = open((root.rw() / "TEST2").c_str(), O_RDONLY); map = mmap(NULL, MEM_SIZE, PROT_READ, MAP_PRIVATE, fd, 0); assert(map != MAP_FAILED); rc = write_flash(ctx, (OFFSET * 2), src, sizeof(src)); @@ -216,11 +183,8 @@ int main(void) // Copy partition2 file from ro to patch to simulate a patch file that is // different from the one in rw (partition2 in rw was modified with the // previous write test) - fs::path roFile(tmpROdir); - roFile /= "TEST2"; - fs::path patchFile(tmpPATCHdir); - patchFile /= "TEST2"; - assert(fs::copy_file(roFile, patchFile) == true); + fs::path patch = root.patch() / "TEST2"; + assert(fs::copy_file(root.ro() / "TEST2", patch)); // Write arbitrary data char srcPatch[DATA_SIZE]{0}; @@ -229,9 +193,7 @@ int main(void) assert(rc == 0); // Check that partition file in RW location still contains the original data - fs::path rwFile(tmpRWdir); - rwFile /= "TEST2"; - fd = open(rwFile.c_str(), O_RDONLY); + fd = open((root.rw() / "TEST2").c_str(), O_RDONLY); map = mmap(NULL, MEM_SIZE, PROT_READ, MAP_PRIVATE, fd, 0); assert(map != MAP_FAILED); rc = memcmp(src, map, sizeof(src)); @@ -240,7 +202,7 @@ int main(void) close(fd); // Check that partition file in PATCH location was written with the new data - fd = open(patchFile.c_str(), O_RDONLY); + fd = open(patch.c_str(), O_RDONLY); map = mmap(NULL, MEM_SIZE, PROT_READ, MAP_PRIVATE, fd, 0); assert(map != MAP_FAILED); rc = memcmp(srcPatch, map, sizeof(srcPatch)); @@ -248,15 +210,6 @@ int main(void) munmap(map, MEM_SIZE); close(fd); - // Remove patch file so that subsequent tests don't use it - fs::remove(patchFile); - // END Test patch location - - fs::remove_all(fs::path{tmpROdir}); - fs::remove_all(fs::path{tmpRWdir}); - fs::remove_all(fs::path{tmpPRSVdir}); - fs::remove_all(fs::path{tmpPATCHdir}); - destroy_vpnor(ctx); free(ctx->flash_bmap); |