This is an automated email from the ASF dual-hosted git repository. lukaszlenart pushed a commit to branch WW-5540-localized-text-provider-caching in repository https://gitbox.apache.org/repos/asf/struts.git
commit b1e0071804d13bbfcfd4f5ec50f432fae2b4f769 Author: Lukasz Lenart <[email protected]> AuthorDate: Thu Jul 23 13:35:15 2026 +0200 WW-5540 test(core): tighten localized-text cache tests Assert single cache entry in the per-call-format tests (proves the raw pattern is cached, not the formatted result), and mirror the package-cache clearBundle/clearMissingBundlesCache invalidation test. Co-Authored-By: Claude Opus 4.8 <[email protected]> --- .../struts2/text/StrutsLocalizedTextProviderTest.java | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/core/src/test/java/org/apache/struts2/text/StrutsLocalizedTextProviderTest.java b/core/src/test/java/org/apache/struts2/text/StrutsLocalizedTextProviderTest.java index ad35de8e4..e4dc0c831 100644 --- a/core/src/test/java/org/apache/struts2/text/StrutsLocalizedTextProviderTest.java +++ b/core/src/test/java/org/apache/struts2/text/StrutsLocalizedTextProviderTest.java @@ -582,6 +582,7 @@ public class StrutsLocalizedTextProviderTest extends XWorkTestCase { String y = provider.findText(CacheFixture.class, "cache.withparam", Locale.ENGLISH, null, new Object[]{"Y"}, valueStack); assertEquals("Value with param X", x); assertEquals("Value with param Y", y); + assertEquals("Raw pattern should be cached once, not per format ?", 1, provider.classHierarchyCacheSize()); } public void testOgnlTranslationIsPerCall() { @@ -597,6 +598,7 @@ public class StrutsLocalizedTextProviderTest extends XWorkTestCase { assertEquals("Hello World", world); assertEquals("Hello Mars", mars); + assertEquals("Raw pattern should be cached once across value stacks ?", 1, provider.classHierarchyCacheSize()); } public void testNullFormattingFallsThroughToDefault() { @@ -663,6 +665,21 @@ public class StrutsLocalizedTextProviderTest extends XWorkTestCase { assertEquals("Reload did not clear package hierarchy cache ?", 0, provider.packageHierarchyCacheSize()); } + public void testClearBundleAndClearMissingCacheEmptyPackageHierarchyCache() { + TestStrutsLocalizedTextProvider provider = new TestStrutsLocalizedTextProvider(); + ValueStack valueStack = ActionContext.getContext().getValueStack(); + + provider.findText(org.apache.struts2.test.ModelDrivenAction2.class, "package.properties", Locale.getDefault(), null, null, valueStack); + assertEquals("Package cache not populated ?", 1, provider.packageHierarchyCacheSize()); + provider.callClearBundleWithLocale("org/apache/struts2/test/package", Locale.getDefault()); + assertEquals("clearBundle did not empty package hierarchy cache ?", 0, provider.packageHierarchyCacheSize()); + + provider.findText(org.apache.struts2.test.ModelDrivenAction2.class, "package.properties", Locale.getDefault(), null, null, valueStack); + assertEquals("Package cache not repopulated ?", 1, provider.packageHierarchyCacheSize()); + provider.callClearMissingBundlesCache(); + assertEquals("clearMissingBundlesCache did not empty package hierarchy cache ?", 0, provider.packageHierarchyCacheSize()); + } + public void testDeprecatedFindMessageStillDelegates() { // findMessage leaves findText's hot path in this task; this locks the deprecated delegator. TestStrutsLocalizedTextProvider provider = new TestStrutsLocalizedTextProvider();
