Skip to content

Commit

Permalink
test: read and dump sysfs tar file
Browse files Browse the repository at this point in the history
The library is able to scan the topology from a simple copy of
sysfs. There is no need to do any IOCTL, thus we can start test to
tree code.

This provides just the basic building blocks.

Signed-off-by: Daniel Wagner <[email protected]>
  • Loading branch information
igaw committed Feb 2, 2024
1 parent dfb421a commit 154c374
Show file tree
Hide file tree
Showing 7 changed files with 187 additions and 0 deletions.
22 changes: 22 additions & 0 deletions scripts/collect-sysfs.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
#!/usr/bin/env bash
# SPDX-License-Identifier: LGPL-2.1-or-later

filename=nvme-sysfs-$(hostname)-$(uname -r).tar.xz

declare -a dirs=(
"/sys/class/nvme"
"/sys/class/nvme-fabrics"
"/sys/class/nvme-generic"
"/sys/class/nvme-subsystem"
"/sys/bus/pci/slots"
)

files=""
for d in "${dirs[@]}"; do
files+="${d} "
for l in "${d}"/*; do
files+="$(readlink -f $l) "
done
done

tar -c -J -p -f "${filename}" ${files} 2> /dev/null
4 changes: 4 additions & 0 deletions test/meson.build
Original file line number Diff line number Diff line change
Expand Up @@ -97,3 +97,7 @@ endif

subdir('ioctl')
subdir('nbft')

if json_c_dep.found()
subdir('sysfs')
endif
32 changes: 32 additions & 0 deletions test/sysfs/data/nvme-sysfs-tw-carbon-6.8.0-rc1+.out
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
{
"hosts":[
{
"hostnqn":"nqn.2014-08.org.nvmexpress:uuid:ce4fee3e-c02c-11ee-8442-830d068a36c6",
"hostid":"ce4fee3e-c02c-11ee-8442-830d068a36c6",
"subsystems":[
{
"name":"nvme-subsys1",
"nqn":"nqn.2019-08.org.qemu:nvme-0",
"controllers":[
{
"name":"nvme1",
"transport":"pcie",
"traddr":"0000:00:05.0"
}
]
},
{
"name":"nvme-subsys0",
"nqn":"nqn.2019-08.org.qemu:subsys1",
"controllers":[
{
"name":"nvme0",
"transport":"pcie",
"traddr":"0000:0f:00.0"
}
]
}
]
}
]
}
Binary file not shown.
29 changes: 29 additions & 0 deletions test/sysfs/meson.build
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
# SPDX-License-Identifier: LGPL-2.1-or-later
#
# This file is part of libnvme.
# Copyright (c) 2024 SUSE LLC.
#
# Authors: Daniel Wagner <[email protected]>


sysfs = executable(
'test-sysfs',
['sysfs.c'],
dependencies: libnvme_dep,
include_directories: [incdir, internal_incdir]
)

sysfs_files= [
'nvme-sysfs-tw-carbon-6.8.0-rc1+'
]

setup = find_program('setup.sh')

foreach t_file : sysfs_files
r = run_command(setup, files('data'/t_file + '.tar.xz'), meson.current_build_dir(), check: true)
i = r.stdout().strip()
e0 = 'LIBNVME_SYSFS_PATH=' + i
e1 = 'LIBNVME_HOSTNQN=nqn.2014-08.org.nvmexpress:uuid:ce4fee3e-c02c-11ee-8442-830d068a36c6'
e2 = 'LIBNVME_HOSTID=ce4fee3e-c02c-11ee-8442-830d068a36c6'
test('sysfs', sysfs, args : [ i, t_file + '.out', files('data'/t_file + '.out') ], env : [ e0, e1, e2 ])
endforeach
11 changes: 11 additions & 0 deletions test/sysfs/setup.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
#!/usr/bin/env bash
# SPDX-License-Identifier: LGPL-2.1-or-later

TARFILE=$1
BASEDIR=$2
TESTDIR="$BASEDIR/$(basename -s .tar.xz ${TARFILE})"

mkdir -p "${TESTDIR}"
tar -x -f "${TARFILE}" -C "${TESTDIR}" || exit 1

echo "${TESTDIR}"
89 changes: 89 additions & 0 deletions test/sysfs/sysfs.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,89 @@
// SPDX-License-Identifier: LGPL-2.1-or-later
/**
* This file is part of libnvme.
* Copyright (c) 2024 Daniel Wagner, SUSE LLC
*/

#include "nvme/tree.h"
#include <assert.h>
#include <errno.h>
#include <string.h>
#include <stdbool.h>
#include <stdlib.h>
#include <arpa/inet.h>

#include <ccan/array_size/array_size.h>

#include <libnvme.h>
#include <nvme/private.h>

static bool test_sysfs(const char *path, const char *filename)
{
FILE *f;
nvme_root_t r;
int err;

f = fopen(filename, "w");
if (!f)
return false;

r = nvme_create_root(f, LOG_ERR);
assert(r);

err = nvme_scan_topology(r, NULL, NULL);
if (!err)
nvme_dump_tree(r);
fprintf(f, "\n");

nvme_free_tree(r);
fclose(f);

return err == 0;
}

static bool compare_content(const char *filename1, const char *filename2)
{
FILE *f1, *f2;
char c1, c2;
bool pass = false;

f1 = fopen(filename1, "r");
if (!f1)
return false;

f2 = fopen(filename2, "r");
if (!f2) {
fclose(f1);
return false;
}

do {
c1 = getc(f1);
c2 = getc(f2);
if (c1 != c2)
goto out;
} while (c1 != EOF || c2 != EOF);

if (c1 == c2)
pass = true;
out:
fclose(f1);
fclose(f2);

return pass;
}

int main(int argc, char *argv[])
{
bool pass = true;

if (argc < 4) {
fprintf(stderr, "usage: test-sysfs SYSFS_DIR OUTPUT_FILE COMPARE_FILE\n");
return EXIT_FAILURE;
}

pass &= test_sysfs(argv[1], argv[2]);
pass &= compare_content(argv[2], argv[3]);

exit(pass ? EXIT_SUCCESS : EXIT_FAILURE);
}

0 comments on commit 154c374

Please sign in to comment.