summaryrefslogtreecommitdiff
path: root/ccan/tal/test/run-allocfail.c
diff options
context:
space:
mode:
authorWilliam Casarin <jb55@jb55.com>2018-07-09 22:28:25 -0700
committerWilliam Casarin <jb55@jb55.com>2018-07-09 22:31:48 -0700
commit9593fc545950782ed75f12f53238b07885559b2b (patch)
tree9c7c2f7cbb427c54e9184cb61eedce737a6cbc6f /ccan/tal/test/run-allocfail.c
parentbd8c223756d2f912526ecef53bae0cc8e0c63442 (diff)
remove ccan for now
Diffstat (limited to 'ccan/tal/test/run-allocfail.c')
-rw-r--r--ccan/tal/test/run-allocfail.c153
1 files changed, 0 insertions, 153 deletions
diff --git a/ccan/tal/test/run-allocfail.c b/ccan/tal/test/run-allocfail.c
deleted file mode 100644
index 97cba9f..0000000
--- a/ccan/tal/test/run-allocfail.c
+++ /dev/null
@@ -1,153 +0,0 @@
-#include <ccan/tal/tal.h>
-#include <ccan/tal/tal.c>
-#include <ccan/tap/tap.h>
-
-static int alloc_count, when_to_fail, err_count;
-static bool stealing;
-
-static void *failing_alloc(size_t len)
-{
- if (alloc_count++ == when_to_fail)
- return NULL;
- /* once we've failed once, it shouldn't ask again (steal can though). */
- assert(stealing || alloc_count <= when_to_fail);
-
- return malloc(len);
-}
-
-static void *failing_realloc(void *p, size_t len)
-{
- if (alloc_count++ == when_to_fail)
- return NULL;
-
- return realloc(p, len);
-}
-
-
-static void nofail_on_error(const char *msg)
-{
- diag("ERROR: %s", msg);
- err_count++;
-}
-
-static void destroy_p(void *p UNNEEDED)
-{
-}
-
-int main(void)
-{
- char *p, *c1, *c2;
- bool success;
-
- plan_tests(25);
-
- tal_set_backend(failing_alloc, failing_realloc, NULL, nofail_on_error);
-
- /* Fail at each possible point in an allocation. */
- when_to_fail = err_count = 0;
- do {
- alloc_count = 0;
- p = tal(NULL, char);
- when_to_fail++;
- } while (!p);
- ok1(alloc_count >= 1);
- ok1(when_to_fail > 1);
- ok1(err_count == when_to_fail - 1);
-
- /* Do it again. */
- when_to_fail = err_count = 0;
- do {
- alloc_count = 0;
- c1 = tal(p, char);
- when_to_fail++;
- } while (!c1);
- ok1(alloc_count >= 1);
- ok1(when_to_fail > 1);
- ok1(err_count == when_to_fail - 1);
-
- /* Now during resize. */
- c2 = c1;
- when_to_fail = err_count = 0;
- for (;;) {
- alloc_count = 0;
- if (tal_resize(&c1, 100))
- break;
- /* Failing alloc will not change pointer. */
- ok1(c1 == c2);
- when_to_fail++;
- };
- ok1(alloc_count == 1);
- ok1(when_to_fail == 1);
- ok1(err_count == 1);
- /* Make sure it's really resized. */
- memset(c1, 1, 100);
-
- /* Now for second child. */
- when_to_fail = err_count = 0;
- do {
- alloc_count = 0;
- c2 = tal(p, char);
- when_to_fail++;
- } while (!c2);
- ok1(alloc_count >= 1);
- ok1(when_to_fail > 1);
- /* Note: adding a child will fall through if group alloc fails. */
- ok1 (err_count == when_to_fail - 1 || err_count == when_to_fail);
-
- /* Now while adding a destructor. */
- when_to_fail = err_count = 0;
- do {
- alloc_count = 0;
- success = tal_add_destructor(p, destroy_p);
- when_to_fail++;
- } while (!success);
- ok1(alloc_count >= 1);
- ok1(when_to_fail > 1);
- ok1(err_count == when_to_fail - 1);
-
- /* Now while adding a name. */
- when_to_fail = err_count = 0;
- do {
- const char name[] = "some name";
- alloc_count = 0;
- success = tal_set_name(p, name);
- when_to_fail++;
- } while (!success);
- ok1(alloc_count >= 1);
- ok1(when_to_fail > 1);
- ok1(err_count == when_to_fail - 1);
-
- /* Now while stealing. */
- stealing = true;
- when_to_fail = err_count = 0;
- do {
- alloc_count = 0;
- success = tal_steal(c2, c1) != NULL;
- when_to_fail++;
- } while (!success);
- ok1(alloc_count >= 1);
- ok1(when_to_fail > 1);
- ok1(err_count == when_to_fail - 1);
-
- /* Now stealing with more children (more coverage). */
- when_to_fail = 1000;
- (void)tal(p, char);
- c1 = tal(p, char);
- c2 = tal(p, char);
- (void)tal(p, char);
-
- /* Now steal again. */
- when_to_fail = err_count = 0;
- do {
- alloc_count = 0;
- success = tal_steal(c2, c1) != NULL;
- when_to_fail++;
- } while (!success);
- ok1(alloc_count >= 1);
- ok1(when_to_fail > 1);
- ok1(err_count == when_to_fail - 1);
-
- tal_free(p);
- tal_cleanup();
- return exit_status();
-}