LCOV - code coverage report
Current view: top level - UTests - testRespect.cpp (source / functions) Hit Total Coverage
Test: Coverage example Lines: 105 112 93.8 %
Date: 2021-12-02 17:21:05 Functions: 17 17 100.0 %

          Line data    Source code
       1             : ///////////////////////////////////////////////////////////////////////////
       2             : // Spetabaru - Berenger Bramas MPCDF - 2017
       3             : // Under LGPL Licence, please you must read the LICENCE file.
       4             : ///////////////////////////////////////////////////////////////////////////
       5             : 
       6             : #include <future>
       7             : 
       8             : #include "UTester.hpp"
       9             : 
      10             : #include "Data/SpDataAccessMode.hpp"
      11             : #include "Utils/SpUtils.hpp"
      12             : 
      13             : #include "Task/SpTask.hpp"
      14             : #include "Legacy/SpRuntime.hpp"
      15             : 
      16             : class TestRespect : public UTester< TestRespect > {
      17             :     using Parent = UTester< TestRespect >;
      18             : 
      19           2 :     void TestBasic(){
      20           4 :         SpRuntime runtime(2);
      21             : 
      22             :         {
      23           4 :             std::promise<int> promise1;
      24           4 :             std::promise<int> promise2;
      25             : 
      26           2 :             const int initVal = 1;
      27             : 
      28           0 :             runtime.task(SpRead(initVal),
      29           2 :                          [&](const int& /*initValParam*/){
      30           2 :                 promise1.set_value(0);
      31           2 :                 promise2.get_future().wait();
      32          16 :             });
      33             :             
      34           2 :             promise1.get_future().wait();
      35             :             
      36           0 :             runtime.task(SpRead(initVal),
      37           2 :                          [&](const int& /*initValParam*/){
      38           2 :                 promise2.set_value(0);
      39           4 :             });        
      40             :             
      41           2 :             runtime.waitAllTasks();
      42             :         }
      43           2 :         std::cout << "Next" << std::endl;
      44             :         {
      45           4 :             std::promise<int> promise1;
      46           4 :             std::promise<int> promise2;
      47             : 
      48           2 :             const int initVal = 1;
      49           2 :             int writeVal = 0;
      50             : 
      51           2 :             runtime.task(SpRead(initVal), SpWrite(writeVal),
      52           2 :                          [&](const int& /*initValParam*/, int& /*writeValParam*/){
      53           2 :                 promise1.set_value(0);
      54           2 :                 promise2.get_future().wait();
      55          14 :             });
      56             :             
      57           2 :             promise1.get_future().wait();
      58             :             
      59           0 :             runtime.task(SpRead(initVal),
      60           2 :                          [&](const int& /*initValParam*/){
      61           2 :                 promise2.set_value(0);
      62           4 :             });        
      63             :             
      64           2 :             runtime.waitAllTasks();
      65             :         }
      66           2 :         std::cout << "Next" << std::endl;
      67             :         {
      68           4 :             std::promise<int> promise2;
      69             : 
      70           2 :             int writeVal = 0;
      71             : 
      72           0 :             runtime.task(SpWrite(writeVal),
      73           2 :                          [&](int& /*writeValParam*/){
      74           2 :                 promise2.get_future().wait();
      75           4 :             });
      76             :             
      77           2 :             auto descriptor = runtime.task(SpRead(writeVal),
      78           2 :                          [&](const int& /*writeValParam*/){
      79           2 :             });
      80           2 :             UASSERTETRUE(descriptor.isReady() == false);
      81             :             
      82           2 :             promise2.set_value(0);       
      83             :             
      84           2 :             runtime.waitAllTasks();
      85             :         }
      86           2 :         std::cout << "Next" << std::endl;        
      87             :         {
      88           4 :             std::promise<int> promise1;
      89           4 :             std::promise<int> promise2;
      90             : 
      91           2 :             const int initVal[10] = {0};
      92             : 
      93           4 :             runtime.task(SpReadArray(initVal, SpArrayView(10)),
      94           2 :                          [&](const SpArrayAccessor<const int>& /*initValParam*/){
      95           2 :                 promise1.set_value(0);
      96           2 :                 promise2.get_future().wait();
      97           6 :             });
      98             :             
      99           2 :             promise1.get_future().wait();
     100             :             
     101           4 :             runtime.task(SpReadArray(initVal, SpArrayView(10)),
     102           2 :                          [&](const SpArrayAccessor<const int>& /*initValParam*/){
     103           2 :                 promise2.set_value(0);
     104           6 :             });
     105             :             
     106           2 :             runtime.waitAllTasks();
     107             :         }
     108           2 :         std::cout << "Next" << std::endl;
     109             :         {
     110           4 :             std::promise<int> promise1;
     111           4 :             std::promise<int> promise2;
     112             : 
     113           2 :             const int initVal[10] = {0};
     114             : 
     115           4 :             runtime.task(SpReadArray(initVal, SpArrayView(10).removeItems(5,9)),
     116           2 :                          [&](const SpArrayAccessor<const int>& /*initValParam*/){
     117           2 :                 promise1.set_value(0);
     118           2 :                 promise2.get_future().wait();
     119           6 :             });
     120             :             
     121           2 :             promise1.get_future().wait();
     122             :             
     123           0 :             runtime.task(SpRead(initVal[0]),
     124           2 :                          [&](const int& /*initValParam*/){
     125           2 :                 promise2.set_value(0);
     126           4 :             });        
     127             :             
     128           2 :             runtime.waitAllTasks();
     129             :         }
     130           2 :         std::cout << "Next" << std::endl;
     131             :         {
     132           4 :             std::promise<int> promise1;
     133           4 :             std::promise<int> promise2;
     134             : 
     135           2 :             int initVal[10] = {0};
     136             : 
     137           4 :             runtime.task(SpReadArray(initVal, SpArrayView(10).removeItems(1)),
     138           2 :                          [&](const SpArrayAccessor<const int>& /*initValParam*/){
     139           2 :                 promise1.set_value(0);
     140           2 :                 promise2.get_future().wait();
     141           6 :             });
     142             :             
     143           2 :             promise1.get_future().wait();
     144             :             
     145           0 :             runtime.task(SpWrite(initVal[1]),
     146           2 :                          [&](int& /*initValParam*/){
     147           2 :                 promise2.set_value(0);
     148           4 :             });        
     149             :             
     150           2 :             runtime.waitAllTasks();
     151             :         }
     152           2 :         std::cout << "Next" << std::endl;
     153             :         {
     154           4 :             std::promise<int> promise1;
     155           4 :             std::promise<int> promise2;
     156             : 
     157           2 :             int initVal[10] = {0};
     158             : 
     159           4 :             runtime.task(SpReadArray(initVal, SpArrayView(10).removeItems(0)),
     160           2 :                          [&](const SpArrayAccessor<const int>& /*initValParam*/){
     161           2 :                 promise1.set_value(0);
     162           2 :                 promise2.get_future().wait();
     163           6 :             });
     164             : 
     165           2 :             promise1.get_future().wait();
     166             : 
     167           0 :             runtime.task(SpWrite(initVal[0]),
     168           2 :                          [&](int& /*initValParam*/){
     169           2 :                 promise2.set_value(0);
     170           4 :             });
     171             : 
     172           2 :             runtime.waitAllTasks();
     173             :         }
     174             : 
     175           2 :         runtime.stopAllThreads();
     176           2 :     }
     177             : 
     178             : 
     179             :     void TestMaxParallel(){
     180             :         const int dumbVal = 0;
     181             : 
     182             :         SpRuntime runtime(10);
     183             : 
     184             :         std::promise<long int> promises_A[10];
     185             :         for(int idxThread = 0 ; idxThread < runtime.getNbThreads() ; ++idxThread){
     186             :             runtime.task(SpRead(dumbVal),
     187             :                          [&,idxThread](const int& /*dumbValParam*/){
     188             :                 promises_A[idxThread].set_value(idxThread);
     189             :                 const long int res = promises_A[(idxThread+1)%10].get_future().get();
     190             :                 UASSERTETRUE(res == (idxThread+1)%10);
     191             :             });
     192             :         }
     193             : 
     194             :         std::promise<long int> promises_B[10];
     195             :         for(int idxThread = 0 ; idxThread < runtime.getNbThreads() ; ++idxThread){
     196             :             runtime.task(SpRead(dumbVal),
     197             :                          [&,idxThread](const int& /*dumbValParam*/){
     198             :                 promises_B[idxThread].set_value(idxThread);
     199             :                 const long int res = promises_B[(idxThread+1)%10].get_future().get();
     200             :                 UASSERTETRUE(res == (idxThread+1)%10);
     201             :             });
     202             :         }
     203             : 
     204             : 
     205             :         std::promise<long int> promises_C[10];
     206             :         for(int idxThread = 0 ; idxThread < runtime.getNbThreads() ; ++idxThread){
     207             :             runtime.task(SpRead(dumbVal),
     208             :                          [&,idxThread](const int& /*dumbValParam*/){
     209             :                 promises_C[idxThread].set_value(idxThread);
     210             :                 const long int res = promises_C[(idxThread+1)%10].get_future().get();
     211             :                 UASSERTETRUE(res == (idxThread+1)%10);
     212             :             });
     213             :         }
     214             : 
     215             : 
     216             :         std::promise<long int> promises_D[5];
     217             :         for(int idxThread = 0 ; idxThread < runtime.getNbThreads()/2 ; ++idxThread){
     218             :             runtime.task(SpRead(dumbVal),
     219             :                          [&,idxThread](const int& /*dumbValParam*/){
     220             :                 promises_D[idxThread].set_value(idxThread);
     221             :                 const long int res = promises_D[(idxThread+1)%5].get_future().get();
     222             :                 UASSERTETRUE(res == (idxThread+1)%5);
     223             :             });
     224             :         }
     225             : 
     226             :         runtime.waitAllTasks();
     227             :     }
     228             : 
     229           1 :     void SetTests() {
     230           1 :         Parent::AddTest(&TestRespect::TestBasic, "Basic tests");
     231           1 :         Parent::AddTest(&TestRespect::TestBasic, "Basic test max parallel");
     232           1 :     }
     233             : };
     234             : 
     235             : // You must do this
     236           1 : TestClass(TestRespect)
     237             : 
     238             : 

Generated by: LCOV version 1.14