xref: /aosp_15_r20/external/pytorch/aten/src/ATen/test/ExclusivelyOwned_test.cpp (revision da0073e96a02ea20f0ac840b70461e3646d07c45)
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