Skip to content

Commit 1c43cc7

Browse files
authored
local_date parse bug is fixed. Tests are added. (#1127)
* local_date parse bug is fixed. Tests are added for date_time related stuffs.
1 parent cb31e66 commit 1c43cc7

File tree

3 files changed

+187
-3
lines changed

3 files changed

+187
-3
lines changed

hazelcast/include/hazelcast/client/protocol/ClientMessage.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -469,7 +469,7 @@ class HAZELCAST_API ClientMessage
469469
typename std::enable_if<std::is_same<T, local_date>::value,
470470
T>::type inline get()
471471
{
472-
auto year = static_cast<uint8_t>(get<int32_t>());
472+
auto year = get<int32_t>();
473473
auto month = static_cast<uint8_t>(get<int8_t>());
474474
auto day_of_month = static_cast<uint8_t>(get<int8_t>());
475475
return { year, month, day_of_month };

hazelcast/test/src/ClientTest.h

Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717

1818
#include <utility>
1919
#include <iterator>
20+
#include <functional>
2021
#include <boost/uuid/uuid.hpp>
2122

2223
#include <gtest/gtest.h>
@@ -25,6 +26,8 @@
2526
#include <hazelcast/client/imap.h>
2627
#include <hazelcast/logger.h>
2728

29+
#include "remote_controller_client.h"
30+
2831
namespace hazelcast {
2932
namespace client {
3033

@@ -88,6 +91,50 @@ class ClientTest : public ::testing::Test
8891
return entries;
8992
}
9093

94+
template<typename Value = int,
95+
typename Key = int,
96+
typename ValueGenerator = generator<Value>,
97+
typename KeyGenerator = key_int_generator>
98+
std::unordered_map<Key, Value> populate_map_via_rc(
99+
std::function<std::string(const Value&)> fn,
100+
const std::string& map_name,
101+
const std::string& cluster_id,
102+
int n_entries = 10,
103+
ValueGenerator&& value_gen = ValueGenerator{},
104+
KeyGenerator&& key_gen = KeyGenerator{})
105+
{
106+
std::unordered_map<Key, Value> entries;
107+
entries.reserve(n_entries);
108+
109+
generate_n(
110+
inserter(entries, end(entries)), n_entries, [&value_gen, &key_gen]() {
111+
return std::make_pair(key_gen(), value_gen());
112+
});
113+
114+
for (std::pair<Key, Value> p : entries) {
115+
remote::Response response;
116+
117+
remote_controller_client().executeOnController(
118+
response,
119+
cluster_id,
120+
(boost::format(
121+
R"(
122+
var map = instance_0.getMap("%1%");
123+
map.set(new java.lang.Integer(%2%), %3%);
124+
125+
result = "" + true;
126+
)") %
127+
map_name % std::to_string(p.first) % fn(p.second))
128+
.str(),
129+
remote::Lang::JAVASCRIPT);
130+
131+
if (response.result != "true")
132+
throw std::logic_error{ response.message };
133+
}
134+
135+
return entries;
136+
}
137+
91138
private:
92139
std::shared_ptr<logger> logger_;
93140
};
@@ -128,6 +175,57 @@ struct generator<hazelcast_json_value>
128175
}
129176
};
130177

178+
template<>
179+
struct generator<local_date>
180+
{
181+
local_date operator()()
182+
{
183+
generator<int> int_gen;
184+
185+
return local_date{ 2000 + int_gen() % 50,
186+
uint8_t(int_gen() % 11 + 1),
187+
uint8_t(int_gen() % 27 + 1) };
188+
}
189+
};
190+
191+
template<>
192+
struct generator<local_time>
193+
{
194+
local_time operator()()
195+
{
196+
generator<int> int_gen;
197+
198+
return local_time{ uint8_t(int_gen() % 24),
199+
uint8_t(int_gen() % 60),
200+
uint8_t(int_gen() % 60),
201+
int_gen() % 123456 };
202+
}
203+
};
204+
205+
template<>
206+
struct generator<local_date_time>
207+
{
208+
local_date_time operator()()
209+
{
210+
generator<local_date> date_gen;
211+
generator<local_time> time_gen;
212+
213+
return local_date_time{ date_gen(), time_gen() };
214+
}
215+
};
216+
217+
template<>
218+
struct generator<offset_date_time>
219+
{
220+
offset_date_time operator()()
221+
{
222+
generator<int> int_gen;
223+
generator<local_date_time> date_time_gen;
224+
225+
return offset_date_time{ date_time_gen(), int_gen() % 12 * 3600 };
226+
}
227+
};
228+
131229
} // namespace test
132230
} // namespace client
133231
} // namespace hazelcast

hazelcast/test/src/sql_test.cpp

Lines changed: 88 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -579,8 +579,6 @@ class SqlTest : public ClientTest
579579
}
580580
static std::unique_ptr<HazelcastServer> member_;
581581
static std::unique_ptr<HazelcastServer> member2_;
582-
583-
private:
584582
static std::unique_ptr<HazelcastServerFactory> server_factory_;
585583
};
586584

@@ -1358,6 +1356,94 @@ TEST_F(SqlTest, test_streaming_sql_query)
13581356
for_each_row_until(200, result);
13591357
}
13601358

1359+
TEST_F(SqlTest, test_date)
1360+
{
1361+
create_mapping("DATE");
1362+
1363+
auto expecteds = populate_map_via_rc<local_date>(
1364+
[](const local_date& date) {
1365+
return boost::str(
1366+
boost::format("java.time.LocalDate.of(%1%, %2%, %3%)") %
1367+
int(date.year) % int(date.month) % int(date.day_of_month));
1368+
},
1369+
map_name,
1370+
server_factory_->get_cluster_id());
1371+
1372+
auto result = select_all();
1373+
1374+
for_each_row(result,
1375+
assert_row_count(expecteds.size()),
1376+
assert_entries_equal<local_date>{ expecteds });
1377+
}
1378+
1379+
TEST_F(SqlTest, test_time)
1380+
{
1381+
create_mapping("TIME");
1382+
1383+
auto expecteds = populate_map_via_rc<local_time>(
1384+
[](const local_time& time) {
1385+
return boost::str(
1386+
boost::format("java.time.LocalTime.of(%1%, %2%, %3%, %4%)") %
1387+
int(time.hours) % int(time.minutes) % int(time.seconds) %
1388+
int(time.nanos));
1389+
},
1390+
map_name,
1391+
server_factory_->get_cluster_id());
1392+
1393+
auto result = select_all();
1394+
1395+
for_each_row(result,
1396+
assert_row_count(expecteds.size()),
1397+
assert_entries_equal<local_time>{ expecteds });
1398+
}
1399+
1400+
TEST_F(SqlTest, test_timestamp)
1401+
{
1402+
create_mapping("TIMESTAMP");
1403+
1404+
auto expecteds = populate_map_via_rc<local_date_time>(
1405+
[](const local_date_time& dt) {
1406+
return boost::str(
1407+
boost::format(
1408+
"java.time.LocalDateTime.of(%1%, %2%, %3%, %4%, %5%, %6%, %7%)") %
1409+
dt.date.year % int(dt.date.month) % int(dt.date.day_of_month) %
1410+
int(dt.time.hours) % int(dt.time.minutes) % int(dt.time.seconds) %
1411+
int(dt.time.nanos));
1412+
},
1413+
map_name,
1414+
server_factory_->get_cluster_id());
1415+
1416+
auto result = select_all();
1417+
1418+
for_each_row(result,
1419+
assert_row_count(expecteds.size()),
1420+
assert_entries_equal<local_date_time>{ expecteds });
1421+
}
1422+
1423+
TEST_F(SqlTest, test_timestamp_with_timezone)
1424+
{
1425+
create_mapping("TIMESTAMP WITH TIME ZONE");
1426+
1427+
auto expecteds = populate_map_via_rc<offset_date_time>(
1428+
[](const offset_date_time& dt) {
1429+
return boost::str(
1430+
boost::format("java.time.OffsetDateTime.of(%1%, %2%, %3%, %4%, "
1431+
"%5%, %6%, %7%, java.time.ZoneOffset.ofHours(%8%))") %
1432+
dt.date_time.date.year % int(dt.date_time.date.month) %
1433+
int(dt.date_time.date.day_of_month) % int(dt.date_time.time.hours) %
1434+
int(dt.date_time.time.minutes) % int(dt.date_time.time.seconds) %
1435+
int(dt.date_time.time.nanos) % (dt.zone_offset_in_seconds / 3600));
1436+
},
1437+
map_name,
1438+
server_factory_->get_cluster_id());
1439+
1440+
auto result = select_all();
1441+
1442+
for_each_row(result,
1443+
assert_row_count(expecteds.size()),
1444+
assert_entries_equal<offset_date_time>{ expecteds });
1445+
}
1446+
13611447
TEST_F(SqlTest, exception)
13621448
{
13631449
sql::sql_service service = client.get_sql();

0 commit comments

Comments
 (0)