initial version of avifile testing framework plus the first simple tests
Julius Schwartzenberg
julius.schwartzenberg at gmail.com
Fri Dec 25 13:29:43 CST 2009
---
dlls/avifil32/tests/api.c | 320 +++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 320 insertions(+), 0 deletions(-)
diff --git a/dlls/avifil32/tests/api.c b/dlls/avifil32/tests/api.c
index 55b194f..cfef4dc 100644
--- a/dlls/avifil32/tests/api.c
+++ b/dlls/avifil32/tests/api.c
@@ -35,6 +35,138 @@ static const CHAR winetest1[] = "winetest1";
/* ########################### */
+typedef struct common_avi_headers {
+ MainAVIHeader mah;
+ AVIStreamHeader ash0;
+ AVIStreamHeader ash1;
+ PCMWAVEFORMAT pcmwf;
+} COMMON_AVI_HEADERS;
+
+static const MainAVIHeader defmah =
+{
+ 0x00008256, /* dwMicroSecPerFrame */
+ 0x000080e8, /* dwMaxBytesPerSec */
+ 0x00000000, /* dwPaddingGranularity */
+ 0x00000910, /* dwFlags */
+ 1, /* dwTotalFrames */
+ 0, /* dwInitialFrames */
+ 2, /* dwStreams */
+ 0x00100000, /* dwSuggestedBufferSize*/
+ 8, /* dwWidth */
+ 6, /* dwHeight */
+ { 0, 0, 0, 0 } /* dwReserved[4] */
+};
+
+static const AVIStreamHeader defash0 =
+{
+ streamtypeVIDEO, /* fccType */
+ 0x30323449, /* fccHandler */
+ 0x00000000, /* dwFlags */
+ 0, /* wPriority */
+ 0, /* wLanguage */
+ 0, /* dwInitialFrames */
+ 0x000003e9, /* dwScale */
+ 0x00007530, /* dwRate */
+ 0, /* dwStart */
+ 1, /* dwLength */
+ 0x00100000, /* dwSuggestedBufferSize*/
+ 0xffffffff, /* dwQuality */
+ 0, /* dwSampleSize */
+ { 0, 0, 0, 0 } /* short left right top bottom */
+};
+
+static const AVIStreamHeader defash1 =
+{
+ /* AVIStreamHeader */
+ streamtypeAUDIO, /* fccType */
+ 1, /* fccHandler */
+ 0, /* dwFlags */
+ 0, /* wPriority */
+ 0, /* wLanguage */
+ 0, /* dwInitialFrames */
+ 1, /* dwScale */
+ 0x00002b11, /* dwRate */
+ 0, /* dwStart */
+ 0x00000665, /* dwLength */
+ 0x00003000, /* dwSuggestedBufferSize*/
+ 0xffffffff, /* dwQuality */
+ 2, /* dwSampleSize */
+ { 0, 0, 0, 0 } /* short left right top bottom */
+};
+
+static const PCMWAVEFORMAT defpcmwf =
+{
+ {
+ 1, /* wFormatTag */
+ 2, /* nChannels */
+ 11025, /* nSamplesPerSec */
+ 22050, /* nAvgBytesPerSec */
+ 2, /* nBlockAlign */
+ },
+ 8, /* wBitsPerSample */
+};
+
+/* Extra data needed to get the VFW API to load the file */
+static DWORD file_header[] =
+{
+ FOURCC_RIFF, 0x34c6 /* length */, formtypeAVI,
+ FOURCC_LIST, 0x1ac /* length */,
+ listtypeAVIHEADER, ckidAVIMAINHDR, sizeof(MainAVIHeader),
+};
+/* MainAVIHeader mah */
+static DWORD streamlist[] =
+{
+ FOURCC_LIST, 0xd4 /* length */,
+ listtypeSTREAMHEADER, ckidSTREAMHEADER, 0x38 /* length */,
+};
+/* AVIStreamHeader ash0 */
+static DWORD videostreamformat[] =
+{
+ ckidSTREAMFORMAT, 0x28 /* length */,
+ 0x00000028, 0x00000008, 0x00000006, 0x00180001,
+ 0x30323449, 0x00000090, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000,
+};
+static DWORD padding1[] =
+{
+ ckidAVIPADDING, 0xc /* length */,
+ 0x00000004, 0x00000000, 0x63643030
+};
+static DWORD videopropheader[] =
+{
+ 0x70727076, 0x44 /* length */,
+ 0x00000000, 0x00000000,
+ 0x0000001e, 0x00000008, 0x00000006, 0x00100009,
+ 0x00000008, 0x00000006, 0x00000001, 0x00000006,
+ 0x00000008, 0x00000006, 0x00000008, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000,
+ FOURCC_LIST, 0x70 /* length */,
+ listtypeSTREAMHEADER, ckidSTREAMHEADER, 0x38 /* length */,
+};
+/* AVIStreamHeader ash1 */
+static DWORD audiostreamformat_pre[] =
+{
+ ckidSTREAMFORMAT, sizeof(PCMWAVEFORMAT) /* length */,
+};
+/* PCMWAVEFORMAT pcmwf */
+static DWORD data[] =
+{
+ ckidAVIPADDING, 0xc /* length */,
+ 0x00000004, 0x00000000, 0x62773130,
+ ckidAVIPADDING, 0xc /* length */,
+ 0x6c6d646f, 0x686c6d64, 0x000000f8,
+ FOURCC_LIST, 0x18 /* length */,
+ 0x4f464e49,
+ 0x54465349, 0xc /* length */,
+ 0x6676614c, 0x332e3235, 0x00302e37,
+ ckidAVIPADDING, 0x4 /* length */,
+ 0,
+ FOURCC_LIST, 0xd1b /* length */, listtypeAVIMOVIE,
+ 0, 0
+};
+
+/* ########################### */
+
static void test_AVISaveOptions(void)
{
AVICOMPRESSOPTIONS options[2];
@@ -87,11 +219,199 @@ static void test_AVISaveOptions(void)
/* ########################### */
+static void init_test_struct(COMMON_AVI_HEADERS *cah)
+{
+ memcpy(&cah->mah, &defmah, sizeof(defmah));
+ memcpy(&cah->ash0, &defash0, sizeof(defash0));
+ memcpy(&cah->ash1, &defash1, sizeof(defash1));
+ memcpy(&cah->pcmwf, &defpcmwf, sizeof(defpcmwf));
+}
+
+static void create_avi_file(const COMMON_AVI_HEADERS *cah)
+{
+ HANDLE hFile;
+ DWORD written;
+
+ hFile = CreateFile("small.avi", GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
+
+ ok(hFile != INVALID_HANDLE_VALUE, "Couldn't create file\n");
+
+ WriteFile(hFile, file_header, sizeof(file_header), &written, NULL);
+ WriteFile(hFile, &cah->mah, sizeof(MainAVIHeader), &written, NULL);
+ WriteFile(hFile, streamlist, sizeof(streamlist), &written, NULL);
+ WriteFile(hFile, &cah->ash0, 0x38, &written, NULL);
+ WriteFile(hFile, videostreamformat, sizeof(videostreamformat), &written, NULL);
+ WriteFile(hFile, padding1, sizeof(padding1), &written, NULL);
+ WriteFile(hFile, videopropheader, sizeof(videopropheader), &written, NULL);
+ WriteFile(hFile, &cah->ash1, 0x38, &written, NULL);
+ WriteFile(hFile, audiostreamformat_pre, sizeof(audiostreamformat_pre), &written, NULL);
+ WriteFile(hFile, &cah->pcmwf, sizeof(PCMWAVEFORMAT), &written, NULL);
+ WriteFile(hFile, data, sizeof(data), &written, NULL);
+
+ CloseHandle(hFile);
+}
+
+static void test_default_data(void)
+{
+ COMMON_AVI_HEADERS cah;
+ PAVIFILE pFile;
+ int res;
+ LONG lSize;
+ PAVISTREAM pStream0;
+ PAVISTREAM pStream1;
+ AVISTREAMINFO asi0;
+ AVISTREAMINFO asi1;
+ WAVEFORMATEX wfx;
+
+ init_test_struct(&cah);
+ create_avi_file(&cah);
+
+ res = AVIFileOpen(&pFile, "small.avi", OF_SHARE_DENY_WRITE, 0L);
+ ok(res == 0, "Unable to open file: error=%u\n", res);
+
+ res = AVIFileGetStream(pFile, &pStream0, 0, 0);
+ ok(res == 0, "Unable to open video stream: error=%u\n", res);
+
+ res = AVIFileGetStream(pFile, &pStream1, 0, 1);
+ ok(res == 0, "Unable to open audio stream: error=%u\n", res);
+
+ res = AVIStreamInfo(pStream0, &asi0, sizeof(AVISTREAMINFO));
+ ok(res == 0, "Unable to read stream info: error=%u\n", res);
+
+ res = AVIStreamInfo(pStream1, &asi1, sizeof(AVISTREAMINFO));
+ ok(res == 0, "Unable to read stream info: error=%u\n", res);
+
+ res = AVIStreamReadFormat(pStream0, AVIStreamStart(pStream1), NULL, &lSize);
+ ok(res == 0, "Unable to read format size: error=%u\n", res);
+
+ res = AVIStreamReadFormat(pStream1, AVIStreamStart(pStream1), &wfx, &lSize);
+ ok(res == 0, "Unable to read format: error=%u\n", res);
+
+ ok(asi0.fccType == streamtypeVIDEO, "got 0x%x (expected streamtypeVIDEO)\n", asi0.fccType);
+ ok(asi0.fccHandler == 0x30323449, "got 0x%x (expected 0x30323449)\n", asi0.fccHandler);
+ ok(asi0.dwFlags == 0, "got %u (expected 0)\n", asi0.dwFlags);
+ ok(asi0.wPriority == 0, "got %u (expected 0)\n", asi0.wPriority);
+ ok(asi0.wLanguage == 0, "got %u (expected 0)\n", asi0.wLanguage);
+ ok(asi0.dwScale == 1001, "got %u (expected 1001)\n", asi0.dwScale);
+ ok(asi0.dwRate == 30000, "got %u (expected 30000)\n", asi0.dwRate);
+ ok(asi0.dwStart == 0, "got %u (expected 0)\n", asi0.dwStart);
+ ok(asi0.dwLength == 1, "got %u (expected 1)\n", asi0.dwLength);
+ ok(asi0.dwInitialFrames == 0, "got %u (expected 0)\n", asi0.dwInitialFrames);
+ ok(asi0.dwSuggestedBufferSize == 0, "got %u (expected 0)\n", asi0.dwSuggestedBufferSize);
+ ok(asi0.dwQuality == 0xffffffff, "got 0x%x (expected 0xffffffff)\n", asi0.dwQuality);
+ ok(asi0.dwSampleSize == 0, "got %u (expected 0)\n", asi0.dwSampleSize);
+ ok(asi0.rcFrame.left == 0, "got %u (expected 0)\n", asi0.rcFrame.left);
+ ok(asi0.rcFrame.top == 0, "got %u (expected 0)\n", asi0.rcFrame.top);
+ ok(asi0.rcFrame.right == 8, "got %u (expected 8)\n", asi0.rcFrame.right); /* these are based on the values in the mah and not */
+ ok(asi0.rcFrame.bottom == 6, "got %u (expected 6)\n", asi0.rcFrame.bottom);/* on the ones in the ash which are 0 here */
+ ok(asi0.dwEditCount == 0, "got %u (expected 0)\n", asi0.dwEditCount);
+ ok(asi0.dwFormatChangeCount == 0, "got %u (expected 0)\n)", asi0.dwFormatChangeCount);
+
+ ok(asi1.fccType == streamtypeAUDIO, "got 0x%x (expected streamtypeVIDEO)\n", asi1.fccType);
+ ok(asi1.fccHandler == 0x1, "got 0x%x (expected 0x1)\n", asi1.fccHandler);
+ ok(asi1.dwFlags == 0, "got %u (expected 0)\n", asi1.dwFlags);
+ ok(asi1.wPriority == 0, "got %u (expected 0)\n", asi1.wPriority);
+ ok(asi1.wLanguage == 0, "got %u (expected 0)\n", asi1.wLanguage);
+ ok(asi1.dwScale == 1, "got %u (expected 1)\n", asi1.dwScale);
+ ok(asi1.dwRate == 11025, "got %u (expected 11025)\n", asi1.dwRate);
+ ok(asi1.dwStart == 0, "got %u (expected 0)\n", asi1.dwStart);
+ ok(asi1.dwLength == 1637, "got %u (expected 1637)\n", asi1.dwLength);
+ ok(asi1.dwInitialFrames == 0, "got %u (expected 0)\n", asi1.dwInitialFrames);
+ ok(asi1.dwSuggestedBufferSize == 0, "got %u (expected 0)\n", asi1.dwSuggestedBufferSize);
+ ok(asi1.dwQuality == 0xffffffff, "got 0x%x (expected 0xffffffff)\n", asi1.dwQuality);
+ ok(asi1.dwSampleSize == 2, "got %u (expected 2)\n", asi1.dwSampleSize);
+ ok(asi1.rcFrame.left == 0, "got %u (expected 0)\n", asi1.rcFrame.left);
+ ok(asi1.rcFrame.top == 0, "got %u (expected 0)\n", asi1.rcFrame.top);
+ ok(asi1.rcFrame.right == 0, "got %u (expected 0)\n", asi1.rcFrame.right);
+ ok(asi1.rcFrame.bottom == 0, "got %u (expected 0)\n", asi1.rcFrame.bottom);
+ ok(asi1.dwEditCount == 0, "got %u (expected 0)\n", asi1.dwEditCount);
+ ok(asi1.dwFormatChangeCount == 0, "got %u (expected 0)\n)", asi1.dwFormatChangeCount);
+
+ ok(wfx.wFormatTag == 1, "got %u (expected 1)\n",wfx.wFormatTag);
+ ok(wfx.nChannels == 2, "got %u (expected 2)\n",wfx.nChannels);
+ ok(wfx.wFormatTag == 1, "got %u (expected 1)\n",wfx.wFormatTag);
+ ok(wfx.nSamplesPerSec == 11025, "got %u (expected 11025)\n",wfx.nSamplesPerSec);
+ ok(wfx.nAvgBytesPerSec == 22050, "got %u (expected 22050)\n",wfx.nAvgBytesPerSec);
+ ok(wfx.nBlockAlign == 2, "got %u (expected 2)\n",wfx.nBlockAlign);
+
+ AVIStreamRelease(pStream0);
+ AVIStreamRelease(pStream1);
+ AVIFileRelease(pFile);
+ ok(DeleteFile("small.avi") !=0, "Deleting file small.avi failed");
+}
+
+static void test_ash1_corruption(void) {
+ COMMON_AVI_HEADERS cah;
+ PAVIFILE pFile;
+ int res;
+ PAVISTREAM pStream1;
+ AVISTREAMINFO asi1;
+
+ init_test_struct(&cah);
+
+ /* Corrupt the sample size in the audio stream header */
+ cah.ash1.dwSampleSize = 0xdeadbeef;
+
+ create_avi_file(&cah);
+
+ res = AVIFileOpen(&pFile, "small.avi", OF_SHARE_DENY_WRITE, 0L);
+ ok(res == 0, "Unable to open file: error=%u\n", res);
+
+ res = AVIFileGetStream(pFile, &pStream1, 0, 1);
+ ok(res == 0, "Unable to open audio stream: error=%u\n", res);
+
+ res = AVIStreamInfo(pStream1, &asi1, sizeof(AVISTREAMINFO));
+ ok(res == 0, "Unable to read stream info: error=%u\n", res);
+
+ /* The result will still be 2, because the value is dynamically replaced with the nBlockAlign
+ value from the stream format header. The next test will prove this */
+ ok(asi1.dwSampleSize == 2, "got %u (expected 2)\n", asi1.dwSampleSize);
+
+ AVIStreamRelease(pStream1);
+ AVIFileRelease(pFile);
+ ok(DeleteFile("small.avi") !=0, "Deleting file small.avi failed");
+}
+
+static void test_ash1_corruption2(void) {
+ COMMON_AVI_HEADERS cah;
+ PAVIFILE pFile;
+ int res;
+ PAVISTREAM pStream1;
+ AVISTREAMINFO asi1;
+
+ init_test_struct(&cah);
+
+ /* Corrupt the block alignment in the audio format header */
+ cah.pcmwf.wf.nBlockAlign = 0xdead;
+
+ create_avi_file(&cah);
+
+ res = AVIFileOpen(&pFile, "small.avi", OF_SHARE_DENY_WRITE, 0L);
+ ok(res == 0, "Unable to open file: error=%u\n", res);
+
+ res = AVIFileGetStream(pFile, &pStream1, 0, 1);
+ ok(res == 0, "Unable to open audio stream: error=%u\n", res);
+
+ ok(AVIStreamInfo(pStream1, &asi1, sizeof(AVISTREAMINFO)) == 0, "Unable to read stream info\n");
+
+ /* The result will also be the corrupt value, as explained above. */
+ ok(asi1.dwSampleSize == 0xdead, "got %u (expected 0xdead)\n", asi1.dwSampleSize);
+
+ AVIStreamRelease(pStream1);
+ AVIFileRelease(pFile);
+ ok(DeleteFile("small.avi") !=0, "Deleting file small.avi failed");
+}
+
+/* ########################### */
+
START_TEST(api)
{
AVIFileInit();
test_AVISaveOptions();
+ test_default_data();
+ test_ash1_corruption();
+ test_ash1_corruption2();
AVIFileExit();
}
--
1.6.3.3
--------------030806030204050700070909--
More information about the wine-devel
mailing list