Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add unit tests for LimitedConcurrencyLevelTaskScheduler, #1110 #1119

Merged
merged 2 commits into from
Jan 22, 2025

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