blob: d6847061f50670d0981f2fcef244f46ecddb4264 [file] [log] [blame]
Andrew Jefferyd083efd2018-02-21 21:19:00 +10301/* SPDX-License-Identifier: Apache-2.0 */
2/* Copyright (C) 2018 IBM Corp. */
3
4#include <assert.h>
5#include <string.h>
6#include <vector>
7#include <fstream>
8#include <experimental/filesystem>
9
10#include "config.h"
11#include "pnor_partition_table.hpp"
12
Andrew Jefferyd083efd2018-02-21 21:19:00 +103013namespace openpower
14{
15namespace virtual_pnor
16{
17namespace test
18{
19
Andrew Jeffery812923d2018-02-22 11:59:52 +103020namespace fs = std::experimental::filesystem;
21
22class VpnorRoot
Andrew Jefferyd083efd2018-02-21 21:19:00 +103023{
Andrew Jeffery812923d2018-02-22 11:59:52 +103024 public:
25 template <std::size_t N>
26 VpnorRoot(const std::string (&toc)[N], size_t blockSize)
Andrew Jefferyd083efd2018-02-21 21:19:00 +103027 {
Andrew Jeffery812923d2018-02-22 11:59:52 +103028 char tmplt[] = "/tmp/vpnor_root.XXXXXX";
29 char* tmpdir = mkdtemp(tmplt);
30 root = fs::path{tmpdir};
Andrew Jefferyd083efd2018-02-21 21:19:00 +103031
Andrew Jeffery812923d2018-02-22 11:59:52 +103032 fs::path tocFilePath{root};
33 tocFilePath /= PARTITION_TOC_FILE;
34 std::ofstream tocFile(tocFilePath.c_str());
Andrew Jefferyd083efd2018-02-21 21:19:00 +103035
Andrew Jeffery812923d2018-02-22 11:59:52 +103036 for (const std::string& line : toc)
37 {
38 pnor_partition part;
Andrew Jefferyd083efd2018-02-21 21:19:00 +103039
Andrew Jeffery812923d2018-02-22 11:59:52 +103040 openpower::virtual_pnor::parseTocLine(line, blockSize, part);
41
42 /* Populate the partition in the tree */
43 fs::path partitionFilePath{root};
44 partitionFilePath /= part.data.name;
45 std::ofstream partitionFile(partitionFilePath.c_str());
46 std::vector<char> empty(part.data.size, 0);
47 partitionFile.write(empty.data(), empty.size());
48 partitionFile.close();
49
50 /* Update the ToC if the partition file was created */
51 tocFile.write(line.c_str(), line.length());
52 tocFile.write("\n", 1);
53 }
54
55 tocFile.close();
Andrew Jefferyd083efd2018-02-21 21:19:00 +103056 }
57
Andrew Jeffery812923d2018-02-22 11:59:52 +103058 VpnorRoot(const VpnorRoot&) = delete;
59 VpnorRoot& operator=(const VpnorRoot&) = delete;
60 VpnorRoot(VpnorRoot&&) = delete;
61 VpnorRoot& operator=(VpnorRoot&&) = delete;
62
63 ~VpnorRoot()
64 {
65 fs::remove_all(root);
66 }
67 const fs::path& path()
68 {
69 return root;
70 }
71 size_t write(const std::string& name, const void* data, size_t len);
72
73 private:
74 fs::path root;
75};
Andrew Jefferyd083efd2018-02-21 21:19:00 +103076
77} // test
78} // virtual_pnor
79} // openpower