--- /dev/null
+/*
+ Copyright (c) 2018-2019 Nokia.
+
+ 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 "private/redis/contentsbuilder.hpp"
+#include "private/redis/contents.hpp"
+
+using namespace shareddatalayer;
+using namespace shareddatalayer::redis;
+using namespace testing;
+
+namespace
+{
+ class ContentsBuilderTest: public testing::Test
+ {
+ public:
+ std::unique_ptr<ContentsBuilder> contentsBuilder;
+ AsyncConnection::Namespace ns;
+ char nsKeySeparator;
+ std::string string;
+ std::string string2;
+ std::string string3;
+ AsyncConnection::Key key;
+ AsyncConnection::Key key2;
+ AsyncConnection::Data data;
+ AsyncConnection::Data data2;
+ AsyncConnection::Keys keys;
+ AsyncConnection::DataMap dataMap;
+
+ ContentsBuilderTest():
+ ns("ns"),
+ nsKeySeparator('#'),
+ string("string"),
+ string2("string2"),
+ string3("string3"),
+ key("key"),
+ key2("key2"),
+ data({11,12}),
+ data2({21,22}),
+ keys({key,key2}),
+ dataMap({{key,data},{key2,data2}})
+ {
+ contentsBuilder.reset(new ContentsBuilder(nsKeySeparator));
+ }
+
+ void expectStringInContents(Contents& contents, std::string& string, int pos)
+ {
+ EXPECT_EQ(string, contents.stack[pos]);
+ EXPECT_EQ(string.size(), contents.sizes[pos]);
+ }
+
+ void expectDataMapInContents(Contents& contents, int pos)
+ {
+ expectKeyInContents(contents, key, pos);
+ expectDataInContents(contents, data, pos+1);
+ expectKeyInContents(contents, key2, pos+2);
+ expectDataInContents(contents, data2, pos+3);
+ }
+
+ void expectKeyInContents(Contents& contents, AsyncConnection::Key& key, int pos)
+ {
+ AsyncConnection::Key keyWithPrefix('{' + ns + '}' + nsKeySeparator + key);
+ EXPECT_EQ(keyWithPrefix, contents.stack[pos]);
+ EXPECT_EQ(keyWithPrefix.size(), contents.sizes[pos]);
+ }
+
+ void expectDataInContents(Contents& contents, AsyncConnection::Data& data, int pos)
+ {
+ EXPECT_EQ(data.size(), contents.sizes[pos]);
+ std::string dataAsString(data.begin(), data.end());
+ EXPECT_EQ(dataAsString, contents.stack[pos]);
+ }
+
+ void expectMessageInContents(Contents& contents, int pos)
+ {
+ EXPECT_EQ(string2, contents.stack[pos]);
+ EXPECT_EQ(string2.size(), contents.sizes[pos]);
+ }
+
+ void expectKeysInContents(Contents& contents, int pos)
+ {
+ expectKeyInContents(contents, key, pos);
+ expectKeyInContents(contents, key2, pos+1);
+ }
+ };
+}
+
+TEST_F(ContentsBuilderTest, BuildWithString)
+{
+ auto contents(contentsBuilder->build(string));
+ EXPECT_EQ(size_t(1), contents.stack.size());
+ EXPECT_EQ(size_t(1), contents.sizes.size());
+ expectStringInContents(contents, string, 0);
+}
+
+TEST_F(ContentsBuilderTest, BuildWithStringAndString2)
+{
+ auto contents(contentsBuilder->build(string, string2));
+ EXPECT_EQ(size_t(2), contents.stack.size());
+ EXPECT_EQ(size_t(2), contents.sizes.size());
+ expectStringInContents(contents, string, 0);
+ expectStringInContents(contents, string2, 1);
+}
+
+TEST_F(ContentsBuilderTest, BuildWithStringString2AndString3)
+{
+ auto contents(contentsBuilder->build(string, string2, string3));
+ EXPECT_EQ(size_t(3), contents.stack.size());
+ EXPECT_EQ(size_t(3), contents.sizes.size());
+ expectStringInContents(contents, string, 0);
+ expectStringInContents(contents, string2, 1);
+ expectStringInContents(contents, string3, 2);
+}
+
+TEST_F(ContentsBuilderTest, BuildWithStringAndDataMap)
+{
+ auto contents(contentsBuilder->build(string, ns, dataMap));
+ EXPECT_EQ(size_t(5), contents.stack.size());
+ EXPECT_EQ(size_t(5), contents.sizes.size());
+ expectStringInContents(contents, string, 0);
+ expectDataMapInContents(contents, 1);
+}
+
+TEST_F(ContentsBuilderTest, BuildWithStringDataMapAndTwoStrings)
+{
+ auto contents(contentsBuilder->build(string, ns, dataMap, string2, string3));
+ EXPECT_EQ(size_t(7), contents.stack.size());
+ EXPECT_EQ(size_t(7), contents.sizes.size());
+ expectStringInContents(contents, string, 0);
+ expectDataMapInContents(contents, 1);
+ expectStringInContents(contents, string2, 5);
+ expectStringInContents(contents, string3, 6);
+}
+
+TEST_F(ContentsBuilderTest, BuildWithStringKeyAndData)
+{
+ auto contents(contentsBuilder->build(string, ns, key, data));
+ EXPECT_EQ(size_t(3), contents.stack.size());
+ EXPECT_EQ(size_t(3), contents.sizes.size());
+ expectStringInContents(contents, string, 0);
+ expectKeyInContents(contents, key, 1);
+ expectDataInContents(contents, data, 2);
+}
+
+TEST_F(ContentsBuilderTest, BuildWithStringKeyDataAndTwoStrings)
+{
+ auto contents(contentsBuilder->build(string, ns, key, data, string2, string3));
+ EXPECT_EQ(size_t(5), contents.stack.size());
+ EXPECT_EQ(size_t(5), contents.sizes.size());
+ expectStringInContents(contents, string, 0);
+ expectKeyInContents(contents, key, 1);
+ expectDataInContents(contents, data, 2);
+ expectStringInContents(contents, string2, 3);
+ expectStringInContents(contents, string3, 4);
+}
+
+TEST_F(ContentsBuilderTest, BuildWithStringKeyAndTwoDatas)
+{
+ auto contents(contentsBuilder->build(string, ns, key, data, data2));
+ EXPECT_EQ(size_t(4), contents.stack.size());
+ EXPECT_EQ(size_t(4), contents.sizes.size());
+ expectStringInContents(contents, string, 0);
+ expectKeyInContents(contents, key, 1);
+ expectDataInContents(contents, data, 2);
+ expectDataInContents(contents, data2, 3);
+}
+
+TEST_F(ContentsBuilderTest, BuildWithStringKeyTwoDatasAndTwoStrings)
+{
+ auto contents(contentsBuilder->build(string, ns, key, data, data2, string2, string3));
+ EXPECT_EQ(size_t(6), contents.stack.size());
+ EXPECT_EQ(size_t(6), contents.sizes.size());
+ expectStringInContents(contents, string, 0);
+ expectKeyInContents(contents, key, 1);
+ expectDataInContents(contents, data, 2);
+ expectDataInContents(contents, data2, 3);
+ expectStringInContents(contents, string2, 4);
+ expectStringInContents(contents, string3, 5);
+}
+
+TEST_F(ContentsBuilderTest, BuildWithStringAndKeys)
+{
+ auto contents(contentsBuilder->build(string, ns, keys));
+ EXPECT_EQ(size_t(3), contents.stack.size());
+ EXPECT_EQ(size_t(3), contents.sizes.size());
+ expectStringInContents(contents, string, 0);
+ expectKeysInContents(contents, 1);
+}
+
+TEST_F(ContentsBuilderTest, BuildWithStringKeysAndTwoStrings)
+{
+ auto contents(contentsBuilder->build(string, ns, keys, string2, string3));
+ EXPECT_EQ(size_t(5), contents.stack.size());
+ EXPECT_EQ(size_t(5), contents.sizes.size());
+ expectStringInContents(contents, string, 0);
+ expectKeysInContents(contents, 1);
+ expectStringInContents(contents, string2, 3);
+ expectStringInContents(contents, string3, 4);
+}