libcouchbase 0.0.7 → 0.0.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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
  }