blob: 28d27c9011468e40597b9053a795b519df862b59 [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 Jeffery097495c2018-02-22 11:36:13 +103032 for (const auto& attr : attributes)
33 {
34 fs::create_directory(root / attr);
35 }
36
37 fs::path tocFilePath = root / "ro" / PARTITION_TOC_FILE;
Andrew Jefferyd083efd2018-02-21 21:19:00 +103038
Andrew Jeffery812923d2018-02-22 11:59:52 +103039 for (const std::string& line : toc)
40 {
41 pnor_partition part;
Andrew Jefferyd083efd2018-02-21 21:19:00 +103042
Andrew Jeffery812923d2018-02-22 11:59:52 +103043 openpower::virtual_pnor::parseTocLine(line, blockSize, part);
44
45 /* Populate the partition in the tree */
Andrew Jeffery097495c2018-02-22 11:36:13 +103046 std::vector<char> zeroed(part.data.actual, 0);
47 fs::path partitionFilePath = root / "ro" / part.data.name;
48 std::ofstream(partitionFilePath)
49 .write(zeroed.data(), zeroed.size());
Andrew Jeffery812923d2018-02-22 11:59:52 +103050
51 /* Update the ToC if the partition file was created */
Andrew Jeffery097495c2018-02-22 11:36:13 +103052 std::ofstream(tocFilePath, std::ofstream::app) << line << "\n";
Andrew Jeffery812923d2018-02-22 11:59:52 +103053 }
Andrew Jefferyd083efd2018-02-21 21:19:00 +103054 }
55
Andrew Jeffery812923d2018-02-22 11:59:52 +103056 VpnorRoot(const VpnorRoot&) = delete;
57 VpnorRoot& operator=(const VpnorRoot&) = delete;
58 VpnorRoot(VpnorRoot&&) = delete;
59 VpnorRoot& operator=(VpnorRoot&&) = delete;
60
61 ~VpnorRoot()
62 {
63 fs::remove_all(root);
64 }
Andrew Jeffery097495c2018-02-22 11:36:13 +103065 fs::path ro()
Andrew Jeffery812923d2018-02-22 11:59:52 +103066 {
Andrew Jeffery097495c2018-02-22 11:36:13 +103067 return fs::path{root} / "ro";
68 }
69 fs::path rw()
70 {
71 return fs::path{root} / "rw";
72 }
73 fs::path prsv()
74 {
75 return fs::path{root} / "prsv";
76 }
77 fs::path patch()
78 {
79 return fs::path{root} / "patch";
Andrew Jeffery812923d2018-02-22 11:59:52 +103080 }
81 size_t write(const std::string& name, const void* data, size_t len);
82
83 private:
84 fs::path root;
Andrew Jeffery097495c2018-02-22 11:36:13 +103085 const std::string attributes[4] = {"ro", "rw", "prsv", "patch"};
Andrew Jeffery812923d2018-02-22 11:59:52 +103086};
Andrew Jefferyd083efd2018-02-21 21:19:00 +103087
88} // test
89} // virtual_pnor
90} // openpower