Skip to content

Conversation

@paulirwin
Copy link
Contributor

  • You've read the Contributor Guide and Code of Conduct.
  • You've included unit or integration tests for your change, where applicable.
  • You've included inline docs for your change, where applicable.
  • There's an open issue for the PR that you are making. If you'd like to propose a change, please open an issue to discuss the change or find an existing issue.

Adds unit tests for LimitedConcurrencyLevelTaskScheduler.

Fixes #1110

Description

This adds some Apache Harmony tests for ThreadPoolExecutor and adapts them for testing LimitedConcurrencyLevelTaskScheduler (used in Lucene.NET in place of ThreadPoolExecutor).

This class, being a TaskScheduler, is only useful when used with i.e. a TaskFactory, so it does not have a very testable public API surface. So to exercise this class, some extension methods were added in the JSR166TestCase file to emulate a ThreadPoolExecutor's API surface. This keeps track of task state using a ConditionalWeakTable keyed on TaskScheduler, so that when the TaskScheduler is garbage collected, its state is cleaned up. The state is needed to track completed tasks, since LimitedConcurrencyLevelTaskScheduler removes/dequeues tasks when they are completed. This also implements the joinPool method in JSR166TestCase via waiting for all tracked tasks for the scheduler with a timeout.

This does not port all of the tests from Harmony, since most are irrelevant, but it ports enough to test executing tasks, concurrency level, the number of running/completed tasks, shutdown state, etc.

As noted in #1110, FEATURE_THREADPOOL_UNSAFEQUEUEWORKITEM was removed as all targets support this feature.

@paulirwin paulirwin added the notes:improvement An enhancement to an existing feature label Jan 22, 2025
@paulirwin paulirwin requested a review from NightOwl888 January 22, 2025 05:00
@NightOwl888 NightOwl888 self-requested a review January 22, 2025 19:57
@paulirwin paulirwin merged commit b1d309f into apache:master Jan 22, 2025
267 checks passed
@paulirwin paulirwin deleted the issue/1110 branch January 22, 2025 20:27
@NightOwl888
Copy link
Contributor

It looks like there is a problem with these tests on:

  • net9.0 x64, Windows
  • net9.0 x64 Linux
  • net6.0 x64 Windows

https://dev.azure.com/LuceneNET-Temp/Lucene.NET/_build/results?buildId=2410&view=ms.vss-test-web.build-test-results-tab

Expected: 1, Actual: 0
(Test: Lucene.Net.Support.Threading.TestLimitedConcurrencyLevelTaskScheduler.TestGetActiveCount)


To reproduce this test result:


Option 1:


Apply the following assembly-level attributes:


[assembly: Lucene.Net.Util.RandomSeed("0x9054fc2057c057c9")]
[assembly: NUnit.Framework.SetCulture("ia")]


Option 2:


Use the following .runsettings file:


<RunSettings>
  <TestRunParameters>
    <Parameter name="tests:seed" value="0x9054fc2057c057c9" />
    <Parameter name="tests:culture" value="ia" />
  </TestRunParameters>
</RunSettings>
Option 3:


Create the following lucene.testsettings.json file somewhere between the test assembly and the root of your drive:


{
"tests": {
"seed": "0x9054fc2057c057c9",
"culture": "ia"
}
}


Fixture Test Values

Random Seed:           0x9054fc2057c057c9
Culture:               ia
Time Zone:             (UTC-04:00) Georgetown, La Paz, Manaus, San Juan
Default Codec:         Lucene45 (Lucene45RWCodec)
Default Similarity:    RandomSimilarityProvider(queryNorm=False,coord=crazy): {}


System Properties

Nightly:               False
Weekly:                False
Slow:                  True
Awaits Fix:            False
Directory:             random
Verbose:               False
Random Multiplier:     1

Expected: 1, Actual: 0
(Test: Lucene.Net.Support.Threading.TestLimitedConcurrencyLevelTaskScheduler.TestGetCompletedTaskCount)


To reproduce this test result:


Option 1:


Apply the following assembly-level attributes:


[assembly: Lucene.Net.Util.RandomSeed("0x9054fc2057c057c9")]
[assembly: NUnit.Framework.SetCulture("ia")]


Option 2:


Use the following .runsettings file:


<RunSettings>
  <TestRunParameters>
    <Parameter name="tests:seed" value="0x9054fc2057c057c9" />
    <Parameter name="tests:culture" value="ia" />
  </TestRunParameters>
</RunSettings>
Option 3:


Create the following lucene.testsettings.json file somewhere between the test assembly and the root of your drive:


{
"tests": {
"seed": "0x9054fc2057c057c9",
"culture": "ia"
}
}


Fixture Test Values

Random Seed:           0x9054fc2057c057c9
Culture:               ia
Time Zone:             (UTC-04:00) Georgetown, La Paz, Manaus, San Juan
Default Codec:         Lucene45 (Lucene45RWCodec)
Default Similarity:    RandomSimilarityProvider(queryNorm=False,coord=crazy): {}


System Properties

Nightly:               False
Weekly:                False
Slow:                  True
Awaits Fix:            False
Directory:             random
Verbose:               False
Random Multiplier:     1

@paulirwin
Copy link
Contributor Author

Created issue for failing tests: #1123

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

notes:improvement An enhancement to an existing feature

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Add Support unit tests for LimitedConcurrencyLevelTaskScheduler

2 participants