Merge lp:~clint-fewbar/gearmand/round-robin into lp:gearmand/1.0

Proposed by Clint Byrum
Status: Merged
Merged at revision: not available
Proposed branch: lp:~clint-fewbar/gearmand/round-robin
Merge into: lp:gearmand/1.0
Diff against target: 355 lines (+253/-1) (has conflicts)
4 files modified
.bzrignore (+2/-0)
tests/include.am (+26/-1)
tests/round_robin.c (+199/-0)
tests/test_gearmand.c (+26/-0)
Text conflict in tests/include.am
To merge this branch: bzr merge lp:~clint-fewbar/gearmand/round-robin
Reviewer Review Type Date Requested Status
Gearman-developers Pending
Review via email: mp+19424@code.launchpad.net
To post a comment you must log in.
Revision history for this message
Clint Byrum (clint-fewbar) wrote :

Adds tests for round-robin behavior

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file '.bzrignore'
--- .bzrignore 2010-01-26 05:53:44 +0000
+++ .bzrignore 2010-02-16 17:23:15 +0000
@@ -72,3 +72,5 @@
72tests/worker_test.res72tests/worker_test.res
73tests/tokyocabinet_test73tests/tokyocabinet_test
74tests/tokyocabinet_test.res74tests/tokyocabinet_test.res
75tests/round_robin_test
76tests/round_robin_test.res
7577
=== modified file 'tests/include.am'
--- tests/include.am 2010-02-10 01:48:52 +0000
+++ tests/include.am 2010-02-16 17:23:16 +0000
@@ -55,11 +55,20 @@
55tests_tokyocabinet_test_LDADD= ${TEST_LDADD}55tests_tokyocabinet_test_LDADD= ${TEST_LDADD}
5656
57noinst_PROGRAMS+= \57noinst_PROGRAMS+= \
58<<<<<<< TREE
58 tests/client_test \59 tests/client_test \
59 tests/cpp_test \60 tests/cpp_test \
60 tests/internals_test \61 tests/internals_test \
61 tests/regression_test \62 tests/regression_test \
62 tests/worker_test63 tests/worker_test
64=======
65 tests/client_test \
66 tests/cpp_test \
67 tests/internals_test \
68 tests/regression_test \
69 tests/round_robin_test \
70 tests/worker_test
71>>>>>>> MERGE-SOURCE
6372
64noinst_HEADERS+= \73noinst_HEADERS+= \
65 tests/test.h \74 tests/test.h \
@@ -75,6 +84,9 @@
75tests_regression_test_SOURCES= tests/regression.c84tests_regression_test_SOURCES= tests/regression.c
76tests_regression_test_LDADD= ${TEST_LDADD} libgearman/libgearmancore.la85tests_regression_test_LDADD= ${TEST_LDADD} libgearman/libgearmancore.la
7786
87tests_round_robin_test_SOURCES= tests/round_robin.c
88tests_round_robin_test_LDADD= ${TEST_LDADD} libgearman/libgearmancore.la
89
78tests_worker_test_SOURCES= tests/worker_test.c90tests_worker_test_SOURCES= tests/worker_test.c
79tests_worker_test_LDADD= ${TEST_LDADD}91tests_worker_test_LDADD= ${TEST_LDADD}
8092
@@ -85,6 +97,9 @@
85test-client:97test-client:
86 @tests/client_test $(ARG1) $(ARG2)98 @tests/client_test $(ARG1) $(ARG2)
8799
100test-round-robin:
101 tests/round_robin_test $(ARG1) $(ARG2)
102
88test-worker:103test-worker:
89 @tests/worker_test $(ARG1) $(ARG2)104 @tests/worker_test $(ARG1) $(ARG2)
90105
@@ -104,11 +119,14 @@
104 $(TOKYOCABINET_TEST) $(ARG1) $(ARG2)119 $(TOKYOCABINET_TEST) $(ARG1) $(ARG2)
105 $(TOKYOCABINET_RM)120 $(TOKYOCABINET_RM)
106121
107check-local: test-client test-worker test-internals test-libmemcached test-sqlite test-tokyocabinet122check-local: test-client test-round-robin test-worker test-internals test-libmemcached test-sqlite test-tokyocabinet
108123
109gdb-client: ${noinst_PROGRAMS}124gdb-client: ${noinst_PROGRAMS}
110 $(LIBTOOL) --mode=execute gdb tests/client_test125 $(LIBTOOL) --mode=execute gdb tests/client_test
111126
127gdb-round-robin: ${noinst_PROGRAMS}
128 $(LIBTOOL) --mode=execute gdb tests/round_robin_test
129
112gdb-worker: ${noinst_PROGRAMS}130gdb-worker: ${noinst_PROGRAMS}
113 $(LIBTOOL) --mode=execute gdb tests/worker_test131 $(LIBTOOL) --mode=execute gdb tests/worker_test
114132
@@ -118,6 +136,9 @@
118valgrind-client:136valgrind-client:
119 $(VALGRIND_COMMAND) tests/client_test $(ARG1) $(ARG2)137 $(VALGRIND_COMMAND) tests/client_test $(ARG1) $(ARG2)
120138
139valgrind-round-robin:
140 $(VALGRIND_COMMAND) tests/round_robin_test $(ARG1) $(ARG2)
141
121valgrind-worker:142valgrind-worker:
122 $(VALGRIND_COMMAND) tests/worker_test $(ARG1) $(ARG2)143 $(VALGRIND_COMMAND) tests/worker_test $(ARG1) $(ARG2)
123144
@@ -137,6 +158,7 @@
137 $(VALGRIND_COMMAND) $(TOKYOCABINET_TEST) $(ARG1) $(ARG2)158 $(VALGRIND_COMMAND) $(TOKYOCABINET_TEST) $(ARG1) $(ARG2)
138 $(TOKYOCABINET_RM)159 $(TOKYOCABINET_RM)
139160
161<<<<<<< TREE
140GEARMAN_CLIENT_TEST= bin/gearman162GEARMAN_CLIENT_TEST= bin/gearman
141GEARMAN_PIDFILE = ${abs_top_builddir}/tests/Xugear.pid163GEARMAN_PIDFILE = ${abs_top_builddir}/tests/Xugear.pid
142164
@@ -148,3 +170,6 @@
148170
149valgrind: ${noinst_PROGRAMS} valgrind-client valgrind-worker valgrind-internals valgrind-sqlite valgrind-tokyocabinetn171valgrind: ${noinst_PROGRAMS} valgrind-client valgrind-worker valgrind-internals valgrind-sqlite valgrind-tokyocabinetn
150172
173=======
174valgrind: ${noinst_PROGRAMS} valgrind-client valgrind-round-robin valgrind-worker valgrind-internals valgrind-sqlite valgrind-tokyocabinetn
175>>>>>>> MERGE-SOURCE
151176
=== added file 'tests/round_robin.c'
--- tests/round_robin.c 1970-01-01 00:00:00 +0000
+++ tests/round_robin.c 2010-02-16 17:23:16 +0000
@@ -0,0 +1,199 @@
1/* Gearman server and library
2 * Copyright (C) 2008 Brian Aker, Eric Day
3 * All rights reserved.
4 *
5 * Use and distribution licensed under the BSD license. See
6 * the COPYING file in the parent directory for full text.
7 */
8
9#include "config.h"
10
11#if defined(NDEBUG)
12# undef NDEBUG
13#endif
14
15#include <assert.h>
16#include <stdio.h>
17#include <stdlib.h>
18#include <string.h>
19#include <unistd.h>
20
21#include <libgearman/gearman.h>
22#include "test.h"
23#include "test_gearmand.h"
24
25#define WORKER_TEST_PORT 32123
26
27typedef struct
28{
29 pid_t gearmand_pid;
30 gearman_worker_st worker;
31 bool run_worker;
32} worker_test_st;
33
34/* Prototypes */
35test_return_t queue_add(void *object);
36test_return_t queue_worker(void *object);
37
38test_return_t pre(void *object);
39test_return_t post(void *object);
40
41void *world_create(test_return_t *error);
42test_return_t world_destroy(void *object);
43
44/* append test for worker */
45static void *append_function(gearman_job_st *job __attribute__((unused)),
46 void *context, size_t *result_size,
47 gearman_return_t *ret_ptr __attribute__((unused)))
48{
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);
53 buf += strlen(buf);
54 *buf = *work;
55 *result_size= 0;
56 return NULL;
57}
58
59test_return_t queue_add(void *object)
60{
61 worker_test_st *test= (worker_test_st *)object;
62 gearman_client_st client;
63 char job_handle[GEARMAN_JOB_HANDLE_SIZE];
64
65 uint8_t * value= (uint8_t *)strdup("0");
66 size_t value_length= 1;
67 uint8_t i;
68
69 test->run_worker= false;
70
71 if (gearman_client_create(&client) == NULL)
72 return TEST_FAILURE;
73
74 if (gearman_client_add_server(&client, NULL,
75 WORKER_TEST_PORT) != GEARMAN_SUCCESS)
76 {
77 return TEST_FAILURE;
78 }
79
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)
86 {
87 return TEST_FAILURE;
88 }
89 *value = (uint8_t)(*value + 1);
90 }
91
92 gearman_client_free(&client);
93 free(value);
94
95 test->run_worker= true;
96 return TEST_SUCCESS;
97}
98
99test_return_t queue_worker(void *object)
100{
101 worker_test_st *test= (worker_test_st *)object;
102 gearman_worker_st *worker= &(test->worker);
103 char buffer[11];
104 int i;
105 memset(buffer, 0, 11);
106
107 if (!test->run_worker)
108 return TEST_FAILURE;
109
110 if (gearman_worker_add_function(worker, "queue1", 5, append_function,
111 buffer) != GEARMAN_SUCCESS)
112 {
113 return TEST_FAILURE;
114 }
115
116 if (gearman_worker_add_function(worker, "queue2", 5, append_function,
117 buffer) != GEARMAN_SUCCESS)
118 {
119 return TEST_FAILURE;
120 }
121
122 for (i=0; i<10; i++) {
123 if (gearman_worker_work(worker) != GEARMAN_SUCCESS)
124 return TEST_FAILURE;
125 }
126
127 // expect buffer to be reassembled in a predictable round robin order
128 if( strcmp(buffer, "1032547698") )
129 {
130 fprintf(stderr, "\n\nexpecting 0123456789, got %s\n\n", buffer);
131 return TEST_FAILURE;
132 }
133
134 return TEST_SUCCESS;
135}
136
137
138void *world_create(test_return_t *error)
139{
140 worker_test_st *test;
141 const char *argv[2]= { "test_gearmand", "--round-robin"};
142 pid_t gearmand_pid;
143
144 gearmand_pid= test_gearmand_start(WORKER_TEST_PORT, NULL, (char **)argv, 2);
145
146 test= malloc(sizeof(worker_test_st));
147 if (! test)
148 {
149 *error= TEST_MEMORY_ALLOCATION_FAILURE;
150 return NULL;
151 }
152
153 memset(test, 0, sizeof(worker_test_st));
154 if (gearman_worker_create(&(test->worker)) == NULL)
155 {
156 *error= TEST_FAILURE;
157 return NULL;
158 }
159
160 if (gearman_worker_add_server(&(test->worker), NULL, WORKER_TEST_PORT) != GEARMAN_SUCCESS)
161 {
162 *error= TEST_FAILURE;
163 return NULL;
164 }
165
166 test->gearmand_pid= gearmand_pid;
167
168 *error= TEST_SUCCESS;
169
170 return (void *)test;
171}
172
173test_return_t world_destroy(void *object)
174{
175 worker_test_st *test= (worker_test_st *)object;
176 gearman_worker_free(&(test->worker));
177 test_gearmand_stop(test->gearmand_pid);
178 free(test);
179
180 return TEST_SUCCESS;
181}
182
183test_st tests[] ={
184 {"add", 0, queue_add },
185 {"worker", 0, queue_worker },
186 {0, 0, 0}
187};
188
189collection_st collection[] ={
190 {"round_robin", 0, 0, tests},
191 {0, 0, 0, 0}
192};
193
194void get_world(world_st *world)
195{
196 world->collections= collection;
197 world->create= world_create;
198 world->destroy= world_destroy;
199}
0200
=== modified file 'tests/test_gearmand.c'
--- tests/test_gearmand.c 2010-01-28 21:45:14 +0000
+++ tests/test_gearmand.c 2010-02-16 17:23:16 +0000
@@ -46,6 +46,10 @@
46 pid_t gearmand_pid;46 pid_t gearmand_pid;
47 gearmand_st *gearmand;47 gearmand_st *gearmand;
48 gearman_conf_st conf;48 gearman_conf_st conf;
49 gearman_conf_module_st module;
50 const char *name;
51 const char *value;
52 bool round_robin= false;
4953
50 gearmand_pid= fork();54 gearmand_pid= fork();
51 assert(gearmand_pid != -1);55 assert(gearmand_pid != -1);
@@ -74,12 +78,32 @@
74 assert(ret == GEARMAN_SUCCESS);78 assert(ret == GEARMAN_SUCCESS);
75#endif79#endif
7680
81 (void)gearman_conf_module_create(&conf, &module, NULL);
82
83#ifndef MCO
84#define MCO(__name, __short, __value, __help) \
85 gearman_conf_module_add_option(&module, __name, __short, __value, __help);
86#endif
87
88 MCO("round-robin", 'R', NULL, "Assign work in round-robin order per worker"
89 "connection. The default is to assign work in the order of functions "
90 "added by the worker.")
91
77 ret= gearman_conf_parse_args(&conf, argc, argv);92 ret= gearman_conf_parse_args(&conf, argc, argv);
78 assert(ret == GEARMAN_SUCCESS);93 assert(ret == GEARMAN_SUCCESS);
7994
95 /* Check for option values that were given. */
96 while (gearman_conf_module_value(&module, &name, &value))
97 {
98 if (!strcmp(name, "round-robin"))
99 round_robin++;
100 }
101
80 gearmand= gearmand_create(NULL, port);102 gearmand= gearmand_create(NULL, port);
81 assert(gearmand != NULL);103 assert(gearmand != NULL);
82104
105 gearmand_set_round_robin(gearmand, round_robin);
106
83 if (queue_type != NULL)107 if (queue_type != NULL)
84 {108 {
85 assert(argc);109 assert(argc);
@@ -121,6 +145,8 @@
121 }145 }
122 }146 }
123147
148
149
124 ret= gearmand_run(gearmand);150 ret= gearmand_run(gearmand);
125 assert(ret != GEARMAN_SUCCESS);151 assert(ret != GEARMAN_SUCCESS);
126152

Subscribers

People subscribed via source and target branches