[
https://issues.apache.org/jira/browse/GEODE-10505?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Jinwoo Hwang updated GEODE-10505:
---------------------------------
Fix Version/s: 2.0.0
> Migrate MockRunner to Spring Test 6.x for Jakarta EE 10 Compatibility
> ---------------------------------------------------------------------
>
> Key: GEODE-10505
> URL: https://issues.apache.org/jira/browse/GEODE-10505
> Project: Geode
> Issue Type: Improvement
> Reporter: Jinwoo Hwang
> Assignee: Jinwoo Hwang
> Priority: Major
> Fix For: 2.0.0
>
>
> h3. Background
> As part of the Jakarta EE 10 migration, the geode-modules-session module's
> integration tests are currently failing because they depend on MockRunner, a
> servlet container testing framework that:
> # *Only supports javax.servlet* (not Jakarta EE)
> # *Is no longer maintained* (last release 2014)
> # *Has no Jakarta-compatible version* available
> # *Blocks test execution* in Jakarta-migrated codebase
> The geode-modules-session tests use MockRunner to mock servlet container
> components (HttpServletRequest, HttpServletResponse, ServletContext,
> FilterChain) for testing Geode session management functionality.
> h3. Proposed Solution
> Migrate from MockRunner to *Spring Test 6.x* (spring-test module), which:
> * ✅ Fully supports Jakarta EE 10 (jakarta.servlet.*)
> * ✅ Actively maintained by Spring Framework team
> * ✅ Provides equivalent servlet mocking capabilities
> * ✅ Drop-in replacement with minimal code changes
> * ✅ Better integration with Spring ecosystem
> ----
> h2. Scope
> h3. Files to Migrate (5 files)
> h4. Test Infrastructure
> # *SessionCookieConfigServletTestCaseAdapter.java* (~300 lines estimated)
> ** Complete rewrite required
> ** Currently extends MockRunner's {{BasicServletTestCaseAdapter}}
> ** Will implement custom adapter using Spring Test mocks
> h4. Test Classes
> # *CommonTests.java*
> ** Cookie API changes (List → Array)
> ** Import statement updates
> ** API method name changes
> # *SessionReplicationJUnitTest.java*
> ** Import updates
> ** API compatibility fixes
> # *SessionReplicationLocalCacheJUnitTest.java*
> ** Import updates
> ** API compatibility fixes
> # *SessionReplicationIntegrationJUnitTest.java*
> ** Import updates
> ** Jetty 11 API compatibility (servlet registration)
> h3. Dependencies to Update
> *Remove:*
>
> {{testImplementation 'com.mockrunner:mockrunner-servlet:2.0.6'}}
> *Add:*
>
> {{testImplementation 'org.springframework:spring-test:6.1.1'}}
> ----
> h2. Migration Strategy
> h3. Phase 1: Research & Planning
> {*}Effort{*}: 2-3 days
> * [ ] Research MockRunner Jakarta support status
> * [ ] Evaluate alternative frameworks (Spring Test, WireMock, JMockit)
> * [ ] Create API mapping between MockRunner and Spring Test
> * [ ] Document migration approach and risks
> * [ ] Get stakeholder approval
> h3. Phase 2: Test Adapter Rewrite
> {*}Effort{*}: 4-6 days
> Rewrite {{SessionCookieConfigServletTestCaseAdapter}} to use Spring Test:
> *Tasks:*
> * [ ] Remove {{BasicServletTestCaseAdapter}} base class
> * [ ] Implement custom servlet context lifecycle management
> * [ ] Create Spring Test-based mock objects (request, response, context)
> * [ ] Preserve existing test API surface for backward compatibility
> * [ ] Implement custom {{SessionCookieConfig}} mock (not provided by Spring
> Test)
> * [ ] Implement filter chain execution logic{{}}
> h3. Phase 3: API Translation
> {*}Effort{*}: 1-2 days
> Update API calls in test files (estimated ~30 locations):
> ||MockRunner API||Spring Test API||Est. Locations||
> |{{getCookies().get(0)}}|{{getCookies()[0]}}|~7|
> |{{addCookie(cookie)}}|{{setCookies(cookie)}}|~9|
> |{{setRequestURL(url)}}|{{setRequestURI(url)}}|~3|
> |{{factory.getMockFilterConfig()}}|{{new MockFilterConfig(context)}}|~3|
> |{{addServlet(Class, path)}}|{{addServlet(Class.getName(), path)}}|~8|
> *Tasks:*
> * [ ] Update cookie API calls (List → Array syntax)
> * [ ] Update request URL methods
> * [ ] Update filter config creation
> * [ ] Update servlet registration calls
> h3. Phase 4: Import Updates
> {*}Effort{*}: 1 day
> Update all import statements in 5 test files:
> *Tasks:*
> * [ ] Remove MockRunner imports: {{com.mockrunner.mock.web.*}}
> * [ ] Remove MockRunner imports: {{com.mockrunner.servlet.*}}
> * [ ] Add Spring Test imports: {{org.springframework.mock.web.*}}
> * [ ] Update servlet imports: {{javax.servlet.*}} → {{jakarta.servlet.*}}
> h3. Phase 5: Compilation Verification
> {*}Effort{*}: 1 day
> *Tasks:*
> * [ ] Run: {{./gradlew
> :extensions:geode-modules-session:compileIntegrationTestJava}}
> * [ ] Verify zero compilation errors
> * [ ] Verify zero import resolution errors
> * [ ] Fix any compilation issues discovered
> * [ ] Document any API gaps or workarounds needed
> *Success Criteria:*
>
> {{BUILD SUCCESSFUL
> Errors: 0
> Warnings: 0}}
> h3. Phase 6: Test Execution & Analysis
> {*}Effort{*}: 2-3 days
> *Tasks:*
> * [ ] Run: {{./gradlew :extensions:geode-modules-session:integrationTest}}
> * [ ] Analyze test results
> * [ ] Categorize failures: migration-related vs. infrastructure-related
> * [ ] Document expected vs. actual behavior
> * [ ] Create separate JIRAs for non-migration issues (if needed)
> *Expected Outcomes:*
> * Servlet mocking functionality works (tests can execute)
> * Some tests may fail due to Geode infrastructure issues (separate concern)
> * Clear documentation of what works vs. what needs additional fixes
> h3. Phase 7: Documentation
> {*}Effort{*}: 2 days
> *Tasks:*
> * [ ] Create migration completion summary
> * [ ] Document API translation guide for future reference
> * [ ] List known issues and limitations
> * [ ] Create troubleshooting guide
> * [ ] Update project README with new test dependencies
>
> h3. Success Criteria
> * ✅ Build successful (zero compilation errors)
> * ✅ No deprecated API warnings
> * ✅ Mock objects created correctly
> * ✅ Filter lifecycle works (init → doFilter → destroy)
> * ✅ Request/Response state preserved
> * ✅ Cookie handling works correctly
> * ✅ Session management API accessible
>
>
> ----
--
This message was sent by Atlassian Jira
(v8.20.10#820010)