[PATCH resend 3/4] msxml3/tests: Test for disabled document methods with writer domdoc dest.

Jefferson Carpenter jeffersoncarpenter2 at gmail.com
Mon May 31 15:06:57 CDT 2021


-------------- next part --------------
From 41287679e1b89dc810eb3b2a3c44279a40223645 Mon Sep 17 00:00:00 2001
From: Jefferson Carpenter <jeffersoncarpenter2 at gmail.com>
Date: Mon, 31 May 2021 20:07:58 +0000
Subject: [PATCH 3/4] msxml3/tests: Test for disabled document methods with
 writer domdoc dest.

Signed-off-by: Jefferson Carpenter <jeffersoncarpenter2 at gmail.com>
---
 dlls/msxml3/tests/saxreader.c | 338 ++++++++++++++++++++++++++++++++++
 1 file changed, 338 insertions(+)

diff --git a/dlls/msxml3/tests/saxreader.c b/dlls/msxml3/tests/saxreader.c
index 53e2af016f4..2a82a81da02 100644
--- a/dlls/msxml3/tests/saxreader.c
+++ b/dlls/msxml3/tests/saxreader.c
@@ -4970,6 +4970,331 @@ static void check_domelement_methods_disabled(IXMLDOMElement *locked_element)
     ok(hr == E_FAIL, "%p: Unexpected hr %#x.\n", locked_element, hr);
 }
 
+typedef struct {
+    IDispatch IDispatch_iface;
+    LONG ref;
+} dispevent;
+
+static inline dispevent *impl_from_IDispatch( IDispatch *iface )
+{
+    return CONTAINING_RECORD(iface, dispevent, IDispatch_iface);
+}
+
+static HRESULT WINAPI dispevent_QueryInterface(IDispatch *iface, REFIID riid, void **ppvObject)
+{
+    *ppvObject = NULL;
+
+    if ( IsEqualGUID( riid, &IID_IDispatch) ||
+         IsEqualGUID( riid, &IID_IUnknown) )
+    {
+        *ppvObject = iface;
+    }
+    else
+        return E_NOINTERFACE;
+
+    IDispatch_AddRef( iface );
+
+    return S_OK;
+}
+
+static ULONG WINAPI dispevent_AddRef(IDispatch *iface)
+{
+    dispevent *This = impl_from_IDispatch( iface );
+    return InterlockedIncrement( &This->ref );
+}
+
+static ULONG WINAPI dispevent_Release(IDispatch *iface)
+{
+    dispevent *This = impl_from_IDispatch( iface );
+    ULONG ref = InterlockedDecrement( &This->ref );
+
+    if (ref == 0)
+        heap_free(This);
+
+    return ref;
+}
+
+static HRESULT WINAPI dispevent_GetTypeInfoCount(IDispatch *iface, UINT *pctinfo)
+{
+    return S_OK;
+}
+
+static HRESULT WINAPI dispevent_GetTypeInfo(IDispatch *iface, UINT iTInfo,
+        LCID lcid, ITypeInfo **ppTInfo)
+{
+    return S_OK;
+}
+
+static HRESULT WINAPI dispevent_GetIDsOfNames(IDispatch *iface, REFIID riid,
+        LPOLESTR *rgszNames, UINT cNames, LCID lcid, DISPID *rgDispId)
+{
+    return S_OK;
+}
+
+static HRESULT WINAPI dispevent_Invoke(IDispatch *iface, DISPID member, REFIID riid,
+        LCID lcid, WORD flags, DISPPARAMS *params, VARIANT *result,
+        EXCEPINFO *excepInfo, UINT *argErr)
+{
+    return S_OK;
+}
+
+static const IDispatchVtbl dispeventVtbl =
+{
+    dispevent_QueryInterface,
+    dispevent_AddRef,
+    dispevent_Release,
+    dispevent_GetTypeInfoCount,
+    dispevent_GetTypeInfo,
+    dispevent_GetIDsOfNames,
+    dispevent_Invoke
+};
+
+static IDispatch* create_dispevent(void)
+{
+    dispevent *event = heap_alloc(sizeof(*event));
+
+    event->IDispatch_iface.lpVtbl = &dispeventVtbl;
+    event->ref = 1;
+
+    return (IDispatch*)&event->IDispatch_iface;
+}
+
+static void check_domdoc_methods_disabled(IXMLDOMDocument *locked_doc)
+{
+    HRESULT hr;
+    VARIANT variant;
+    VARIANT_BOOL variant_bool;
+    BSTR bstr;
+    LONG long_integer;
+    IDispatch *dispatch;
+    IXMLDOMDocumentType *document_type;
+    IXMLDOMImplementation *implementation;
+    IXMLDOMElement *element;
+    IXMLDOMDocumentFragment *document_fragment;
+    IXMLDOMText *text;
+    IXMLDOMComment *comment;
+    IXMLDOMCDATASection *cdata_section;
+    IXMLDOMProcessingInstruction *processing_instruction;
+    IXMLDOMAttribute *attribute;
+    IXMLDOMEntityReference *entity_reference;
+    IXMLDOMNodeList *node_list;
+    IXMLDOMNode *node;
+    IXMLDOMParseError *parse_error;
+
+    document_type = (void*)0xdeadbeef;
+    hr = IXMLDOMDocument_get_doctype(locked_doc, &document_type);
+    ok(hr == S_FALSE, "%p: Unexpected hr %#x.\n", locked_doc, hr);
+    ok(document_type == NULL, "%p: Got %p.\n", locked_doc, document_type);
+
+    hr = IXMLDOMDocument_get_implementation(locked_doc, &implementation);
+    ok(hr == S_OK, "%p: Unexpected hr %#x.\n", locked_doc, hr);
+    IXMLDOMImplementation_Release(implementation);
+
+    element = (void*)0xdeadbeef;
+    hr = IXMLDOMDocument_get_documentElement(locked_doc, &element);
+    todo_wine ok(hr == S_OK, "%p: Unexpected hr %#x.\n", locked_doc, hr);
+    ok(element != (void*)0xdeadbeef, "%p: Got %p.\n", locked_doc, element);
+    /* element used by next test */
+
+    if (element) {
+        hr = IXMLDOMDocument_putref_documentElement(locked_doc, element);
+        ok(hr == E_FAIL, "%p: Unexpected hr %#x.\n", locked_doc, hr);
+        IXMLDOMElement_Release(element);
+    }
+
+    element = (void*)0xdeadbeef;
+    hr = IXMLDOMDocument_createElement(locked_doc, _bstr_("SomeTagName"), &element);
+    todo_wine ok(hr == E_FAIL, "%p: Unexpected hr %#x.\n", locked_doc, hr);
+    todo_wine ok(element == (void*)0xdeadbeef, "%p: Got %p.\n", locked_doc, element);
+    if (element && element != (void*)0xdeadbeef) IXMLDOMElement_Release(element);
+
+    hr = IXMLDOMDocument_createDocumentFragment(locked_doc, &document_fragment);
+    ok(hr == S_OK, "%p: Unexpected hr %#x.\n", locked_doc, hr);
+    IXMLDOMDocumentFragment_Release(document_fragment);
+
+    hr = IXMLDOMDocument_createTextNode(locked_doc, _bstr_("some text"), &text);
+    ok(hr == S_OK, "%p: Unexpected hr %#x.\n", locked_doc, hr);
+    IXMLDOMText_Release(text);
+
+    hr = IXMLDOMDocument_createComment(locked_doc, _bstr_("some comment"), &comment);
+    ok(hr == S_OK, "%p: Unexpected hr %#x.\n", locked_doc, hr);
+    IXMLDOMComment_Release(comment);
+
+    hr = IXMLDOMDocument_createCDATASection(locked_doc, _bstr_("some CDATA"), &cdata_section);
+    ok(hr == S_OK, "%p: Unexpected hr %#x.\n", locked_doc, hr);
+    IXMLDOMCDATASection_Release(cdata_section);
+
+    processing_instruction = (void*)0xdeadbeef;
+    hr = IXMLDOMDocument_createProcessingInstruction( locked_doc, _bstr_("xml"),
+        _bstr_("version=\"1.0\" encoding=\"UTF-16\""), &processing_instruction);
+    todo_wine ok(hr == E_FAIL, "%p: Unexpected hr %#x.\n", locked_doc, hr);
+    todo_wine ok(processing_instruction == (void*)0xdeadbeef, "%p: Got %p.\n", locked_doc, processing_instruction);
+    if (processing_instruction && processing_instruction != (void*)0xdeadbeef)
+        IXMLDOMProcessingInstruction_Release(processing_instruction);
+
+    attribute = (void*)0xdeadbeef;
+    hr = IXMLDOMDocument_createAttribute(locked_doc, _bstr_("attribute"), &attribute);
+    todo_wine ok(hr == E_FAIL, "%p: Unexpected hr %#x.\n", locked_doc, hr);
+    todo_wine ok(attribute == (void*)0xdeadbeef, "%p: Got %p.\n", locked_doc, attribute);
+    if (attribute && attribute != (void*)0xdeadbeef) IXMLDOMAttribute_Release(attribute);
+
+    entity_reference = (void*)0xdeadbeef;
+    hr = IXMLDOMDocument_createEntityReference(locked_doc, _bstr_("entityref"), &entity_reference);
+    todo_wine ok(hr == E_FAIL, "%p: Unexpected hr %#x.\n", locked_doc, hr);
+    todo_wine ok(entity_reference == (void*)0xdeadbeef, "%p: Got %p.\n", locked_doc, entity_reference);
+    if (entity_reference && entity_reference != (void*)0xdeadbeef) IXMLDOMEntityReference_Release(entity_reference);
+
+    node_list = (void*)0xdeadbeef;
+    hr = IXMLDOMDocument_getElementsByTagName(locked_doc, _bstr_("BankAccount"), &node_list);
+    todo_wine ok(hr == E_PENDING, "%p: Unexpected hr %#x.\n", locked_doc, hr);
+    todo_wine ok(node_list == NULL, "%p: Got %p.\n", locked_doc, node_list);
+    if (node_list && node_list != (void*)0xdeadbeef) IXMLDOMNodeList_Release(node_list);
+
+    V_VT(&variant) = VT_I1;
+    V_I1(&variant) = NODE_TEXT;
+    node = (void*)0xdeadbeef;
+    hr = IXMLDOMDocument_createNode(locked_doc, variant, NULL, NULL, &node);
+    todo_wine ok(hr == E_FAIL, "%p: Unexpected hr %#x.\n", locked_doc, hr);
+    todo_wine ok(node == (void*)0xdeadbeef, "%p: Got %p.\n", locked_doc, node);
+    if (node && node != (void*)0xdeadbeef) IXMLDOMNode_Release(node);
+
+    node = (void*)0xdeadbeef;
+    hr = IXMLDOMDocument_nodeFromID(locked_doc, _bstr_("id"), &node);
+    todo_wine ok(hr == E_PENDING, "%p: Unexpected hr %#x.\n", locked_doc, hr);
+    ok(node == (void*)0xdeadbeef, "%p: Got %p.\n", locked_doc, node);
+    if (node && node != (void*)0xdeadbeef) IXMLDOMNode_Release(node);
+
+    long_integer = 0;
+    hr = IXMLDOMDocument_get_readyState(locked_doc, &long_integer);
+    ok(hr == S_OK, "%p: Unexpected hr %#x.\n", locked_doc, hr);
+    todo_wine ok(long_integer == 3, "%p: Got %d, expected %d.", locked_doc, long_integer, 3);
+
+    hr = IXMLDOMDocument_get_parseError(locked_doc, &parse_error);
+    ok(hr == S_OK, "%p: Unexpected hr %#x.\n", locked_doc, hr);
+    IXMLDOMParseError_Release(parse_error);
+
+    bstr = (void*)0xdeadbeef;
+    hr = IXMLDOMDocument_get_url(locked_doc, &bstr);
+    ok(hr == S_FALSE, "%p: Unexpected hr %#x.\n", locked_doc, hr);
+    ok(bstr == NULL, "%p: Got %p.\n", locked_doc, bstr);
+
+    hr = IXMLDOMDocument_get_async(locked_doc, &variant_bool);
+    ok(hr == S_OK, "%p: Unexpected hr %#x.\n", locked_doc, hr);
+    ok(variant_bool == VARIANT_TRUE, "Got %d, expected %d.\n", variant_bool, VARIANT_TRUE);
+
+    hr = IXMLDOMDocument_put_async(locked_doc, variant_bool);
+    todo_wine ok(hr == E_FAIL, "%p: Unexpected hr %#x.\n", locked_doc, hr);
+
+    V_VT(&variant) = VT_BSTR;
+    V_BSTR(&variant) = _bstr_("saxreader_test.xml");
+    hr = IXMLDOMDocument_save(locked_doc, variant);
+    ok(hr == S_OK, "%p: Unexpected hr %#x.\n", locked_doc, hr);
+    DeleteFileA("saxreader_test.xml");
+
+    hr = IXMLDOMDocument_get_validateOnParse(locked_doc, &variant_bool);
+    ok(hr == S_OK, "%p: Unexpected hr %#x.\n", locked_doc, hr);
+    todo_wine ok(variant_bool == VARIANT_TRUE, "%p: Got %d, expected %d.\n", locked_doc, variant_bool, VARIANT_TRUE);
+
+    hr = IXMLDOMDocument_put_validateOnParse(locked_doc, variant_bool);
+    todo_wine ok(hr == E_FAIL, "%p: Unexpected hr %#x.\n", locked_doc, hr);
+
+    variant_bool = VARIANT_TRUE;
+    hr = IXMLDOMDocument_get_resolveExternals(locked_doc, &variant_bool);
+    ok(hr == S_OK, "%p: Unexpected hr %#x.\n", locked_doc, hr);
+    ok(variant_bool == VARIANT_FALSE, "%p: Got %d, expected %d.\n", locked_doc, variant_bool, VARIANT_FALSE);
+
+    hr = IXMLDOMDocument_put_resolveExternals(locked_doc, variant_bool);
+    todo_wine ok(hr == E_FAIL, "%p: Unexpected hr %#x.\n", locked_doc, hr);
+
+    variant_bool = VARIANT_TRUE;
+    hr = IXMLDOMDocument_get_preserveWhiteSpace(locked_doc, &variant_bool);
+    ok(hr == S_OK, "%p: Unexpected hr %#x.\n", locked_doc, hr);
+    ok(variant_bool == VARIANT_FALSE, "%p: Got %d, expected %d.\n", locked_doc, variant_bool, VARIANT_FALSE);
+
+    hr = IXMLDOMDocument_put_preserveWhiteSpace(locked_doc, variant_bool);
+    todo_wine ok(hr == E_FAIL, "%p: Unexpected hr %#x.\n", locked_doc, hr);
+
+    dispatch = create_dispevent();
+    V_VT(&variant) = VT_DISPATCH;
+    V_DISPATCH(&variant) = dispatch;
+    hr = IXMLDOMDocument_put_onreadystatechange(locked_doc, variant);
+    ok(hr == S_OK, "%p: Unexpected hr %#x.\n", locked_doc, hr);
+    EXPECT_REF(dispatch, 2);
+
+    hr = IXMLDOMDocument_put_ondataavailable(locked_doc, variant);
+    todo_wine ok(hr == S_OK, "%p: Unexpected hr %#x.\n", locked_doc, hr);
+    todo_wine EXPECT_REF(dispatch, 3);
+
+    hr = IXMLDOMDocument_put_ontransformnode(locked_doc, variant);
+    todo_wine ok(hr == S_OK, "%p: Unexpected hr %#x.\n", locked_doc, hr);
+    todo_wine EXPECT_REF(dispatch, 4);
+
+    IDispatch_Release(dispatch);
+
+    /* The abort, load, and loadXML functions break the connection
+       with the mxwriter and are tested elsewhere. */
+}
+
+static void check_domdoc2_methods_disabled(IXMLDOMDocument2 *locked_doc)
+{
+    HRESULT hr;
+    VARIANT variant;
+    IXMLDOMSchemaCollection *schema_collection;
+    IXMLDOMParseError *parse_error;
+
+    hr = IXMLDOMDocument2_get_namespaces(locked_doc, &schema_collection);
+    ok(hr == S_OK, "%p: Unexpected hr %#x.\n", locked_doc, hr);
+    IXMLDOMSchemaCollection_Release(schema_collection);
+
+    V_VT(&variant) = VT_EMPTY;
+    hr = IXMLDOMDocument2_get_schemas(locked_doc, &variant);
+    ok(hr == S_FALSE, "%p: Unexpected hr %#x.\n", locked_doc, hr);
+    ok(V_VT(&variant) == VT_NULL, "%p: Got %d.\n", locked_doc, V_VT(&variant));
+
+    V_VT(&variant) = VT_DISPATCH;
+    V_DISPATCH(&variant) = NULL;
+    hr = IXMLDOMDocument2_putref_schemas(locked_doc, variant);
+    todo_wine ok(hr == E_FAIL, "%p: Unexpected hr %#x.\n", locked_doc, hr);
+
+    parse_error = (void*)0xdeadbeef;
+    hr = IXMLDOMDocument2_validate(locked_doc, &parse_error);
+    todo_wine ok(hr == E_FAIL, "%p: Unexpected hr %#x.\n", locked_doc, hr);
+    todo_wine ok(parse_error == (void*)0xdeadbeef, "%p: Got %p.\n", locked_doc, parse_error);
+    if (parse_error && parse_error != (void*)0xdeadbeef) IXMLDOMParseError_Release(parse_error);
+
+    V_VT(&variant) = VT_BOOL;
+    V_BOOL(&variant) = VARIANT_FALSE;
+    hr = IXMLDOMDocument2_setProperty(locked_doc, _bstr_("ForcedResync"), variant);
+    ok(hr == E_FAIL, "%p: Unexpected hr %#x.\n", locked_doc, hr);
+
+    V_VT(&variant) = VT_EMPTY;
+    hr = IXMLDOMDocument2_getProperty(locked_doc, _bstr_("ForcedResync"), &variant);
+    todo_wine ok(hr == S_OK, "%p: Unexpected hr %#x.\n", locked_doc, hr);
+    todo_wine ok(V_VT(&variant) == VT_BOOL, "%p: Got %d, expected %d.\n", locked_doc, V_VT(&variant), VT_BOOL);
+    todo_wine ok(V_BOOL(&variant) == VARIANT_TRUE, "%p: Got %d, expected %d.\n", locked_doc, V_BOOL(&variant), VARIANT_TRUE);
+}
+
+static void check_domdoc3_methods_disabled(IXMLDOMDocument3 *locked_doc, IXMLDOMNode *locked_node)
+{
+    HRESULT hr;
+    VARIANT_BOOL variant_bool;
+    IXMLDOMParseError *parse_error;
+    IXMLDOMNode *node;
+
+    parse_error = (void*)0xdeadbeef;
+    hr = IXMLDOMDocument3_validateNode(locked_doc, locked_node, &parse_error);
+    todo_wine ok(hr == E_FAIL, "%p: Unexpected hr %#x.\n", locked_doc, hr);
+    todo_wine ok(parse_error == (void*)0xdeadbeef, "%p: Got %p.\n", locked_doc, parse_error);
+    if (parse_error && parse_error != (void*)0xdeadbeef) IXMLDOMParseError_Release(parse_error);
+
+    node = (void*)0xdeadbeef;
+    variant_bool = VARIANT_TRUE;
+    hr = IXMLDOMDocument3_importNode(locked_doc, locked_node, variant_bool, &node);
+    todo_wine ok(hr == S_OK, "%p: Unexpected hr %#x.\n", locked_doc, hr);
+    todo_wine ok(node != (void*)0xdeadbeef, "%p: Got %p.\n", locked_doc, node);
+    if (node && node != (void*)0xdeadbeef) IXMLDOMNode_Release(node);
+}
+
 static void test_mxwriter_domdoc_startDocument_disables_domdoc_methods(void)
 {
     HRESULT hr;
@@ -4991,6 +5316,7 @@ static void test_mxwriter_domdoc_startDocument_disables_domdoc_methods(void)
     IXMLDOMCDATASection *cdata_section = NULL;
     /* for disabled element methods */
     IXMLDOMElement *element = NULL;
+    /* for disabled domdoc methods */
     IXMLDOMDocument2 *domdoc2;
     IXMLDOMDocument3 *domdoc3;
 
@@ -5130,6 +5456,18 @@ static void test_mxwriter_domdoc_startDocument_disables_domdoc_methods(void)
     }
 
 
+    /* Call IXMLDOMDocument/2/3 methods on domdoc. */
+    check_domdoc_methods_disabled(domdoc);
+
+    check_domdoc_methods_disabled((IXMLDOMDocument*)domdoc2);
+    check_domdoc2_methods_disabled(domdoc2);
+
+    check_domdoc_methods_disabled((IXMLDOMDocument*)domdoc3);
+    check_domdoc2_methods_disabled((IXMLDOMDocument2*)domdoc3);
+    check_domdoc3_methods_disabled(domdoc3, element_node);
+    check_domdoc3_methods_disabled(domdoc3, text_node);
+
+
     if (import_text_node) IXMLDOMNode_Release(import_text_node);
     if (import_element_node) IXMLDOMNode_Release(import_element_node);
     if (text_node) IXMLDOMNode_Release(text_node);
-- 
2.26.2



More information about the wine-devel mailing list