Doc updates
[glib.git] / tests / checksum-test.c
blobb44be762a33cdb644470510528059692bdcffd2c
1 #include "config.h"
3 #include <glib.h>
4 #include <string.h>
5 #ifdef HAVE_UNISTD_H
6 #include <unistd.h>
7 #endif
8 #include <stdlib.h>
10 #define FIXED_STR "The quick brown fox jumps over the lazy dog"
11 #define FIXED_LEN (strlen (FIXED_STR))
13 #define MD5_FIXED_SUM "9e107d9d372bb6826bd81d3542a419d6"
14 #define SHA1_FIXED_SUM "2fd4e1c67a2d28fced849ee1bb76e7391b93eb12"
15 #define SHA256_FIXED_SUM "d7a8fbb307d7809469ca9abcb0082e4f8d5651e46d3cdb762d02d0bf37c9e592"
17 #define BLOCK_SIZE 256
19 static gchar *
20 digest_to_string (guint8 *digest,
21 gsize digest_len)
23 static const gchar hex_digits[] = "0123456789abcdef";
24 gint len = digest_len * 2;
25 gchar *retval;
26 gint i;
28 retval = g_new (gchar, len + 1);
30 for (i = 0; i < digest_len; i++)
32 retval[2 * i] = hex_digits[digest[i] >> 4];
33 retval[2 * i + 1] = hex_digits[digest[i] & 0xf];
36 retval[len] = 0;
38 return retval;
41 static void
42 test_checksum (GChecksumType checksum_type,
43 const gchar *type,
44 const gchar *sum,
45 const gchar *filename)
47 GChecksum *checksum0, *checksum1, *checksum2;
48 gchar *data;
49 guchar *p;
50 gsize data_len;
51 guint8 digest1[64], digest2[64];
52 gsize len1 = sizeof (digest1), len2 = sizeof (digest2);
53 gchar *digest_str1, *digest_str2;
55 checksum0 = g_checksum_new (checksum_type);
56 g_checksum_update (checksum0, (const guchar *) FIXED_STR, FIXED_LEN);
57 if (strcmp (g_checksum_get_string (checksum0), sum) != 0)
59 g_print ("Invalid %s checksum for `%s': %s (expecting: %s)\n",
60 type,
61 FIXED_STR,
62 g_checksum_get_string (checksum0),
63 sum);
64 exit (1);
67 g_checksum_free (checksum0);
69 checksum1 = g_checksum_new (checksum_type);
70 checksum2 = g_checksum_new (checksum_type);
72 if (!g_file_get_contents (filename, &data, &data_len, NULL))
74 g_print ("Could not load `%s' contents\n", filename);
75 exit (1);
78 g_checksum_update (checksum1, (const guchar *) data, data_len);
80 p = (guchar *) data;
83 if (data_len > BLOCK_SIZE)
85 g_checksum_update (checksum2, p, BLOCK_SIZE);
86 data_len -= BLOCK_SIZE;
87 p += BLOCK_SIZE;
89 else
91 g_checksum_update (checksum2, p, data_len);
92 break;
95 while (*p != '\0');
97 g_free (data);
99 g_checksum_get_digest (checksum1, digest1, &len1);
100 g_checksum_get_digest (checksum2, digest2, &len2);
102 digest_str1 = digest_to_string (digest1, len1);
103 digest_str2 = digest_to_string (digest2, len2);
105 if (strcmp (digest_str1, digest_str2) != 0)
107 g_print ("Wrong %s digest `%s' (expecting: %s)\n",
108 type,
109 digest_str1,
110 digest_str2);
111 exit (1);
114 g_free (digest_str1);
115 g_free (digest_str2);
117 digest_str1 = g_strdup (g_checksum_get_string (checksum1));
118 digest_str2 = g_strdup (g_checksum_get_string (checksum2));
120 if (!digest_str1 || !digest_str2)
122 g_print ("No %s digest string found\n", type);
123 exit (1);
126 if (strcmp (digest_str1, digest_str2) != 0)
128 g_print ("Wrong %s digest string `%s' (expecting: %s)\n",
129 type,
130 digest_str1,
131 digest_str2);
132 exit (1);
135 g_free (digest_str1);
136 g_free (digest_str2);
138 g_checksum_free (checksum1);
139 g_checksum_free (checksum2);
142 #define test(type) test_checksum (G_CHECKSUM_##type, \
143 #type, \
144 type##_FIXED_SUM, \
145 __FILE__)
148 main (int argc, char *argv[])
150 test (MD5);
151 test (SHA1);
152 test (SHA256);
154 return EXIT_SUCCESS;