Groonga 3.0.9 Source Code Document
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
test-memcached.c
Go to the documentation of this file.
1 /* -*- c-basic-offset: 2; coding: utf-8 -*- */
2 /*
3  Copyright (C) 2008-2009 Tasuku SUENAGA <a@razil.jp>
4 
5  This library is free software; you can redistribute it and/or
6  modify it under the terms of the GNU Lesser General Public
7  License version 2.1 as published by the Free Software Foundation.
8 
9  This library is distributed in the hope that it will be useful,
10  but WITHOUT ANY WARRANTY; without even the implied warranty of
11  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12  Lesser General Public License for more details.
13 
14  You should have received a copy of the GNU Lesser General Public
15  License along with this library; if not, write to the Free Software
16  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
17 */
18 
19 #include <glib/gstdio.h>
20 #include "libmemcached/memcached.h"
21 #include <gcutter.h> /* must be included after memcached.h */
22 
23 #include <unistd.h>
24 
25 #include "../lib/grn-assertions.h"
26 #include "../lib/grn-test-memcached-assertions.h"
27 #include "../lib/grn-test-server.h"
28 
29 /* globals */
30 static gchar *val1 = NULL, *val2 = NULL;
31 static size_t val1_len, val2_len;
32 static struct memcached_st *memc = NULL;
33 static struct memcached_server_st *servers = NULL;
34 
35 static GrnTestServer *server;
36 
37 void
38 cut_setup(void)
39 {
40  GError *error = NULL;
41 
42  memc = NULL;
43  servers = NULL;
44 
45  server = grn_test_server_new();
46  grn_test_server_start(server, &error);
47  gcut_assert_error(error);
48 
49  memc = memcached_create(NULL);
50  memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_BINARY_PROTOCOL, 1);
51 
52  servers =
53  memcached_servers_parse(grn_test_server_get_memcached_address(server));
54  grn_test_memcached_assert(memcached_server_push(memc, servers),
55  cut_message("memcached server connect failed."));
56 
57  memcached_flush(memc, 0); /* flush immediately for debug daemon */
58 }
59 
60 void
62 {
63  if (val1) { free(val1); val1 = NULL; }
64  if (val2) { free(val2); val2 = NULL; }
65 
66  if (servers) {
67  memcached_server_list_free(servers);
68  }
69  if (memc) {
70  memcached_free(memc);
71  }
72 
73  if (server) {
74  g_object_unref(server);
75  }
76 }
77 
78 void
80 {
81  uint32_t flags;
82  memcached_return rc;
83 
85  memcached_set(memc, "key", 3, "value", 5, 0, 0xdeadbeefU),
86  cut_message("memcached set failed."));
87 
88  val1 = memcached_get(memc, "key", 3, &val1_len, &flags, &rc);
89  grn_test_memcached_assert(rc, cut_message("memcached get failed."));
90  cut_assert_equal_string("value", val1);
91  cut_assert_equal_uint(0xdeadbeefU, flags);
92 }
93 
94 void
96 {
97  uint32_t flags;
98  memcached_return rc;
99  const int timeout = 1;
100 
102  memcached_set(memc, "key", 1, "value", 5, timeout, 0xdeadbeefU),
103  cut_message("memcached set with expiration failed."));
104 
105  val1 = memcached_get(memc, "key", 1, &val1_len, &flags, &rc);
107  rc, cut_message("memcached get with expiration failed."));
108  cut_assert_equal_string("value", val1);
109  cut_assert_equal_uint(0xdeadbeefU, flags);
110 
111  sleep(timeout + 1);
112 
113  val2 = memcached_get(memc, "key", 1, &val2_len, &flags, &rc);
115  MEMCACHED_NOTFOUND, rc,
116  cut_message("memcached get with expiration error."));
117 }
118 
119 void
121 {
122  /* TODO: implement */
123  memcached_return rc = MEMCACHED_SUCCESS;
125 }
126 
127 void
129 {
130  uint32_t flags;
131  memcached_return rc;
132 
134  memcached_add(memc, "key", 3, "value", 5, 0, 0xdeadbeefU),
135  cut_message("memcached add failed."));
136 
138  MEMCACHED_NOTSTORED,
139  memcached_add(memc, "key", 3, "new-value", 9, 0, 0xdeadbeefU),
140  cut_message("memcached add succeeded."));
141 
142  val1 = memcached_get(memc, "key", 3, &val1_len, &flags, &rc);
143  grn_test_memcached_assert(rc, cut_message("memcached get failed."));
144  cut_assert_equal_string("value", val1);
145  cut_assert_equal_uint(0xdeadbeefU, flags);
146 }
147 
148 void
150 {
151  uint32_t flags;
152  memcached_return rc;
153 
155  MEMCACHED_NOTSTORED,
156  memcached_replace(memc, "key", 3, "value", 5, 0, 0xdeadbeefU),
157  cut_message("memcached replace succeeded."));
158 
159  sleep(1);
160 
162  memcached_add(memc, "key", 3, "value", 5, 0, 0xdeadbeefU),
163  cut_message("memcached add failed."));
164 
166  memcached_replace(memc, "key", 3, "new-value", 9, 0, 0xdeadbeefU),
167  cut_message("memcached replace failed."));
168 
169  val1 = memcached_get(memc, "key", 3, &val1_len, &flags, &rc);
170  grn_test_memcached_assert(rc, cut_message("memcached get failed."));
171  cut_assert_equal_string("new-value", val1);
172  cut_assert_equal_uint(0xdeadbeefU, flags);
173 }
174 
175 void
177 {
178  uint32_t flags;
179  memcached_return rc;
180 
182  memcached_set(memc, "key", 3, "to be flushed", 13, 0, 0xdeadbeefU),
183  cut_message("memcached set failed."));
184 
185  memcached_flush(memc, 0);
186 
187  val1 = memcached_get(memc, "key", 3, &val1_len, &flags, &rc);
189  MEMCACHED_NOTFOUND, rc,
190  cut_message("memcached get succeeded."));
191 }
192 
193 void
195 {
196  const int sleep_time = 1;
197  uint32_t flags;
198  memcached_return rc;
199 
201  memcached_set(memc, "key", 3, "to be flushed", 13, 0, 0xdeadbeefU),
202  cut_message("memcached set failed."));
203 
204  memcached_flush(memc, sleep_time);
205 
206  val1 = memcached_get(memc, "key", 3, &val1_len, &flags, &rc);
207  grn_test_memcached_assert(rc, cut_message("memcached get failed."));
208  cut_assert_equal_string("to be flushed", val1);
209  cut_assert_equal_uint(0xdeadbeefU, flags);
210 
211  sleep(sleep_time + 1);
212 
213  val2 = memcached_get(memc, "key", 3, &val2_len, &flags, &rc);
215  MEMCACHED_NOTFOUND, rc,
216  cut_message("memcached get succeeded."));
217 }
218 
219 void
221 {
222  memcached_return rc;
223 
224  const char *key = "caskey";
225  size_t key_len = strlen(key);
226  const char* keys[2] = { (char *)key, NULL };
227  size_t key_lens[2] = { key_len, 0 };
228 
229  memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_SUPPORT_CAS, 1);
231  memcached_set(memc, key, key_len, "cas test", 8, 0, 0xdeadbeefU),
232  cut_message("memcached set failed."));
233 
234  {
235  uint64_t cas;
236  memcached_result_st *results;
237  memcached_result_st results_obj;
238 
239  results = memcached_result_create(memc, &results_obj);
241  memcached_mget(memc, keys, key_lens, 1),
242  cut_message("memcached mget failed."));
243  results = memcached_fetch_result(memc, &results_obj, &rc);
244  cut_assert_not_null(results,
245  cut_message("memcached fetch result failed."));
246 
247  cas = memcached_result_cas(results);
248  cut_assert_operator(cas, !=, 0,
249  cut_message("memcached cas value is non-zero."));
250 
252  memcached_cas(memc, key, key_len, "cas changed", 12, 0, 0, cas),
253  cut_message("memcached cas failed."));
254 
256  MEMCACHED_NOTSTORED,
257  memcached_cas(memc, key, key_len, "cas changed", 12, 0, 0, cas),
258  cut_message("memcached cas value is same."));
259 
260  memcached_result_free(&results_obj);
261  }
262 }
263 
264 void
266 {
267  uint64_t intval;
268 
270  memcached_increment_with_initial(memc, "incr", 4, 1, 30, 0, &intval));
271  gcut_assert_equal_uint64(30, intval);
272 
274  memcached_increment_with_initial(memc, "incr", 4, 3, 0, 0, &intval));
275  gcut_assert_equal_uint64(33, intval);
276 
277  fflush(stderr);
278 }
279 
280 void
282 {
283  uint64_t intval;
284 
286  memcached_increment_with_initial(memc, "decr", 4, 30, 99, 0, &intval));
287  gcut_assert_equal_uint64(99, intval);
288 
290  memcached_decrement_with_initial(memc, "decr", 4, 17, 0, 0, &intval));
291  gcut_assert_equal_uint64(82, intval);
292 }