summaryrefslogtreecommitdiff
path: root/epan/tvbtest.c
diff options
context:
space:
mode:
authorGilbert Ramirez <gram@alumni.rice.edu>2000-09-27 04:55:05 +0000
committerGilbert Ramirez <gram@alumni.rice.edu>2000-09-27 04:55:05 +0000
commit83ec54675c19f25cfbb2e8a8863c6ee2191d8b0c (patch)
tree35d39e43d20aca160b96d8a85ddc2b80e4646f67 /epan/tvbtest.c
parentf881e13932e0ba390c26cce15d1334b2154a8062 (diff)
downloadwireshark-83ec54675c19f25cfbb2e8a8863c6ee2191d8b0c.tar.gz
First step in moving core Ethereal routines to libepan.
svn path=/trunk/; revision=2458
Diffstat (limited to 'epan/tvbtest.c')
-rw-r--r--epan/tvbtest.c406
1 files changed, 406 insertions, 0 deletions
diff --git a/epan/tvbtest.c b/epan/tvbtest.c
new file mode 100644
index 0000000000..c528f7c837
--- /dev/null
+++ b/epan/tvbtest.c
@@ -0,0 +1,406 @@
+/* Standalone program to test functionality of tvbuffs.
+ *
+ * tvbtest : tvbtest.o tvbuff.o except.o
+ *
+ * $Id: tvbtest.c,v 1.1 2000/09/27 04:54:53 gram Exp $
+ *
+ * Copyright (c) 2000 by Gilbert Ramirez <gram@xiexie.org>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "tvbuff.h"
+#include "pint.h"
+
+/* Tests a tvbuff against the expected pattern/length.
+ * Returns TRUE if all tests succeeed, FALSE if any test fails */
+gboolean
+test(tvbuff_t *tvb, gchar* name,
+ guint8* expected_data, guint expected_length)
+{
+ guint length;
+ guint8 *ptr;
+ volatile gboolean ex_thrown;
+ volatile guint32 val32;
+ guint32 expected32;
+ int incr, i;
+
+ length = tvb_length(tvb);
+
+ if (length != expected_length) {
+ printf("01: Failed TVB=%s Length of tvb=%u while expected length=%u\n",
+ name, length, expected_length);
+ return FALSE;
+ }
+
+ /* Test boundary case. A BoundsError exception should be thrown. */
+ ex_thrown = FALSE;
+ TRY {
+ ptr = tvb_get_ptr(tvb, 0, length + 1);
+ }
+ CATCH(BoundsError) {
+ ex_thrown = TRUE;
+ }
+ CATCH(ReportedBoundsError) {
+ printf("02: Caught wrong exception: ReportedBoundsError\n");
+ }
+ ENDTRY;
+
+ if (!ex_thrown) {
+ printf("02: Failed TVB=%s No BoundsError when retrieving %u bytes\n",
+ name, length + 1);
+ return FALSE;
+ }
+
+ /* Test boundary case with one more byte. A ReportedBoundsError
+ exception should be thrown. */
+ ex_thrown = FALSE;
+ TRY {
+ ptr = tvb_get_ptr(tvb, 0, length + 2);
+ }
+ CATCH(BoundsError) {
+ printf("03: Caught wrong exception: BoundsError\n");
+ }
+ CATCH(ReportedBoundsError) {
+ ex_thrown = TRUE;
+ }
+ ENDTRY;
+
+ if (!ex_thrown) {
+ printf("03: Failed TVB=%s No ReportedBoundsError when retrieving %u bytes\n",
+ name, length + 2);
+ return FALSE;
+ }
+
+ /* Test boundary case. A BoundsError exception should be thrown. */
+ ex_thrown = FALSE;
+ TRY {
+ ptr = tvb_get_ptr(tvb, -1, 2);
+ }
+ CATCH(BoundsError) {
+ ex_thrown = TRUE;
+ }
+ CATCH(ReportedBoundsError) {
+ printf("04: Caught wrong exception: ReportedBoundsError\n");
+ }
+ ENDTRY;
+
+ if (!ex_thrown) {
+ printf("04: Failed TVB=%s No BoundsError when retrieving 2 bytes from"
+ " offset -1\n", name);
+ return FALSE;
+ }
+
+ /* Test boundary case. A BoundsError exception should not be thrown. */
+ ex_thrown = FALSE;
+ TRY {
+ ptr = tvb_get_ptr(tvb, 0, 1);
+ }
+ CATCH(BoundsError) {
+ ex_thrown = TRUE;
+ }
+ CATCH(ReportedBoundsError) {
+ printf("05: Caught wrong exception: ReportedBoundsError\n");
+ }
+ ENDTRY;
+
+ if (ex_thrown) {
+ printf("05: Failed TVB=%s BoundsError when retrieving 1 bytes from"
+ " offset 0\n", name);
+ return FALSE;
+ }
+
+ /* Test boundary case. A BoundsError exception should not be thrown. */
+ ex_thrown = FALSE;
+ TRY {
+ ptr = tvb_get_ptr(tvb, -1, 1);
+ }
+ CATCH(BoundsError) {
+ ex_thrown = TRUE;
+ }
+ CATCH(ReportedBoundsError) {
+ printf("06: Caught wrong exception: ReportedBoundsError\n");
+ }
+ ENDTRY;
+
+ if (ex_thrown) {
+ printf("06: Failed TVB=%s BoundsError when retrieving 1 bytes from"
+ " offset -1\n", name);
+ return FALSE;
+ }
+
+
+ /* Check data at boundary. An exception should not be thrown. */
+ if (length >= 4) {
+ ex_thrown = FALSE;
+ TRY {
+ val32 = tvb_get_ntohl(tvb, 0);
+ }
+ CATCH_ALL {
+ ex_thrown = TRUE;
+ }
+ ENDTRY;
+
+ if (ex_thrown) {
+ printf("07: Failed TVB=%s Exception when retrieving "
+ "guint32 from offset 0\n", name);
+ return FALSE;
+ }
+
+ expected32 = pntohl(expected_data);
+ if (val32 != expected32) {
+ printf("08: Failed TVB=%s guint32 @ 0 %u != expected %u\n",
+ name, val32, expected32);
+ return FALSE;
+ }
+ }
+
+ /* Check data at boundary. An exception should not be thrown. */
+ if (length >= 4) {
+ ex_thrown = FALSE;
+ TRY {
+ val32 = tvb_get_ntohl(tvb, -4);
+ }
+ CATCH_ALL {
+ ex_thrown = TRUE;
+ }
+ ENDTRY;
+
+ if (ex_thrown) {
+ printf("09: Failed TVB=%s Exception when retrieving "
+ "guint32 from offset 0\n", name);
+ return FALSE;
+ }
+
+ expected32 = pntohl(&expected_data[length-4]);
+ if (val32 != expected32) {
+ printf("10: Failed TVB=%s guint32 @ -4 %u != expected %u\n",
+ name, val32, expected32);
+ return FALSE;
+ }
+ }
+
+ /* Sweep across data in various sized increments checking
+ * tvb_memdup() */
+ for (incr = 1; incr < length; incr++) {
+ for (i = 0; i < length - incr; i += incr) {
+ ptr = tvb_memdup(tvb, i, incr);
+ if (memcmp(ptr, &expected_data[i], incr) != 0) {
+ printf("11: Failed TVB=%s Offset=%d Length=%d "
+ "Bad memdup\n",
+ name, i, incr);
+ g_free(ptr);
+ return FALSE;
+ }
+ g_free(ptr);
+ }
+ }
+
+ /* One big memdup */
+ ptr = tvb_memdup(tvb, 0, -1);
+ if (memcmp(ptr, expected_data, length) != 0) {
+ printf("12: Failed TVB=%s Offset=0 Length=-1 "
+ "Bad memdup\n", name);
+ g_free(ptr);
+ return FALSE;
+ }
+ g_free(ptr);
+
+
+ printf("Passed TVB=%s\n", name);
+
+ return TRUE;
+}
+
+
+
+void
+run_tests(void)
+{
+ int i, j;
+
+ tvbuff_t *tvb_small[3];
+ tvbuff_t *tvb_large[3];
+ tvbuff_t *tvb_subset[6];
+ tvbuff_t *tvb_comp[6];
+ guint8 *small[3];
+ guint8 *large[3];
+ guint8 *subset[6];
+ guint subset_length[6];
+ guint8 *comp[6];
+ guint comp_length[6];
+ guint8 temp;
+ int len;
+
+ for (i = 0; i < 3; i++) {
+ small[i] = g_new(guint8, 16);
+
+ temp = 16 * i;
+ for (j = 0; j < 16; j++) {
+ small[i][j] = temp + j;
+ }
+
+ tvb_small[i] = tvb_new_real_data(small[i], 16, 17);
+ }
+
+ for (i = 0; i < 3; i++) {
+ large[i] = g_new(guint8, 19);
+
+ temp = 19 * i;
+ for (j = 0; j < 19; j++) {
+ large[i][j] = temp + j;
+ }
+
+ tvb_large[i] = tvb_new_real_data(large[i], 19, 20);
+ }
+
+ /* Test the TVBUFF_REAL_DATA objects. */
+ test(tvb_small[0], "Small 0", small[0], 16);
+ test(tvb_small[1], "Small 1", small[1], 16);
+ test(tvb_small[2], "Small 2", small[2], 16);
+
+ test(tvb_large[0], "Large 0", large[0], 19);
+ test(tvb_large[1], "Large 1", large[1], 19);
+ test(tvb_large[2], "Large 2", large[2], 19);
+
+ tvb_subset[0] = tvb_new_subset(tvb_small[0], 0, 8, 9);
+ subset[0] = &small[0][0];
+ subset_length[0] = 8;
+
+ tvb_subset[1] = tvb_new_subset(tvb_large[0], -10, 10, 11);
+ subset[1] = &large[0][9];
+ subset_length[1] = 10;
+
+ tvb_subset[2] = tvb_new_subset(tvb_small[1], -16, -1, 17);
+ subset[2] = &small[1][0];
+ subset_length[2] = 16;
+
+ tvb_subset[3] = tvb_new_subset(tvb_subset[0], 0, 3, 4);
+ subset[3] = &small[0][0];
+ subset_length[3] = 3;
+
+ tvb_subset[4] = tvb_new_subset(tvb_subset[1], -5, 5, 6);
+ subset[4] = &large[0][14];
+ subset_length[4] = 5;
+
+ tvb_subset[5] = tvb_new_subset(tvb_subset[2], 4, 8, 9);
+ subset[5] = &small[1][4];
+ subset_length[5] = 8;
+
+ /* Test the TVBUFF_SUBSET objects. */
+ test(tvb_subset[0], "Subset 0", subset[0], subset_length[0]);
+ test(tvb_subset[1], "Subset 1", subset[1], subset_length[1]);
+ test(tvb_subset[2], "Subset 2", subset[2], subset_length[2]);
+ test(tvb_subset[3], "Subset 3", subset[3], subset_length[3]);
+ test(tvb_subset[4], "Subset 4", subset[4], subset_length[4]);
+ test(tvb_subset[5], "Subset 5", subset[5], subset_length[5]);
+
+ /* One Real */
+ printf("Making Composite 0\n");
+ tvb_comp[0] = tvb_new_composite();
+ comp[0] = small[0];
+ comp_length[0] = 16;
+ tvb_composite_append(tvb_comp[0], tvb_small[0]);
+ tvb_composite_finalize(tvb_comp[0]);
+
+ /* Two Reals */
+ printf("Making Composite 1\n");
+ tvb_comp[1] = tvb_new_composite();
+ comp[1] = g_malloc(32);
+ comp_length[1] = 32;
+ memcpy(comp[1], small[0], 16);
+ memcpy(&comp[1][16], small[1], 16);
+ tvb_composite_append(tvb_comp[1], tvb_small[0]);
+ tvb_composite_append(tvb_comp[1], tvb_small[1]);
+ tvb_composite_finalize(tvb_comp[1]);
+
+ /* One subset */
+ printf("Making Composite 2\n");
+ tvb_comp[2] = tvb_new_composite();
+ comp[2] = subset[1];
+ comp_length[2] = subset_length[1];
+ tvb_composite_append(tvb_comp[2], tvb_subset[1]);
+ tvb_composite_finalize(tvb_comp[2]);
+
+ /* Two subsets */
+ printf("Making Composite 3\n");
+ tvb_comp[3] = tvb_new_composite();
+ comp[3] = g_malloc(13);
+ comp_length[3] = 13;
+ memcpy(comp[3], &large[0][14], 5);
+ memcpy(&comp[3][5], &small[1][4], 8);
+ tvb_composite_append(tvb_comp[3], tvb_subset[4]);
+ tvb_composite_append(tvb_comp[3], tvb_subset[5]);
+ tvb_composite_finalize(tvb_comp[3]);
+
+ /* One real, one subset */
+ printf("Making Composite 4\n");
+ tvb_comp[4] = tvb_new_composite();
+ comp[4] = g_malloc(16 + subset_length[1]);
+ comp_length[4] = 16 + subset_length[1];
+ memcpy(comp[4], small[0], 16);
+ memcpy(&comp[4][16], subset[1], subset_length[1]);
+ tvb_composite_append(tvb_comp[4], tvb_small[0]);
+ tvb_composite_append(tvb_comp[4], tvb_subset[1]);
+ tvb_composite_finalize(tvb_comp[4]);
+
+ /* 4 composites */
+ printf("Making Composite 5\n");
+ tvb_comp[5] = tvb_new_composite();
+ comp_length[5] = comp_length[0] +
+ comp_length[1] +
+ comp_length[2] +
+ comp_length[3];
+ comp[5] = g_malloc(comp_length[5]);
+
+ len = 0;
+ memcpy(&comp[5][len], comp[0], comp_length[0]);
+ len += comp_length[0];
+ memcpy(&comp[5][len], comp[1], comp_length[1]);
+ len += comp_length[1];
+ memcpy(&comp[5][len], comp[2], comp_length[2]);
+ len += comp_length[2];
+ memcpy(&comp[5][len], comp[3], comp_length[3]);
+
+ tvb_composite_append(tvb_comp[5], tvb_comp[0]);
+ tvb_composite_append(tvb_comp[5], tvb_comp[1]);
+ tvb_composite_append(tvb_comp[5], tvb_comp[2]);
+ tvb_composite_append(tvb_comp[5], tvb_comp[3]);
+ tvb_composite_finalize(tvb_comp[5]);
+
+ /* Test the TVBUFF_COMPOSITE objects. */
+ test(tvb_comp[0], "Composite 0", comp[0], comp_length[0]);
+ test(tvb_comp[1], "Composite 1", comp[1], comp_length[1]);
+ test(tvb_comp[2], "Composite 2", comp[2], comp_length[2]);
+ test(tvb_comp[3], "Composite 3", comp[3], comp_length[3]);
+ test(tvb_comp[4], "Composite 4", comp[4], comp_length[4]);
+ test(tvb_comp[5], "Composite 5", comp[5], comp_length[5]);
+}
+
+int
+main(void)
+{
+ except_init();
+ tvbuff_init();
+ run_tests();
+ tvbuff_cleanup();
+ except_deinit();
+ exit(0);
+}