dispatch_cancel_in_block.c   [plain text]


#include <stdlib.h>
#include <notify.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <darwintest.h>

#define KEY "com.apple.notify.test.dispatch_cancel_in_block"
#define COUNT 10

T_DECL(dispatch_cancel_in_block,
       "Tests notify_cancel in dispatch block.",
       T_META("owner", "Core Darwin Daemons & Tools"),
       T_META("as_root", "false"))
{
	int i;
	int status;
    int tokens[COUNT];

	T_LOG("Creating Notify queue");
	dispatch_queue_t queue = dispatch_queue_create("Notify", NULL);

	T_LOG("Creating dispatch group");
    dispatch_group_t group = dispatch_group_create();

	for (i = 0; i < COUNT; ++i)
	{
        dispatch_group_enter(group);

        T_LOG("Registering dispatch notification listeners");
		status = notify_register_dispatch(KEY, &tokens[i], queue, ^(int x){
                int is_valid;
                int status; 

                T_LOG("Received dispatch notification: %d", x);

				status = notify_cancel(x);
                T_EXPECT_EQ(status, NOTIFY_STATUS_OK,
                        "notify_cancel %d == NOTIFY_STATUS_OK", status);    

                is_valid = notify_is_valid_token(x);
                T_EXPECT_EQ(is_valid, 0,
                        "notify_is_valid_token(%d) == 0", x, is_valid);    

                dispatch_group_leave(group);
		});

        T_EXPECT_EQ(status, NOTIFY_STATUS_OK,
                "notify_register_dispatch %d == NOTIFY_STATUS_OK", status);    
        T_EXPECT_TRUE(tokens[i] >= 0, "token %d >= 0", status);    
	}

    T_LOG("Posting notifications");
	notify_post(KEY);

    dispatch_group_notify(group, queue, ^(void) {
            printf("Notified...\n");
            T_END;
    });
	
	dispatch_release(queue);
	dispatch_main();
}