Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 51e6c252 authored by Colin Cross's avatar Colin Cross
Browse files

Make memunreachable_binder_test suitable for VTS

Link statically against libmemunreachable to avoid runtime
dependency on libmemunreachable.so.
Provide a better error when run as non-root.
Rename the test to MemunreachableBinderTest.
Add comments explaining the test sequence.

Bug: 28275695
Test: memunreachable_binder_test
Change-Id: Iddfba636205b7ca3ad31a6ba2c4e85abadd32d0d
parent cdf778f5
Loading
Loading
Loading
Loading
+3 −3
Original line number Original line Diff line number Diff line
@@ -20,7 +20,7 @@ cc_defaults {
    },
    },
}
}


cc_library_shared {
cc_library {
    name: "libmemunreachable",
    name: "libmemunreachable",
    defaults: ["libmemunreachable_defaults"],
    defaults: ["libmemunreachable_defaults"],
    srcs: [
    srcs: [
@@ -88,14 +88,14 @@ cc_test {
cc_test {
cc_test {
    name: "memunreachable_binder_test",
    name: "memunreachable_binder_test",
    defaults: ["libmemunreachable_defaults"],
    defaults: ["libmemunreachable_defaults"],
    test_suites: ["vts"],
    srcs: [
    srcs: [
        "tests/Binder_test.cpp",
        "tests/Binder_test.cpp",
        "tests/MemUnreachable_test.cpp",
    ],
    ],
    static_libs: ["libmemunreachable"],
    shared_libs: [
    shared_libs: [
        "libbinder",
        "libbinder",
        "libhwbinder",
        "libhwbinder",
        "libmemunreachable",
        "libutils",
        "libutils",
    ],
    ],
}
}
+14 −2
Original line number Original line Diff line number Diff line
@@ -33,6 +33,9 @@ namespace android {


static const String16 service_name("test.libmemunreachable_binder");
static const String16 service_name("test.libmemunreachable_binder");


// Provides a service that will hold a strong reference to any remote binder
// object, so that the test can verify that a remote strong reference is
// visible to libmemunreachable.
class BinderService : public BBinder {
class BinderService : public BBinder {
 public:
 public:
  BinderService() = default;
  BinderService() = default;
@@ -55,6 +58,8 @@ class BinderObject : public BBinder {
  ~BinderObject() = default;
  ~BinderObject() = default;
};
};


// Forks a subprocess that registers a BinderService with the global binder
// servicemanager.  Requires root permissions.
class ServiceProcess {
class ServiceProcess {
 public:
 public:
  ServiceProcess() : child_(0) {}
  ServiceProcess() : child_(0) {}
@@ -97,6 +102,7 @@ class ServiceProcess {
      fprintf(stderr, "Failed to get service manager\n");
      fprintf(stderr, "Failed to get service manager\n");
      return 1;
      return 1;
    }
    }
    // This step requires root permissions
    if (sm->addService(service_name, new BinderService()) != OK) {
    if (sm->addService(service_name, new BinderService()) != OK) {
      fprintf(stderr, "Failed to add test service\n");
      fprintf(stderr, "Failed to add test service\n");
      return 1;
      return 1;
@@ -110,12 +116,18 @@ class ServiceProcess {
  pid_t child_;
  pid_t child_;
};
};


class BinderTest : public ::testing::Test {
class MemunreachableBinderTest : public ::testing::Test {
 protected:
 protected:
  ServiceProcess service_process_;
  ServiceProcess service_process_;
};
};


TEST_F(BinderTest, binder) {
// Tests that a local binder object with a remote strong reference is visible
// through the libmemunreachable BinderReferences interface, which uses the
// getBinderKernelReferences method in libbinder.  Starts a BinderService
// through ServiceProcess as a remote service to hold the strong reference.
TEST_F(MemunreachableBinderTest, binder) {
  ASSERT_EQ(static_cast<uid_t>(0), getuid()) << "This test must be run as root.";

  ServiceProcess service_process;
  ServiceProcess service_process;
  ASSERT_TRUE(service_process.Run());
  ASSERT_TRUE(service_process.Run());