已合并
【fix】修复 `ResourceRegistry` 加载编译资源 manifest 时允许空 `resource_id` 的问题 #5319
好好说话95号创建于 8月25日
【fix】修复 `ResourceRegistry` 加载编译资源 manifest 时允许空 `resource_id` 的问题 #5319
已合并
共 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 | + | ||
| 1306 | TEST_F(ResourceRegistryTest, LoadAutomaticCachesFirstStatus) | 1333 | TEST_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 | ||