Merge "Support generation of make rule for vts profiler."
diff --git a/test/Android.bp b/test/Android.bp
index b5bd3f2..6c99082 100644
--- a/test/Android.bp
+++ b/test/Android.bp
@@ -24,7 +24,8 @@
         "android.hardware.tests.inheritance@1.0",
         "android.hardware.tests.pointer@1.0",
         "android.hardware.tests.memory@1.0",
-        "android.hidl.memory@1.0", // TODO remove this line when b/32185232 is fixed
+        "android.hidl.memory@1.0",
+        "android.hidl.token@1.0",
     ],
     static_libs: ["libgtest"],
 
@@ -39,7 +40,6 @@
         "android.hardware.tests.inheritance@1.0-impl",
         "android.hardware.tests.pointer@1.0-impl",
         "android.hardware.tests.memory@1.0-impl",
-        "android.hidl.memory@1.0-impl", // TODO remove this line when b/32185232 is fixed
     ],
 
     cflags: [
diff --git a/test/main.cpp b/test/main.cpp
index fb0e773..e56608c 100644
--- a/test/main.cpp
+++ b/test/main.cpp
@@ -7,6 +7,8 @@
 #include <android/hidl/memory/1.0/IAllocator.h>
 #include <android/hidl/memory/1.0/IMemory.h>
 
+#include <android/hidl/token/1.0/ITokenManager.h>
+
 #include <android/hardware/tests/foo/1.0/IFoo.h>
 #include <android/hardware/tests/foo/1.0/IFooCallback.h>
 #include <android/hardware/tests/foo/1.0/BnSimple.h>
@@ -106,6 +108,7 @@
 using ::android::hidl::manager::V1_0::IServiceNotification;
 using ::android::hidl::memory::V1_0::IAllocator;
 using ::android::hidl::memory::V1_0::IMemory;
+using ::android::hidl::token::V1_0::ITokenManager;
 using ::android::sp;
 using ::android::wp;
 using ::android::to_string;
@@ -317,6 +320,7 @@
 
 public:
     sp<IServiceManager> manager;
+    sp<ITokenManager> tokenManager;
     sp<IAllocator> ashmemAllocator;
     sp<IMemoryTest> memoryTest;
     sp<IFetcher> fetcher;
@@ -343,13 +347,17 @@
         ASSERT_NE(manager, nullptr);
         ASSERT_TRUE(manager->isRemote()); // manager is always remote
 
+        tokenManager = ITokenManager::getService("manager");
+        ASSERT_NE(tokenManager, nullptr);
+        ASSERT_TRUE(tokenManager->isRemote()); // tokenManager is always remote
+
+        ashmemAllocator = IAllocator::getService("ashmem");
+        ASSERT_NE(ashmemAllocator, nullptr);
+        ASSERT_TRUE(ashmemAllocator->isRemote()); // allocator is always remote
+
         // getStub is true if we are in passthrough mode to skip checking
         // binderized server, false for binderized mode.
 
-        ashmemAllocator = IAllocator::getService("ashmem", gMode == PASSTHROUGH /* getStub */);
-        ASSERT_NE(ashmemAllocator, nullptr);
-        ASSERT_EQ(ashmemAllocator->isRemote(), gMode == BINDERIZED);
-
         memoryTest = IMemoryTest::getService("memory", gMode == PASSTHROUGH /* getStub */);
         ASSERT_NE(memoryTest, nullptr);
         ASSERT_EQ(memoryTest->isRemote(), gMode == BINDERIZED);
@@ -427,7 +435,6 @@
         ALOGI("Environment setup beginning...");
 
         size_t i = 0;
-        addServer<IAllocator>("ashmem");
         addServer<IMemoryTest>("memory");
         addServer<IChild>("child");
         addServer<IParent>("parent");
@@ -447,6 +454,7 @@
 class HidlTest : public ::testing::Test {
 public:
     sp<IServiceManager> manager;
+    sp<ITokenManager> tokenManager;
     sp<IAllocator> ashmemAllocator;
     sp<IMemoryTest> memoryTest;
     sp<IFetcher> fetcher;
@@ -477,6 +485,7 @@
             env = gPassthroughEnvironment;
         }
         manager = env->manager;
+        tokenManager = env->tokenManager;
         ashmemAllocator = env->ashmemAllocator;
         memoryTest = env->memoryTest;
         fetcher = env->fetcher;
@@ -644,6 +653,29 @@
     }
 }
 
+TEST_F(HidlTest, TestToken) {
+    Return<uint64_t> ret = tokenManager->createToken(manager);
+    EXPECT_OK(ret);
+    uint64_t token = ret;
+
+    EXPECT_OK(tokenManager->get(token, [&](const auto &store) {
+        EXPECT_NE(nullptr, store.get());
+        sp<IServiceManager> retManager = IServiceManager::castFrom(store);
+
+        // TODO(b/33818800): should have only one Bp per process
+        // EXPECT_EQ(manager, retManager);
+
+        EXPECT_NE(nullptr, retManager.get());
+    }));
+
+    Return<bool> unregisterRet = tokenManager->unregister(token);
+
+    EXPECT_OK(unregisterRet);
+    if (unregisterRet.isOk()) {
+        EXPECT_TRUE(ret);
+    }
+}
+
 TEST_F(HidlTest, TestSharedMemory) {
     const uint8_t kValue = 0xCA;
     hidl_memory mem_copy;