已合并
【fix】修复 `ResourceRegistry` 加载编译资源 manifest 时允许空 `resource_id` 的问题 #5319
好好说话95号创建于 8月25日
【fix】修复 `ResourceRegistry` 加载编译资源 manifest 时允许空 `resource_id` 的问题 #5319
已合并
好好说话95号创建于 8月25日
共 2 个文件变更+34-0
@@ -753,6 +753,8 @@ TEST_F(ResourceRegistryTest, LoadManifestValidatesJsonOwnershipSourceAndDuplicat
753 EXPECT_EQ(loadText("[]"), ResourceStatus::InvalidResource);753 EXPECT_EQ(loadText("[]"), ResourceStatus::InvalidResource);
754 EXPECT_EQ(loadText(R"({"source_file":"source.cpp"})"), ResourceStatus::InvalidResource);754 EXPECT_EQ(loadText(R"({"source_file":"source.cpp"})"), ResourceStatus::InvalidResource);
755 EXPECT_EQ(loadText(R"({"resource_id":1,"source_file":"source.cpp"})"), ResourceStatus::InvalidResource);755 EXPECT_EQ(loadText(R"({"resource_id":1,"source_file":"source.cpp"})"), ResourceStatus::InvalidResource);
756+ EXPECT_EQ(loadText(R"({"resource_id":""})"), ResourceStatus::InvalidResource);
757+ EXPECT_EQ(stage.external.resources.find(""), stage.external.resources.end());
756 EXPECT_EQ(loadText(R"({"resource_id":"metadata-only"})"), ResourceStatus::Success);758 EXPECT_EQ(loadText(R"({"resource_id":"metadata-only"})"), ResourceStatus::Success);
757 EXPECT_TRUE(stage.external.resources.at("metadata-only")->data.sourceFilePath.empty());759 EXPECT_TRUE(stage.external.resources.at("metadata-only")->data.sourceFilePath.empty());
758 EXPECT_EQ(loadText(R"({"resource_id":"resource","source_file":1})"), ResourceStatus::InvalidResource);760 EXPECT_EQ(loadText(R"({"resource_id":"resource","source_file":1})"), ResourceStatus::InvalidResource);
@@ -1303,6 +1305,31 @@ TEST_F(ResourceRegistryTest, LoadReportsManifestFailure)
1303 EXPECT_EQ(registry_->FindResource("public-invalid-manifest"), nullptr);1305 EXPECT_EQ(registry_->FindResource("public-invalid-manifest"), nullptr);
1304}1306}
1305 1307 
1308+TEST_F(ResourceRegistryTest, LoadRejectsEmptyResourceIdAndDoesNotCommitPartialBundle)
1309+{
1310+ const SourceLayout layout = CreateLayout("public-empty-resource-id");
1311+ const std::string validJson = R"({"resource_id":"valid-resource"})";
1312+ const std::string emptyJson = R"({"resource_id":""})";
1313+ AcCompileResourceManifest invalidManifests[] = {
1314+ {StringView(validJson), nullptr, 0U},
1315+ {StringView(emptyJson), nullptr, 0U},
1316+ };
1317+ AcCompileResourceBundle invalidBundle = MakeBundle(invalidManifests, 2U);
1318+ gBundleHeader = &invalidBundle.header;
1319+ MockSuccessfulLoader();
1320+ 
1321+ EXPECT_EQ(registry_->Load(layout.soPath.c_str()), ResourceStatus::InvalidResource);
1322+ EXPECT_EQ(registry_->FindResource(""), nullptr);
1323+ EXPECT_EQ(registry_->FindResource("valid-resource"), nullptr);
1324+ 
1325+ AcCompileResourceManifest validManifest{StringView(validJson), nullptr, 0U};
1326+ AcCompileResourceBundle validBundle = MakeBundle(&validManifest, 1U);
1327+ gBundleHeader = &validBundle.header;
1328+ EXPECT_EQ(registry_->Load(layout.soPath.c_str()), ResourceStatus::Success);
1329+ ResourceData output;
1330+ EXPECT_EQ(registry_->Lookup("valid-resource", output), ResourceStatus::Success);
1331+}
1332+ 
1306TEST_F(ResourceRegistryTest, LoadAutomaticCachesFirstStatus)1333TEST_F(ResourceRegistryTest, LoadAutomaticCachesFirstStatus)
1307{1334{
1308 UnsetEnvironment("ASCEND_CUSTOM_OPP_PATH");1335 UnsetEnvironment("ASCEND_CUSTOM_OPP_PATH");
@@ -367,6 +367,13 @@ ResourceStatus ParseResourceId(
367 return ResourceStatus::InvalidResource;367 return ResourceStatus::InvalidResource;
368 }368 }
369 resourceId = document.at("resource_id").get<std::string>();369 resourceId = document.at("resource_id").get<std::string>();
370+ if (resourceId.empty()) {
371+ ASCENDLOGE(
372+ "Compile resource manifest field is empty: source_type=%s so=%s manifest=%" PRIu64
373+ " field=resource_id expected=non-empty string",
374+ SourceTypeName(spec.sourceType), spec.path.c_str(), manifestIndex);
375+ return ResourceStatus::InvalidResource;
376+ }
370 return ResourceStatus::Success;377 return ResourceStatus::Success;
371}378}
372 379