<AWT Dev> Review Request for 8039749: Migrate needed functionality from all subclasses of java.awt.Robot in jdk/test directory to the ancestor
Dmitriy Ermashov
dmitriy.ermashov at oracle.com
Fri Aug 29 12:52:21 UTC 2014
Or it could be a Toolkit.nativeEventQueueSync. It would allow us to call
the method in a static way.
Many functional tests have a call like
((SunToolkit) Toolkit.getDefaultToolkit()).realSync()
They call realSync without instantiating a robot.
It would be great just replace it with
Toolkit.getDefaultToolkit().nativeEventQueueSync()
in existing tests and nothing more.
Thanks,
Dima
On 08/29/2014 04:35 PM, Anthony Petrov wrote:
> Yes, that sounds good to me. We need to consider whether this should
> be Toolkit or Robot class though, and settle on the name of the new
> method. For example, if we go with Robot, then it could be
> Robot.waitForNativeIdle() or alike.
>
> --
> best regards,
> Anthony
>
> On 8/29/2014 4:24 PM, Dmitriy Ermashov wrote:
>> Hi Anthony,
>>
>> Ok, let's summarize:
>> We leave all functionality in ExtendedRobot except of realSync() call,
>> which in turn we move to a new method in java.awt.Toolkit.
>>
>> I believe it could be a reasonable compromise.
>>
>> Is it ok?
>>
>> Thanks,
>> Dima
>>
>> On 08/28/2014 10:03 PM, Anthony Petrov wrote:
>>> Hi Dmitriy,
>>>
>>> On 8/28/2014 1:14 PM, Dmitriy Ermashov wrote:
>>>> On 08/28/2014 12:09 PM, Anthony Petrov wrote:
>>>>> On 8/27/2014 4:54 PM, Yuri Nesterenko wrote:
>>>>>> On 08/27/2014 04:25 PM, Dmitriy Ermashov wrote:
>>>>>>> At first, let me focus on fact that the actual motivation of moving
>>>>>>> functionality to java.awt.Robot is the Jigsaw project. We (SQE)
>>>>>>> will be
>>>>>>> unable to use internal java API after the project will be finished
>>>>>>> (ExtendedRobot just will not compile, for example) and it will be a
>>>>>>> reason of failing huge amount of regression and functional tests.
>>>>>
>>>>> Could you please clarify as to why it won't compile? IIUC, all the
>>>>> GUI
>>>>> tests that require Robot will be in a single module (the java.desktop
>>>>> one I suppose?), so why wouldn't ExtendedRobot compile while the
>>>>> tests
>>>>> themselves would if they all are located in the same module?
>>>> All jtreg tests are in default package, ExtendedRobot class as well.
>>>> When we trying to run any jtreg test that uses ExtendedRobot it fails
>>>> with the following error:
>>>> java.lang.IllegalAccessError: tried to access class sun.awt.SunToolkit
>>>> from class ExtendedRobot
>>>>
>>>> As you can see the problem is not in tests that uses ExtendedRobot,
>>>> but
>>>> in code that uses sun.* and other internal packages. This is the
>>>> limitation we are trying to deal with.
>>>
>>> Thank you for the clarification. If I read this correctly, I see that
>>> the only reason to migrate all the code from ExtendedRobot to the
>>> public Robot class is the fact that you're unable to call one internal
>>> method from SunToolkit. I really don't think this is a good
>>> justification for introducing a bunch of new public APIs that external
>>> developers never requested and that we'll have to support forever.
>>>
>>> Please find another way to call realSync() from ExtendedRobot and
>>> leave the latter alone. One suggestion that I've already proposed is
>>> to introduce a new method in Toolkit class
>>> (Toolkit.nativeEventQueueSync() ?) that would call the internal
>>> realSync() method. Or perhaps the jigsaw projects could provide some
>>> other mechanisms to access module-private APIs - please discuss this
>>> with jigsaw folks.
>>>
>>>
>>>>>>> As for waitForIdle() method, we do not change it's use-case. The
>>>>>>> java.awt.Robot class is used only for GUI actions. And
>>>>>>> waitForIdle() is
>>>>>>> used for ensuring of finishing all events in EventQueue.
>>>>>>> The implementation with realSync() just flushes native queue as
>>>>>>> well
>>>>>>> and
>>>>>>> it is just an improved version of existing one.
>>>>>>>
>>>>>>> Anyway, the changing of waitForIdle() implementation is
>>>>>>> discussable.
>>>>>>> The
>>>>>>> other solution may be in adding new method with realSync call.
>>>>>>
>>>>>> Which would require touching some 340 tests in apprx 950 places,
>>>>>> sorry
>>>>>> for statistics.
>>>>>
>>>>> Yes, I realize that some changes will be needed for this. My concern
>>>>> is that having realSync() being called unconditionally from an
>>>>> existing public method may have an impact on existing applications
>>>>> that use the Robot for tasks other than testing (e.g. for simple
>>>>> automation tasks, etc.) And I'm not sure if we're able to estimate
>>>>> all
>>>>> the potential side effects that this change can bring.
>>>> We already have a kind of condition: a variable isAutoWaitForIdle.
>>>> waitForIdle method for now is called only from inside other Robot
>>>> methods and in case when isAutoWaitForIdle flag is set to true
>>>> (fortunately it's default value is false).
>>>
>>> Robot.waitForIdle() is a public API. You don't (and can't) know who
>>> calls this method, when, and why. Changing its implementation the way
>>> you're proposing looks dangerous to me.
>>>
>>> --
>>> best regards,
>>> Anthony
>>>
>>>
>>>>
>>>> Thanks,
>>>> Dima
>>>>>
>>>>> Again, if the tests go into the java.desktop module, then I don't see
>>>>> a problem with calling realSync() from sun.awt.SunToolkit directly as
>>>>> you did before. If this is not the case, then I think I'd prefer to
>>>>> introduce a separate single public method in the Toolkit (or Robot?)
>>>>> class that would allow applications (and tests) to actually perform
>>>>> the realSync() operation.
>>>>>
>>>>> --
>>>>> best regards,
>>>>> Anthony
>>>>>
>>>>>>
>>>>>> -yan
>>>>>>
>>>>>>>
>>>>>>> Thanks,
>>>>>>> Dima
>>>>>>>
>>>>>>> On 08/27/2014 03:16 PM, Anthony Petrov wrote:
>>>>>>>> Hi Dmitriy,
>>>>>>>>
>>>>>>>> While I realize that all the new methods are useful when
>>>>>>>> writing JDK
>>>>>>>> regression tests, do you have any evidence that would suggest that
>>>>>>>> these same methods could be useful to and/or have been
>>>>>>>> requested by
>>>>>>>> external developers? All of them look like convenient APIs and
>>>>>>>> I'm not
>>>>>>>> entirely convinced if we should ultimately add them all to our
>>>>>>>> public
>>>>>>>> Robot API. Personally, I don't see a problem with using the custom
>>>>>>>> ExtendedRobot class specifically for tests. This also helps
>>>>>>>> reduce the
>>>>>>>> JDK and JRE static footprints, btw. But then again, I'm not an SQE
>>>>>>>> engineer.
>>>>>>>>
>>>>>>>> I don't have a strong opinion on this and I'm leaving the final
>>>>>>>> decision to Sergey and other AWT team members, but I just thought
>>>>>>>> I'd
>>>>>>>> bring this up here.
>>>>>>>>
>>>>>>>> As for the implementation, I see that you're adding realSync()
>>>>>>>> calls
>>>>>>>> in some places where they were not previously there. For example,
>>>>>>>> calling Robot.waitForIdle() before the fix would not cause a
>>>>>>>> realSync() to occur, while after your fix it does. This is a
>>>>>>>> significant change from threading and native event queue
>>>>>>>> synchronization perspectives, and I'm not sure if this should be
>>>>>>>> done.
>>>>>>>> Again, I do know that in tests it is useful to call realSync()
>>>>>>>> here
>>>>>>>> and there, but I'm not sure we should spread the calls all over
>>>>>>>> the
>>>>>>>> Robot implementation simply because of this reason. The calls
>>>>>>>> may in
>>>>>>>> fact produce some unwanted side-effects for existing applications
>>>>>>>> employing the Robot (e.g. introducing unwanted delays, or
>>>>>>>> performing
>>>>>>>> excessive synchronization while the app didn't really need it,
>>>>>>>> etc.) I
>>>>>>>> consider this change very risky.
>>>>>>>>
>>>>>>>> --
>>>>>>>> best regards,
>>>>>>>> Anthony
>>>>>>>>
>>>>>>>> On 8/26/2014 5:40 PM, Dmitriy Ermashov wrote:
>>>>>>>>> Hi awt team!
>>>>>>>>>
>>>>>>>>> A few months ago we have consolidated methods required by
>>>>>>>>> functional
>>>>>>>>> and
>>>>>>>>> regression tests in ExtendedRobot class. After a period of
>>>>>>>>> extensive
>>>>>>>>> testing, it's time to migrate them to java.awt.Robot.
>>>>>>>>>
>>>>>>>>> Please review the changeset:
>>>>>>>>> http://cr.openjdk.java.net/~dermashov/8039749/webrev.00/
>>>>>>>>>
>>>>>>>>> Corresponding bug:
>>>>>>>>> https://bugs.openjdk.java.net/browse/JDK-8039749
>>>>>>>>>
>>>>>>>>> Note that this change is an important prerequisite to a massive
>>>>>>>>> regression and functional test suites change for Jigsaw.
>>>>>>>>> As one can see the webrev contains changes in class signature.
>>>>>>>>> The
>>>>>>>>> CCC
>>>>>>>>> request will take place after the code review.
>>>>>>>>>
>>>>>>>>> Thanks,
>>>>>>>>> Dima
>>>>>>>
>>>>>>
>>>>
>>
More information about the awt-dev
mailing list