[tests][common][webapi-plugins.spec] Changed common unit tests files structure. 42/211142/5
authorMichal Michalski <m.michalski2@partner.samsung.com>
Tue, 30 Jul 2019 09:30:12 +0000 (11:30 +0200)
committerMichal Michalski <m.michalski2@partner.samsung.com>
Thu, 1 Aug 2019 06:04:54 +0000 (08:04 +0200)
New structure allows better modularization of unit tests.

[Verification] webapi_common_tests are built successfully and pass.

Signed-off-by: Michal Michalski <m.michalski2@partner.samsung.com>
Change-Id: Icad5cca7739716bde7c09092f4d1d73fca1972a0

packaging/webapi-plugins.spec
src/common/common_ut.gyp
src/common/ut/bundle_ut.cc [deleted file]
src/common/ut/json-utils.cc [new file with mode: 0644]
src/common/ut/json-utils.h [new file with mode: 0644]
src/common/ut/main.cc [new file with mode: 0644]

index 6733b912a2b61f2964824d005af8ea003c4e5a6b..8af04596151cb9eb094031c772437c029699c7ea 100644 (file)
@@ -1201,7 +1201,7 @@ mkdir -p %{buildroot}%{crosswalk_extensions_path}/mobile
 # tizen ut mobile
 %if "%{?tizen_ut_build}"  == "1"
 mkdir -p %{buildroot}/usr/bin
-install -p -m 755 out/bin_mobile/bundle_ut %{buildroot}/usr/bin/
+install -p -m 755 out/bin_mobile/webapi_common_tests %{buildroot}/usr/bin/
 %endif
 
 install -p -m 644 out/bin_mobile/libtizen*.so %{buildroot}%{crosswalk_extensions_path}/mobile
@@ -1339,7 +1339,7 @@ fi
 # UT files
 %if "%{?tizen_ut_build}" == "1"
 %license GTEST.BSD-3-Clause
-/usr/bin/bundle_ut
+/usr/bin/webapi_common_tests
 %endif
 
 # mobile-extension-emulator
index 1ceb42f5fb27be49598470d2e4443afe0984d265..61db8ad3b1843c6624715906d35dfb6544c59458 100644 (file)
@@ -4,7 +4,7 @@
   ],
   'targets': [
     {
-      'target_name': 'bundle_ut',
+      'target_name': 'webapi_common_tests',
       'type': 'executable',
       'dependencies': [
         'common.gyp:tizen_common'
@@ -19,7 +19,8 @@
         '../googletest/src/gtest-all.cc',
         '../googlemock/src/gmock-all.cc',
         'ut/common_ut_extension.cc',
-        'ut/bundle_ut.cc'
+        'ut/json-utils.cc',
+        'ut/main.cc'
       ],
       'libraries': [
         '-lbundle',
diff --git a/src/common/ut/bundle_ut.cc b/src/common/ut/bundle_ut.cc
deleted file mode 100644 (file)
index 0155d4d..0000000
+++ /dev/null
@@ -1,402 +0,0 @@
-/*
- * Copyright (c) 2019 Samsung Electronics Co., Ltd All Rights Reserved
- *
- *    Licensed under the Apache License, Version 2.0 (the "License");
- *    you may not use this file except in compliance with the License.
- *    You may obtain a copy of the License at
- *
- *        http://www.apache.org/licenses/LICENSE-2.0
- *
- *    Unless required by applicable law or agreed to in writing, software
- *    distributed under the License is distributed on an "AS IS" BASIS,
- *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *    See the License for the specific language governing permissions and
- *    limitations under the License.
- */
-#include "tizen.h"
-
-#include "gmock/gmock.h"
-#include "gtest/gtest.h"
-
-#include "bundle.h"
-#include "bundle_internal.h"
-#include "common/json-utils.h"
-
-#include <iostream>
-#include <string>
-#include <vector>
-
-using namespace std;
-using testing::_;
-using testing::StrEq;
-
-namespace {
-
-template <typename T, typename V>
-picojson::value vec2json(vector<V> vec) {
-  picojson::array array;
-  for (auto v : vec) {
-    array.push_back(picojson::value(static_cast<T>(v)));
-  }
-  return picojson::value(array);
-}
-
-}  // namespace
-
-MATCHER_P(KeyValStrEq, expected, "match keyval_t string value") {
-  auto* kv = const_cast<bundle_keyval_t*>(static_cast<const bundle_keyval_t*>(arg));
-
-  if (BUNDLE_TYPE_STR != bundle_keyval_get_type(kv)) {
-    return false;
-  }
-
-  void* untyped = nullptr;
-  size_t size = 0;
-
-  int ret = bundle_keyval_get_basic_val(kv, &untyped, &size);
-  if (BUNDLE_ERROR_NONE != ret) {
-    return false;
-  }
-
-  string value = static_cast<char*>(untyped);
-  return value == expected;
-}
-
-MATCHER_P(KeyValStrArrEq, expected, "match keyval_t string array value") {
-  auto* kv = const_cast<bundle_keyval_t*>(static_cast<const bundle_keyval_t*>(arg));
-
-  if (BUNDLE_TYPE_STR_ARRAY != bundle_keyval_get_type(kv)) {
-    return false;
-  }
-
-  void** untyped = nullptr;
-  size_t array_size = 0;
-  size_t* elem_size = nullptr;
-
-  int ret = bundle_keyval_get_array_val(kv, &untyped, &array_size, &elem_size);
-  if (BUNDLE_ERROR_NONE != ret) {
-    return false;
-  }
-
-  if (array_size != expected.size()) {
-    return false;
-  }
-
-  char** value = reinterpret_cast<char**>(untyped);
-  for (size_t i = 0; i < array_size; ++i) {
-    if (string(value[i]) != expected[i]) {
-      return false;
-    }
-  }
-
-  return true;
-}
-
-MATCHER_P(KeyValBytesEq, expected, "match keyval_t bytes value") {
-  auto* kv = const_cast<bundle_keyval_t*>(static_cast<const bundle_keyval_t*>(arg));
-
-  if (BUNDLE_TYPE_BYTE != bundle_keyval_get_type(kv)) {
-    return false;
-  }
-
-  void* untyped = nullptr;
-  size_t size = 0;
-
-  int ret = bundle_keyval_get_basic_val(kv, &untyped, &size);
-  if (BUNDLE_ERROR_NONE != ret) {
-    return false;
-  }
-
-  if (size != expected.size()) {
-    return false;
-  }
-
-  auto bytes = static_cast<unsigned char*>(untyped);
-  for (unsigned int i = 0; i < size; ++i) {
-    if (bytes[i] != expected[i]) {
-      return false;
-    }
-  }
-
-  return true;
-}
-
-MATCHER_P(KeyValBytesArrEq, expected, "match keyval_t bytes array value") {
-  auto* kv = const_cast<bundle_keyval_t*>(static_cast<const bundle_keyval_t*>(arg));
-
-  if (BUNDLE_TYPE_BYTE_ARRAY != bundle_keyval_get_type(kv)) {
-    return false;
-  }
-
-  void** untyped = nullptr;
-  size_t array_size = 0;
-  size_t* elem_size = nullptr;
-
-  int ret = bundle_keyval_get_array_val(kv, &untyped, &array_size, &elem_size);
-  if (BUNDLE_ERROR_NONE != ret) {
-    return false;
-  }
-
-  if (array_size != expected.size()) {
-    return false;
-  }
-
-  unsigned char** value = reinterpret_cast<unsigned char**>(untyped);
-  for (size_t i = 0; i < array_size; ++i) {
-    for (size_t j = 0; j < elem_size[i]; ++j) {
-      if (expected[i][j] != value[i][j]) {
-        return false;
-      }
-    }
-  }
-
-  return true;
-}
-
-class JsonToBundleTest : public testing::Test {
- public:
-  virtual void SetUp() {
-    bundleData = nullptr;
-  }
-
-  virtual void TearDown() {
-    if (bundleData) {
-      bundle_free(bundleData);
-    }
-  }
-
-  // Replacing bundle_keyval_t with void and cast it in matcher is required because
-  // bundle_keyval_t has only public declaration, not implementation.
-  // This causes incomplete type error which I couldn't resolve in any other way.
-  using BundleIterator = void(const char*, const int, const void*, void*);
-  using BundleIteratorMock = testing::MockFunction<BundleIterator>;
-
-  void CheckBundle(bundle* b, BundleIteratorMock& mock) {
-    bundle_foreach(b,
-                   [](const char* key, const int type, const bundle_keyval_t* kv, void* ud) {
-                     auto* mock = static_cast<testing::MockFunction<BundleIterator>*>(ud);
-                     mock->Call(key, type, kv, nullptr);
-                   },
-                   &mock);
-  }
-
-  bundle* bundleData;
-  BundleIteratorMock bundleIteratorMock;
-};
-
-TEST_F(JsonToBundleTest, BytesArrayConversion) {
-  vector<vector<unsigned char>> value = {{0, 1, 2}, {100, 101, 102}, {200, 201, 202}};
-
-  auto json_val = picojson::value(picojson::object());
-  auto& json = json_val.get<picojson::object>();
-
-  picojson::array array;
-  array.push_back(vec2json<double>(value[0]));
-  array.push_back(vec2json<double>(value[1]));
-  array.push_back(vec2json<double>(value[2]));
-
-  json["key"] = picojson::value(array);
-
-  auto result = common::JsonToBundle(json_val, &bundleData);
-  ASSERT_TRUE(result);
-
-  EXPECT_CALL(bundleIteratorMock,
-              Call(StrEq("key"), BUNDLE_TYPE_BYTE_ARRAY, KeyValBytesArrEq(value), nullptr));
-
-  CheckBundle(bundleData, bundleIteratorMock);
-}
-
-TEST_F(JsonToBundleTest, BytesConversion) {
-  vector<unsigned char> value = {0, 126, 255};
-
-  auto json_val = picojson::value(picojson::object());
-  auto& json = json_val.get<picojson::object>();
-
-  json["key"] = vec2json<double>(value);
-
-  auto result = common::JsonToBundle(json_val, &bundleData);
-  ASSERT_TRUE(result);
-
-  EXPECT_CALL(bundleIteratorMock,
-              Call(StrEq("key"), BUNDLE_TYPE_BYTE, KeyValBytesEq(value), nullptr));
-
-  CheckBundle(bundleData, bundleIteratorMock);
-}
-
-TEST_F(JsonToBundleTest, BytesConversionInvalidByteValue) {
-  auto json_val = picojson::value(picojson::object());
-  auto& json = json_val.get<picojson::object>();
-  json["key"] = vec2json<double>(vector<double>({1.0, 256.0, 2.0}));
-
-  auto result = common::JsonToBundle(json_val, &bundleData);
-  ASSERT_FALSE(result);
-
-  json["key"] = vec2json<double>(vector<double>({1.0, -1.0, 2.0}));
-  result = common::JsonToBundle(json_val, &bundleData);
-  ASSERT_FALSE(result);
-}
-
-TEST_F(JsonToBundleTest, StringConversion) {
-  string value = "tizen";
-
-  auto json_val = picojson::value(picojson::object());
-  auto& json = json_val.get<picojson::object>();
-
-  json["key"] = picojson::value(value);
-
-  auto result = common::JsonToBundle(json_val, &bundleData);
-  ASSERT_TRUE(result);
-
-  EXPECT_CALL(bundleIteratorMock, Call(StrEq("key"), BUNDLE_TYPE_STR, KeyValStrEq(value), nullptr));
-
-  CheckBundle(bundleData, bundleIteratorMock);
-}
-
-TEST_F(JsonToBundleTest, StringArrayConversion) {
-  vector<string> value = {"str1", "str2", "str3"};
-
-  auto json_val = picojson::value(picojson::object());
-  auto& json = json_val.get<picojson::object>();
-
-  json["key"] = picojson::value(picojson::array(
-      {picojson::value(value[0]), picojson::value(value[1]), picojson::value(value[2])}));
-
-  auto result = common::JsonToBundle(json_val, &bundleData);
-  ASSERT_TRUE(result);
-
-  EXPECT_CALL(bundleIteratorMock,
-              Call(StrEq("key"), BUNDLE_TYPE_STR_ARRAY, KeyValStrArrEq(value), nullptr));
-
-  CheckBundle(bundleData, bundleIteratorMock);
-}
-
-TEST_F(JsonToBundleTest, UnsupportedType) {
-  auto json_val = picojson::value(picojson::object());
-  auto& json = json_val.get<picojson::object>();
-
-  json["key"] = picojson::value(true);
-  auto result = common::JsonToBundle(json_val, &bundleData);
-  ASSERT_FALSE(result);
-
-  json["key"] = picojson::value(picojson::object());
-  result = common::JsonToBundle(json_val, &bundleData);
-  ASSERT_FALSE(result);
-}
-
-TEST_F(JsonToBundleTest, NullConversion) {
-  picojson::value json_val;
-  auto result = common::JsonToBundle(json_val, &bundleData);
-  ASSERT_TRUE(result);
-  ASSERT_EQ(nullptr, bundleData);
-}
-
-class BundleToJsonTest : public testing::Test {
- public:
-  virtual void SetUp() {
-    bundleData = bundle_create();
-  }
-
-  virtual void TearDown() {
-    if (bundleData) {
-      bundle_free(bundleData);
-    }
-  }
-
-  bundle* bundleData;
-};
-
-TEST_F(BundleToJsonTest, NullConversion) {
-  bundle* data = nullptr;
-  picojson::value json;
-  auto result = common::BundleToJson(data, &json);
-  ASSERT_TRUE(result);
-  ASSERT_TRUE(json.is<picojson::null>());
-}
-
-TEST_F(BundleToJsonTest, StringConversion) {
-  string key = "key", value = "tizen";
-  ASSERT_EQ(bundle_add_str(bundleData, key.c_str(), value.c_str()), BUNDLE_ERROR_NONE);
-
-  picojson::value json;
-  auto result = common::BundleToJson(bundleData, &json);
-
-  ASSERT_TRUE(result);
-  ASSERT_TRUE(json.is<picojson::object>());
-  ASSERT_EQ(json.get<picojson::object>()[key].get<string>(), value);
-}
-
-TEST_F(BundleToJsonTest, StringArrayConversion) {
-  string key = "key";
-  vector<const char*> value = {"value1", "value2"};
-
-  ASSERT_EQ(bundle_add_str_array(bundleData, key.c_str(), value.data(), value.size()),
-            BUNDLE_ERROR_NONE);
-
-  picojson::value json;
-  auto result = common::BundleToJson(bundleData, &json);
-  ASSERT_TRUE(result);
-  ASSERT_TRUE(json.is<picojson::object>());
-
-  const auto& array = json.get<picojson::object>()[key].get<picojson::array>();
-  ASSERT_EQ(array.size(), value.size());
-  EXPECT_EQ(array[0].get<std::string>(), std::string(value[0]));
-  EXPECT_EQ(array[1].get<std::string>(), std::string(value[1]));
-}
-
-TEST_F(BundleToJsonTest, BytesConversion) {
-  string key = "key";
-  vector<unsigned char> bytes = {0, 126, 255};
-
-  ASSERT_EQ(bundle_add_byte(bundleData, key.c_str(), bytes.data(), bytes.size()),
-            BUNDLE_ERROR_NONE);
-
-  picojson::value json;
-  auto result = common::BundleToJson(bundleData, &json);
-  ASSERT_TRUE(result);
-  ASSERT_TRUE(json.is<picojson::object>());
-
-  const auto& array = json.get<picojson::object>()[key].get<picojson::array>();
-  ASSERT_EQ(array.size(), bytes.size());
-  EXPECT_EQ(array[0].get<double>(), bytes[0]);
-  EXPECT_EQ(array[1].get<double>(), bytes[1]);
-  EXPECT_EQ(array[2].get<double>(), bytes[2]);
-}
-
-TEST_F(BundleToJsonTest, BytesArrayConversion) {
-  string key = "key";
-  vector<vector<unsigned char>> value = {{0, 126, 255}, {1, 127, 254}};
-
-  ASSERT_EQ(bundle_add_byte_array(bundleData, key.c_str(), nullptr, value.size()),
-            BUNDLE_ERROR_NONE);
-  ASSERT_EQ(
-      bundle_set_byte_array_element(bundleData, key.c_str(), 0, value[0].data(), value[0].size()),
-      BUNDLE_ERROR_NONE);
-  ASSERT_EQ(
-      bundle_set_byte_array_element(bundleData, key.c_str(), 1, value[1].data(), value[1].size()),
-      BUNDLE_ERROR_NONE);
-
-  picojson::value json;
-  auto result = common::BundleToJson(bundleData, &json);
-  ASSERT_TRUE(result);
-  ASSERT_TRUE(json.is<picojson::object>());
-
-  auto& array = json.get<picojson::object>()[key].get<picojson::array>();
-  ASSERT_EQ(array.size(), value.size());
-
-  auto& bytes = array[0].get<picojson::array>();
-  ASSERT_EQ(bytes.size(), value[0].size());
-  EXPECT_EQ(bytes[0].get<double>(), value[0][0]);
-  EXPECT_EQ(bytes[1].get<double>(), value[0][1]);
-  EXPECT_EQ(bytes[2].get<double>(), value[0][2]);
-
-  bytes = array[1].get<picojson::array>();
-  ASSERT_EQ(bytes.size(), value[1].size());
-  EXPECT_EQ(bytes[0].get<double>(), value[1][0]);
-  EXPECT_EQ(bytes[1].get<double>(), value[1][1]);
-  EXPECT_EQ(bytes[2].get<double>(), value[1][2]);
-}
-
-int main(int argc, char* argv[]) {
-  ::testing::InitGoogleTest(&argc, argv);
-  return RUN_ALL_TESTS();
-}
diff --git a/src/common/ut/json-utils.cc b/src/common/ut/json-utils.cc
new file mode 100644 (file)
index 0000000..935b776
--- /dev/null
@@ -0,0 +1,398 @@
+/*
+ * Copyright (c) 2019 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ *    Licensed under the Apache License, Version 2.0 (the "License");
+ *    you may not use this file except in compliance with the License.
+ *    You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *    Unless required by applicable law or agreed to in writing, software
+ *    distributed under the License is distributed on an "AS IS" BASIS,
+ *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *    See the License for the specific language governing permissions and
+ *    limitations under the License.
+ */
+#include "gmock/gmock.h"
+#include "gtest/gtest.h"
+
+#include "common/ut/json-utils.h"
+
+#include "bundle.h"
+#include "bundle_internal.h"
+#include "common/json-utils.h"
+
+#include <iostream>
+#include <string>
+#include <vector>
+
+using namespace std;
+using testing::_;
+using testing::StrEq;
+
+namespace {
+
+template <typename T, typename V>
+picojson::value vec2json(vector<V> vec) {
+  picojson::array array;
+  for (auto v : vec) {
+    array.push_back(picojson::value(static_cast<T>(v)));
+  }
+  return picojson::value(array);
+}
+
+}  // namespace
+
+MATCHER_P(KeyValStrEq, expected, "match keyval_t string value") {
+  auto* kv = const_cast<bundle_keyval_t*>(static_cast<const bundle_keyval_t*>(arg));
+
+  if (BUNDLE_TYPE_STR != bundle_keyval_get_type(kv)) {
+    return false;
+  }
+
+  void* untyped = nullptr;
+  size_t size = 0;
+
+  int ret = bundle_keyval_get_basic_val(kv, &untyped, &size);
+  if (BUNDLE_ERROR_NONE != ret) {
+    return false;
+  }
+
+  string value = static_cast<char*>(untyped);
+  return value == expected;
+}
+
+MATCHER_P(KeyValStrArrEq, expected, "match keyval_t string array value") {
+  auto* kv = const_cast<bundle_keyval_t*>(static_cast<const bundle_keyval_t*>(arg));
+
+  if (BUNDLE_TYPE_STR_ARRAY != bundle_keyval_get_type(kv)) {
+    return false;
+  }
+
+  void** untyped = nullptr;
+  size_t array_size = 0;
+  size_t* elem_size = nullptr;
+
+  int ret = bundle_keyval_get_array_val(kv, &untyped, &array_size, &elem_size);
+  if (BUNDLE_ERROR_NONE != ret) {
+    return false;
+  }
+
+  if (array_size != expected.size()) {
+    return false;
+  }
+
+  char** value = reinterpret_cast<char**>(untyped);
+  for (size_t i = 0; i < array_size; ++i) {
+    if (string(value[i]) != expected[i]) {
+      return false;
+    }
+  }
+
+  return true;
+}
+
+MATCHER_P(KeyValBytesEq, expected, "match keyval_t bytes value") {
+  auto* kv = const_cast<bundle_keyval_t*>(static_cast<const bundle_keyval_t*>(arg));
+
+  if (BUNDLE_TYPE_BYTE != bundle_keyval_get_type(kv)) {
+    return false;
+  }
+
+  void* untyped = nullptr;
+  size_t size = 0;
+
+  int ret = bundle_keyval_get_basic_val(kv, &untyped, &size);
+  if (BUNDLE_ERROR_NONE != ret) {
+    return false;
+  }
+
+  if (size != expected.size()) {
+    return false;
+  }
+
+  auto bytes = static_cast<unsigned char*>(untyped);
+  for (unsigned int i = 0; i < size; ++i) {
+    if (bytes[i] != expected[i]) {
+      return false;
+    }
+  }
+
+  return true;
+}
+
+MATCHER_P(KeyValBytesArrEq, expected, "match keyval_t bytes array value") {
+  auto* kv = const_cast<bundle_keyval_t*>(static_cast<const bundle_keyval_t*>(arg));
+
+  if (BUNDLE_TYPE_BYTE_ARRAY != bundle_keyval_get_type(kv)) {
+    return false;
+  }
+
+  void** untyped = nullptr;
+  size_t array_size = 0;
+  size_t* elem_size = nullptr;
+
+  int ret = bundle_keyval_get_array_val(kv, &untyped, &array_size, &elem_size);
+  if (BUNDLE_ERROR_NONE != ret) {
+    return false;
+  }
+
+  if (array_size != expected.size()) {
+    return false;
+  }
+
+  unsigned char** value = reinterpret_cast<unsigned char**>(untyped);
+  for (size_t i = 0; i < array_size; ++i) {
+    for (size_t j = 0; j < elem_size[i]; ++j) {
+      if (expected[i][j] != value[i][j]) {
+        return false;
+      }
+    }
+  }
+
+  return true;
+}
+
+class JsonToBundleTest : public testing::Test {
+ public:
+  virtual void SetUp() {
+    bundleData = nullptr;
+  }
+
+  virtual void TearDown() {
+    if (bundleData) {
+      bundle_free(bundleData);
+    }
+  }
+
+  // Replacing bundle_keyval_t with void and cast it in matcher is required because
+  // bundle_keyval_t has only public declaration, not implementation.
+  // This causes incomplete type error which I couldn't resolve in any other way.
+  using BundleIterator = void(const char*, const int, const void*, void*);
+  using BundleIteratorMock = testing::MockFunction<BundleIterator>;
+
+  void CheckBundle(bundle* b, BundleIteratorMock& mock) {
+    bundle_foreach(b,
+                   [](const char* key, const int type, const bundle_keyval_t* kv, void* ud) {
+                     auto* mock = static_cast<testing::MockFunction<BundleIterator>*>(ud);
+                     mock->Call(key, type, kv, nullptr);
+                   },
+                   &mock);
+  }
+
+  bundle* bundleData;
+  BundleIteratorMock bundleIteratorMock;
+};
+
+TEST_F(JsonToBundleTest, BytesArrayConversion) {
+  vector<vector<unsigned char>> value = {{0, 1, 2}, {100, 101, 102}, {200, 201, 202}};
+
+  auto json_val = picojson::value(picojson::object());
+  auto& json = json_val.get<picojson::object>();
+
+  picojson::array array;
+  array.push_back(vec2json<double>(value[0]));
+  array.push_back(vec2json<double>(value[1]));
+  array.push_back(vec2json<double>(value[2]));
+
+  json["key"] = picojson::value(array);
+
+  auto result = common::JsonToBundle(json_val, &bundleData);
+  ASSERT_TRUE(result);
+
+  EXPECT_CALL(bundleIteratorMock,
+              Call(StrEq("key"), BUNDLE_TYPE_BYTE_ARRAY, KeyValBytesArrEq(value), nullptr));
+
+  CheckBundle(bundleData, bundleIteratorMock);
+}
+
+TEST_F(JsonToBundleTest, BytesConversion) {
+  vector<unsigned char> value = {0, 126, 255};
+
+  auto json_val = picojson::value(picojson::object());
+  auto& json = json_val.get<picojson::object>();
+
+  json["key"] = vec2json<double>(value);
+
+  auto result = common::JsonToBundle(json_val, &bundleData);
+  ASSERT_TRUE(result);
+
+  EXPECT_CALL(bundleIteratorMock,
+              Call(StrEq("key"), BUNDLE_TYPE_BYTE, KeyValBytesEq(value), nullptr));
+
+  CheckBundle(bundleData, bundleIteratorMock);
+}
+
+TEST_F(JsonToBundleTest, BytesConversionInvalidByteValue) {
+  auto json_val = picojson::value(picojson::object());
+  auto& json = json_val.get<picojson::object>();
+  json["key"] = vec2json<double>(vector<double>({1.0, 256.0, 2.0}));
+
+  auto result = common::JsonToBundle(json_val, &bundleData);
+  ASSERT_FALSE(result);
+
+  json["key"] = vec2json<double>(vector<double>({1.0, -1.0, 2.0}));
+  result = common::JsonToBundle(json_val, &bundleData);
+  ASSERT_FALSE(result);
+}
+
+TEST_F(JsonToBundleTest, StringConversion) {
+  string value = "tizen";
+
+  auto json_val = picojson::value(picojson::object());
+  auto& json = json_val.get<picojson::object>();
+
+  json["key"] = picojson::value(value);
+
+  auto result = common::JsonToBundle(json_val, &bundleData);
+  ASSERT_TRUE(result);
+
+  EXPECT_CALL(bundleIteratorMock, Call(StrEq("key"), BUNDLE_TYPE_STR, KeyValStrEq(value), nullptr));
+
+  CheckBundle(bundleData, bundleIteratorMock);
+}
+
+TEST_F(JsonToBundleTest, StringArrayConversion) {
+  vector<string> value = {"str1", "str2", "str3"};
+
+  auto json_val = picojson::value(picojson::object());
+  auto& json = json_val.get<picojson::object>();
+
+  json["key"] = picojson::value(picojson::array(
+      {picojson::value(value[0]), picojson::value(value[1]), picojson::value(value[2])}));
+
+  auto result = common::JsonToBundle(json_val, &bundleData);
+  ASSERT_TRUE(result);
+
+  EXPECT_CALL(bundleIteratorMock,
+              Call(StrEq("key"), BUNDLE_TYPE_STR_ARRAY, KeyValStrArrEq(value), nullptr));
+
+  CheckBundle(bundleData, bundleIteratorMock);
+}
+
+TEST_F(JsonToBundleTest, UnsupportedType) {
+  auto json_val = picojson::value(picojson::object());
+  auto& json = json_val.get<picojson::object>();
+
+  json["key"] = picojson::value(true);
+  auto result = common::JsonToBundle(json_val, &bundleData);
+  ASSERT_FALSE(result);
+
+  json["key"] = picojson::value(picojson::object());
+  result = common::JsonToBundle(json_val, &bundleData);
+  ASSERT_FALSE(result);
+}
+
+TEST_F(JsonToBundleTest, NullConversion) {
+  picojson::value json_val;
+  auto result = common::JsonToBundle(json_val, &bundleData);
+  ASSERT_TRUE(result);
+  ASSERT_EQ(nullptr, bundleData);
+}
+
+class BundleToJsonTest : public testing::Test {
+ public:
+  virtual void SetUp() {
+    bundleData = bundle_create();
+  }
+
+  virtual void TearDown() {
+    if (bundleData) {
+      bundle_free(bundleData);
+    }
+  }
+
+  bundle* bundleData;
+};
+
+TEST_F(BundleToJsonTest, NullConversion) {
+  bundle* data = nullptr;
+  picojson::value json;
+  auto result = common::BundleToJson(data, &json);
+  ASSERT_TRUE(result);
+  ASSERT_TRUE(json.is<picojson::null>());
+}
+
+TEST_F(BundleToJsonTest, StringConversion) {
+  string key = "key", value = "tizen";
+  ASSERT_EQ(bundle_add_str(bundleData, key.c_str(), value.c_str()), BUNDLE_ERROR_NONE);
+
+  picojson::value json;
+  auto result = common::BundleToJson(bundleData, &json);
+
+  ASSERT_TRUE(result);
+  ASSERT_TRUE(json.is<picojson::object>());
+  ASSERT_EQ(json.get<picojson::object>()[key].get<string>(), value);
+}
+
+TEST_F(BundleToJsonTest, StringArrayConversion) {
+  string key = "key";
+  vector<const char*> value = {"value1", "value2"};
+
+  ASSERT_EQ(bundle_add_str_array(bundleData, key.c_str(), value.data(), value.size()),
+            BUNDLE_ERROR_NONE);
+
+  picojson::value json;
+  auto result = common::BundleToJson(bundleData, &json);
+  ASSERT_TRUE(result);
+  ASSERT_TRUE(json.is<picojson::object>());
+
+  const auto& array = json.get<picojson::object>()[key].get<picojson::array>();
+  ASSERT_EQ(array.size(), value.size());
+  EXPECT_EQ(array[0].get<std::string>(), std::string(value[0]));
+  EXPECT_EQ(array[1].get<std::string>(), std::string(value[1]));
+}
+
+TEST_F(BundleToJsonTest, BytesConversion) {
+  string key = "key";
+  vector<unsigned char> bytes = {0, 126, 255};
+
+  ASSERT_EQ(bundle_add_byte(bundleData, key.c_str(), bytes.data(), bytes.size()),
+            BUNDLE_ERROR_NONE);
+
+  picojson::value json;
+  auto result = common::BundleToJson(bundleData, &json);
+  ASSERT_TRUE(result);
+  ASSERT_TRUE(json.is<picojson::object>());
+
+  const auto& array = json.get<picojson::object>()[key].get<picojson::array>();
+  ASSERT_EQ(array.size(), bytes.size());
+  EXPECT_EQ(array[0].get<double>(), bytes[0]);
+  EXPECT_EQ(array[1].get<double>(), bytes[1]);
+  EXPECT_EQ(array[2].get<double>(), bytes[2]);
+}
+
+TEST_F(BundleToJsonTest, BytesArrayConversion) {
+  string key = "key";
+  vector<vector<unsigned char>> value = {{0, 126, 255}, {1, 127, 254}};
+
+  ASSERT_EQ(bundle_add_byte_array(bundleData, key.c_str(), nullptr, value.size()),
+            BUNDLE_ERROR_NONE);
+  ASSERT_EQ(
+      bundle_set_byte_array_element(bundleData, key.c_str(), 0, value[0].data(), value[0].size()),
+      BUNDLE_ERROR_NONE);
+  ASSERT_EQ(
+      bundle_set_byte_array_element(bundleData, key.c_str(), 1, value[1].data(), value[1].size()),
+      BUNDLE_ERROR_NONE);
+
+  picojson::value json;
+  auto result = common::BundleToJson(bundleData, &json);
+  ASSERT_TRUE(result);
+  ASSERT_TRUE(json.is<picojson::object>());
+
+  auto& array = json.get<picojson::object>()[key].get<picojson::array>();
+  ASSERT_EQ(array.size(), value.size());
+
+  auto& bytes = array[0].get<picojson::array>();
+  ASSERT_EQ(bytes.size(), value[0].size());
+  EXPECT_EQ(bytes[0].get<double>(), value[0][0]);
+  EXPECT_EQ(bytes[1].get<double>(), value[0][1]);
+  EXPECT_EQ(bytes[2].get<double>(), value[0][2]);
+
+  bytes = array[1].get<picojson::array>();
+  ASSERT_EQ(bytes.size(), value[1].size());
+  EXPECT_EQ(bytes[0].get<double>(), value[1][0]);
+  EXPECT_EQ(bytes[1].get<double>(), value[1][1]);
+  EXPECT_EQ(bytes[2].get<double>(), value[1][2]);
+}
+
diff --git a/src/common/ut/json-utils.h b/src/common/ut/json-utils.h
new file mode 100644 (file)
index 0000000..653a821
--- /dev/null
@@ -0,0 +1,22 @@
+/*
+ * Copyright (c) 2019 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ *    Licensed under the Apache License, Version 2.0 (the "License");
+ *    you may not use this file except in compliance with the License.
+ *    You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *    Unless required by applicable law or agreed to in writing, software
+ *    distributed under the License is distributed on an "AS IS" BASIS,
+ *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *    See the License for the specific language governing permissions and
+ *    limitations under the License.
+ */
+#ifndef COMMON_UT_JSON_UTILS_H
+#define COMMON_UT_JSON_UTILS_H
+
+class JsonToBundleTest;
+class BundleToJsonTest;
+
+#endif // COMMON_UT_JSON_UTILS_H
diff --git a/src/common/ut/main.cc b/src/common/ut/main.cc
new file mode 100644 (file)
index 0000000..044ac9f
--- /dev/null
@@ -0,0 +1,27 @@
+/*
+ * Copyright (c) 2019 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ *    Licensed under the Apache License, Version 2.0 (the "License");
+ *    you may not use this file except in compliance with the License.
+ *    You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *    Unless required by applicable law or agreed to in writing, software
+ *    distributed under the License is distributed on an "AS IS" BASIS,
+ *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *    See the License for the specific language governing permissions and
+ *    limitations under the License.
+ */
+
+#include "gtest/gtest.h"
+
+#include "common/ut/json-utils.h"
+
+#include "tizen.h"
+
+int main(int argc, char* argv[]) {
+  ::testing::InitGoogleTest(&argc, argv);
+  return RUN_ALL_TESTS();
+}
+