#include #include // 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"})); } }