blob: 75f9d1e7ba1299bbee24086787bbe26a35ce71a1 [file] [log] [blame]
// Copyright 2018 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "lib/fidl/cpp/clone.h"
#include <gtest/gtest.h>
#ifdef __Fuchsia__
#include <lib/zx/channel.h>
#include <lib/zx/socket.h>
#endif
namespace fidl {
namespace {
TEST(Clone, Control) {
int8_t a = 32;
int8_t b = 0;
EXPECT_EQ(ZX_OK, Clone(a, &b));
EXPECT_EQ(32, b);
}
#ifdef __Fuchsia__
TEST(Clone, Socket) {
zx::socket h1, h2;
EXPECT_EQ(ZX_OK, zx::socket::create(0, &h1, &h2));
zx::socket h;
EXPECT_EQ(ZX_OK, Clone(h1, &h));
h.reset();
EXPECT_EQ(ZX_OK, Clone(h, &h2));
EXPECT_FALSE(h2.is_valid());
}
TEST(Clone, Channel) {
zx::channel h1, h2;
EXPECT_EQ(ZX_OK, zx::channel::create(0, &h1, &h2));
zx::channel h;
EXPECT_EQ(ZX_ERR_ACCESS_DENIED, Clone(h1, &h));
EXPECT_EQ(ZX_OK, Clone(h, &h2));
EXPECT_FALSE(h2.is_valid());
}
#endif
TEST(Clone, VectorPtrPrimitive) {
VectorPtr<int> intvec1({1, 2, 3, 4});
VectorPtr<int> intvec2;
EXPECT_TRUE(intvec1.has_value());
EXPECT_FALSE(intvec2.has_value());
EXPECT_EQ(ZX_OK, Clone(intvec1, &intvec2));
EXPECT_TRUE(intvec1.has_value());
EXPECT_TRUE(intvec2.has_value());
EXPECT_EQ(intvec1->size(), 4u);
EXPECT_EQ(intvec2->size(), 4u);
EXPECT_EQ(intvec2->at(0), 1);
EXPECT_EQ(intvec2->at(1), 2);
EXPECT_EQ(intvec2->at(2), 3);
EXPECT_EQ(intvec2->at(3), 4);
intvec1->push_back(5);
EXPECT_EQ(intvec1->size(), 5u);
EXPECT_EQ(intvec2->size(), 4u);
VectorPtr<int> intvec3;
EXPECT_TRUE(intvec2.has_value());
EXPECT_FALSE(intvec3.has_value());
EXPECT_EQ(ZX_OK, Clone(intvec3, &intvec2));
EXPECT_FALSE(intvec2.has_value());
EXPECT_FALSE(intvec3.has_value());
VectorPtr<int> empty;
empty.emplace();
EXPECT_TRUE(empty.has_value());
EXPECT_EQ(empty->size(), 0u);
auto cloned_empty = fidl::Clone(empty);
EXPECT_TRUE(cloned_empty.has_value());
EXPECT_EQ(cloned_empty->size(), 0u);
}
TEST(Clone, VectorPtrString) {
VectorPtr<std::string> strvec1({"satu", "dua", "tiga", "empat"});
VectorPtr<std::string> strvec2;
VectorPtr<std::string> strvec3;
EXPECT_TRUE(strvec1.has_value());
EXPECT_FALSE(strvec2.has_value());
EXPECT_EQ(ZX_OK, Clone(strvec1, &strvec2));
EXPECT_TRUE(strvec1.has_value());
EXPECT_TRUE(strvec2.has_value());
EXPECT_EQ(strvec1->size(), 4u);
EXPECT_EQ(strvec2->size(), 4u);
EXPECT_EQ(strvec2->at(0), "satu");
EXPECT_EQ(strvec2->at(1), "dua");
EXPECT_EQ(strvec2->at(2), "tiga");
EXPECT_EQ(strvec2->at(3), "empat");
strvec1->push_back("lima");
EXPECT_EQ(strvec1->size(), 5u);
EXPECT_EQ(strvec2->size(), 4u);
EXPECT_TRUE(strvec2.has_value());
EXPECT_FALSE(strvec3.has_value());
EXPECT_EQ(ZX_OK, Clone(strvec3, &strvec2));
EXPECT_FALSE(strvec2.has_value());
EXPECT_FALSE(strvec3.has_value());
VectorPtr<std::string> empty;
empty.emplace();
EXPECT_TRUE(empty.has_value());
EXPECT_EQ(empty->size(), 0u);
auto cloned_empty = fidl::Clone(empty);
EXPECT_TRUE(cloned_empty.has_value());
EXPECT_EQ(cloned_empty->size(), 0u);
}
// There's a different implementation for Clone<VectorPtr<T>> for strings and
// primitives vs all other types.
TEST(Clone, VectorPtrVector) {
VectorPtr<std::vector<int>> vecvec1({std::vector<int>(1, 1), std::vector<int>(2, 2),
std::vector<int>(3, 3), std::vector<int>(4, 4)});
VectorPtr<std::vector<int>> vecvec2;
VectorPtr<std::vector<int>> vecvec3;
EXPECT_TRUE(vecvec1.has_value());
EXPECT_FALSE(vecvec2.has_value());
EXPECT_EQ(ZX_OK, Clone(vecvec1, &vecvec2));
EXPECT_TRUE(vecvec1.has_value());
EXPECT_TRUE(vecvec2.has_value());
EXPECT_EQ(vecvec1->size(), 4u);
EXPECT_EQ(vecvec2->size(), 4u);
EXPECT_EQ(vecvec2->at(0).size(), 1u);
EXPECT_EQ(vecvec2->at(1).size(), 2u);
EXPECT_EQ(vecvec2->at(2).size(), 3u);
EXPECT_EQ(vecvec2->at(3).size(), 4u);
vecvec1->push_back(std::vector<int>(5, 5));
EXPECT_EQ(vecvec1->size(), 5u);
EXPECT_EQ(vecvec2->size(), 4u);
EXPECT_TRUE(vecvec2.has_value());
EXPECT_FALSE(vecvec3.has_value());
EXPECT_EQ(ZX_OK, Clone(vecvec3, &vecvec2));
EXPECT_FALSE(vecvec2.has_value());
EXPECT_FALSE(vecvec3.has_value());
VectorPtr<std::vector<int>> empty;
empty.emplace();
EXPECT_TRUE(empty.has_value());
EXPECT_EQ(empty->size(), 0u);
auto cloned_empty = fidl::Clone(empty);
EXPECT_TRUE(cloned_empty.has_value());
EXPECT_EQ(cloned_empty->size(), 0u);
}
} // namespace
} // namespace fidl