/* * Copyright (C) 2018 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include #include #include #include #include "include/bpf/BpfMap.h" #include "include/bpf/BpfUtils.h" #include "include/libbpf_android.h" using ::testing::Test; constexpr const char tp_prog_path[] = "/sys/fs/bpf/prog_bpf_load_tp_prog_tracepoint_sched_sched_switch"; constexpr const char tp_map_path[] = "/sys/fs/bpf/map_bpf_load_tp_prog_cpu_pid_map"; namespace android { namespace bpf { class BpfLoadTest : public testing::Test { protected: BpfLoadTest() {} int mProgFd; void SetUp() { unlink(tp_prog_path); unlink(tp_map_path); bool critical = true; EXPECT_EQ(android::bpf::loadProg("/system/etc/bpf/bpf_load_tp_prog.o", &critical), 0); EXPECT_EQ(false, critical); mProgFd = bpf_obj_get(tp_prog_path); EXPECT_GT(mProgFd, 0); int ret = bpf_attach_tracepoint(mProgFd, "sched", "sched_switch"); EXPECT_NE(ret, 0); } void TearDown() { close(mProgFd); unlink(tp_prog_path); unlink(tp_map_path); } void checkMapNonZero() { // The test program installs a tracepoint on sched:sched_switch // and expects the kernel to populate a PID corresponding to CPU android::bpf::BpfMap m(tp_map_path); // Wait for program to run a little sleep(1); int non_zero = 0; const auto iterFunc = [&non_zero](const uint32_t& key, const uint32_t& val, BpfMap& map) { if (val && !non_zero) { non_zero = 1; } UNUSED(key); UNUSED(map); return base::Result(); }; EXPECT_RESULT_OK(m.iterateWithValue(iterFunc)); EXPECT_EQ(non_zero, 1); } }; TEST_F(BpfLoadTest, bpfCheckMap) { checkMapNonZero(); } } // namespace bpf } // namespace android