1616using namespace ::testing;
1717using ::executorch::aten::ScalarType;
1818using ::executorch::aten::Tensor;
19+ using ::executorch::etdump::BufferDataSink;
1920using ::executorch::runtime::Error;
2021using ::executorch::runtime::Result;
2122using ::executorch::runtime::Span;
@@ -29,7 +30,6 @@ class BufferDataSinkTest : public ::testing::Test {
2930 buffer_size_ = 128 ; // Small size for testing
3031 buffer_ptr_ = malloc (buffer_size_);
3132 buffer_ = Span<uint8_t >(static_cast <uint8_t *>(buffer_ptr_), buffer_size_);
32- data_sink_ = std::make_unique<executorch::etdump::BufferDataSink>(buffer_);
3333 }
3434
3535 void TearDown () override {
@@ -39,11 +39,13 @@ class BufferDataSinkTest : public ::testing::Test {
3939 size_t buffer_size_;
4040 void * buffer_ptr_;
4141 Span<uint8_t > buffer_;
42- std::unique_ptr<executorch::etdump::BufferDataSink> data_sink_;
4342};
4443
4544TEST_F (BufferDataSinkTest, StorageSizeCheck) {
46- Result<size_t > ret = data_sink_->get_storage_size ();
45+ Result<BufferDataSink> buffer_data_sink = BufferDataSink::create (buffer_);
46+ ASSERT_EQ (buffer_data_sink.error (), Error::Ok);
47+
48+ Result<size_t > ret = buffer_data_sink.get ().get_storage_size ();
4749 ASSERT_EQ (ret.error (), Error::Ok);
4850
4951 size_t storage_size = ret.get ();
@@ -54,8 +56,10 @@ TEST_F(BufferDataSinkTest, WriteOneTensorAndCheckData) {
5456 TensorFactory<ScalarType::Float> tf;
5557 Tensor tensor = tf.make ({1 , 4 }, {1.0 , 2.0 , 3.0 , 4.0 });
5658
59+ Result<BufferDataSink> buffer_data_sink = BufferDataSink::create (buffer_);
60+
5761 Result<size_t > ret =
58- data_sink_ ->write (tensor.const_data_ptr (), tensor.nbytes ());
62+ buffer_data_sink ->write (tensor.const_data_ptr (), tensor.nbytes ());
5963 ASSERT_EQ (ret.error (), Error::Ok);
6064
6165 size_t offset = ret.get ();
@@ -75,9 +79,11 @@ TEST_F(BufferDataSinkTest, WriteMultiTensorsAndCheckData) {
7579 std::vector<Tensor> tensors = {
7680 tf.make ({1 , 4 }, {1.0 , 2.0 , 3.0 , 4.0 }),
7781 tf.make ({1 , 4 }, {5.0 , 6.0 , 7.0 , 8.0 })};
82+ Result<BufferDataSink> buffer_data_sink = BufferDataSink::create (buffer_);
83+
7884 for (const auto & tensor : tensors) {
7985 Result<size_t > ret =
80- data_sink_ ->write (tensor.const_data_ptr (), tensor.nbytes ());
86+ buffer_data_sink ->write (tensor.const_data_ptr (), tensor.nbytes ());
8187 ASSERT_EQ (ret.error (), Error::Ok);
8288
8389 size_t offset = ret.get ();
@@ -94,8 +100,10 @@ TEST_F(BufferDataSinkTest, WriteMultiTensorsAndCheckData) {
94100TEST_F (BufferDataSinkTest, PointerAlignmentCheck) {
95101 TensorFactory<ScalarType::Float> tf;
96102 Tensor tensor = tf.make ({1 , 4 }, {1.0 , 2.0 , 3.0 , 4.0 });
103+ Result<BufferDataSink> buffer_data_sink = BufferDataSink::create (buffer_);
104+
97105 Result<size_t > ret =
98- data_sink_ ->write (tensor.const_data_ptr (), tensor.nbytes ());
106+ buffer_data_sink ->write (tensor.const_data_ptr (), tensor.nbytes ());
99107 ASSERT_EQ (ret.error (), Error::Ok);
100108
101109 size_t offset = ret.get ();
@@ -109,15 +117,38 @@ TEST_F(BufferDataSinkTest, WriteUntilOverflow) {
109117 TensorFactory<ScalarType::Float> tf;
110118 Tensor tensor = tf.zeros ({1 , 8 }); // Large tensor to fill the buffer
111119
120+ Result<BufferDataSink> buffer_data_sink = BufferDataSink::create (buffer_);
121+
112122 // Write tensors until we run out of space
113123 for (size_t i = 0 ; i < 2 ; i++) {
114124 Result<size_t > ret =
115- data_sink_ ->write (tensor.const_data_ptr (), tensor.nbytes ());
125+ buffer_data_sink ->write (tensor.const_data_ptr (), tensor.nbytes ());
116126 ASSERT_EQ (ret.error (), Error::Ok);
117127 }
118128
119129 // Attempting to write another tensor should raise an error
120130 Result<size_t > ret =
121- data_sink_ ->write (tensor.const_data_ptr (), tensor.nbytes ());
131+ buffer_data_sink ->write (tensor.const_data_ptr (), tensor.nbytes ());
122132 ASSERT_EQ (ret.error (), Error::OutOfResources);
123133}
134+
135+ TEST_F (BufferDataSinkTest, illegalAlignment) {
136+ for (size_t i = 1 ; i <= 128 ; i <<= 1 ) {
137+ // Create a buffer_data_sink with legal alignment that is a power of 2 and
138+ // greater than 0
139+ Result<BufferDataSink> buffer_data_sink =
140+ BufferDataSink::create (buffer_, i);
141+ ASSERT_EQ (buffer_data_sink.error (), Error::Ok);
142+ }
143+
144+ // Create a buffer_data_sink with illegal alignment that is not a power of 2
145+ // or greater than 0
146+
147+ std::vector<size_t > illegal_alignments = {0 , 3 , 5 , 7 , 100 , 127 };
148+
149+ for (size_t i = 0 ; i < illegal_alignments.size (); i++) {
150+ Result<BufferDataSink> buffer_data_sink =
151+ BufferDataSink::create (buffer_, illegal_alignments[i]);
152+ ASSERT_EQ (buffer_data_sink.error (), Error::InvalidArgument);
153+ }
154+ }
0 commit comments