Some refcount tests

Nikolay Sivov bunglehead at gmail.com
Thu Feb 11 10:22:37 CST 2010


---
 dlls/msxml3/domdoc.c       |    4 ++
 dlls/msxml3/tests/domdoc.c |  109 ++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 113 insertions(+), 0 deletions(-)

diff --git a/dlls/msxml3/domdoc.c b/dlls/msxml3/domdoc.c
index 77d1d2e..d4be6b6 100644
--- a/dlls/msxml3/domdoc.c
+++ b/dlls/msxml3/domdoc.c
@@ -1046,6 +1046,8 @@ static HRESULT WINAPI domdoc_createElement(
 
     TRACE("%p->(%s,%p)\n", iface, debugstr_w(tagname), element);
 
+    if (!element) return E_INVALIDARG;
+
     xml_name = xmlChar_from_wchar(tagname);
     xmlnode = xmlNewDocNode(get_doc(This), NULL, xml_name, NULL);
     xmldoc_add_orphan(xmlnode->doc, xmlnode);
@@ -1346,6 +1348,8 @@ static HRESULT WINAPI domdoc_createNode(
 
     TRACE("(%p)->(type,%s,%s,%p)\n", This, debugstr_w(name), debugstr_w(namespaceURI), node);
 
+    if(!node) return E_INVALIDARG;
+
     if(namespaceURI && namespaceURI[0])
         FIXME("nodes with namespaces currently not supported.\n");
 
diff --git a/dlls/msxml3/tests/domdoc.c b/dlls/msxml3/tests/domdoc.c
index 1b134af..61aa391 100644
--- a/dlls/msxml3/tests/domdoc.c
+++ b/dlls/msxml3/tests/domdoc.c
@@ -274,6 +274,29 @@ static WCHAR szStrangeChars[] = {'&','x',' ',0x2103, 0};
 
 #define double_eq(x, y) ok((x)-(y)<=1e-14*(x) && (x)-(y)>=-1e-14*(x), "expected %.16g, got %.16g\n", x, y)
 
+static void check_refcount_(IUnknown *iface, LONG expected, int todo, int line)
+{
+     LONG ref;
+
+     ref = IUnknown_AddRef(iface);
+     IUnknown_Release(iface);
+     if (todo) {
+         todo_wine
+            ok_(__FILE__, line)((ref-1) == expected, "Expected %d, got %d\n", expected, ref-1);
+     }
+     else
+            ok_(__FILE__, line)((ref-1) == expected, "Expected %d, got %d\n", expected, ref-1);
+}
+
+#define check_refcount(iface, exp, todo) check_refcount_((IUnknown*)iface, exp, todo, __LINE__)
+
+static void release_iface_(IUnknown *iface)
+{
+    while(IUnknown_Release(iface)) {};
+}
+
+#define release_iface(iface) release_iface_((IUnknown*)iface)
+
 static BSTR alloc_str_from_narrow(const char *str)
 {
     int len = MultiByteToWideChar(CP_ACP, 0, str, -1, NULL, 0);
@@ -969,6 +992,8 @@ static void test_domdoc( void )
     /* test Create Comment */
     r = IXMLDOMDocument_createComment(doc, NULL, NULL);
     ok( r == E_INVALIDARG, "returns %08x\n", r );
+    r = IXMLDOMDocument_createComment(doc, szComment, NULL);
+    ok( r == E_INVALIDARG, "returns %08x\n", r );
     r = IXMLDOMDocument_createComment(doc, szComment, &node_comment);
     ok( r == S_OK, "returns %08x\n", r );
     if(node_comment)
@@ -994,6 +1019,8 @@ static void test_domdoc( void )
     /* test Create Attribute */
     r = IXMLDOMDocument_createAttribute(doc, NULL, NULL);
     ok( r == E_INVALIDARG, "returns %08x\n", r );
+    r = IXMLDOMDocument_createAttribute(doc, szAttribute, NULL);
+    ok( r == E_INVALIDARG, "returns %08x\n", r );
     r = IXMLDOMDocument_createAttribute(doc, szAttribute, &node_attr);
     ok( r == S_OK, "returns %08x\n", r );
     IXMLDOMText_Release( node_attr);
@@ -1664,6 +1691,11 @@ static void test_create(void)
     ok( r == S_OK, "returns %08x\n", r );
     if( SUCCEEDED(r) ) IXMLDOMNode_Release( node );
 
+    V_VT(&var) = VT_I1;
+    V_I1(&var) = NODE_ELEMENT;
+    r = IXMLDOMDocument_createNode( doc, var, str, NULL, NULL );
+    ok( r == E_INVALIDARG, "returns %08x\n", r );
+
     V_VT(&var) = VT_R4;
     V_R4(&var) = NODE_ELEMENT;
     r = IXMLDOMDocument_createNode( doc, var, str, NULL, &node );
@@ -3641,6 +3673,9 @@ static void test_nodeTypeTests( void )
     if( hr != S_OK )
         return;
 
+    hr = IXMLDOMDocument_createElement(doc, _bstr_("Testing"), NULL);
+    ok(hr == E_INVALIDARG, "ret %08x\n", hr );
+
     hr = IXMLDOMDocument_createElement(doc, _bstr_("Testing"), &pRoot);
     ok(hr == S_OK, "ret %08x\n", hr );
     if(hr == S_OK)
@@ -4673,6 +4708,79 @@ static void test_TransformWithLoadingLocalFile(void)
     free_bstrs();
 }
 
+static void test_refcount(void)
+{
+    IXMLDOMDocument *doc;
+    IXMLDOMElement *elem;
+    IXMLDOMAttribute *attr, *attr2;
+    IXMLDOMComment *comment;
+    IXMLDOMNode *node;
+    VARIANT var;
+    HRESULT hr;
+
+    hr = CoCreateInstance( &CLSID_DOMDocument, NULL, CLSCTX_INPROC_SERVER, &IID_IXMLDOMDocument, (LPVOID*)&doc );
+    if( hr != S_OK )
+        return;
+
+    check_refcount(doc, 1, FALSE);
+
+    hr = IXMLDOMDocument_createElement(doc, _bstr_("Testing1"), &elem);
+    ok(hr == S_OK, "ret %08x\n", hr );
+    check_refcount(elem, 2, TRUE);
+    check_refcount(doc, 1, FALSE);
+
+    /* appendChild doesn't change refcount */
+    hr = IXMLDOMDocument_appendChild(doc, (IXMLDOMNode*)elem, NULL);
+    ok(hr == S_OK, "ret %08x\n", hr );
+    check_refcount(elem, 2, FALSE);
+    check_refcount(doc, 1, FALSE);
+
+    /* cloned node has 1 reference */
+    hr = IXMLDOMElement_cloneNode(elem, VARIANT_TRUE, &node);
+    ok( hr == S_OK, "ret %08x\n", hr );
+    check_refcount(elem, 2, FALSE);
+    check_refcount(node, 1, FALSE);
+    IXMLDOMNode_Release(node);
+
+    hr = IXMLDOMElement_cloneNode(elem, VARIANT_FALSE, &node);
+    ok( hr == S_OK, "ret %08x\n", hr );
+    check_refcount(elem, 2, FALSE);
+    check_refcount(node, 1, FALSE);
+    IXMLDOMNode_Release(node);
+
+    attr = (IXMLDOMAttribute*)0x1;
+    hr = IXMLDOMDocument_createAttribute(doc, _bstr_("attr1"), &attr);
+    ok(hr == S_OK, "ret %08x\n", hr );
+    check_refcount(attr, 2, TRUE);
+
+    attr2 = (IXMLDOMAttribute*)0x1;
+    hr = IXMLDOMElement_setAttributeNode(elem, attr, &attr2);
+    todo_wine ok(hr == S_OK, "ret %08x\n", hr );
+    check_refcount(attr, 2, TRUE);
+    todo_wine ok(attr2 == NULL, "expected null iface\n" );
+
+    hr = IXMLDOMDocument_createComment(doc, _bstr_("Comment"), &comment);
+    ok(hr == S_OK, "ret %08x\n", hr );
+    check_refcount(comment, 2, TRUE);
+
+    /* ::insertBefore() */
+    VariantInit(&var);
+    node = (IXMLDOMNode*)0x1;
+    /* comment refcount is increased */
+    check_refcount(elem, 2, FALSE);
+    hr = IXMLDOMElement_insertBefore(elem, (IXMLDOMNode*)comment, var, &node);
+    ok(hr == S_OK, "ret %08x\n", hr );
+    check_refcount(comment, 3, TRUE);
+    check_refcount(elem, 2, FALSE);
+
+    free_bstrs();
+
+    release_iface(comment);
+    release_iface(attr);
+    release_iface(elem);
+    IXMLDOMDocument_Release(doc);
+}
+
 START_TEST(domdoc)
 {
     HRESULT r;
@@ -4703,6 +4811,7 @@ START_TEST(domdoc)
     test_FormattingXML();
     test_NodeTypeValue();
     test_TransformWithLoadingLocalFile();
+    test_refcount();
 
     CoUninitialize();
 }
-- 
1.5.6.5


--=-JWcRdYVd4TEUvOez5hVK--




More information about the wine-patches mailing list