Adapters: allow adding a different instance name.

For testing or other purposes, it may make more sense
to register the new HAL with a different instance
name.

Change-Id: Ifab1b459f17b7b2d7ce4af75aee68a8de146e1d7
Fixes: 76819968
Test: adapter power HAL with new instance name
diff --git a/adapter/HidlBinderAdapter.cpp b/adapter/HidlBinderAdapter.cpp
index 71c9a8c..d368fca 100644
--- a/adapter/HidlBinderAdapter.cpp
+++ b/adapter/HidlBinderAdapter.cpp
@@ -37,10 +37,14 @@
 const static std::string kDeactivateProp = "test.hidl.adapters.deactivated";
 
 int usage(const std::string& me) {
-    std::cerr << "usage: " << me << " [-p] interface-name instance-name number-of-threads."
+    std::cerr << "usage: " << me
+              << " [-p] [-n instance-name] interface-name instance-name number-of-threads."
               << std::endl;
     std::cerr << "    -p: stop based on property " << kDeactivateProp << "and reset it."
               << std::endl;
+    std::cerr
+        << "    -n instance-name: register as a different instance name (does not de-register)"
+        << std::endl;
     return EINVAL;
 }
 
@@ -49,16 +53,21 @@
     std::string interface;     // e.x. IFoo
     std::string instanceName;  // e.x. default
     int threadNumber;
+    std::string registerInstanceName;  // e.x. default
 };
 
 bool processArguments(int argc, char** argv, Args* args) {
     int c;
-    while ((c = getopt(argc, argv, "p")) != -1) {
+    while ((c = getopt(argc, argv, "pn:")) != -1) {
         switch (c) {
             case 'p': {
                 args->propertyStop = true;
                 break;
             }
+            case 'n': {
+                args->registerInstanceName = optarg;
+                break;
+            }
             default: { return false; }
         }
     }
@@ -83,6 +92,10 @@
         return false;
     }
 
+    if (args->registerInstanceName.empty()) {
+        args->registerInstanceName = args->instanceName;
+    }
+
     return true;
 }
 
@@ -121,7 +134,8 @@
         return 1;
     }
 
-    std::cout << "Trying to adapt down " << interfaceName << "/" << args.instanceName << std::endl;
+    std::cout << "Trying to adapt down " << interfaceName << "/" << args.instanceName << " to "
+              << args.registerInstanceName << std::endl;
 
     configureRpcThreadpool(args.threadNumber, false /* callerWillJoin */);
 
@@ -143,7 +157,7 @@
         return 1;
     }
 
-    bool replaced = manager->add(args.instanceName, adapter).withDefault(false);
+    bool replaced = manager->add(args.registerInstanceName, adapter).withDefault(false);
     if (!replaced) {
         std::cerr << "ERROR: could not register the service with the service manager." << std::endl;
         return 1;
@@ -157,11 +171,14 @@
         getchar();
     }
 
-    bool restored = manager->add(args.instanceName, implementation).withDefault(false);
-    if (!restored) {
-        std::cerr << "ERROR: could not re-register interface with the service manager."
-                  << std::endl;
-        return 1;
+    // automatically unregistered on process exit if it is a new instance name
+    if (args.registerInstanceName == args.instanceName) {
+        bool restored = manager->add(args.instanceName, implementation).withDefault(false);
+        if (!restored) {
+            std::cerr << "ERROR: could not re-register interface with the service manager."
+                      << std::endl;
+            return 1;
+        }
     }
 
     std::cout << "Success." << std::endl;