FqInstance::setTo accepts more formats.

FqInstance::setTo() by components allow interface
and instance names to be empty.

Test: run_all_host_tests
Bug: 73774955
Change-Id: I127c8856b8cb741fd11b2105d14b11854788afb4
diff --git a/utils/FqInstance.cpp b/utils/FqInstance.cpp
index 0b2b8f8..4689aae 100644
--- a/utils/FqInstance.cpp
+++ b/utils/FqInstance.cpp
@@ -62,11 +62,7 @@
     return !mInstance.empty();
 }
 
-bool FqInstance::setTo(const std::string& s) {
-    auto pos = s.find(INSTANCE_SEP);
-    if (!mFqName.setTo(s.substr(0, pos))) return false;
-    mInstance = pos == std::string::npos ? std::string{} : s.substr(pos + 1);
-
+bool FqInstance::isValid() const {
     bool hasPkg = hasPackage();
     bool hasVer = hasVersion();
     bool hasIntf = hasInterface();
@@ -91,12 +87,19 @@
     return !hasInst;
 }
 
+bool FqInstance::setTo(const std::string& s) {
+    auto pos = s.find(INSTANCE_SEP);
+    if (!mFqName.setTo(s.substr(0, pos))) return false;
+    mInstance = pos == std::string::npos ? std::string{} : s.substr(pos + 1);
+
+    return isValid();
+}
+
 bool FqInstance::setTo(const std::string& package, size_t majorVer, size_t minorVer,
                        const std::string& interface, const std::string& instance) {
-    std::stringstream ss;
-    ss << package << "@" << majorVer << "." << minorVer << "::" << interface << INSTANCE_SEP
-       << instance;
-    return setTo(ss.str());
+    if (!mFqName.setTo(package, majorVer, minorVer, interface)) return false;
+    mInstance = instance;
+    return isValid();
 }
 
 bool FqInstance::setTo(size_t majorVer, size_t minorVer, const std::string& interface,
@@ -105,7 +108,7 @@
 }
 
 bool FqInstance::setTo(const std::string& interface, const std::string& instance) {
-    return setTo(interface + INSTANCE_SEP + instance);
+    return setTo(0u, 0u, interface, instance);
 }
 
 std::string FqInstance::string() const {