1 #include <gtest/gtest.h>
2
3 #include <ATen/Functions.h>
4 #include <ATen/NativeFunctions.h>
5 #include <ATen/Tensor.h>
6 #include <caffe2/core/tensor.h>
7 #include <c10/util/ExclusivelyOwned.h>
8 #include <c10/util/intrusive_ptr.h>
9
10 #include <string>
11
12 namespace {
13
14 template <typename T>
15 class ExclusivelyOwnedTest : public ::testing::Test {
16 public:
17 c10::ExclusivelyOwned<T> defaultConstructed;
18 c10::ExclusivelyOwned<T> sample;
19 protected:
20 void SetUp() override; // defined below helpers
TearDown()21 void TearDown() override {
22 defaultConstructed = c10::ExclusivelyOwned<T>();
23 sample = c10::ExclusivelyOwned<T>();
24 }
25 };
26
27 template <typename T>
28 T getSampleValue();
29
30 template <>
getSampleValue()31 at::Tensor getSampleValue() {
32 return at::zeros({2, 2}).to(at::kCPU);
33 }
34
35 template <>
getSampleValue()36 caffe2::Tensor getSampleValue() {
37 return caffe2::Tensor(getSampleValue<at::Tensor>());
38 }
39
40 template <typename T>
41 void assertIsSampleObject(const T& eo);
42
43 template <>
assertIsSampleObject(const at::Tensor & t)44 void assertIsSampleObject<at::Tensor>(const at::Tensor& t) {
45 EXPECT_EQ(t.sizes(), (c10::IntArrayRef{2, 2}));
46 EXPECT_EQ(t.strides(), (c10::IntArrayRef{2, 1}));
47 ASSERT_EQ(t.scalar_type(), at::ScalarType::Float);
48 static const float zeros[4] = {0};
49 EXPECT_EQ(memcmp(zeros, t.data_ptr(), 4 * sizeof(float)), 0);
50 }
51
52 template <>
assertIsSampleObject(const caffe2::Tensor & t)53 void assertIsSampleObject<caffe2::Tensor>(const caffe2::Tensor& t) {
54 assertIsSampleObject<at::Tensor>(at::Tensor(t));
55 }
56
57
58 template <typename T>
SetUp()59 void ExclusivelyOwnedTest<T>::SetUp() {
60 defaultConstructed = c10::ExclusivelyOwned<T>();
61 sample = c10::ExclusivelyOwned<T>(getSampleValue<T>());
62 }
63
64 using ExclusivelyOwnedTypes = ::testing::Types<
65 at::Tensor,
66 caffe2::Tensor
67 >;
68
69 TYPED_TEST_SUITE(ExclusivelyOwnedTest, ExclusivelyOwnedTypes);
70
TYPED_TEST(ExclusivelyOwnedTest,DefaultConstructor)71 TYPED_TEST(ExclusivelyOwnedTest, DefaultConstructor) {
72 c10::ExclusivelyOwned<TypeParam> defaultConstructed;
73 }
74
TYPED_TEST(ExclusivelyOwnedTest,MoveConstructor)75 TYPED_TEST(ExclusivelyOwnedTest, MoveConstructor) {
76 auto movedDefault = std::move(this->defaultConstructed);
77 auto movedSample = std::move(this->sample);
78
79 assertIsSampleObject(*movedSample);
80 }
81
TYPED_TEST(ExclusivelyOwnedTest,MoveAssignment)82 TYPED_TEST(ExclusivelyOwnedTest, MoveAssignment) {
83 // Move assignment from a default-constructed ExclusivelyOwned is handled in
84 // TearDown at the end of every test!
85 c10::ExclusivelyOwned<TypeParam> anotherSample = c10::ExclusivelyOwned<TypeParam>(getSampleValue<TypeParam>());
86 anotherSample = std::move(this->sample);
87 assertIsSampleObject(*anotherSample);
88 }
89
TYPED_TEST(ExclusivelyOwnedTest,MoveAssignmentFromContainedType)90 TYPED_TEST(ExclusivelyOwnedTest, MoveAssignmentFromContainedType) {
91 c10::ExclusivelyOwned<TypeParam> anotherSample = c10::ExclusivelyOwned<TypeParam>(getSampleValue<TypeParam>());
92 anotherSample = getSampleValue<TypeParam>();
93 assertIsSampleObject(*anotherSample);
94 }
95
TYPED_TEST(ExclusivelyOwnedTest,Take)96 TYPED_TEST(ExclusivelyOwnedTest, Take) {
97 auto x = std::move(this->sample).take();
98 assertIsSampleObject(x);
99 }
100
101 } // namespace
102
inspectTensor()103 extern "C" void inspectTensor() {
104 auto t = getSampleValue<at::Tensor>();
105 }
106
inspectExclusivelyOwnedTensor()107 extern "C" void inspectExclusivelyOwnedTensor() {
108 c10::ExclusivelyOwned<at::Tensor> t(getSampleValue<at::Tensor>());
109 }
110