Add arg for overwriting class loader class path

Added stored_context srgument to EncodeContextForOatFile that
overwrites the class path when non-null.

This is used by the --stored-class-loader-context argument. Fixed
the test.

Bug: 70934104
Bug: 67345922
Test: test-art-host-gtest

Change-Id: If877d8cfe9d34eeaa941e9f6df2e12539d9c4a6f
diff --git a/dex2oat/dex2oat_test.cc b/dex2oat/dex2oat_test.cc
index 710a6af..bc8468e 100644
--- a/dex2oat/dex2oat_test.cc
+++ b/dex2oat/dex2oat_test.cc
@@ -2126,10 +2126,26 @@
 }
 
 TEST_F(Dex2oatClassLoaderContextTest, StoredClassLoaderContext) {
+  std::vector<std::unique_ptr<const DexFile>> dex_files = OpenTestDexFiles("MultiDex");
   const std::string out_dir = GetScratchDir();
   const std::string odex_location = out_dir + "/base.odex";
-  const std::string valid_context = "PCL[" + GetUsedDexLocation() + "]";
+  const std::string valid_context = "PCL[" + dex_files[0]->GetLocation() + "]";
   const std::string stored_context = "PCL[/system/not_real_lib.jar]";
+  std::string expected_stored_context = "PCL[";
+  size_t index = 1;
+  for (const std::unique_ptr<const DexFile>& dex_file : dex_files) {
+    const bool is_first = index == 1u;
+    if (!is_first) {
+      expected_stored_context += ":";
+    }
+    expected_stored_context += "/system/not_real_lib.jar";
+    if (!is_first) {
+      expected_stored_context += "!classes" + std::to_string(index) + ".dex";
+    }
+    expected_stored_context += "*" + std::to_string(dex_file->GetLocationChecksum());
+    ++index;
+  }
+  expected_stored_context +=    + "]";
   // The class path should not be valid and should fail being stored.
   GenerateOdexForTest(GetTestDexFileName("ManyMethods"),
                       odex_location,
@@ -2138,8 +2154,8 @@
                       true,  // expect_success
                       false,  // use_fd
                       [&](const OatFile& oat_file) {
-    EXPECT_NE(oat_file.GetClassLoaderContext(), stored_context);
-    EXPECT_NE(oat_file.GetClassLoaderContext(), valid_context);
+    EXPECT_NE(oat_file.GetClassLoaderContext(), stored_context) << output_;
+    EXPECT_NE(oat_file.GetClassLoaderContext(), valid_context) << output_;
   });
   // The stored context should match what we expect even though it's invalid.
   GenerateOdexForTest(GetTestDexFileName("ManyMethods"),
@@ -2150,7 +2166,7 @@
                       true,  // expect_success
                       false,  // use_fd
                       [&](const OatFile& oat_file) {
-    EXPECT_EQ(oat_file.GetClassLoaderContext(), stored_context);
+    EXPECT_EQ(oat_file.GetClassLoaderContext(), expected_stored_context) << output_;
   });
 }