/* * 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. */ /* * Stand-alone tests for the ioctls in the vsoc driver. */ #include "uapi/vsoc_shm.h" #include <atomic> #include <stdint.h> #include "common/vsoc/lib/e2e_test_region_view.h" #include "guest/vsoc/lib/manager_region_view.h" #include <android-base/logging.h> #include <gtest/gtest.h> void BasicWaitForSignal(vsoc::E2EPrimaryRegionView* region, uint32_t expected_start, uint32_t expected_finish) { ASSERT_EQ(expected_start, region->read_guest_self_register()); int rval = region->wait_guest_self_register(expected_start); EXPECT_LE(0, rval); EXPECT_GT(5, rval); EXPECT_EQ(expected_finish, region->read_guest_self_register()); } TEST(FutexTest, BasicFutexTests) { constexpr uint32_t INITIAL_SIGNAL = 0; constexpr uint32_t SILENT_UPDATE_SIGNAL = 1; constexpr uint32_t WAKE_SIGNAL = 2; auto region = vsoc::E2EPrimaryRegionView::GetInstance(); ASSERT_TRUE(region != NULL); LOG(INFO) << "Regions are open"; region->write_guest_self_register(INITIAL_SIGNAL); std::thread waiter(BasicWaitForSignal, region, INITIAL_SIGNAL, WAKE_SIGNAL); sleep(1); LOG(INFO) << "Still waiting. Trying to wake wrong address"; region->signal_guest_to_host_register(); sleep(1); LOG(INFO) << "Still waiting. Trying to wake without update"; region->signal_guest_self_register(); sleep(1); LOG(INFO) << "Still waiting. Trying to wake without signal"; region->write_guest_self_register(SILENT_UPDATE_SIGNAL); sleep(1); LOG(INFO) << "Still waiting. Trying to wake with signal"; region->write_guest_self_register(WAKE_SIGNAL); region->signal_guest_self_register(); waiter.join(); LOG(INFO) << "Wake worked"; LOG(INFO) << "PASS: BasicPeerTests"; } int main(int argc, char* argv[]) { android::base::InitLogging(argv); testing::InitGoogleTest(&argc, argv); return RUN_ALL_TESTS(); }