test_load_callback.c 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. /*
  2. * Copyright (c) 2009-2011 Petri Lehtinen <[email protected]>
  3. *
  4. * Jansson is free software; you can redistribute it and/or modify
  5. * it under the terms of the MIT license. See LICENSE for details.
  6. */
  7. #include "util.h"
  8. #include <jansson.h>
  9. #include <stdlib.h>
  10. #include <string.h>
  11. struct my_source {
  12. const char *buf;
  13. size_t off;
  14. size_t cap;
  15. };
  16. static const char my_str[] = "[\"A\", {\"B\": \"C\", \"e\": false}, 1, null, \"foo\"]";
  17. static size_t greedy_reader(void *buf, size_t buflen, void *arg) {
  18. struct my_source *s = arg;
  19. if (buflen > s->cap - s->off)
  20. buflen = s->cap - s->off;
  21. if (buflen > 0) {
  22. memcpy(buf, s->buf + s->off, buflen);
  23. s->off += buflen;
  24. return buflen;
  25. } else {
  26. return 0;
  27. }
  28. }
  29. static void run_tests() {
  30. struct my_source s;
  31. json_t *json;
  32. json_error_t error;
  33. s.off = 0;
  34. s.cap = strlen(my_str);
  35. s.buf = my_str;
  36. json = json_load_callback(greedy_reader, &s, 0, &error);
  37. if (!json)
  38. fail("json_load_callback failed on a valid callback");
  39. json_decref(json);
  40. s.off = 0;
  41. s.cap = strlen(my_str) - 1;
  42. s.buf = my_str;
  43. json = json_load_callback(greedy_reader, &s, 0, &error);
  44. if (json) {
  45. json_decref(json);
  46. fail("json_load_callback should have failed on an incomplete stream, "
  47. "but it didn't");
  48. }
  49. if (strcmp(error.source, "<callback>") != 0) {
  50. fail("json_load_callback returned an invalid error source");
  51. }
  52. if (strcmp(error.text, "']' expected near end of file") != 0) {
  53. fail("json_load_callback returned an invalid error message for an "
  54. "unclosed top-level array");
  55. }
  56. json = json_load_callback(NULL, NULL, 0, &error);
  57. if (json) {
  58. json_decref(json);
  59. fail("json_load_callback should have failed on NULL load callback, but "
  60. "it didn't");
  61. }
  62. if (strcmp(error.text, "wrong arguments") != 0) {
  63. fail("json_load_callback returned an invalid error message for a NULL "
  64. "load callback");
  65. }
  66. }