Repository navigation
test: document problems with the current VT_I1 mapping in tlbparser. - #962
Conversation
Codecov Report❌ Patch coverage is
Additional details and impacted files@@ Coverage Diff @@
## main #962 +/- ##
==========================================
+ Coverage 89.34% 89.53% +0.18%
==========================================
Files 142 143 +1
Lines 13856 14122 +266
==========================================
+ Hits 12380 12644 +264
- Misses 1476 1478 +2 ☔ View full report in Codecov by Harness. 🚀 New features to boost your workflow:
|
junkmd
left a comment
There was a problem hiding this comment.
Thank you for your continued contributions!
This is clearly an inconsistency, and it is normally not the correct behavior for software. However, I could not find any earlier bug reports about this specific behavior. This makes me wonder whether users have come to expect the current behavior over time, or whether no one has ever reached this code path.
So, let's move forward step by step, checking both the impact of this change and backward compatibility.
As before, let's start with the test structure.
This comment was marked as resolved.
This comment was marked as resolved.
|
Added the reverse-direction probe and expanded the real native-call matrix. The separate component/interface/test module are now named The output probe writes one character through a plain Observed with freshly generated wrappers against latest-main production versus the proposed mapping:
This establishes the opposite direction's accepted-buffer change independently of SAFEARRAYs. Explicit LPSTR and unsigned scalar tables still pass both versions. I retained the two legacy input/output assertions as expected failures and added documentation for affected generated types, saved/handwritten interfaces, replacement arguments, signed outputs and explicit string handling. Full local unittest: 474 run / 448 passed / 24 skipped / 2 expected compatibility failures. Focused suites: 70 / 59 / 9 / 2; without NumPy/pywin32: 51 / 41 / 8 / 2. Native build, full Ruff CI scope and strict Sphinx HTML build pass. Existing full docs doctest cannot get past its optional Excel type-library setup locally ( The mapping itself is unchanged in this follow-up and the PR remains draft. These results and the documentation describe the compatibility cost; they do not resolve it or decide whether a more detailed mapping should be used. |
This comment was marked as outdated.
This comment was marked as outdated.
|
I opened #969 to record decisions about this change and provide a place for future support. When referring to this mapping in code comments or documentation, please link to this issue. |
|
To understand real-world use cases of You can review the implementation in a409eea. The warnings alone are shown below. Please investigate the use cases of these interfaces and structures to determine whether the impact of changing the mapping is small, or whether switching to the new mapping would fix bugs. |
|
Pushed the requested test organization and explicit compatibility assertions:
Observed Windows x64 / Python 3.13.5 / NumPy 2.1.3 / pywin32 308 results: focused 75 run, 66 passed, 9 skipped; full unittest discovery 481 run, 457 passed, 24 skipped. No expected failures remain. Old-mapping regeneration matches the legacy definitions; the proposed-definition assertion fails and the original native SAFEARRAY tests still fail (3 failures, 1 error). Ruff 0.6.9 passes the complete CI lint/format scope in an isolated worktree (151 files); the migration RST parses without warnings. Temporary HKCU registrations were cleaned up and the last focused run regenerated the proposed fixture wrappers. The native binary is unchanged and was reused; I did not rerun its build, the optional-dependency-free environment or the Sphinx documentation build. Production behavior is unchanged from the previous PR revision. Draft status remains while the compatibility/transition plan is discussed; upstream CI for this new head is tracked separately. AI assistance: OpenAI Codex. |
There was a problem hiding this comment.
Thank you for the research and tests. The tests with the current test doubles are now much easier to read.
I have a suggestion. Could we leave the tlbparser.COMTYPES mapping as it is in this PR?
Adding the schar_type definition in tlbparser is fine.
The title of this PR could be something like "Add tests to show the problems with the current VT_I1 mapping in tlbparser."
Instead of trying to solve all the topics discussed in #969 in one PR, adding tests and features step by step would make this PR easier to merge.
Also, if you tested real calls using SAPI or PortableDevice, could we turn those tests into tests that run in GitHub Actions? Such tests would help answer a concern: we might fix the technical problem but still fail to solve a problem that users face in real use.
As discussed in #969 (comment), let's keep discussing warnings, feature flags, and documentation.
Thank you!
|
Changed this PR to the incremental test scope you suggested. The generated interface is now The SAFEARRAY cases now record the current problems explicitly instead of requiring the unimplemented mapping change: unsigned tuple values differ from the signed fixture values; 1-D ndarray output is a byte-string scalar; 2-D ndarray conversion raises Observed local results: focused 88 run / 79 passed / 9 skipped; full 494 / 470 / 24; without NumPy/pywin32 63 / 53 / 10. Full Ruff 0.6.9 CI lint/format scope passes in a clean validation worktree (151 files), and For the real-library question: my earlier SAPI/PortableDevice investigation regenerated their actual type libraries and inspected declarations, field values and local counted buffers; it did not invoke an end-to-end speech-recognition/device COM path. I therefore have no such integration call to promote into an Actions test in this revision. The first-party fixture tests do make real out-of-process COM calls, and run in the existing Actions test job. A real-library test should additionally verify an affected user operation and its native allocation/lifetime contract before we claim that coverage. I will keep the warning/feature-flag discussion in #969. AI assistance: OpenAI Codex. |
|
CI follow-up for
I attempted AI assistance: OpenAI Codex. |
I did this. When we have active PRs, I try to check them on a best effort basis, and if the CI fails, I click "rerun failed jobs".
I also don't know the cause yet. I cannot reproduce the failure in my local environment either. Although this is separate from the |
tlbparser.
tlbparser.VT_I1 mapping in tlbparser.
junkmd
left a comment
There was a problem hiding this comment.
I think this test double and the test content are enough to show the current problems with tlbparser for now.
So, I will approve this PR now. Thank you very much!
If you are still interested in this project, please try the next steps below.
As you can see in my PoC commit for warnings, I think we also need to test fields in structs and unions.
To do this, we can add methods and structs to source/CppTestSrv/CoByteCompatibilityTest.*, and then add tests to test_compatibility_tlbparser_VT_I1_assignment.py.
The test double is for development and we do not publish it as an API for a specific application, so it is OK to change the interface.
Also, like SAFEARRAY, I think we need to study and test VT_I1 marshalling in VARIANT.
If there are problems like the tlbparser mapping this time and we need to fix production code to resolve the inconsistency, please open an issue.
If you only add regression tests, you do not need an issue—a PR is enough.
The current type-library parser maps
VT_I1toc_char. A signed scalar retval can therefore fail during automatic output allocation, and a generated signed-byte SAFEARRAY exposes unsigned tuple values or incorrect NumPy results. This PR records those problems and compares current and proposed interface definitions against the same native COM server.The default
tlbparser.COMTYPESmapping stays unchanged.schar_typeis defined for later work, but is not selected by the parser. Mapping, warnings, feature flags and migration decisions remain in #969.Changes:
LPSTR, and plain character input/output pointers. Its IDL, implementation, factory and build registration are included in the existing CI server.COMMETHODdeclarations, automatic/pointer/byref/array result helpers, literal return values and explicitTypeError/ArgumentErrorpaths. Keep the freshly generated interface separate; assert it still matches the legacy declarations and exercise its actual calls.ValueError.Observed validation on Windows x64, Python 3.13.5, NumPy 2.1.3 and pywin32 308:
git diff --checkpasses.The unchanged native binary from the earlier fixture build was reused; its build was not rerun for this revision. These are local results, not a claim about new-head GitHub CI. The real-library investigation in #969 covers generated declarations and local records, not end-to-end SAPI, PortableDevice, CLR or event-source calls. This PR does not claim to fix the intermittent UIAutomation exception discussed elsewhere.
AI assistance: prepared and revised with OpenAI Codex; commands and outcomes above were observed locally.
Current GitHub CI for
379ef3e: 64 checks succeeded, one failed and 11 were cancelled. The failure is the existingTestLocalServer_win32com.test_get_nameworking-set assertion (Leaks 4096 bytes) on Python 3.14 x86 with third parties; all changed tests passed in that job. Root cause remains unresolved. Rerun was attempted but requires repository admin rights; awaiting maintainer rerun. Job: https://github.com/enthought/comtypes/actions/runs/39103259500/job/117603688961