Re: testsuite under wine

Jacob Bachmeyer <[email protected]> Fri, 06 Jan 2023 21:58:14 -0600
Newsgroups gmane.comp.sysutils.dejagnu.general,gmane.comp.gcc.fortran
Message-ID <[email protected]>
Jacek Caban wrote:
> Hi Jacob,
>
> Sorry for the delay.

Not a problem.

> On 12/24/22 06:33, Jacob Bachmeyer wrote:
>> Jacek Caban wrote:
>>
> [...]
>
>
>> The terminfo database access functions tparm(), tigetflag(), 
>> tigetnum(), and tigetstr() all return values to their callers for 
>> further processing and the information needed to perform curses-style 
>> terminal initialization is stored as string capabilities in the 
>> terminfo database.
>
> Yes, we should consider some form of better TERM compatibility.

I still suggest using terminfo here.  This seems to be exactly the 
problem it is supposed to solve.

>>> Also my point was that if you capture the output sent by the 
>>> application to the terminal and match that to a pattern, then any 
>>> processing made by conhost could cause problems. Please correct me 
>>> if I'm wrong, but my understanding is that, in the above 
>>> hypothetical example, a test case doing printf(stdout, "\rA\rB\rC") 
>>> and matching output to "\rA\rB\rC" would be considered valid (and 
>>> fail on Wine).
>>
>> This type of thing is a general problem with testing curses programs, 
>> so the only difference would be effectively adding curses to programs 
>> that are not expected to use it.  Yes, this could break testsuites 
>> that should work, so some kind of full bypass would be very helpful; 
>> you already have this if wine is run inside a pipeline.
>>
>>> That's why we're trying to figure out a solution that bypasses 
>>> conhost and makes the application write directly to stdout, like 
>>> usual native application would do. Such mode would be less 
>>> compatible with Windows, but if tests only does simple I/O and no 
>>> other console interactions, it should work fine. Interpreting 
>>> TERM=dumb would be a possible solution to enter that mode.
>>
>> I see two aspects to this, and I think both of them have value as 
>> improvements to Wine:
>>
>> 1.  Programs that only use the standard handles (a la ISO C) probably 
>> do not /want/ full compatibility with Windows, so their I/O should be 
>> direct to the underlying POSIX fds.  Note that line endings are still 
>> an issue here, but are /not/ Wine's problem---the program's I/O 
>> library module is generating Windows-style line endings because it 
>> was written for Windows.
>
> That's what my earlier patch allows. Note that there are weird 
> implications like the fact that in this mode, a Windows equivalent of 
> isatty(1) will return 0 and a number of Windows console functions will 
> not work, so the setup would be kind of weird from Windows point of 
> view. I'm afraid that it will not be satisfactory for more complex 
> things (gdb?).

It would probably be a good idea to map the Windows equivalent of 
isatty(3) to the underlying isatty(3) call in this mode, so that an 
underlying pty will be correctly reflected, although this is a future 
improvement.  As for the setup being kind of weird from a Windows point 
of view, I suggest comparing it to the scenario of running a program 
under a telnet session on a Windows host, prior to the introduction of 
pseudoconsoles, which I understand was also quite weird by Windows 
standards.

>> (Actually, an option to explicitly select an X11 Wine console window 
>> might be helpful for people that want to invoke a Windows CUI program 
>> from a graphical menu; otherwise, you might end up with the CUI 
>> silently appearing on the console from which the X session was 
>> started... I know adding xterm to the mix solves this, but it is a 
>> use case.)
>
> Currently, you'd run it through wineconsole explicitly. And yes, it's 
> not perfect and default behaviour could be improved, but it's 
> challenging architecturally. There were some improvements to that code 
> in current release cycle, which moved things in the right direction, 
> but also proved this stuff to be hard to change without breaking anything.

I see.

>> I think the best goal here is that, for the standard handles, Wine 
>> I/O should be equivalent to a network connection (telnet?) to a 
>> Windows box.  For CUI, Wine should actually use curses or at least 
>> terminfo, to allow the escape codes produced to match the user's 
>> terminal.  The user's terminal might not always be a VT100-alike and 
>> custom simulated terminals could be very reasonable for testing 
>> curses TUI programs.  (To my knowledge, there are as yet no 
>> testsuites that actually /do/ that, but the composition seems 
>> reasonable to me.)
>
>
> As I said, compatibility with other terminals could be improved, but 
> curses does not fit the role. Anyway, for sake of testing, the 
> attached patch disables escapes hiding the cursor during screen 
> updates which seem the most problematic. With this patch, some tests 
> may work without disabling conhost (but other discussed problems are 
> expected).

Agreed that curses may not be feasible for Wine to use, but terminfo 
would still be a good solution to replace the hardcoded terminal escape 
strings in conhost.

> [...]
>
> BTW, if Expect ever plans a Windows port that's not based on Cygwin, 
> it will likely need to use conhost-based pseudo consoles. It would 
> then face exactly the same problem as when using Wine. Maybe long-term 
> solution fits there? Problematic cursor hide/show escapes should be 
> trivial to filter. Other differences may be more challenging.

My understanding is that Expect does not have a native Windows port 
precisely because Windows, until recently, did not have ptys or anything 
like them.  Those other differences may still preclude a native Windows 
port of Expect.


-- Jacob