1
/* Gearman server and library
2
* Copyright (C) 2008 Brian Aker, Eric Day
5
* Use and distribution licensed under the BSD license. See
6
* the COPYING file in the parent directory for full text.
21
#include <libgearman/gearman.h>
23
#include "test_gearmand.h"
25
#define WORKER_TEST_PORT 32123
30
gearman_worker_st worker;
35
test_return_t queue_add(void *object);
36
test_return_t queue_worker(void *object);
38
test_return_t pre(void *object);
39
test_return_t post(void *object);
41
void *world_create(test_return_t *error);
42
test_return_t world_destroy(void *object);
44
/* append test for worker */
45
static void *append_function(gearman_job_st *job __attribute__((unused)),
46
void *context, size_t *result_size,
47
gearman_return_t *ret_ptr __attribute__((unused)))
49
/* this will will set the last char in the context (buffer) to the */
50
/* first char of the work */
51
char * buf = (char *)context;
52
char * work = (char *)gearman_job_workload(job);
59
test_return_t queue_add(void *object)
61
worker_test_st *test= (worker_test_st *)object;
62
gearman_client_st client;
63
char job_handle[GEARMAN_JOB_HANDLE_SIZE];
65
uint8_t * value= (uint8_t *)strdup("0");
66
size_t value_length= 1;
69
test->run_worker= false;
71
if (gearman_client_create(&client) == NULL)
74
if (gearman_client_add_server(&client, NULL,
75
WORKER_TEST_PORT) != GEARMAN_SUCCESS)
80
/* send strings "0", "1" ... "9" to alternating between 2 queues */
81
/* queue1 = 1,3,5,7,9 */
82
/* queue2 = 0,2,4,6,8 */
83
for (i=0; i<10; i++) {
84
if (gearman_client_do_background(&client, i % 2 ? "queue1" : "queue2", NULL, value,
85
value_length, job_handle) != GEARMAN_SUCCESS)
89
*value = (uint8_t)(*value + 1);
92
gearman_client_free(&client);
95
test->run_worker= true;
99
test_return_t queue_worker(void *object)
101
worker_test_st *test= (worker_test_st *)object;
102
gearman_worker_st *worker= &(test->worker);
105
memset(buffer, 0, 11);
107
if (!test->run_worker)
110
if (gearman_worker_add_function(worker, "queue1", 5, append_function,
111
buffer) != GEARMAN_SUCCESS)
116
if (gearman_worker_add_function(worker, "queue2", 5, append_function,
117
buffer) != GEARMAN_SUCCESS)
122
for (i=0; i<10; i++) {
123
if (gearman_worker_work(worker) != GEARMAN_SUCCESS)
127
// expect buffer to be reassembled in a predictable round robin order
128
if( strcmp(buffer, "1032547698") )
130
fprintf(stderr, "\n\nexpecting 0123456789, got %s\n\n", buffer);
138
void *world_create(test_return_t *error)
140
worker_test_st *test;
141
const char *argv[2]= { "test_gearmand", "--round-robin"};
144
gearmand_pid= test_gearmand_start(WORKER_TEST_PORT, NULL, (char **)argv, 2);
146
test= malloc(sizeof(worker_test_st));
149
*error= TEST_MEMORY_ALLOCATION_FAILURE;
153
memset(test, 0, sizeof(worker_test_st));
154
if (gearman_worker_create(&(test->worker)) == NULL)
156
*error= TEST_FAILURE;
160
if (gearman_worker_add_server(&(test->worker), NULL, WORKER_TEST_PORT) != GEARMAN_SUCCESS)
162
*error= TEST_FAILURE;
166
test->gearmand_pid= gearmand_pid;
168
*error= TEST_SUCCESS;
173
test_return_t world_destroy(void *object)
175
worker_test_st *test= (worker_test_st *)object;
176
gearman_worker_free(&(test->worker));
177
test_gearmand_stop(test->gearmand_pid);
184
{"add", 0, queue_add },
185
{"worker", 0, queue_worker },
189
collection_st collection[] ={
190
{"round_robin", 0, 0, tests},
194
void get_world(world_st *world)
196
world->collections= collection;
197
world->create= world_create;
198
world->destroy= world_destroy;