Jacek Caban : inetcomm/tests: Added more IMimeBody:: SetData and GetData tests.

Alexandre Julliard julliard at winehq.org
Mon Jan 30 15:39:16 CST 2017


Module: wine
Branch: master
Commit: b0902a487d3c7de62f391e5599a89e63a0639d44
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=b0902a487d3c7de62f391e5599a89e63a0639d44

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Fri Jan 27 16:00:03 2017 +0100

inetcomm/tests: Added more IMimeBody::SetData and GetData tests.

Signed-off-by: Jacek Caban <jacek at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/inetcomm/tests/mimeole.c | 275 ++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 275 insertions(+)

diff --git a/dlls/inetcomm/tests/mimeole.c b/dlls/inetcomm/tests/mimeole.c
index 7e510c5..9fbaeec 100644
--- a/dlls/inetcomm/tests/mimeole.c
+++ b/dlls/inetcomm/tests/mimeole.c
@@ -32,6 +32,36 @@
 
 #include "wine/test.h"
 
+#define DEFINE_EXPECT(func) \
+    static BOOL expect_ ## func = FALSE, called_ ## func = FALSE
+
+#define SET_EXPECT(func) \
+    expect_ ## func = TRUE
+
+#define CHECK_EXPECT(func) \
+    do { \
+        ok(expect_ ##func, "unexpected call " #func "\n"); \
+        expect_ ## func = FALSE; \
+        called_ ## func = TRUE; \
+    }while(0)
+
+#define CHECK_EXPECT2(func) \
+    do { \
+        ok(expect_ ##func, "unexpected call " #func  "\n"); \
+        called_ ## func = TRUE; \
+    }while(0)
+
+#define CHECK_CALLED(func) \
+    do { \
+        ok(called_ ## func, "expected " #func "\n"); \
+        expect_ ## func = called_ ## func = FALSE; \
+    }while(0)
+
+DEFINE_EXPECT(Stream_Read);
+DEFINE_EXPECT(Stream_Stat);
+DEFINE_EXPECT(Stream_Seek);
+DEFINE_EXPECT(Stream_Seek_END);
+
 static const char msg1[] =
     "MIME-Version: 1.0\r\n"
     "Content-Type: multipart/mixed;\r\n"
@@ -212,6 +242,250 @@ static void test_CreateBody(void)
     IMimeBody_Release(body);
 }
 
+typedef struct {
+    IStream IStream_iface;
+    LONG ref;
+    unsigned pos;
+} TestStream;
+
+static inline TestStream *impl_from_IStream(IStream *iface)
+{
+    return CONTAINING_RECORD(iface, TestStream, IStream_iface);
+}
+
+static HRESULT WINAPI Stream_QueryInterface(IStream *iface, REFIID riid, void **ppv)
+{
+    if(IsEqualGUID(&IID_IUnknown, riid) || IsEqualGUID(&IID_ISequentialStream, riid) || IsEqualGUID(&IID_IStream, riid)) {
+        *ppv = iface;
+        return S_OK;
+    }
+
+    ok(0, "unexpected call %s\n", wine_dbgstr_guid(riid));
+    *ppv = NULL;
+    return E_NOINTERFACE;
+}
+
+static ULONG WINAPI Stream_AddRef(IStream *iface)
+{
+    TestStream *This = impl_from_IStream(iface);
+    return InterlockedIncrement(&This->ref);
+}
+
+static ULONG WINAPI Stream_Release(IStream *iface)
+{
+    TestStream *This = impl_from_IStream(iface);
+    return InterlockedDecrement(&This->ref);
+}
+
+static HRESULT WINAPI Stream_Read(IStream *iface, void *pv, ULONG cb, ULONG *pcbRead)
+{
+    TestStream *This = impl_from_IStream(iface);
+    BYTE *output = pv;
+    unsigned i;
+
+    CHECK_EXPECT(Stream_Read);
+
+    for(i = 0; i < cb; i++)
+        output[i] = '0' + This->pos++;
+    *pcbRead = i;
+    return S_OK;
+}
+
+static HRESULT WINAPI Stream_Write(IStream *iface, const void *pv, ULONG cb, ULONG *pcbWritten)
+{
+    ok(0, "unexpected call\n");
+    return E_NOTIMPL;
+}
+
+static DWORD expect_seek_pos;
+
+static HRESULT WINAPI Stream_Seek(IStream *iface, LARGE_INTEGER dlibMove, DWORD dwOrigin,
+                                  ULARGE_INTEGER *plibNewPosition)
+{
+    TestStream *This = impl_from_IStream(iface);
+
+    if(dwOrigin == STREAM_SEEK_END) {
+        CHECK_EXPECT(Stream_Seek_END);
+        ok(dlibMove.QuadPart == expect_seek_pos, "unexpected seek pos %u\n", dlibMove.u.LowPart);
+        if(plibNewPosition)
+            plibNewPosition->QuadPart = 10;
+        return S_OK;
+    }
+
+    CHECK_EXPECT(Stream_Seek);
+
+    ok(dlibMove.QuadPart == expect_seek_pos, "unexpected seek pos %u\n", dlibMove.u.LowPart);
+    ok(dwOrigin == STREAM_SEEK_SET, "dwOrigin = %d\n", dwOrigin);
+    This->pos = dlibMove.QuadPart;
+    if(plibNewPosition)
+        plibNewPosition->QuadPart = This->pos;
+    return S_OK;
+}
+
+static HRESULT WINAPI Stream_SetSize(IStream *iface, ULARGE_INTEGER libNewSize)
+{
+    ok(0, "unexpected call\n");
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI Stream_CopyTo(IStream *iface, IStream *pstm, ULARGE_INTEGER cb,
+                                    ULARGE_INTEGER *pcbRead, ULARGE_INTEGER *pcbWritten)
+{
+    ok(0, "unexpected call\n");
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI Stream_Commit(IStream *iface, DWORD grfCommitFlags)
+{
+    ok(0, "unexpected call\n");
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI Stream_Revert(IStream *iface)
+{
+    ok(0, "unexpected call\n");
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI Stream_LockRegion(IStream *iface, ULARGE_INTEGER libOffset,
+                                        ULARGE_INTEGER cb, DWORD dwLockType)
+{
+    ok(0, "unexpected call\n");
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI Stream_UnlockRegion(IStream *iface,
+        ULARGE_INTEGER libOffset, ULARGE_INTEGER cb, DWORD dwLockType)
+{
+    ok(0, "unexpected call\n");
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI Stream_Stat(IStream *iface, STATSTG *pstatstg, DWORD dwStatFlag)
+{
+    CHECK_EXPECT(Stream_Stat);
+    ok(dwStatFlag == STATFLAG_NONAME, "dwStatFlag = %x\n", dwStatFlag);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI Stream_Clone(IStream *iface, IStream **ppstm)
+{
+    ok(0, "unexpected call\n");
+    return E_NOTIMPL;
+}
+
+static const IStreamVtbl StreamVtbl = {
+    Stream_QueryInterface,
+    Stream_AddRef,
+    Stream_Release,
+    Stream_Read,
+    Stream_Write,
+    Stream_Seek,
+    Stream_SetSize,
+    Stream_CopyTo,
+    Stream_Commit,
+    Stream_Revert,
+    Stream_LockRegion,
+    Stream_UnlockRegion,
+    Stream_Stat,
+    Stream_Clone
+};
+
+static TestStream *create_test_stream(void)
+{
+    TestStream *stream;
+    stream = HeapAlloc(GetProcessHeap(), 0, sizeof(*stream));
+    stream->IStream_iface.lpVtbl = &StreamVtbl;
+    stream->ref = 1;
+    stream->pos = 0;
+    return stream;
+}
+
+#define test_stream_read(a,b,c,d) _test_stream_read(__LINE__,a,b,c,d)
+static void _test_stream_read(unsigned line, IStream *stream, HRESULT exhres, const char *exdata, unsigned read_size)
+{
+    ULONG read = 0xdeadbeed, exread = strlen(exdata);
+    char buf[1024];
+    HRESULT hres;
+
+    if(read_size == -1)
+        read_size = sizeof(buf)-1;
+
+    hres = IStream_Read(stream, buf, read_size, &read);
+    ok_(__FILE__,line)(hres == exhres, "Read returned %08x, expected %08x\n", hres, exhres);
+    ok_(__FILE__,line)(read == exread, "unexpected read size %u, expected %u\n", read, exread);
+    buf[read] = 0;
+    ok_(__FILE__,line)(read == exread && !memcmp(buf, exdata, read), "unexpected data %s\n", buf);
+}
+
+static void test_SetData(void)
+{
+    IStream *stream, *stream2;
+    TestStream *test_stream;
+    IMimeBody *body;
+    HRESULT hr;
+
+    hr = CoCreateInstance(&CLSID_IMimeBody, NULL, CLSCTX_INPROC_SERVER, &IID_IMimeBody, (void**)&body);
+    ok(hr == S_OK, "ret %08x\n", hr);
+
+    /* Need to call InitNew before Load otherwise Load crashes with native inetcomm */
+    hr = IMimeBody_InitNew(body);
+    ok(hr == S_OK, "ret %08x\n", hr);
+
+    stream = create_stream_from_string(msg1);
+    hr = IMimeBody_Load(body, stream);
+    ok(hr == S_OK, "ret %08x\n", hr);
+    IStream_Release(stream);
+
+    test_stream = create_test_stream();
+    hr = IMimeBody_SetData(body, IET_BINARY, "text", "plain", &IID_IStream, &test_stream->IStream_iface);
+
+    ok(hr == S_OK, "ret %08x\n", hr);
+    hr = IMimeBody_IsContentType(body, "text", "plain");
+    todo_wine
+    ok(hr == S_OK, "ret %08x\n", hr);
+
+    SET_EXPECT(Stream_Stat);
+    SET_EXPECT(Stream_Seek_END);
+    hr = IMimeBody_GetData(body, IET_BINARY, &stream);
+    CHECK_CALLED(Stream_Stat);
+    CHECK_CALLED(Stream_Seek_END);
+    ok(hr == S_OK, "GetData failed %08x\n", hr);
+    ok(stream != &test_stream->IStream_iface, "unexpected stream\n");
+
+    SET_EXPECT(Stream_Seek);
+    SET_EXPECT(Stream_Read);
+    test_stream_read(stream, S_OK, "012", 3);
+    CHECK_CALLED(Stream_Seek);
+    CHECK_CALLED(Stream_Read);
+
+    SET_EXPECT(Stream_Stat);
+    SET_EXPECT(Stream_Seek_END);
+    hr = IMimeBody_GetData(body, IET_BINARY, &stream2);
+    CHECK_CALLED(Stream_Stat);
+    CHECK_CALLED(Stream_Seek_END);
+    ok(hr == S_OK, "GetData failed %08x\n", hr);
+    ok(stream2 != stream, "unexpected stream\n");
+
+    SET_EXPECT(Stream_Seek);
+    SET_EXPECT(Stream_Read);
+    test_stream_read(stream2, S_OK, "01", 2);
+    CHECK_CALLED(Stream_Seek);
+    CHECK_CALLED(Stream_Read);
+
+    expect_seek_pos = 3;
+    SET_EXPECT(Stream_Seek);
+    SET_EXPECT(Stream_Read);
+    test_stream_read(stream, S_OK, "345", 3);
+    CHECK_CALLED(Stream_Seek);
+    CHECK_CALLED(Stream_Read);
+
+    IStream_Release(stream);
+    IStream_Release(stream2);
+    IStream_Release(&test_stream->IStream_iface);
+    IMimeBody_Release(body);
+}
+
 static void test_Allocator(void)
 {
     HRESULT hr;
@@ -844,6 +1118,7 @@ START_TEST(mimeole)
     test_CreateVirtualStream();
     test_CreateSecurity();
     test_CreateBody();
+    test_SetData();
     test_Allocator();
     test_CreateMessage();
     test_MessageSetProp();




More information about the wine-cvs mailing list