From 53c6c772d7bc6695e4b261c373171349f370b532 Mon Sep 17 00:00:00 2001 From: Xiaobing Zhou Date: Wed, 19 Jul 2017 14:19:53 -0700 Subject: [PATCH] HBASE-18407. [C++] make Configuration::Set/GetBool work for both true/false and 1/0 --- hbase-native-client/core/configuration-test.cc | 58 +++++++++++++++++++++++++- hbase-native-client/core/configuration.cc | 10 +++-- 2 files changed, 64 insertions(+), 4 deletions(-) diff --git a/hbase-native-client/core/configuration-test.cc b/hbase-native-client/core/configuration-test.cc index 192ed46e80..abdf0c7708 100644 --- a/hbase-native-client/core/configuration-test.cc +++ b/hbase-native-client/core/configuration-test.cc @@ -22,6 +22,62 @@ using hbase::Configuration; +TEST(Configuration, SetGetBool) { + Configuration conf; + + /* test true/false */ + conf.SetBool("bool_key1", true); + EXPECT_EQ(true, conf.GetBool("bool_key1", false)); + conf.SetBool("bool_key2", false); + EXPECT_EQ(false, conf.GetBool("bool_key2", true)); + + /* test 1/0 */ + conf.SetBool("bool_key3", 1); + EXPECT_EQ(true, conf.GetBool("bool_key3", false)); + conf.SetBool("bool_key4", 0); + EXPECT_EQ(false, conf.GetBool("bool_key4", true)); + + /* test non zero integer */ + conf.SetBool("bool_key5", 5); + EXPECT_EQ(true, conf.GetBool("bool_key5", false)); + conf.SetBool("bool_key6", -1); + EXPECT_EQ(true, conf.GetBool("bool_key5", false)); + + /* test non zero float */ + conf.SetBool("bool_key7", 5.1); + EXPECT_EQ(true, conf.GetBool("bool_key7", false)); + conf.SetBool("bool_key8", -1.2); + EXPECT_EQ(true, conf.GetBool("bool_key8", false)); +} + +TEST(Configuration, SetGetForBool) { + Configuration conf; + + /* test true/false */ + conf.Set("bool_key1", "true"); + EXPECT_EQ(true, conf.GetBool("bool_key1", false)); + conf.Set("bool_key2", "false"); + EXPECT_EQ(false, conf.GetBool("bool_key2", true)); + + /* test 1/0 */ + conf.Set("bool_key3", "1"); + EXPECT_EQ(true, conf.GetBool("bool_key3", false)); + conf.Set("bool_key4", "0"); + EXPECT_EQ(false, conf.GetBool("bool_key4", true)); + + /* test non zero integer */ + conf.Set("bool_key5", "5"); + EXPECT_THROW(conf.GetBool("bool_key5", false), std::runtime_error); + conf.Set("bool_key6", "-1"); + EXPECT_THROW(conf.GetBool("bool_key6", false), std::runtime_error); + + /* test non zero float */ + conf.Set("bool_key7", "5.1"); + EXPECT_THROW(conf.GetBool("bool_key7", false), std::runtime_error); + conf.Set("bool_key8", "-1.2"); + EXPECT_THROW(conf.GetBool("bool_key8", false), std::runtime_error); +} + TEST(Configuration, SetGet) { Configuration conf; @@ -54,7 +110,7 @@ TEST(Configuration, SetGetDouble) { EXPECT_EQ(conf.GetDouble("foo", 0), 42.0); } -TEST(Configuration, SetGetBool) { +TEST(Configuration, SetGetBoolBasic) { Configuration conf; EXPECT_EQ(conf.GetBool("foo", false), false); diff --git a/hbase-native-client/core/configuration.cc b/hbase-native-client/core/configuration.cc index afca122391..f4fc46d3ac 100644 --- a/hbase-native-client/core/configuration.cc +++ b/hbase-native-client/core/configuration.cc @@ -25,6 +25,7 @@ #include #include +#include namespace hbase { @@ -202,12 +203,15 @@ double Configuration::GetDouble(const std::string &key, double default_value) co optional Configuration::GetBool(const std::string &key) const { optional raw = Get(key); if (raw) { - if (!strcasecmp((*raw).c_str(), "true")) { + if (!strcasecmp((*raw).c_str(), "true") || !strcasecmp((*raw).c_str(), "1")) { return std::experimental::make_optional(true); - } else if (!strcasecmp((*raw).c_str(), "false")) { + } else if (!strcasecmp((*raw).c_str(), "false") || !strcasecmp((*raw).c_str(), "0")) { return std::experimental::make_optional(false); } else { - throw std::runtime_error("Unexpected value found while conversion to bool."); + boost::format what("Unexpected value \"%s\" found being converted to bool for key \"%s\""); + what % (*raw); + what % key; + throw std::runtime_error(what.str()); } } return optional(); -- 2.11.0 (Apple Git-81)