libcouchbase 0.0.7 → 0.0.8

Sign up to get free protection for your applications and to get access to all the features.
Files changed (133) hide show
  1. checksums.yaml +4 -4
  2. data/ext/libcouchbase/.gitignore +2 -0
  3. data/ext/libcouchbase/CMakeLists.txt +5 -7
  4. data/ext/libcouchbase/README.markdown +2 -2
  5. data/ext/libcouchbase/RELEASE_NOTES.markdown +49 -0
  6. data/ext/libcouchbase/cmake/Modules/ConfigureDtrace.cmake +11 -0
  7. data/ext/libcouchbase/cmake/Modules/GenerateConfigDotH.cmake +2 -0
  8. data/ext/libcouchbase/cmake/Modules/GetLibcouchbaseFlags.cmake +2 -1
  9. data/ext/libcouchbase/cmake/Modules/GetVersionInfo.cmake +3 -3
  10. data/ext/libcouchbase/cmake/config-cmake.h.in +2 -0
  11. data/ext/libcouchbase/cmake/defs.mk.in +0 -2
  12. data/ext/libcouchbase/cmake/source_files.cmake +34 -14
  13. data/ext/libcouchbase/configure.pl +1 -1
  14. data/ext/libcouchbase/contrib/genhash/genhash.h +6 -0
  15. data/ext/libcouchbase/include/libcouchbase/auth.h +10 -0
  16. data/ext/libcouchbase/include/libcouchbase/couchbase.h +10 -0
  17. data/ext/libcouchbase/include/libcouchbase/error.h +7 -0
  18. data/ext/libcouchbase/include/libcouchbase/n1ql.h +13 -1
  19. data/ext/libcouchbase/include/libcouchbase/plugins/io/bsdio-inl.c +1 -1
  20. data/ext/libcouchbase/include/libcouchbase/subdoc.h +9 -0
  21. data/ext/libcouchbase/include/libcouchbase/views.h +7 -1
  22. data/ext/libcouchbase/include/libcouchbase/visibility.h +1 -0
  23. data/ext/libcouchbase/include/memcached/protocol_binary.h +21 -1132
  24. data/ext/libcouchbase/packaging/parse-git-describe.pl +1 -1
  25. data/ext/libcouchbase/plugins/io/libev/libev_io_opts.h +3 -2
  26. data/ext/libcouchbase/src/README.md +0 -2
  27. data/ext/libcouchbase/src/auth-priv.h +1 -0
  28. data/ext/libcouchbase/src/auth.cc +10 -0
  29. data/ext/libcouchbase/src/bootstrap.cc +216 -0
  30. data/ext/libcouchbase/src/bootstrap.h +50 -39
  31. data/ext/libcouchbase/src/bucketconfig/bc_cccp.cc +455 -0
  32. data/ext/libcouchbase/src/bucketconfig/bc_file.cc +281 -0
  33. data/ext/libcouchbase/src/bucketconfig/bc_http.cc +528 -0
  34. data/ext/libcouchbase/src/bucketconfig/bc_http.h +50 -25
  35. data/ext/libcouchbase/src/bucketconfig/bc_mcraw.cc +115 -0
  36. data/ext/libcouchbase/src/bucketconfig/clconfig.h +407 -386
  37. data/ext/libcouchbase/src/bucketconfig/confmon.cc +378 -0
  38. data/ext/libcouchbase/src/cbft.cc +22 -27
  39. data/ext/libcouchbase/src/cntl.cc +24 -24
  40. data/ext/libcouchbase/src/connspec.cc +30 -1
  41. data/ext/libcouchbase/src/connspec.h +17 -0
  42. data/ext/libcouchbase/src/dns-srv.cc +143 -0
  43. data/ext/libcouchbase/src/{dump.c → dump.cc} +8 -11
  44. data/ext/libcouchbase/src/getconfig.cc +73 -0
  45. data/ext/libcouchbase/src/handler.cc +84 -85
  46. data/ext/libcouchbase/src/hostlist.cc +0 -1
  47. data/ext/libcouchbase/src/hostlist.h +6 -1
  48. data/ext/libcouchbase/src/http/http-priv.h +125 -112
  49. data/ext/libcouchbase/src/http/http.cc +9 -29
  50. data/ext/libcouchbase/src/http/http.h +1 -34
  51. data/ext/libcouchbase/src/http/http_io.cc +22 -26
  52. data/ext/libcouchbase/src/instance.cc +102 -28
  53. data/ext/libcouchbase/src/internal.h +47 -29
  54. data/ext/libcouchbase/src/jsparse/parser.cc +146 -202
  55. data/ext/libcouchbase/src/jsparse/parser.h +91 -98
  56. data/ext/libcouchbase/src/lcbht/lcbht.cc +177 -0
  57. data/ext/libcouchbase/src/lcbht/lcbht.h +174 -163
  58. data/ext/libcouchbase/src/lcbio/connect.cc +562 -0
  59. data/ext/libcouchbase/src/lcbio/connect.h +9 -2
  60. data/ext/libcouchbase/src/lcbio/ctx.c +1 -1
  61. data/ext/libcouchbase/src/lcbio/iotable.h +61 -16
  62. data/ext/libcouchbase/src/lcbio/ioutils.h +1 -1
  63. data/ext/libcouchbase/src/lcbio/manager.c +2 -2
  64. data/ext/libcouchbase/src/lcbio/timer-cxx.h +87 -0
  65. data/ext/libcouchbase/src/mc/mcreq.h +9 -2
  66. data/ext/libcouchbase/src/mcserver/mcserver.cc +723 -0
  67. data/ext/libcouchbase/src/mcserver/mcserver.h +160 -70
  68. data/ext/libcouchbase/src/mcserver/negotiate.cc +118 -152
  69. data/ext/libcouchbase/src/mcserver/negotiate.h +85 -74
  70. data/ext/libcouchbase/src/mctx-helper.h +51 -0
  71. data/ext/libcouchbase/src/n1ql/ixmgmt.cc +1 -2
  72. data/ext/libcouchbase/src/n1ql/n1ql.cc +56 -32
  73. data/ext/libcouchbase/src/{newconfig.c → newconfig.cc} +42 -70
  74. data/ext/libcouchbase/src/nodeinfo.cc +4 -8
  75. data/ext/libcouchbase/src/operations/{cbflush.c → cbflush.cc} +7 -15
  76. data/ext/libcouchbase/src/operations/{counter.c → counter.cc} +0 -0
  77. data/ext/libcouchbase/src/operations/{durability-cas.c → durability-cas.cc} +92 -76
  78. data/ext/libcouchbase/src/operations/{durability-seqno.c → durability-seqno.cc} +55 -49
  79. data/ext/libcouchbase/src/operations/durability.cc +643 -0
  80. data/ext/libcouchbase/src/operations/durability_internal.h +212 -124
  81. data/ext/libcouchbase/src/operations/{get.c → get.cc} +24 -26
  82. data/ext/libcouchbase/src/operations/{observe-seqno.c → observe-seqno.cc} +5 -8
  83. data/ext/libcouchbase/src/operations/{observe.c → observe.cc} +69 -94
  84. data/ext/libcouchbase/src/operations/{pktfwd.c → pktfwd.cc} +0 -0
  85. data/ext/libcouchbase/src/operations/{remove.c → remove.cc} +0 -0
  86. data/ext/libcouchbase/src/operations/{stats.c → stats.cc} +66 -78
  87. data/ext/libcouchbase/src/operations/{store.c → store.cc} +27 -32
  88. data/ext/libcouchbase/src/operations/subdoc.cc +38 -18
  89. data/ext/libcouchbase/src/operations/{touch.c → touch.cc} +0 -0
  90. data/ext/libcouchbase/src/packetutils.h +200 -137
  91. data/ext/libcouchbase/src/probes.d +1 -1
  92. data/ext/libcouchbase/src/{retrychk.c → retrychk.cc} +3 -4
  93. data/ext/libcouchbase/src/retryq.cc +394 -0
  94. data/ext/libcouchbase/src/retryq.h +116 -104
  95. data/ext/libcouchbase/src/settings.h +2 -1
  96. data/ext/libcouchbase/src/ssl/ssl_c.c +1 -0
  97. data/ext/libcouchbase/src/ssl/ssl_e.c +0 -1
  98. data/ext/libcouchbase/src/trace.h +8 -8
  99. data/ext/libcouchbase/src/vbucket/vbucket.c +0 -1
  100. data/ext/libcouchbase/src/views/{docreq.c → docreq.cc} +48 -54
  101. data/ext/libcouchbase/src/views/docreq.h +24 -30
  102. data/ext/libcouchbase/src/views/viewreq.cc +318 -0
  103. data/ext/libcouchbase/src/views/viewreq.h +43 -13
  104. data/ext/libcouchbase/src/{wait.c → wait.cc} +12 -17
  105. data/ext/libcouchbase/tests/basic/t_connstr.cc +89 -50
  106. data/ext/libcouchbase/tests/basic/t_jsparse.cc +27 -78
  107. data/ext/libcouchbase/tests/basic/t_packet.cc +35 -42
  108. data/ext/libcouchbase/tests/htparse/t_basic.cc +58 -78
  109. data/ext/libcouchbase/tests/iotests/t_confmon.cc +94 -111
  110. data/ext/libcouchbase/tests/iotests/t_sched.cc +1 -2
  111. data/ext/libcouchbase/tests/mc/t_alloc.cc +9 -9
  112. data/ext/libcouchbase/tools/cbc-pillowfight.cc +1 -1
  113. data/lib/libcouchbase/version.rb +1 -1
  114. metadata +36 -39
  115. data/ext/libcouchbase/include/memcached/vbucket.h +0 -42
  116. data/ext/libcouchbase/src/bootstrap.c +0 -269
  117. data/ext/libcouchbase/src/bucketconfig/bc_cccp.c +0 -495
  118. data/ext/libcouchbase/src/bucketconfig/bc_file.c +0 -347
  119. data/ext/libcouchbase/src/bucketconfig/bc_http.c +0 -630
  120. data/ext/libcouchbase/src/bucketconfig/bc_mcraw.c +0 -150
  121. data/ext/libcouchbase/src/bucketconfig/confmon.c +0 -474
  122. data/ext/libcouchbase/src/getconfig.c +0 -100
  123. data/ext/libcouchbase/src/lcbht/lcbht.c +0 -282
  124. data/ext/libcouchbase/src/lcbio/connect.c +0 -557
  125. data/ext/libcouchbase/src/mcserver/mcserver.c +0 -784
  126. data/ext/libcouchbase/src/operations/durability.c +0 -668
  127. data/ext/libcouchbase/src/packetutils.c +0 -60
  128. data/ext/libcouchbase/src/retryq.c +0 -424
  129. data/ext/libcouchbase/src/simplestring.c +0 -211
  130. data/ext/libcouchbase/src/simplestring.h +0 -228
  131. data/ext/libcouchbase/src/ssobuf.h +0 -82
  132. data/ext/libcouchbase/src/views/viewreq.c +0 -358
  133. data/ext/libcouchbase/tests/basic/t_string.cc +0 -112
@@ -8,8 +8,13 @@
8
8
  class JsonParseTest : public ::testing::Test {
9
9
  };
10
10
 
11
+ using namespace lcb::jsparse;
11
12
 
12
- struct Context {
13
+ static std::string iov2s(const lcb_IOV& iov) {
14
+ return std::string(reinterpret_cast<const char*>(iov.iov_base), iov.iov_len);
15
+ }
16
+
17
+ struct Context : Parser::Actions {
13
18
  lcb_error_t rc;
14
19
  bool received_done;
15
20
  std::string meta;
@@ -23,115 +28,59 @@ struct Context {
23
28
  meta.clear();
24
29
  rows.clear();
25
30
  }
26
- };
27
-
28
- class Parser {
29
- public:
30
- Parser(int mode_) : mode(mode_), inner(NULL) {
31
- reset();
32
- }
33
-
34
- void reset() {
35
- if (inner != NULL) {
36
- lcbjsp_free(inner);
37
- }
38
- inner = lcbjsp_create(mode);
31
+ void JSPARSE_on_row(const Row& row) {
32
+ rows.push_back(iov2s(row.row));
39
33
  }
40
-
41
- ~Parser() {
42
- if (inner != NULL) {
43
- lcbjsp_free(inner);
44
- }
34
+ void JSPARSE_on_complete(const std::string& s) {
35
+ meta.assign(s);
36
+ received_done = true;
45
37
  }
46
-
47
- operator lcbjsp_PARSER* () {
48
- return inner;
49
- }
50
-
51
- lcbjsp_PARSER *getInner() {
52
- return inner;
38
+ void JSPARSE_on_error(const std::string&) {
39
+ rc = LCB_PROTOCOL_ERROR;
40
+ received_done = true;
53
41
  }
54
-
55
- private:
56
- int mode;
57
- lcbjsp_PARSER *inner;
58
- Parser(Parser&);
59
42
  };
60
43
 
61
- static std::string iov2s(const lcb_IOV& iov) {
62
- return std::string(reinterpret_cast<const char*>(iov.iov_base), iov.iov_len);
63
- }
64
-
65
- extern "C" {
66
- static void rowCallback(lcbjsp_PARSER *parser, const lcbjsp_ROW *row) {
67
- Context *ctx = reinterpret_cast<Context*>(parser->data);
68
- if (row->type == LCBJSP_TYPE_ERROR) {
69
- ctx->rc = LCB_PROTOCOL_ERROR;
70
- ctx->received_done = true;
71
- } else if (row->type == LCBJSP_TYPE_ROW) {
72
- ctx->rows.push_back(iov2s(row->row));
73
- } else if (row->type == LCBJSP_TYPE_COMPLETE) {
74
- ctx->meta = iov2s(row->row);
75
- ctx->received_done = true;
76
- }
77
- }
78
- }
79
-
80
- static bool validateJsonRows(const char *txt, size_t ntxt, int mode)
44
+ static bool validateJsonRows(const char *txt, size_t ntxt, Parser::Mode mode)
81
45
  {
82
- Parser parser(mode);
83
- EXPECT_TRUE(parser != NULL);
84
- if (parser == NULL) {
85
- return false;
86
- }
87
-
88
- // Feed it once
89
46
  Context cx;
90
- parser.getInner()->callback = rowCallback;
91
- parser.getInner()->data = &cx;
47
+ Parser parser(mode, &cx);
92
48
 
93
49
  for (size_t ii = 0; ii < ntxt; ii++) {
94
- lcbjsp_feed(parser, txt + ii, 1);
50
+ parser.feed(txt + ii, 1);
95
51
  }
96
52
  EXPECT_EQ(LCB_SUCCESS, cx.rc);
97
53
 
98
54
  lcb_IOV out;
99
- lcbjsp_get_postmortem(parser, &out);
55
+ parser.get_postmortem(out);
100
56
  EXPECT_EQ(cx.meta, iov2s(out));
101
57
  Json::Value root;
102
58
  EXPECT_TRUE(Json::Reader().parse(cx.meta, root));
103
59
  return true;
104
60
  }
105
61
 
106
- static bool validateBadParse(const char *txt, size_t ntxt, int mode)
62
+ static bool validateBadParse(const char *txt, size_t ntxt, Parser::Mode mode)
107
63
  {
108
- Parser p(mode);
109
64
  Context cx;
110
- p.getInner()->callback = rowCallback;
111
- p.getInner()->data = &cx;
112
- lcbjsp_feed(p, JSON_fts_bad, sizeof(JSON_fts_bad));
65
+ Parser p(mode, &cx);
66
+ p.feed(JSON_fts_bad, sizeof(JSON_fts_bad));
113
67
  EXPECT_EQ(LCB_PROTOCOL_ERROR, cx.rc);
114
68
 
115
69
  p.reset();
116
70
  cx.reset();
117
71
 
118
- p.getInner()->callback = rowCallback;
119
- p.getInner()->data = &cx;
120
-
121
- for (size_t ii = 0; ii < ntxt; ++ii) {
122
- }
123
72
  return true;
124
73
  }
125
74
 
126
75
  TEST_F(JsonParseTest, testFTS)
127
76
  {
128
- ASSERT_TRUE(validateJsonRows(JSON_fts_good, sizeof(JSON_fts_good), LCBJSP_MODE_FTS));
129
- ASSERT_TRUE(validateBadParse(JSON_fts_bad, sizeof(JSON_fts_bad), LCBJSP_MODE_FTS));
130
- ASSERT_TRUE(validateBadParse(JSON_fts_bad2, sizeof(JSON_fts_bad2), LCBJSP_MODE_FTS));
77
+ ASSERT_TRUE(validateJsonRows(JSON_fts_good, sizeof(JSON_fts_good), Parser::MODE_FTS));
78
+ ASSERT_TRUE(validateBadParse(JSON_fts_bad, sizeof(JSON_fts_bad), Parser::MODE_FTS));
79
+ ASSERT_TRUE(validateBadParse(JSON_fts_bad2, sizeof(JSON_fts_bad2), Parser::MODE_FTS));
131
80
  }
132
81
 
133
82
  TEST_F(JsonParseTest, testN1QL) {
134
- ASSERT_TRUE(validateJsonRows(JSON_n1ql_nonempty, sizeof(JSON_n1ql_nonempty), LCBJSP_MODE_N1QL));
135
- ASSERT_TRUE(validateJsonRows(JSON_n1ql_empty, sizeof(JSON_n1ql_empty), LCBJSP_MODE_N1QL));
136
- ASSERT_TRUE(validateBadParse(JSON_n1ql_bad, sizeof(JSON_n1ql_bad), LCBJSP_MODE_N1QL));
83
+ ASSERT_TRUE(validateJsonRows(JSON_n1ql_nonempty, sizeof(JSON_n1ql_nonempty), Parser::MODE_N1QL));
84
+ ASSERT_TRUE(validateJsonRows(JSON_n1ql_empty, sizeof(JSON_n1ql_empty), Parser::MODE_N1QL));
85
+ ASSERT_TRUE(validateBadParse(JSON_n1ql_bad, sizeof(JSON_n1ql_bad), Parser::MODE_N1QL));
137
86
  }
@@ -135,23 +135,22 @@ TEST_F(Packet, testParseBasic)
135
135
  pkt.getq(value, 0);
136
136
  pkt.rbWrite(&ior);
137
137
 
138
- packet_info pi;
138
+ lcb::MemcachedResponse pi;
139
139
  memset(&pi, 0, sizeof(pi));
140
140
  unsigned wanted;
141
- int rv = lcb_pktinfo_ior_get(&pi, &ior, &wanted);
142
- ASSERT_EQ(rv, 1);
143
-
144
- ASSERT_EQ(0, PACKET_STATUS(&pi));
145
- ASSERT_EQ(PROTOCOL_BINARY_CMD_GETQ, PACKET_OPCODE(&pi));
146
- ASSERT_EQ(0, PACKET_OPAQUE(&pi));
147
- ASSERT_EQ(7, PACKET_NBODY(&pi));
148
- ASSERT_EQ(3, PACKET_NVALUE(&pi));
149
- ASSERT_EQ(0, PACKET_NKEY(&pi));
150
- ASSERT_EQ(4, PACKET_EXTLEN(&pi));
151
- ASSERT_EQ(PACKET_NBODY(&pi), rdb_get_nused(&ior));
152
- ASSERT_EQ(0, strncmp(value.c_str(), PACKET_VALUE(&pi), 3));
153
-
154
- lcb_pktinfo_ior_done(&pi, &ior);
141
+ ASSERT_TRUE(pi.load(&ior, &wanted));
142
+
143
+ ASSERT_EQ(0, pi.status());
144
+ ASSERT_EQ(PROTOCOL_BINARY_CMD_GETQ, pi.opcode());
145
+ ASSERT_EQ(0, pi.opaque());
146
+ ASSERT_EQ(7, pi.bodylen());
147
+ ASSERT_EQ(3, pi.vallen());
148
+ ASSERT_EQ(0, pi.keylen());
149
+ ASSERT_EQ(4, pi.extlen());
150
+ ASSERT_EQ(pi.bodylen(), rdb_get_nused(&ior));
151
+ ASSERT_EQ(0, strncmp(value.c_str(), pi.value(), 3));
152
+
153
+ pi.release(&ior);
155
154
  ASSERT_EQ(0, rdb_get_nused(&ior));
156
155
  rdb_cleanup(&ior);
157
156
  }
@@ -165,26 +164,22 @@ TEST_F(Packet, testParsePartial)
165
164
  std::string value;
166
165
  value.insert(0, 1024, '*');
167
166
 
168
- packet_info pi;
169
- int rv;
167
+ lcb::MemcachedResponse pi;
170
168
 
171
169
  // Test where we're missing just one byte
172
170
  pkt.writeGenericHeader(10, &ior);
173
171
  unsigned wanted;
174
- rv = lcb_pktinfo_ior_get(&pi, &ior, &wanted);
175
- ASSERT_EQ(0, rv);
172
+ ASSERT_FALSE(pi.load(&ior, &wanted));
176
173
 
177
174
  for (int ii = 0; ii < 9; ii++) {
178
175
  char c = 'O';
179
176
  rdb_copywrite(&ior, &c, 1);
180
- rv = lcb_pktinfo_ior_get(&pi, &ior, &wanted);
181
- ASSERT_EQ(0, rv);
177
+ ASSERT_FALSE(pi.load(&ior, &wanted));
182
178
  }
183
179
  char tmp = 'O';
184
180
  rdb_copywrite(&ior, &tmp, 1);
185
- rv = lcb_pktinfo_ior_get(&pi, &ior, &wanted);
186
- ASSERT_EQ(1, rv);
187
- lcb_pktinfo_ior_done(&pi, &ior);
181
+ ASSERT_TRUE(pi.load(&ior, &wanted));
182
+ pi.release(&ior);
188
183
  rdb_cleanup(&ior);
189
184
  }
190
185
 
@@ -199,24 +194,22 @@ TEST_F(Packet, testKeys)
199
194
  pkt.get(key, value, 1000, PROTOCOL_BINARY_RESPONSE_ETMPFAIL, 0xdeadbeef, 50);
200
195
  pkt.rbWrite(&ior);
201
196
 
202
- packet_info pi;
203
- memset(&pi, 0, sizeof(pi));
197
+ lcb::MemcachedResponse pi;
204
198
  unsigned wanted;
205
- int rv = lcb_pktinfo_ior_get(&pi, &ior, &wanted);
206
- ASSERT_EQ(1, rv);
207
-
208
- ASSERT_EQ(key.size(), PACKET_NKEY(&pi));
209
- ASSERT_EQ(0, memcmp(key.c_str(), PACKET_KEY(&pi), PACKET_NKEY(&pi)));
210
- ASSERT_EQ(value.size(), PACKET_NVALUE(&pi));
211
- ASSERT_EQ(0, memcmp(value.c_str(), PACKET_VALUE(&pi), PACKET_NVALUE(&pi)));
212
- ASSERT_EQ(0xdeadbeef, PACKET_CAS(&pi));
213
- ASSERT_EQ(PROTOCOL_BINARY_RESPONSE_ETMPFAIL, PACKET_STATUS(&pi));
214
- ASSERT_EQ(PROTOCOL_BINARY_CMD_GET, PACKET_OPCODE(&pi));
215
- ASSERT_EQ(4, PACKET_EXTLEN(&pi));
216
- ASSERT_EQ(4 + key.size() + value.size(), PACKET_NBODY(&pi));
217
- ASSERT_NE(pi.payload, PACKET_VALUE(&pi));
218
- ASSERT_EQ(4 + key.size(), PACKET_VALUE(&pi) - (char *)pi.payload);
219
-
220
- lcb_pktinfo_ior_done(&pi, &ior);
199
+ ASSERT_TRUE(pi.load(&ior, &wanted));
200
+
201
+ ASSERT_EQ(key.size(), pi.keylen());
202
+ ASSERT_EQ(0, memcmp(key.c_str(), pi.key(), pi.keylen()));
203
+ ASSERT_EQ(value.size(), pi.vallen());
204
+ ASSERT_EQ(0, memcmp(value.c_str(), pi.value(), pi.vallen()));
205
+ ASSERT_EQ(0xdeadbeef, pi.cas());
206
+ ASSERT_EQ(PROTOCOL_BINARY_RESPONSE_ETMPFAIL, pi.status());
207
+ ASSERT_EQ(PROTOCOL_BINARY_CMD_GET, pi.opcode());
208
+ ASSERT_EQ(4, pi.extlen());
209
+ ASSERT_EQ(4 + key.size() + value.size(), pi.bodylen());
210
+ ASSERT_NE(pi.body<const char*>(), pi.value());
211
+ ASSERT_EQ(4 + key.size(), pi.value() - pi.body<const char*>());
212
+
213
+ pi.release(&ior);
221
214
  rdb_cleanup(&ior);
222
215
  }
@@ -5,6 +5,7 @@
5
5
  #include "settings.h"
6
6
 
7
7
  using std::string;
8
+ using namespace lcb::htparse;
8
9
 
9
10
  class HtparseTest : public ::testing::Test {
10
11
  };
@@ -13,52 +14,51 @@ TEST_F(HtparseTest, testBasic)
13
14
  {
14
15
  lcb_settings *settings = lcb_settings_new();
15
16
  // Allocate a parser
16
- lcbht_pPARSER parser = lcbht_new(settings);
17
+ Parser *parser = new Parser(settings);
17
18
  ASSERT_FALSE(parser == NULL);
18
19
 
19
20
  // Feed the parser some stuff
20
- lcbht_RESPSTATE state;
21
+ unsigned state;
21
22
 
22
23
  string buf;
23
24
  buf = "HTTP/1.0 200 OK\r\n";
24
25
 
25
- state = lcbht_parse(parser, buf.c_str(), buf.size());
26
+ state = parser->parse(buf.c_str(), buf.size());
26
27
  ASSERT_EQ(0, state);
27
28
 
28
29
  buf = "Connec";
29
- state = lcbht_parse(parser, buf.c_str(), buf.size());
30
+ state = parser->parse(buf.c_str(), buf.size());
30
31
  ASSERT_EQ(0, state);
31
32
  buf = "tion: Keep-Alive\r\n";
32
- state = lcbht_parse(parser, buf.c_str(), buf.size());
33
+ state = parser->parse(buf.c_str(), buf.size());
33
34
  ASSERT_EQ(0, state);
34
35
  buf += "Content-Length: 5\r\n\r\n";
35
- state = lcbht_parse(parser, buf.c_str(), buf.size());
36
- ASSERT_EQ(LCBHT_S_HEADER|LCBHT_S_HTSTATUS, state);
36
+ state = parser->parse(buf.c_str(), buf.size());
37
+ ASSERT_EQ(Parser::S_HEADER|Parser::S_HTSTATUS, state);
37
38
 
38
- lcbht_RESPONSE *resp = lcbht_get_response(parser);
39
- ASSERT_EQ(200, resp->status);
39
+ Response& resp = parser->get_cur_response();
40
+ ASSERT_EQ(200, resp.status);
40
41
 
41
42
  // Add some data into the body
42
43
  buf = "H";
43
- state = lcbht_parse(parser, buf.c_str(), buf.size());
44
- ASSERT_EQ(0, state & LCBHT_S_ERROR);
45
- ASSERT_STREQ("H", resp->body.base);
44
+ state = parser->parse(buf.c_str(), buf.size());
45
+ ASSERT_EQ(0, state & Parser::S_ERROR);
46
+ ASSERT_EQ("H", resp.body);
46
47
 
47
48
  buf = "ello";
48
- state = lcbht_parse(parser, buf.c_str(), buf.size());
49
- ASSERT_NE(0, state & LCBHT_S_DONE);
50
- ASSERT_STREQ("Hello", resp->body.base);
49
+ state = parser->parse(buf.c_str(), buf.size());
50
+ ASSERT_NE(0, state & Parser::S_DONE);
51
+ ASSERT_EQ("Hello", resp.body);
51
52
 
52
53
  // Now find the header
53
-
54
- lcbht_free(parser);
54
+ delete parser;
55
55
  lcb_settings_unref(settings);
56
56
  }
57
57
 
58
58
  TEST_F(HtparseTest, testHeaderFunctions)
59
59
  {
60
60
  lcb_settings *settings = lcb_settings_new();
61
- lcbht_pPARSER parser = lcbht_new(settings);
61
+ Parser *parser = new Parser(settings);
62
62
 
63
63
  string buf = "HTTP/1.0 200 OK\r\n"
64
64
  "Connection: keep-alive\r\n"
@@ -66,45 +66,28 @@ TEST_F(HtparseTest, testHeaderFunctions)
66
66
  "Content-Type: application/json\r\n"
67
67
  "Content-Length: 0\r\n"
68
68
  "\r\n";
69
- lcbht_RESPSTATE state;
70
- state = lcbht_parse(parser, buf.c_str(), buf.size());
71
- ASSERT_NE(0, state & LCBHT_S_DONE);
69
+ unsigned state;
70
+ state = parser->parse(buf.c_str(), buf.size());
71
+ ASSERT_NE(0, state & Parser::S_DONE);
72
72
 
73
- lcbht_RESPONSE *resp = lcbht_get_response(parser);
73
+ Response &resp = parser->get_cur_response();
74
74
  // Now fine the header value stuff
75
- ASSERT_STREQ("keep-alive", lcbht_get_resphdr(resp, "Connection"));
76
- ASSERT_STREQ("dummy/1.0", lcbht_get_resphdr(resp, "X-Server"));
77
- ASSERT_STREQ("application/json", lcbht_get_resphdr(resp, "Content-Type"));
78
-
79
- using std::map;
80
- map<string,string> hdrmap;
81
- char **hdrlist = lcbht_make_resphdrlist(resp);
82
- for (char **cur = hdrlist; *cur != NULL; cur += 2) {
83
- string k = cur[0];
84
- string v = cur[1];
85
- hdrmap[k] = v;
86
- free(cur[0]);
87
- free(cur[1]);
88
- }
89
- free(hdrlist);
90
-
91
- ASSERT_EQ("keep-alive", hdrmap["Connection"]);
92
- ASSERT_EQ("dummy/1.0", hdrmap["X-Server"]);
93
- ASSERT_EQ("application/json", hdrmap["Content-Type"]);
94
-
95
- lcbht_free(parser);
75
+ ASSERT_STREQ("keep-alive", resp.get_header_value("Connection"));
76
+ ASSERT_STREQ("dummy/1.0", resp.get_header_value("X-Server"));
77
+ ASSERT_STREQ("application/json", resp.get_header_value("Content-Type"));
78
+ delete parser;
96
79
  lcb_settings_unref(settings);
97
80
  }
98
81
 
99
82
  TEST_F(HtparseTest, testParseErrors)
100
83
  {
101
84
  lcb_settings *settings = lcb_settings_new();
102
- lcbht_pPARSER parser = lcbht_new(settings);
85
+ Parser *parser = new Parser(settings);
103
86
 
104
87
  string buf = "blahblahblah";
105
- lcbht_RESPSTATE state = lcbht_parse(parser, buf.c_str(), buf.size());
106
- ASSERT_NE(0, state & LCBHT_S_ERROR);
107
- lcbht_free(parser);
88
+ unsigned state = parser->parse(buf.c_str(), buf.size());
89
+ ASSERT_NE(0, state & Parser::S_ERROR);
90
+ delete parser;
108
91
  lcb_settings_unref(settings);
109
92
  }
110
93
 
@@ -112,8 +95,7 @@ TEST_F(HtparseTest, testParseErrors)
112
95
  TEST_F(HtparseTest, testParseExtended)
113
96
  {
114
97
  lcb_settings *settings = lcb_settings_new();
115
- lcbht_pPARSER parser = lcbht_new(settings);
116
- lcbht_RESPONSE *resp;
98
+ Parser *parser = new Parser(settings);
117
99
 
118
100
  const char *body;
119
101
  unsigned nbody, nused;
@@ -122,18 +104,18 @@ TEST_F(HtparseTest, testParseExtended)
122
104
  "Connection: keep-alive\r\n"
123
105
  "Content-Length: 5\r\n";
124
106
 
125
- lcbht_RESPSTATE state;
126
- state = lcbht_parse_ex(parser, buf.c_str(), buf.size(), &nused, &nbody, &body);
127
- ASSERT_EQ(0, state & LCBHT_S_ERROR);
107
+ unsigned state;
108
+ state = parser->parse_ex(buf.c_str(), buf.size(), &nused, &nbody, &body);
109
+ ASSERT_EQ(0, state & Parser::S_ERROR);
128
110
  ASSERT_EQ(NULL, body);
129
111
  ASSERT_EQ(buf.size(), nused);
130
112
  ASSERT_EQ(0, nbody);
131
113
 
132
- resp = lcbht_get_response(parser);
114
+ Response& resp = parser->get_cur_response();
133
115
  buf = "\r\nHello";
134
116
  // Feed the buffer
135
- state = lcbht_parse_ex(parser, buf.c_str(), buf.size(), &nused, &nbody, &body);
136
- ASSERT_EQ(0, state & LCBHT_S_DONE);
117
+ state = parser->parse_ex(buf.c_str(), buf.size(), &nused, &nbody, &body);
118
+ ASSERT_EQ(0, state & Parser::S_DONE);
137
119
  ASSERT_EQ(5, nbody);
138
120
  ASSERT_FALSE(NULL == body);
139
121
  ASSERT_STREQ("Hello", body);
@@ -142,52 +124,50 @@ TEST_F(HtparseTest, testParseExtended)
142
124
  size_t off = nused;
143
125
 
144
126
  // Parse again
145
- state = lcbht_parse_ex(parser, buf.c_str()+off, buf.size()-off, &nused, &nbody, &body);
127
+ state = parser->parse_ex(buf.c_str()+off, buf.size()-off, &nused, &nbody, &body);
146
128
  ASSERT_EQ(nused, buf.size()-off);
147
129
  ASSERT_TRUE(body == NULL);
148
130
  ASSERT_EQ(0, nbody);
149
- ASSERT_NE(0, state & LCBHT_S_DONE);
150
- ASSERT_EQ(0, state & LCBHT_S_ERROR);
151
- ASSERT_EQ(0, resp->body.nused);
152
-
153
- lcbht_free(parser);
131
+ ASSERT_NE(0, state & Parser::S_DONE);
132
+ ASSERT_EQ(0, state & Parser::S_ERROR);
133
+ ASSERT_EQ(0, resp.body.size());
134
+ delete parser;
154
135
  lcb_settings_unref(settings);
155
136
  }
156
137
 
157
138
  TEST_F(HtparseTest, testCanKeepalive)
158
139
  {
159
140
  lcb_settings *settings = lcb_settings_new();
160
- lcbht_pPARSER parser = lcbht_new(settings);
141
+ Parser *parser = new Parser(settings);
161
142
  string buf = "HTTP/1.0 200 OK\r\n"
162
143
  "Content-Length: 0\r\n"
163
144
  "\r\n";
164
- lcbht_RESPSTATE state;
165
- state = lcbht_parse(parser, buf.c_str(), buf.size());
166
- ASSERT_NE(0, state & LCBHT_S_DONE);
167
- ASSERT_EQ(0, state & LCBHT_S_ERROR);
168
- ASSERT_EQ(0, lcbht_can_keepalive(parser));
145
+ unsigned state = parser->parse(buf.c_str(), buf.size());
146
+ ASSERT_NE(0, state & Parser::S_DONE);
147
+ ASSERT_EQ(0, state & Parser::S_ERROR);
148
+ ASSERT_FALSE(parser->can_keepalive());
169
149
 
170
150
  // Use HTTP/1.1 with Connection: close
171
- lcbht_reset(parser);
151
+ parser->reset();
172
152
  buf = "HTTP/1.1 200 OK\r\n"
173
153
  "Content-Length: 0\r\n"
174
154
  "Connection: close\r\n"
175
155
  "\r\n";
176
- state = lcbht_parse(parser, buf.c_str(), buf.size());
177
- ASSERT_NE(0, state & LCBHT_S_DONE);
178
- ASSERT_EQ(0, state & LCBHT_S_ERROR);
179
- ASSERT_EQ(0, lcbht_can_keepalive(parser));
156
+ state = parser->parse(buf.c_str(), buf.size());
157
+ ASSERT_NE(0, state & Parser::S_DONE);
158
+ ASSERT_EQ(0, state & Parser::S_ERROR);
159
+ ASSERT_FALSE(parser->can_keepalive());
180
160
 
181
- lcbht_reset(parser);
161
+ parser->reset();
182
162
  // Default HTTP/1.1
183
163
  buf = "HTTP/1.1 200 OK\r\n"
184
164
  "Content-Length: 0\r\n"
185
165
  "\r\n";
186
- state = lcbht_parse(parser, buf.c_str(), buf.size());
187
- ASSERT_NE(0, state & LCBHT_S_DONE);
188
- ASSERT_EQ(0, state & LCBHT_S_ERROR);
189
- ASSERT_NE(0, lcbht_can_keepalive(parser));
166
+ state = parser->parse(buf.c_str(), buf.size());
167
+ ASSERT_NE(0, state & Parser::S_DONE);
168
+ ASSERT_EQ(0, state & Parser::S_ERROR);
169
+ ASSERT_TRUE(parser->can_keepalive());
190
170
 
191
- lcbht_free(parser);
171
+ delete parser;
192
172
  lcb_settings_unref(settings);
193
173
  }