diff --git a/tests/mts/bpf_existence_test.cpp b/tests/mts/bpf_existence_test.cpp index aa5654a5a5..c294e7bc8d 100644 --- a/tests/mts/bpf_existence_test.cpp +++ b/tests/mts/bpf_existence_test.cpp @@ -20,8 +20,6 @@ #include #include -#include -#include #include #include @@ -45,7 +43,7 @@ using android::modules::sdklevel::IsAtLeastT; class BpfExistenceTest : public ::testing::Test { }; -// Part of Android R platform, but mainlined in S +// Part of Android R platform (for 4.9+), but mainlined in S static const set PLATFORM_ONLY_IN_R = { PLATFORM "map_offload_tether_ingress_map", PLATFORM "map_offload_tether_limit_map", @@ -128,17 +126,18 @@ static const set MAINLINE_FOR_T_5_15_PLUS = { SHARED "prog_dscpPolicy_schedcls_set_dscp_ether", }; -void addAll(set* a, const set& b) { - a->insert(b.begin(), b.end()); +static void addAll(set& a, const set& b) { + a.insert(b.begin(), b.end()); } -#define DO_EXPECT(B, V) do { \ - if (B) addAll(expected, (V)); else addAll(unexpected, (V)); \ -} while (0) +#define DO_EXPECT(B, V) addAll((B) ? mustExist : mustNotExist, (V)) -void getFileLists(set* expected, set* unexpected) { - unexpected->clear(); - expected->clear(); +TEST_F(BpfExistenceTest, TestPrograms) { + // Only unconfined root is guaranteed to be able to access everything in /sys/fs/bpf. + ASSERT_EQ(0, getuid()) << "This test must run as root."; + + set mustExist; + set mustNotExist; // We do not actually check the platform P/Q (netd) and Q (clatd) things // and only verify the mainline module relevant R+ offload maps & progs. @@ -147,24 +146,23 @@ void getFileLists(set* expected, set* unexpected) { // and not to test the platform itself, which may have been modified by vendor or oems, // so we should only test for the removal of stuff that was mainline'd, // and for the presence of mainline stuff. - DO_EXPECT(IsAtLeastR() && !IsAtLeastS(), PLATFORM_ONLY_IN_R); + // R can potentially run on pre-4.9 kernel non-eBPF capable devices. + DO_EXPECT(IsAtLeastR() && !IsAtLeastS() && isAtLeastKernelVersion(4, 9, 0), PLATFORM_ONLY_IN_R); + + // S requires Linux Kernel 4.9+ and thus requires eBPF support. DO_EXPECT(IsAtLeastS(), MAINLINE_FOR_S_PLUS); DO_EXPECT(IsAtLeastS() && isAtLeastKernelVersion(5, 10, 0), MAINLINE_FOR_S_5_10_PLUS); // Nothing added or removed in SCv2. + // T still only requires Linux Kernel 4.9+. DO_EXPECT(IsAtLeastT(), MAINLINE_FOR_T_PLUS); DO_EXPECT(IsAtLeastT() && isAtLeastKernelVersion(4, 14, 0), MAINLINE_FOR_T_4_14_PLUS); DO_EXPECT(IsAtLeastT() && isAtLeastKernelVersion(5, 4, 0), MAINLINE_FOR_T_5_4_PLUS); DO_EXPECT(IsAtLeastT() && isAtLeastKernelVersion(5, 15, 0), MAINLINE_FOR_T_5_15_PLUS); -} -void checkFiles() { - set mustExist; - set mustNotExist; - - getFileLists(&mustExist, &mustNotExist); + // U requires Linux Kernel 4.14+, but nothing (as yet) added or removed in U. for (const auto& file : mustExist) { EXPECT_EQ(0, access(file.c_str(), R_OK)) << file << " does not exist"; @@ -178,19 +176,3 @@ void checkFiles() { } } } - -TEST_F(BpfExistenceTest, TestPrograms) { - SKIP_IF_BPF_NOT_SUPPORTED; - - // Pre-flight check to ensure test has been updated. - uint64_t buildVersionSdk = android_get_device_api_level(); - ASSERT_NE(0, buildVersionSdk) << "Unable to determine device SDK version"; - if (buildVersionSdk > __ANDROID_API_T__ && buildVersionSdk != __ANDROID_API_FUTURE__) { - FAIL() << "Unknown OS version " << buildVersionSdk << ", please update this test"; - } - - // Only unconfined root is guaranteed to be able to access everything in /sys/fs/bpf. - ASSERT_EQ(0, getuid()) << "This test must run as root."; - - checkFiles(); -}