beegfs/common/tests/TestStorageTk.cpp
2025-08-10 01:34:16 +02:00

91 lines
3.7 KiB
C++

#include <common/toolkit/StorageTk.h>
#include <gtest/gtest.h>
// full set of characters allowed in path components, properly escaped as by /proc/mounts
#define FULL_SET "\001\002\003\004\005\006\007\010\\011\\012\013\014\015\016\017\020\021" \
"\022\023\024\025\026\027\030\031\032\033\034\035\036\037\\040!\"#$%&'()*+,-.0123456789:;<=>?" \
"@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\134]^_`abcdefghijklmnopqrstuvwxyz{|}~\177\200\201\202\203\204" \
"\205\206\207\210\211\212\213\214\215\216\217\220\221\222\223\224\225\226\227\230\231\232\233" \
"\234\235\236\237\240\241\242\243\244\245\246\247\250\251\252\253\254\255\256\257\260\261\262" \
"\263\264\265\266\267\270\271\272\273\274\275\276\277\300\301\302\303\304\305\306\307\310\311" \
"\312\313\314\315\316\317\320\321\322\323\324\325\326\327\330\331\332\333\334\335\336\337\340" \
"\341\342\343\344\345\346\347\350\351\352\353\354\355\356\357\360\361\362\363\364\365\366\367" \
"\370\371\372\373\374\375\376\377"
#define FULL_SET_RAW "\001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021" \
"\022\023\024\025\026\027\030\031\032\033\034\035\036\037\040!\"#$%&'()*+,-.0123456789:;<=>?" \
"@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\134]^_`abcdefghijklmnopqrstuvwxyz{|}~\177\200\201\202\203\204" \
"\205\206\207\210\211\212\213\214\215\216\217\220\221\222\223\224\225\226\227\230\231\232\233" \
"\234\235\236\237\240\241\242\243\244\245\246\247\250\251\252\253\254\255\256\257\260\261\262" \
"\263\264\265\266\267\270\271\272\273\274\275\276\277\300\301\302\303\304\305\306\307\310\311" \
"\312\313\314\315\316\317\320\321\322\323\324\325\326\327\330\331\332\333\334\335\336\337\340" \
"\341\342\343\344\345\346\347\350\351\352\353\354\355\356\357\360\361\362\363\364\365\366\367" \
"\370\371\372\373\374\375\376\377"
TEST(StorageTk, findMountedPrefix)
{
static const char* inputFile =
"/dev/root / tmpfs rw 0 0\n"
"/dev/sda1 /test/foo/bar xfs rw 0 0\n"
"/dev/sda1 /test/fo ext4 rw 0 0\n"
"/dev/sda1 /test/" FULL_SET " ext4 rw 0 0\n"
"/dev/sda1 /test/foo ext4 rw 0 0\n";
{
std::stringstream file;
ASSERT_FALSE(StorageTk::findLongestMountedPrefix("", file).first);
}
{
std::stringstream file;
ASSERT_FALSE(StorageTk::findLongestMountedPrefix("relative", file).first);
}
{
std::stringstream file;
file.setstate(std::stringstream::failbit);
ASSERT_FALSE(StorageTk::findLongestMountedPrefix("/", file).first);
}
{
std::stringstream file;
auto res = StorageTk::findLongestMountedPrefix("/test", file);
ASSERT_FALSE(res.first);
}
{
std::stringstream file(inputFile);
auto res = StorageTk::findLongestMountedPrefix("/test/foo1", file);
ASSERT_TRUE(res.first);
ASSERT_EQ(res.second, (Mount{"/dev/root", "/", "tmpfs"}));
}
{
std::stringstream file(inputFile);
auto res = StorageTk::findLongestMountedPrefix("/test/foo/bar/baz", file);
ASSERT_TRUE(res.first);
ASSERT_EQ(res.second, (Mount{"/dev/sda1", "/test/foo/bar", "xfs"}));
}
{
std::stringstream file(inputFile);
auto res = StorageTk::findLongestMountedPrefix("/test/foo", file);
ASSERT_TRUE(res.first);
ASSERT_EQ(res.second, (Mount{"/dev/sda1", "/test/foo", "ext4"}));
}
{
std::stringstream file(inputFile);
auto res = StorageTk::findLongestMountedPrefix("/test/" FULL_SET_RAW, file);
ASSERT_TRUE(res.first);
ASSERT_EQ(res.second, (Mount{"/dev/sda1", "/test/" FULL_SET_RAW, "ext4"}));
}
{
std::stringstream file(inputFile);
auto res = StorageTk::findLongestMountedPrefix("/test/" FULL_SET_RAW "/sub", file);
ASSERT_TRUE(res.first);
ASSERT_EQ(res.second, (Mount{"/dev/sda1", "/test/" FULL_SET_RAW, "ext4"}));
}
}