1515
1616#include < executorch/extension/data_loader/file_data_loader.h>
1717#include < executorch/extension/tensor/tensor.h>
18+ #include < executorch/runtime/core/exec_aten/testing_util/tensor_util.h>
1819
1920using namespace ::executorch::extension;
2021using namespace ::executorch::runtime;
@@ -26,9 +27,9 @@ class ModuleTest : public ::testing::Test {
2627 if (const char * env = std::getenv (" RESOURCES_PATH" )) {
2728 resources_path = env;
2829 }
29- model_path_ = resources_path + " /add.pte " ;
30- linear_path_ = resources_path + " /linear.pte " ;
31- linear_data_path_ = resources_path + " /linear.ptd " ;
30+ model_path_ = std::getenv ( " ET_MODULE_ADD_PATH " ) ;
31+ linear_path_ = std::getenv ( " ET_MODULE_LINEAR_PROGRAM_PATH " ) ;
32+ linear_data_path_ = std::getenv ( " ET_MODULE_LINEAR_DATA_PATH " ) ;
3233 }
3334
3435 static inline std::string model_path_;
@@ -109,22 +110,29 @@ TEST_F(ModuleTest, TestMethodMeta) {
109110 const auto meta = module .method_meta (" forward" );
110111 EXPECT_EQ (meta.error (), Error::Ok);
111112 EXPECT_STREQ (meta->name (), " forward" );
112- EXPECT_EQ (meta->num_inputs (), 2 );
113+ // tensor, tensor, alpha
114+ EXPECT_EQ (meta->num_inputs (), 3 );
113115 EXPECT_EQ (*(meta->input_tag (0 )), Tag::Tensor);
114116 EXPECT_EQ (meta->num_outputs (), 1 );
115117 EXPECT_EQ (*(meta->output_tag (0 )), Tag::Tensor);
116118
117119 const auto input_meta = meta->input_tensor_meta (0 );
118120 EXPECT_EQ (input_meta.error (), Error::Ok);
119121 EXPECT_EQ (input_meta->scalar_type (), executorch::aten::ScalarType::Float);
120- EXPECT_EQ (input_meta->sizes ().size (), 1 );
121- EXPECT_EQ (input_meta->sizes ()[0 ], 1 );
122+ EXPECT_EQ (input_meta->sizes ().size (), 2 );
123+ EXPECT_EQ (input_meta->sizes ()[0 ], 2 );
124+
125+ const auto input_meta1 = meta->input_tensor_meta (1 );
126+ EXPECT_EQ (input_meta1.error (), Error::Ok);
127+ EXPECT_EQ (input_meta1->scalar_type (), executorch::aten::ScalarType::Float);
128+ EXPECT_EQ (input_meta1->sizes ().size (), 2 );
129+ EXPECT_EQ (input_meta1->sizes ()[0 ], 2 );
122130
123131 const auto output_meta = meta->output_tensor_meta (0 );
124132 EXPECT_EQ (output_meta.error (), Error::Ok);
125133 EXPECT_EQ (output_meta->scalar_type (), executorch::aten::ScalarType::Float);
126- EXPECT_EQ (output_meta->sizes ().size (), 1 );
127- EXPECT_EQ (output_meta->sizes ()[0 ], 1 );
134+ EXPECT_EQ (output_meta->sizes ().size (), 2 );
135+ EXPECT_EQ (output_meta->sizes ()[0 ], 2 );
128136}
129137
130138TEST_F (ModuleTest, TestNonExistentMethodMeta) {
@@ -136,17 +144,16 @@ TEST_F(ModuleTest, TestNonExistentMethodMeta) {
136144
137145TEST_F (ModuleTest, TestExecute) {
138146 Module module (model_path_);
139- auto tensor = make_tensor_ptr ({1 .f });
147+ auto tensor = make_tensor_ptr ({2 , 2 }, { 1 . f , 2 . f , 3 . f , 4 .f });
140148
141- const auto result = module .execute (" forward" , {tensor, tensor});
149+ const auto result = module .execute (" forward" , {tensor, tensor, 1.0 });
142150 EXPECT_EQ (result.error (), Error::Ok);
143151
144152 EXPECT_TRUE (module .is_loaded ());
145153 EXPECT_TRUE (module .is_method_loaded (" forward" ));
146154
147- const auto data = result->at (0 ).toTensor ().const_data_ptr <float >();
148-
149- EXPECT_NEAR (data[0 ], 2 , 1e-5 );
155+ const auto expected = make_tensor_ptr ({2 , 2 }, {2 .f , 4 .f , 6 .f , 8 .f });
156+ EXPECT_TENSOR_CLOSE (result->at (0 ).toTensor (), *expected.get ());
150157}
151158
152159TEST_F (ModuleTest, TestExecutePreload) {
@@ -155,14 +162,13 @@ TEST_F(ModuleTest, TestExecutePreload) {
155162 const auto error = module .load ();
156163 EXPECT_EQ (error, Error::Ok);
157164
158- auto tensor = make_tensor_ptr ({1 .f });
165+ auto tensor = make_tensor_ptr ({2 , 2 }, { 1 . f , 2 . f , 3 . f , 4 .f });
159166
160- const auto result = module .execute (" forward" , {tensor, tensor});
167+ const auto result = module .execute (" forward" , {tensor, tensor, 1.0 });
161168 EXPECT_EQ (result.error (), Error::Ok);
162169
163- const auto data = result->at (0 ).toTensor ().const_data_ptr <float >();
164-
165- EXPECT_NEAR (data[0 ], 2 , 1e-5 );
170+ const auto expected = make_tensor_ptr ({2 , 2 }, {2 .f , 4 .f , 6 .f , 8 .f });
171+ EXPECT_TENSOR_CLOSE (result->at (0 ).toTensor (), *expected.get ());
166172}
167173
168174TEST_F (ModuleTest, TestExecutePreload_method) {
@@ -171,14 +177,13 @@ TEST_F(ModuleTest, TestExecutePreload_method) {
171177 const auto error = module .load_method (" forward" );
172178 EXPECT_EQ (error, Error::Ok);
173179
174- auto tensor = make_tensor_ptr ({1 .f });
180+ auto tensor = make_tensor_ptr ({2 , 2 }, { 1 . f , 2 . f , 3 . f , 4 .f });
175181
176- const auto result = module .execute (" forward" , {tensor, tensor});
182+ const auto result = module .execute (" forward" , {tensor, tensor, 1.0 });
177183 EXPECT_EQ (result.error (), Error::Ok);
178184
179- const auto data = result->at (0 ).toTensor ().const_data_ptr <float >();
180-
181- EXPECT_NEAR (data[0 ], 2 , 1e-5 );
185+ const auto expected = make_tensor_ptr ({2 , 2 }, {2 .f , 4 .f , 6 .f , 8 .f });
186+ EXPECT_TENSOR_CLOSE (result->at (0 ).toTensor (), *expected.get ());
182187}
183188
184189TEST_F (ModuleTest, TestExecutePreloadProgramAndMethod) {
@@ -190,14 +195,13 @@ TEST_F(ModuleTest, TestExecutePreloadProgramAndMethod) {
190195 const auto load_method_error = module .load_method (" forward" );
191196 EXPECT_EQ (load_method_error, Error::Ok);
192197
193- auto tensor = make_tensor_ptr ({1 .f });
198+ auto tensor = make_tensor_ptr ({2 , 2 }, { 1 . f , 2 . f , 3 . f , 4 .f });
194199
195- const auto result = module .execute (" forward" , {tensor, tensor});
200+ const auto result = module .execute (" forward" , {tensor, tensor, 1.0 });
196201 EXPECT_EQ (result.error (), Error::Ok);
197202
198- const auto data = result->at (0 ).toTensor ().const_data_ptr <float >();
199-
200- EXPECT_NEAR (data[0 ], 2 , 1e-5 );
203+ const auto expected = make_tensor_ptr ({2 , 2 }, {2 .f , 4 .f , 6 .f , 8 .f });
204+ EXPECT_TENSOR_CLOSE (result->at (0 ).toTensor (), *expected.get ());
201205}
202206
203207TEST_F (ModuleTest, TestExecuteOnNonExistent) {
@@ -219,32 +223,30 @@ TEST_F(ModuleTest, TestExecuteOnCurrupted) {
219223TEST_F (ModuleTest, TestGet) {
220224 Module module (model_path_);
221225
222- auto tensor = make_tensor_ptr ({1 .f });
226+ auto tensor = make_tensor_ptr ({2 , 2 }, { 1 . f , 2 . f , 3 . f , 4 .f });
223227
224- const auto result = module .get (" forward" , {tensor, tensor});
228+ const auto result = module .get (" forward" , {tensor, tensor, 1.0 });
225229 EXPECT_EQ (result.error (), Error::Ok);
226- const auto data = result-> toTensor (). const_data_ptr < float >( );
227- EXPECT_NEAR (data[ 0 ], 2 , 1e-5 );
230+ const auto expected = make_tensor_ptr ({ 2 , 2 }, { 2 . f , 4 . f , 6 . f , 8 . f } );
231+ EXPECT_TENSOR_CLOSE (result-> toTensor (), *expected. get () );
228232}
229233
230234TEST_F (ModuleTest, TestForward) {
231235 auto module = std::make_unique<Module>(model_path_);
232- auto tensor = make_tensor_ptr ({21 .f });
236+ auto tensor = make_tensor_ptr ({2 , 2 }, { 21 . f , 22 . f , 23 . f , 24 .f });
233237
234- const auto result = module ->forward ({tensor, tensor});
238+ const auto result = module ->forward ({tensor, tensor, 1.0 });
235239 EXPECT_EQ (result.error (), Error::Ok);
236240
237- const auto data = result->at (0 ).toTensor ().const_data_ptr <float >();
241+ const auto expected = make_tensor_ptr ({2 , 2 }, {42 .f , 44 .f , 46 .f , 48 .f });
242+ EXPECT_TENSOR_CLOSE (result->at (0 ).toTensor (), *expected.get ());
238243
239- EXPECT_NEAR (data[0 ], 42 , 1e-5 );
240-
241- auto tensor2 = make_tensor_ptr ({2 .f });
244+ auto tensor2 = make_tensor_ptr ({2 , 2 }, {2 .f , 3 .f , 4 .f , 5 .f });
242245 const auto result2 = module ->forward ({tensor2, tensor2});
243246 EXPECT_EQ (result2.error (), Error::Ok);
244247
245- const auto data2 = result->at (0 ).toTensor ().const_data_ptr <float >();
246-
247- EXPECT_NEAR (data2[0 ], 4 , 1e-5 );
248+ const auto expected2 = make_tensor_ptr ({2 , 2 }, {4 .f , 6 .f , 8 .f , 10 .f });
249+ EXPECT_TENSOR_CLOSE (result2->at (0 ).toTensor (), *expected2.get ());
248250}
249251
250252TEST_F (ModuleTest, TestForwardWithInvalidInputs) {
@@ -294,20 +296,20 @@ TEST_F(ModuleTest, TestProgramSharingAndDataLoaderManagement) {
294296 EXPECT_EQ (load_error, Error::Ok);
295297 EXPECT_TRUE (module1->is_loaded ());
296298
297- auto tensor = make_tensor_ptr ({1 .f });
299+ auto tensor = make_tensor_ptr ({2 , 2 }, { 1 . f , 2 . f , 3 . f , 4 .f });
298300
299- const auto result1 = module1->execute (" forward" , {tensor, tensor});
301+ const auto result1 = module1->execute (" forward" , {tensor, tensor, 1.0 });
300302 EXPECT_EQ (result1.error (), Error::Ok);
301303
302304 auto module2 = std::make_unique<Module>(module1->program ());
303305
304- const auto result2 = module2->execute (" forward" , {tensor, tensor});
306+ const auto result2 = module2->execute (" forward" , {tensor, tensor, 1.0 });
305307 EXPECT_EQ (result2.error (), Error::Ok);
306308
307309 module1 = std::make_unique<Module>(" /path/to/nonexistent/file.pte" );
308310 EXPECT_FALSE (module1->is_loaded ());
309311
310- const auto result3 = module2->execute (" forward" , {tensor, tensor});
312+ const auto result3 = module2->execute (" forward" , {tensor, tensor, 1.0 });
311313 EXPECT_EQ (result3.error (), Error::Ok);
312314}
313315
@@ -339,14 +341,13 @@ TEST_F(ModuleTest, TestProgramPersistenceAndReuseAfterModuleDestruction) {
339341
340342 EXPECT_EQ (module .program (), shared_program);
341343
342- auto tensor = make_tensor_ptr ({1 .f });
344+ auto tensor = make_tensor_ptr ({2 , 2 }, { 1 . f , 2 . f , 3 . f , 4 .f });
343345
344- const auto result = module .execute (" forward" , {tensor, tensor});
346+ const auto result = module .execute (" forward" , {tensor, tensor, 1.0 });
345347 EXPECT_EQ (result.error (), Error::Ok);
346348
347- auto data = result->at (0 ).toTensor ().const_data_ptr <float >();
348-
349- EXPECT_NEAR (data[0 ], 2 , 1e-5 );
349+ const auto expected = make_tensor_ptr ({2 , 2 }, {2 .f , 4 .f , 6 .f , 8 .f });
350+ EXPECT_TENSOR_CLOSE (result->at (0 ).toTensor (), *expected.get ());
350351}
351352
352353TEST_F (ModuleTest, TestConcurrentExecutionWithSharedProgram) {
@@ -364,22 +365,22 @@ TEST_F(ModuleTest, TestConcurrentExecutionWithSharedProgram) {
364365 EXPECT_TRUE (program != nullptr );
365366
366367 auto thread = [](std::shared_ptr<Program> program,
367- const std::array<float , 1 >& input) {
368+ const std::array<float , 4 >& input) {
368369 Module module (program);
369- auto tensor = from_blob ((void *)input.data (), {1 });
370+ auto tensor = from_blob ((void *)input.data (), {2 , 2 });
370371
371- const auto result = module .forward ({tensor, tensor});
372+ const auto result = module .forward ({tensor, tensor, 1.0 });
372373 EXPECT_EQ (result.error (), Error::Ok);
373374
374375 const auto data = result->at (0 ).toTensor ().const_data_ptr <float >();
375376 EXPECT_NEAR (data[0 ], (input[0 ] * 2 ), 1e-5 );
376377 };
377378
378- std::thread t1 (thread, program, std::array<float , 1 >{1 });
379- std::thread t2 (thread, program, std::array<float , 1 >{2 });
380- std::thread t3 (thread, program, std::array<float , 1 >{3 });
381- std::thread t4 (thread, program, std::array<float , 1 >{4 });
382- std::thread t5 (thread, program, std::array<float , 1 >{5 });
379+ std::thread t1 (thread, program, std::array<float , 4 >{1 , 2 , 3 , 4 });
380+ std::thread t2 (thread, program, std::array<float , 4 >{2 , 3 , 4 , 5 });
381+ std::thread t3 (thread, program, std::array<float , 4 >{3 , 4 , 5 , 6 });
382+ std::thread t4 (thread, program, std::array<float , 4 >{4 , 5 , 6 , 7 });
383+ std::thread t5 (thread, program, std::array<float , 4 >{5 , 6 , 7 , 8 });
383384
384385 t1.join ();
385386 t2.join ();
@@ -391,37 +392,38 @@ TEST_F(ModuleTest, TestConcurrentExecutionWithSharedProgram) {
391392TEST_F (ModuleTest, TestSetInputsBeforeExecute) {
392393 Module module (model_path_);
393394
394- auto tensor1 = make_tensor_ptr ({4 .f });
395- auto tensor2 = make_tensor_ptr ({5 .f });
395+ auto tensor1 = make_tensor_ptr ({2 , 2 }, { 1 . f , 2 . f , 3 . f , 4 .f });
396+ auto tensor2 = make_tensor_ptr ({2 , 2 }, { 2 . f , 3 . f , 4 . f , 5 .f });
396397
397- EXPECT_EQ (module .set_inputs ({tensor1, tensor2}), Error::Ok);
398+ EXPECT_EQ (module .set_inputs ({tensor1, tensor2, 1.0 }), Error::Ok);
398399
399400 const auto result = module .forward ();
400401 EXPECT_EQ (result.error (), Error::Ok);
401402
402- const auto data = result-> at ( 0 ). toTensor (). const_data_ptr < float >( );
403- EXPECT_NEAR (data[ 0 ], 9 , 1e-5 );
403+ const auto expected = make_tensor_ptr ({ 2 , 2 }, { 3 . f , 5 . f , 7 . f , 9 . f } );
404+ EXPECT_TENSOR_CLOSE (result-> at ( 0 ). toTensor (), *expected. get () );
404405}
405406
406407TEST_F (ModuleTest, TestSetInputCombinedWithExecute) {
407408 Module module (model_path_);
408409
409- auto tensor1 = make_tensor_ptr ({2 .f });
410- auto tensor2 = make_tensor_ptr ({3 .f });
410+ auto tensor1 = make_tensor_ptr ({2 , 2 }, { 1 . f , 2 . f , 3 . f , 4 .f });
411+ auto tensor2 = make_tensor_ptr ({2 , 2 }, { 2 . f , 3 . f , 4 . f , 5 .f });
411412
412413 EXPECT_EQ (module .set_input (tensor2, 1 ), Error::Ok);
414+ EXPECT_EQ (module .set_input (1.0 , 2 ), Error::Ok); // alpha
413415
414416 const auto result = module .forward (tensor1);
415417 EXPECT_EQ (result.error (), Error::Ok);
416418
417- const auto data = result-> at ( 0 ). toTensor (). const_data_ptr < float >( );
418- EXPECT_NEAR (data[ 0 ], 5 , 1e-5 );
419+ const auto expected = make_tensor_ptr ({ 2 , 2 }, { 3 . f , 5 . f , 7 . f , 9 . f } );
420+ EXPECT_TENSOR_CLOSE (result-> at ( 0 ). toTensor (), *expected. get () );
419421}
420422
421423TEST_F (ModuleTest, TestPartiallySetInputs) {
422424 Module module (model_path_);
423425
424- auto tensor = make_tensor_ptr ({1 .f });
426+ auto tensor = make_tensor_ptr ({2 , 2 }, { 1 . f , 2 . f , 3 . f , 4 .f });
425427
426428 EXPECT_EQ (module .set_input (tensor, 0 ), Error::Ok);
427429
@@ -455,8 +457,6 @@ TEST_F(ModuleTest, TestPTD) {
455457
456458 ASSERT_EQ (module .load_method (" forward" ), Error::Ok);
457459
458- auto tensor1 =
459- make_tensor_ptr ({3 , 3 }, {2 .f , 3 .f , 4 .f , 2 .f , 3 .f , 4 .f , 2 .f , 3 .f , 4 .f });
460-
461- ASSERT_EQ (module .forward (tensor1).error (), Error::Ok);
460+ auto tensor = make_tensor_ptr ({2 , 2 }, {2 .f , 3 .f , 4 .f , 2 .f });
461+ ASSERT_EQ (module .forward (tensor).error (), Error::Ok);
462462}
0 commit comments