1 /*
2 * Copyright (C) 2018 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17 /*
18 * Stand-alone tests for the ioctls in the vsoc driver.
19 */
20
21 #include "uapi/vsoc_shm.h"
22 #include <atomic>
23 #include <stdint.h>
24 #include "common/vsoc/lib/e2e_test_region_view.h"
25 #include "guest/vsoc/lib/manager_region_view.h"
26
27 #include <android-base/logging.h>
28 #include <gtest/gtest.h>
29
BasicWaitForSignal(vsoc::E2EPrimaryRegionView * region,uint32_t expected_start,uint32_t expected_finish)30 void BasicWaitForSignal(vsoc::E2EPrimaryRegionView* region,
31 uint32_t expected_start,
32 uint32_t expected_finish) {
33 ASSERT_EQ(expected_start, region->read_guest_self_register());
34 int rval = region->wait_guest_self_register(expected_start);
35 EXPECT_LE(0, rval);
36 EXPECT_GT(5, rval);
37 EXPECT_EQ(expected_finish, region->read_guest_self_register());
38 }
39
TEST(FutexTest,BasicFutexTests)40 TEST(FutexTest, BasicFutexTests) {
41 constexpr uint32_t INITIAL_SIGNAL = 0;
42 constexpr uint32_t SILENT_UPDATE_SIGNAL = 1;
43 constexpr uint32_t WAKE_SIGNAL = 2;
44 auto region = vsoc::E2EPrimaryRegionView::GetInstance();
45 ASSERT_TRUE(region != NULL);
46 LOG(INFO) << "Regions are open";
47 region->write_guest_self_register(INITIAL_SIGNAL);
48 std::thread waiter(BasicWaitForSignal, region, INITIAL_SIGNAL, WAKE_SIGNAL);
49 sleep(1);
50 LOG(INFO) << "Still waiting. Trying to wake wrong address";
51 region->signal_guest_to_host_register();
52 sleep(1);
53 LOG(INFO) << "Still waiting. Trying to wake without update";
54 region->signal_guest_self_register();
55 sleep(1);
56 LOG(INFO) << "Still waiting. Trying to wake without signal";
57 region->write_guest_self_register(SILENT_UPDATE_SIGNAL);
58 sleep(1);
59 LOG(INFO) << "Still waiting. Trying to wake with signal";
60 region->write_guest_self_register(WAKE_SIGNAL);
61 region->signal_guest_self_register();
62 waiter.join();
63 LOG(INFO) << "Wake worked";
64 LOG(INFO) << "PASS: BasicPeerTests";
65 }
66
main(int argc,char * argv[])67 int main(int argc, char* argv[]) {
68 android::base::InitLogging(argv);
69 testing::InitGoogleTest(&argc, argv);
70 return RUN_ALL_TESTS();
71 }
72