Merge changes from topic "fcm_version"

* changes:
  Add AssembleVintfTest
  assemble_vintf: warn for missing env var for fwk_cm.empty.xml
  Add Named<T> in place of std::pair<std::string, T>
  assemble_vintf: move logic to CompatibilityMatrix::combine
  Use base::Split to replace tokenize() function.
  assemble_vintf: refactor to prepare for test
diff --git a/VintfObject.cpp b/VintfObject.cpp
index a49fc24..8dd08ef 100644
--- a/VintfObject.cpp
+++ b/VintfObject.cpp
@@ -79,11 +79,11 @@
     std::unique_lock<std::mutex> _lock(gDeviceManifestMutex);
 
 #ifdef LIBVINTF_TARGET
-    std::string productModel = android::base::GetProperty("ro.product.model", "");
+    std::string productModel = android::base::GetProperty("ro.boot.product.hardware.sku", "");
     if (!productModel.empty()) {
         auto product = Get(&gProductManifest, skipCache,
                            std::bind(&HalManifest::fetchAllInformation, _1,
-                                     "/odm/manifest_" + productModel + ".xml", _2));
+                                     "/odm/etc/manifest_" + productModel + ".xml", _2));
         if (product != nullptr) {
             return product;
         }
@@ -91,7 +91,7 @@
 #endif
 
     auto odm = Get(&gOdmManifest, skipCache,
-                   std::bind(&HalManifest::fetchAllInformation, _1, "/odm/manifest.xml", _2));
+                   std::bind(&HalManifest::fetchAllInformation, _1, "/odm/etc/manifest.xml", _2));
     if (odm != nullptr) {
         return odm;
     }
diff --git a/test/vintf_object_tests.cpp b/test/vintf_object_tests.cpp
index 3033dfe..61eb4df 100644
--- a/test/vintf_object_tests.cpp
+++ b/test/vintf_object_tests.cpp
@@ -175,10 +175,10 @@
     MockFileFetcher* fetcher = static_cast<MockFileFetcher*>(gFetcher);
 
     if (!productModel.empty()) {
-        ON_CALL(*fetcher, fetch(StrEq("/odm/manifest_" + productModel + ".xml"), _))
+        ON_CALL(*fetcher, fetch(StrEq("/odm/etc/manifest_" + productModel + ".xml"), _))
             .WillByDefault(Return(::android::NAME_NOT_FOUND));
     }
-    ON_CALL(*fetcher, fetch(StrEq("/odm/manifest.xml"), _))
+    ON_CALL(*fetcher, fetch(StrEq("/odm/etc/manifest.xml"), _))
         .WillByDefault(Return(::android::NAME_NOT_FOUND));
     ON_CALL(*fetcher, fetch(StrEq("/vendor/manifest.xml"), _))
         .WillByDefault(Invoke([vendorManifestXml](const std::string& path, std::string& fetched) {
@@ -218,7 +218,7 @@
     virtual void SetUp() {
         mounter().reset();
 #ifdef LIBVINTF_TARGET
-        productModel = android::base::GetProperty("ro.product.model", "");
+        productModel = android::base::GetProperty("ro.boot.product.hardware.sku", "");
 #endif
         setupMockFetcher(vendorManifestXml1, systemMatrixXml1, systemManifestXml1, vendorMatrixXml1,
                          productModel);
@@ -236,9 +236,9 @@
     std::vector<std::string> packageInfo;
 
     if (!productModel.empty()) {
-        EXPECT_CALL(fetcher(), fetch(StrEq("/odm/manifest_" + productModel + ".xml"), _));
+        EXPECT_CALL(fetcher(), fetch(StrEq("/odm/etc/manifest_" + productModel + ".xml"), _));
     }
-    EXPECT_CALL(fetcher(), fetch(StrEq("/odm/manifest.xml"), _));
+    EXPECT_CALL(fetcher(), fetch(StrEq("/odm/etc/manifest.xml"), _));
     EXPECT_CALL(fetcher(), fetch(StrEq("/vendor/manifest.xml"), _));
     EXPECT_CALL(fetcher(), fetch(StrEq("/system/manifest.xml"), _));
     EXPECT_CALL(fetcher(), fetch(StrEq("/vendor/compatibility_matrix.xml"), _));
@@ -279,9 +279,9 @@
     std::vector<std::string> packageInfo = {systemMatrixXml1};
 
     if (!productModel.empty()) {
-        EXPECT_CALL(fetcher(), fetch(StrEq("/odm/manifest_" + productModel + ".xml"), _));
+        EXPECT_CALL(fetcher(), fetch(StrEq("/odm/etc/manifest_" + productModel + ".xml"), _));
     }
-    EXPECT_CALL(fetcher(), fetch(StrEq("/odm/manifest.xml"), _));
+    EXPECT_CALL(fetcher(), fetch(StrEq("/odm/etc/manifest.xml"), _));
     EXPECT_CALL(fetcher(), fetch(StrEq("/vendor/manifest.xml"), _));
     EXPECT_CALL(fetcher(), fetch(StrEq("/system/manifest.xml"), _));
     EXPECT_CALL(fetcher(), fetch(StrEq("/vendor/compatibility_matrix.xml"), _));
@@ -344,9 +344,9 @@
     std::vector<std::string> packageInfo = {systemMatrixXml1, systemManifestXml1};
 
     if (!productModel.empty()) {
-        EXPECT_CALL(fetcher(), fetch(StrEq("/odm/manifest_" + productModel + ".xml"), _));
+        EXPECT_CALL(fetcher(), fetch(StrEq("/odm/etc/manifest_" + productModel + ".xml"), _));
     }
-    EXPECT_CALL(fetcher(), fetch(StrEq("/odm/manifest.xml"), _));
+    EXPECT_CALL(fetcher(), fetch(StrEq("/odm/etc/manifest.xml"), _));
     EXPECT_CALL(fetcher(), fetch(StrEq("/vendor/manifest.xml"), _));
     EXPECT_CALL(fetcher(), fetch(StrEq("/system/manifest.xml"), _)).Times(0);
     EXPECT_CALL(fetcher(), fetch(StrEq("/vendor/compatibility_matrix.xml"), _));
@@ -386,9 +386,10 @@
             vendorMatrixXml1, vendorManifestXml1};
 
     if (!productModel.empty()) {
-        EXPECT_CALL(fetcher(), fetch(StrEq("/odm/manifest_" + productModel + ".xml"), _)).Times(0);
+        EXPECT_CALL(fetcher(), fetch(StrEq("/odm/etc/manifest_" + productModel + ".xml"), _))
+            .Times(0);
     }
-    EXPECT_CALL(fetcher(), fetch(StrEq("/odm/manifest.xml"), _)).Times(0);
+    EXPECT_CALL(fetcher(), fetch(StrEq("/odm/etc/manifest.xml"), _)).Times(0);
     EXPECT_CALL(fetcher(), fetch(StrEq("/vendor/manifest.xml"), _)).Times(0);
     EXPECT_CALL(fetcher(), fetch(StrEq("/system/manifest.xml"), _)).Times(0);
     EXPECT_CALL(fetcher(), fetch(StrEq("/vendor/compatibility_matrix.xml"), _)).Times(0);
@@ -429,7 +430,7 @@
     virtual void SetUp() {
         mounter().reset();
 #ifdef LIBVINTF_TARGET
-        productModel = android::base::GetProperty("ro.product.model", "");
+        productModel = android::base::GetProperty("ro.boot.product.hardware.sku", "");
 #endif
         setupMockFetcher(vendorManifestXml1, systemMatrixXml2, systemManifestXml1, vendorMatrixXml1,
                          productModel);
@@ -447,9 +448,9 @@
     std::vector<std::string> packageInfo;
 
     if (!productModel.empty()) {
-        EXPECT_CALL(fetcher(), fetch(StrEq("/odm/manifest_" + productModel + ".xml"), _));
+        EXPECT_CALL(fetcher(), fetch(StrEq("/odm/etc/manifest_" + productModel + ".xml"), _));
     }
-    EXPECT_CALL(fetcher(), fetch(StrEq("/odm/manifest.xml"), _));
+    EXPECT_CALL(fetcher(), fetch(StrEq("/odm/etc/manifest.xml"), _));
     EXPECT_CALL(fetcher(), fetch(StrEq("/vendor/manifest.xml"), _));
     EXPECT_CALL(fetcher(), fetch(StrEq("/system/manifest.xml"), _));
     EXPECT_CALL(fetcher(), fetch(StrEq("/vendor/compatibility_matrix.xml"), _));
@@ -466,9 +467,9 @@
     std::vector<std::string> packageInfo = {systemMatrixXml1};
 
     if (!productModel.empty()) {
-        EXPECT_CALL(fetcher(), fetch(StrEq("/odm/manifest_" + productModel + ".xml"), _));
+        EXPECT_CALL(fetcher(), fetch(StrEq("/odm/etc/manifest_" + productModel + ".xml"), _));
     }
-    EXPECT_CALL(fetcher(), fetch(StrEq("/odm/manifest.xml"), _));
+    EXPECT_CALL(fetcher(), fetch(StrEq("/odm/etc/manifest.xml"), _));
     EXPECT_CALL(fetcher(), fetch(StrEq("/vendor/manifest.xml"), _));
     EXPECT_CALL(fetcher(), fetch(StrEq("/system/manifest.xml"), _));
     EXPECT_CALL(fetcher(), fetch(StrEq("/vendor/compatibility_matrix.xml"), _));