[xiph-commits] r3318 - liboggz/trunk/src/tests
conrad at svn.annodex.net
conrad at svn.annodex.net
Sat Dec 29 04:07:38 PST 2007
Author: conrad
Date: 2007-12-29 04:07:37 -0800 (Sat, 29 Dec 2007)
New Revision: 3318
Added:
liboggz/trunk/src/tests/io-count.c
Modified:
liboggz/trunk/src/tests/Makefile.am
Log:
add io-count.c test; tests the amount of data written against that read.
This is towards fixing the bug outlined in
http://lists.xiph.org/pipermail/annodex-dev/2007-December/000217.html
Modified: liboggz/trunk/src/tests/Makefile.am
===================================================================
--- liboggz/trunk/src/tests/Makefile.am 2007-12-17 06:36:21 UTC (rev 3317)
+++ liboggz/trunk/src/tests/Makefile.am 2007-12-29 12:07:37 UTC (rev 3318)
@@ -22,7 +22,7 @@
if OGGZ_CONFIG_READ
if OGGZ_CONFIG_WRITE
rw_tests = read-generated read-stop-ok read-stop-err \
- io-read io-seek io-write io-read-single io-write-flush io-run
+ io-read io-seek io-write io-read-single io-write-flush io-run io-count
endif
endif
@@ -84,6 +84,9 @@
read_stop_err_SOURCES = read-stop-err.c
read_stop_err_LDADD = $(OGGZ_LIBS)
+io_count_SOURCES = io-count.c
+io_count_LDADD = $(OGGZ_LIBS)
+
io_read_SOURCES = io-read.c
io_read_LDADD = $(OGGZ_LIBS)
Added: liboggz/trunk/src/tests/io-count.c
===================================================================
--- liboggz/trunk/src/tests/io-count.c (rev 0)
+++ liboggz/trunk/src/tests/io-count.c 2007-12-29 12:07:37 UTC (rev 3318)
@@ -0,0 +1,234 @@
+/*
+ Copyright (C) 2003 Commonwealth Scientific and Industrial Research
+ Organisation (CSIRO) Australia
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+
+ - Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+
+ - Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ - Neither the name of CSIRO Australia nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+ PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE ORGANISATION OR
+ CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+#include "config.h"
+
+#include <string.h>
+
+#include <oggz/oggz.h>
+
+#include "oggz_tests.h"
+
+/*#define DEBUG*/
+
+#define DATA_BUF_LEN 4096
+
+static long serialno;
+static int read_called = 0;
+
+static unsigned char packet_buf[1024];
+static long total_bytes_written = 0;
+static long total_bytes_read = 0;
+
+#define MAX_ITER 10
+
+static int
+hungry (OGGZ * oggz, int empty, void * user_data)
+{
+ ogg_packet op;
+ int err;
+ static long packet_bytes_w = 1;
+ static int iter = 0;
+ static long b_o_s = 1;
+ static long e_o_s = 0;
+
+ if (iter > MAX_ITER) return 1;
+
+ total_bytes_written += packet_bytes_w;
+
+ memset (packet_buf, 'a' + iter, 1024);
+
+ op.packet = packet_buf;
+ op.bytes = packet_bytes_w;
+ op.b_o_s = b_o_s;
+ op.e_o_s = e_o_s;
+ op.granulepos = total_bytes_written-1;
+ op.packetno = iter;
+
+ if ((err = oggz_write_feed (oggz, &op, serialno, 0, NULL)) != 0) {
+#ifdef DEBUG
+ printf ("oggz_write_feed: error %d\n", err);
+#endif
+ FAIL ("Could not feed OGGZ");
+ }
+
+#ifdef DEBUG
+ printf ("hungry: packet_bytes_w %ld, eos %d\n", packet_bytes_w, e_o_s);
+#endif
+
+ iter++;
+ b_o_s = 0;
+ if (iter == MAX_ITER) e_o_s = 1;
+ packet_bytes_w *= 2;
+
+ return 0;
+}
+
+static int
+read_packet (OGGZ * oggz, ogg_packet * op, long serialno, void * user_data)
+{
+ static long packet_bytes_r = 1;
+ static int iter = 0;
+ static long b_o_s = 1;
+ static long e_o_s = 0;
+
+ if (iter > MAX_ITER) return 1;
+
+#ifdef DEBUG
+ printf ("%08" PRI_OGGZ_OFF_T "x: serialno %010ld, "
+ "granulepos %" PRId64 ", packetno %" PRId64,
+ oggz_tell (oggz), serialno, op->granulepos, op->packetno);
+
+ if (op->b_o_s) {
+ printf (" *** bos");
+ }
+
+ if (op->e_o_s) {
+ printf (" *** eos");
+ }
+
+ printf ("\n");
+#endif
+
+ total_bytes_read += op->bytes;
+
+#ifdef DEBUG
+ printf ("packet_bytes_r expected: %ld, ", packet_bytes_r);
+ printf ("op->bytes got: %ld\n", op->bytes);
+#endif
+
+ if (op->bytes != packet_bytes_r)
+ FAIL ("Read incorrect length packet");
+
+ if (op->packet[packet_bytes_r-1] != 'a' + iter)
+ FAIL ("Packet contains incorrect data");
+
+ if ((op->b_o_s == 0) != (b_o_s == 0))
+ FAIL ("Packet has incorrect b_o_s");
+
+ if ((op->e_o_s == 0) != (e_o_s == 0))
+ FAIL ("Packet has incorrect e_o_s");
+
+ if (op->granulepos != -1 && op->granulepos != total_bytes_read-1)
+ FAIL ("Packet has incorrect granulepos");
+
+ if (op->packetno != iter)
+ FAIL ("Packet has incorrect packetno");
+
+ iter++;
+ b_o_s = 0;
+ if (iter == MAX_ITER) e_o_s = 1;
+
+ packet_bytes_r *= 2;
+
+ return 0;
+}
+
+static size_t
+my_io_read (void * user_handle, void * buf, size_t n)
+{
+ unsigned char * data_buf = (unsigned char *)user_handle;
+ static int offset = 0;
+ int len;
+
+ len = MIN ((int)n, DATA_BUF_LEN - offset);
+ memcpy (buf, &data_buf[offset], len);
+
+ offset += len;
+
+ return len;
+}
+
+int
+main (int argc, char * argv[])
+{
+ OGGZ * reader, * writer;
+ unsigned char data_buf[DATA_BUF_LEN];
+ long n, nread;
+
+ INFO ("Counting bytes read from packets written");
+
+ writer = oggz_new (OGGZ_WRITE);
+ if (writer == NULL)
+ FAIL("newly created OGGZ writer == NULL");
+
+ serialno = oggz_serialno_new (writer);
+
+ if (oggz_write_set_hungry_callback (writer, hungry, 1, NULL) == -1)
+ FAIL("Could not set hungry callback");
+
+ reader = oggz_new (OGGZ_READ);
+ if (reader == NULL)
+ FAIL("newly created OGGZ reader == NULL");
+
+ oggz_io_set_read (reader, my_io_read, data_buf);
+
+ oggz_set_read_callback (reader, -1, read_packet, NULL);
+
+ while ((n = oggz_write_output (writer, data_buf, DATA_BUF_LEN)) != 0) {
+#ifdef DEBUG
+ printf ("Wrote %ld bytes ...\n", n);
+#endif
+
+ if (n > DATA_BUF_LEN)
+ FAIL("Too much data generated by writer");
+
+ if (n > 0) {
+ nread = oggz_read (reader, n);
+#ifdef DEBUG
+ printf ("Read %ld bytes ...\n", n);
+#endif
+ } else break;
+ }
+
+ if (oggz_close (writer) != 0)
+ FAIL("Could not close OGGZ writer");
+
+ while (oggz_read (reader, n) > 0);
+
+ if (oggz_close (reader) != 0)
+ FAIL("Could not close OGGZ reader");
+
+#ifdef DEBUG
+ printf ("total_bytes_written: %ld\n", total_bytes_written);
+ printf ("total_bytes_read: %ld\n", total_bytes_read);
+#endif
+
+ if (total_bytes_written < total_bytes_read)
+ FAIL ("Read more data than was written");
+
+ if (total_bytes_written > total_bytes_read)
+ FAIL ("Failed to read all data that was written");
+
+
+ exit (0);
+}
More information about the commits
mailing list