GnuCash  2.6.99
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
test-file-stuff.c
1 /***************************************************************************
2  * test-file-stuff.c
3  *
4  * Thu Sep 29 22:50:50 2005
5  * Copyright 2005 GnuCash team
6  ****************************************************************************/
7 /*
8  * This program is free software; you can redistribute it and/or modify
9  * it under the terms of the GNU General Public License as published by
10  * the Free Software Foundation; either version 2 of the License, or
11  * (at your option) any later version.
12  *
13  * This program is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16  * GNU General Public License for more details.
17  *
18  * You should have received a copy of the GNU General Public License
19  * along with this program; if not, write to the Free Software
20  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
21  * 02110-1301, USA.
22  */
23 
24 #include "config.h"
25 
26 #include <unistd.h>
27 #include <sys/types.h>
28 #include <sys/stat.h>
29 #include <dirent.h>
30 #include <fcntl.h>
31 #include <stdlib.h>
32 #include <string.h>
33 #include <glib.h>
34 #include <glib/gstdio.h>
35 
36 #include "gnc-engine.h"
37 #include "sixtp-dom-parsers.h"
38 #include "sixtp-parsers.h"
39 #include "test-file-stuff.h"
40 #include "test-stuff.h"
41 #include "io-gncxml-gen.h"
42 #include "sixtp-utils.h"
43 
44 /*
45 #define __DEBUG 1
46 */
47 /***********************************************************************/
48 
49 static int
50 files_return(int ret, const char* msg)
51 {
52  printf("%s", msg);
53  return ret;
54 }
55 
56 int
57 files_compare(const gchar* f1, const gchar* f2)
58 {
59  gchar buf1[512];
60  gchar buf2[512];
61  int fd1, fd2;
62  int amount_read1, amount_read2;
63 
64  fd1 = g_open(f1, O_RDONLY, 0);
65  fd2 = g_open(f2, O_RDONLY, 0);
66 
67  do
68  {
69  int memcmp_ret;
70 
71  amount_read1 = read(fd1, buf1, 512);
72  amount_read2 = read(fd2, buf2, 512);
73 
74  if (amount_read1 > amount_read2)
75  return files_return(1, "read1 > read2");
76  if (amount_read1 < amount_read2)
77  return files_return(-1, "read1 < read2");
78 
79  if ((memcmp_ret = memcmp(buf1, buf2, amount_read1)) != 0)
80  {
81  return files_return(memcmp_ret, "memcmp return");
82  }
83 
84  }
85  while (amount_read1 == 512);
86 
87  return 0;
88 }
89 
90 void
91 write_dom_node_to_file(xmlNodePtr node, int fd)
92 {
93  FILE *out;
94 
95  out = fdopen(fd, "w");
96 
97  xmlElemDump(out, NULL, node);
98 
99  fclose(out);
100 }
101 
102 gboolean
103 print_dom_tree(gpointer data_for_children, GSList* data_from_children,
104  GSList* sibling_data, gpointer parent_data,
105  gpointer global_data, gpointer *result, const gchar *tag)
106 {
107  if (parent_data == NULL)
108  {
109  xmlElemDump((FILE*)global_data, NULL, (xmlNodePtr)data_for_children);
110  xmlFreeNode(data_for_children);
111  }
112  return TRUE;
113 }
114 
115 gboolean
116 check_dom_tree_version(xmlNodePtr node, gchar *verstr)
117 {
118  char *verteststr;
119 
120  g_return_val_if_fail(node, FALSE);
121  g_return_val_if_fail(verstr, FALSE);
122  g_return_val_if_fail(node->properties, FALSE);
123  g_return_val_if_fail(node->properties->xmlAttrPropertyValue, FALSE);
124  g_return_val_if_fail(node->properties->xmlAttrPropertyValue->content,
125  FALSE);
126 
127  verteststr = (char*) node->properties->xmlAttrPropertyValue->content;
128  if (g_strcmp0(verstr, verteststr) == 0)
129  {
130  return TRUE;
131  }
132  else
133  {
134  return FALSE;
135  }
136 }
137 
138 gboolean
139 equals_node_val_vs_string(xmlNodePtr node, const gchar* str)
140 {
141  gchar *cmp1;
142 
143  g_return_val_if_fail(node, FALSE);
144  g_return_val_if_fail(str, FALSE);
145 
146  cmp1 = dom_tree_to_text(node);
147 
148  if (!cmp1)
149  {
150  return FALSE;
151  }
152  else if (g_strcmp0(cmp1, str) == 0)
153  {
154  g_free(cmp1);
155  return TRUE;
156  }
157  else
158  {
159  printf("Differing types: node:`%s' vs string:`%s'\n", cmp1, str);
160  g_free(cmp1);
161  return FALSE;
162  }
163 }
164 
165 gboolean
166 equals_node_val_vs_int(xmlNodePtr node, gint64 val)
167 {
168  gchar *text;
169  gint64 test_val;
170 
171  g_return_val_if_fail(node, FALSE);
172 
173  text = dom_tree_to_text(node);
174 
175  if (!string_to_gint64(text, &test_val))
176  {
177  g_free(text);
178  return FALSE;
179  }
180 
181  g_free(text);
182 
183  return val == test_val;
184 }
185 
186 gboolean
187 equals_node_val_vs_boolean(xmlNodePtr node, gboolean val)
188 {
189  return equals_node_val_vs_string(node, val ? "TRUE" : "FALSE");
190 }
191 
192 gboolean
193 equals_node_val_vs_guid(xmlNodePtr node, const GncGUID *id)
194 {
195  GncGUID *cmpid;
196 
197  g_return_val_if_fail(node, FALSE);
198  g_return_val_if_fail(id, FALSE);
199 
200  cmpid = dom_tree_to_guid(node);
201 
202  g_return_val_if_fail(cmpid, FALSE);
203 
204  if (guid_compare(cmpid, id) == 0)
205  {
206  g_free(cmpid);
207  return TRUE;
208  }
209  else
210  {
211  g_free(cmpid);
212  return FALSE;
213  }
214 }
215 
216 gboolean
217 equals_node_val_vs_commodity(xmlNodePtr node, const gnc_commodity *com,
218  QofBook *book)
219 {
220  gnc_commodity *cmpcom;
221 
222  g_return_val_if_fail(node, FALSE);
223  g_return_val_if_fail(com, FALSE);
224 
225  cmpcom = dom_tree_to_commodity_ref_no_engine(node, book);
226 
227  g_return_val_if_fail(cmpcom, FALSE);
228 
229  if (gnc_commodity_equiv(com, cmpcom))
230  {
231  gnc_commodity_destroy(cmpcom);
232  return TRUE;
233  }
234  else
235  {
236  gnc_commodity_destroy(cmpcom);
237  return FALSE;
238  }
239 }
240 
241 gboolean
242 equals_node_val_vs_kvp_frame(xmlNodePtr node, const KvpFrame *frm)
243 {
244  KvpFrame *cmpfrm;
245 
246  g_return_val_if_fail(node, FALSE);
247  g_return_val_if_fail(frm, FALSE);
248 
249  cmpfrm = dom_tree_to_kvp_frame(node);
250 
251  g_return_val_if_fail(cmpfrm, FALSE);
252 
253  if (kvp_frame_compare(frm, cmpfrm) == 0)
254  {
255  kvp_frame_delete(cmpfrm);
256  return TRUE;
257  }
258  else
259  {
260  gchar *frm1str;
261  gchar *frm2str;
262 
263  frm1str = kvp_frame_to_string(frm);
264  frm2str = kvp_frame_to_string(cmpfrm);
265 
266  printf("%s vs %s\n", frm1str, frm2str);
267 
268  g_free(frm1str);
269  g_free(frm2str);
270 
271  kvp_frame_delete(cmpfrm);
272  return FALSE;
273  }
274 }
275 
276 gboolean
277 equals_node_val_vs_date(xmlNodePtr node, const Timespec tm)
278 {
279  Timespec tm_test = dom_tree_to_timespec(node);
280 
281  if (tm_test.tv_sec == tm.tv_sec && tm_test.tv_nsec == tm.tv_nsec)
282  {
283  return TRUE;
284  }
285  else
286  {
287  return FALSE;
288  }
289 }
290 
291 /***********************************************************************/
292 
293 static gboolean
294 just_dom_tree_end_handler(gpointer data_for_children,
295  GSList* data_from_children, GSList* sibling_data,
296  gpointer parent_data, gpointer global_data,
297  gpointer *result, const gchar *tag)
298 {
299  xmlNodePtr tree = (xmlNodePtr)data_for_children;
300  xmlNodePtr *globaldata = (xmlNodePtr*)global_data;
301 
302  if (parent_data)
303  {
304  return TRUE;
305  }
306 
307  /* OK. For some messed up reason this is getting called again with a
308  NULL tag. So we ignore those cases */
309  if (!tag)
310  {
311  return TRUE;
312  }
313 
314  g_return_val_if_fail(tree, FALSE);
315 
316  *globaldata = tree;
317 
318  return TRUE;
319 }
320 
321 static xmlNodePtr
322 grab_file_doc(const char *filename)
323 {
324  sixtp *parser;
325  xmlNodePtr ret;
326  gpointer parse_result = NULL;
327 
328  parser = sixtp_dom_parser_new(just_dom_tree_end_handler, NULL, NULL);
329 
330  sixtp_parse_file(parser, filename, NULL, &ret, &parse_result);
331 
332  return ret;
333 }
334 
335 static void
336 test_load_file(const char *filename, gxpf_callback cb, sixtp *top_parser,
337  QofBook *book)
338 {
339  xmlNodePtr node;
340 
341  node = grab_file_doc(filename);
342 
343  if (!node)
344  {
345  failure_args("failure of libxml to parse file", __FILE__, __LINE__,
346  "%s", filename);
347  return;
348  }
349 
350  if (!gnc_xml_parse_file(top_parser, filename, cb, node->children, book))
351  {
352  failure_args("failure to parse file", __FILE__, __LINE__,
353  "%s", filename);
354  }
355 
356  xmlFreeNode(node);
357 }
358 
359 void
360 test_files_in_dir(int argc, char **argv, gxpf_callback cb,
361  sixtp *parser, const char *parser_tag,
362  QofBook *book)
363 {
364  int count;
365  sixtp *main_parser;
366  sixtp *top_parser;
367 
368 
369  top_parser = sixtp_new();
370  main_parser = sixtp_new();
371 
372  if (!sixtp_add_some_sub_parsers(top_parser, TRUE, "gnc-v2", main_parser,
373  NULL, NULL))
374  return;
375 
376  if (!sixtp_add_some_sub_parsers(main_parser, TRUE, parser_tag, parser,
377  NULL, NULL))
378  return;
379 
380 
381  for (count = 1; count < argc; count++)
382  {
383  struct stat file_info;
384  const char *to_open = argv[count];
385  if (g_stat(to_open, &file_info) != 0)
386  {
387  printf("cannot stat %s.\n", to_open);
388  failure("unable to stat file");
389  }
390  else
391  {
392  if (!S_ISDIR(file_info.st_mode))
393  {
394 #ifdef __DEBUG
395  printf( "testing load of file \"%s\":\n", argv[count] );
396 #endif
397  test_load_file(to_open, cb, top_parser, book);
398  }
399  }
400  }
401 
402  sixtp_destroy(top_parser);
403 }
Definition: sixtp.h:93
gint kvp_frame_compare(const KvpFrame *fa, const KvpFrame *fb)
Use a 64-bit unsigned int timespec.
Definition: gnc-date.h:299
void kvp_frame_delete(KvpFrame *frame)
Definition: guid.h:65
gchar * kvp_frame_to_string(const KvpFrame *frame)
All type declarations for the whole Gnucash engine.
struct KvpFrameImpl KvpFrame
Definition: kvp_frame.h:76
void gnc_commodity_destroy(gnc_commodity *cm)
gboolean gnc_commodity_equiv(const gnc_commodity *a, const gnc_commodity *b)