RFR: JDK-8176084 Developer-friendly run-test facility

Erik Joelsson erik.joelsson at oracle.com
Fri Mar 3 10:29:12 UTC 2017

Looks good to me now.


On 2017-03-03 10:39, Magnus Ihse Bursie wrote:
> I have an updated webrev.
> Here is a differential webrev showing the changes compared to the 
> previous webrev:
> http://cr.openjdk.java.net/~ihse/JDK-8176084-introduce-run-test/webrev.02
> And here is a full webrev showing all changes:
> http://cr.openjdk.java.net/~ihse/JDK-8176084-introduce-run-test/webrev.03
> Replies to specific comments inline.
> On 2017-03-02 11:40, Erik Joelsson wrote:
>> Hello Magnus,
>> Overall this is excellent work! But I still have some opinions and 
>> questions.
>> I think the implementation of the caching mechanism is a bit weird 
>> and it will not handle changes to jtreg test groups (or other test 
>> name definition files). I don't think we can expect people to have to 
>> manually clean if they edit such a file. I would very much prefer if 
>> this was done the same way as we calculate modules. This would be 
>> achieved by: 1. including FindTests.gmk from Main.gmk instead of 
>> shell-call. 2. In FindTests.gmk -include $(NAMED_TESTS_INCLUDE). 3. 
>> In FindTests.gmk add all actual source files for test names as 
>> prerequisites to $(NAMED_TESTS_INCLUDE). 4. Modify FindTests.gmk to 
>> only actually do work if the recipe for $(NAMED_TESTS_INCLUDE) is 
>> triggered. This can be achieved by moving the calls to the recipe. 
>> This means the variables you generate are always read from the 
>> generated makefile.
> Yeah, I agree, it's a bit corny. It grew out of a non-caching 
> solution. According to our off-list discussion, I have now removed the 
> caching mechanism instead. It didn't do much for performance and just 
> complicated things. Instead I include FindTests.gmk where it is needed.
>> FindTests.gmk
>> 51: This conditional seems redundant, did you mean to put a wildcard 
>> there?
> Yes I did. Thanks.
>> 63: should be 2 spaces
> Really? I think it's a single line I had to break into two, similar to 
> what's on line 66. Do you consider it to be a logical indentation? If 
> so, I should probably move the closing parenthesis to a separate line, 
> but that feels overkill. In general, I have not considered simple 
> foreach:es to be logical construct but one-liners.
>> MakeBase.gmk
>> 772: an -> a
> Fixed.
>> 774: did you really mean = and not :=?
> No, not really. :-) Fixed.
>> Note that when using $(eval) inside a macro body that will also be 
>> evaled, you actually need 4 dollars on all references inside it if 
>> you want to be sure to handle any $ in the variable values correctly. 
>> In this case, if $ is ever a character in one of the parameters to 
>> jtreg/gtest, it's likely going to fail. Then we have the special case 
>> of the foreach local variable, which has to be referenced with the 
>> same amount of dollars as the foreach call, so you can't just put 4 
>> on it. Here is an example of how I figured you can deal with this:
>> $$(foreach f, $$($1_SRC_FILES), \
>>    $$(eval fd := $$(call DoubleDollar, $$(f))) \
>>    $$(if $$(filter /%, $$(f)), \
>>       $$(eval r := $$$$(patsubst $$$$($1_SRC_BASE_DIR)/%, %, 
>> $$$$(fd))) \
>>    ) \
>> )
>> Basically for the foreach variable, you need to create a doubledollar 
>> version and use the new one in evals, with 4 dollars, and the 
>> original in all other cases. Yes, this becomes very convoluted.
> No sh*t. :-& I've updated the code to match this pattern.
>> RunTests.gmk
>> 74: I thought Christian made the default for hotspot be min(12, 
>> $(NUM_CORES) / 2)?
> I tried to mimic what I could extract from the existing logic. 
> However, I see now that you say it that I've missed some 
> concurrency-related hacks in the old hotspot JTreg Makefile. (Both 
> this and the MaxRAMFraction). Talk about convoluted... :-( I fixed 
> this now by porting the old behavior verbatim, but I think this area 
> could need some cleanup in the future.
> Also, I noticed that the fix to limit JTreg jobs to 50 had disappeared 
> somewhere when I worked with handling the hotspot special logic. I 
> have now restored that.
>> 238: The command is wrapped in ExecuteWithLog, why pipe to yet 
>> another log file?
> For consistency, to store the log output in the rest-results 
> directory, like the other test suites do. Gtest does not have a 
> built-in way of storing the test output to a log file. I could have 
> copied the ExecuteWithLog file at the end, but that felt like I 
> meddled with a private part of the interface. What if we introduce a 
> way to disable logging in ExecuteWithLog? Then the gtest parsing would 
> fail.
>> 242,361: shouldn't parse-test have run-test as prerequisite (even if 
>> .NOTPARALLEL is in effect)?
> Yes, it should indeed. Fixed.
>> 261: Would be nice with a line of # heading this section too
> Okie-dokie.
>> 325: The MaxRAMFraction for at least hotspot was made dynamic on the 
>> concurrency AFAIK
> Correctly. I missed that part as well. Fixed.
>> 430: I think it would be better just adding $(TARGETS) as prereq
> Better like this?
> /Magnus
>> /Erik
>> On 2017-03-02 08:42, Magnus Ihse Bursie wrote:
>>> A long-time issue has been a consistent way for developers to 
>>> effortlessly run tests on local builds. This patch introduces a new, 
>>> alternative "run-test" target, which allows for a smoother developer 
>>> experience in running tests. It does not modify or remove any 
>>> existing ways of running tests, which are still needed for automated 
>>> test systems and old scripts.
>>> Bug: https://bugs.openjdk.java.net/browse/JDK-8176084
>>> WebRev: 
>>> http://cr.openjdk.java.net/~ihse/JDK-8176084-introduce-run-test/webrev.01
>>> /Magnus

More information about the build-dev mailing list