Home | History | Annotate | Download | only in lib
      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 
     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 
     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 
     67 int main(int argc, char* argv[]) {
     68   android::base::InitLogging(argv);
     69   testing::InitGoogleTest(&argc, argv);
     70   return RUN_ALL_TESTS();
     71 }
     72