Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
MBI: typo + fix one Sendrecv test
[simgrid.git] / teshsuite / smpi / MBI / P2PSendrecvArgGenerator.py
1 #! /usr/bin/python3
2 import os
3 import sys
4 import generator_utils as gen
5
6 template = """// @{generatedby}@
7 /* ///////////////////////// The MPI Bugs Initiative ////////////////////////
8
9   Origin: @{origin}@
10
11   Description: @{shortdesc}@
12     @{longdesc}@
13
14     Version of MPI: Conforms to MPI 1.1, does not require MPI 2 implementation
15
16 BEGIN_MPI_FEATURES
17     P2P!basic: Yes
18     P2P!nonblocking: Lacking
19     P2P!persistent: Lacking
20     COLL!basic: Lacking
21     COLL!nonblocking: Lacking
22     COLL!persistent: Lacking
23     COLL!tools: Lacking
24     RMA: Lacking
25 END_MPI_FEATURES
26
27 BEGIN_MBI_TESTS
28   $ mpirun -np 3 ${EXE}
29   | @{outcome}@
30   | @{errormsg}@
31 END_MBI_TESTS
32 //////////////////////       End of MBI headers        /////////////////// */
33
34 #include <mpi.h>
35 #include <stdio.h>
36 #include <stdlib.h>
37
38 #define N 10
39
40 int main(int argc, char **argv) {
41   int nprocs = -1 , rank = -1;
42
43   MPI_Init(&argc, &argv);
44   MPI_Comm_size(MPI_COMM_WORLD, &nprocs);
45   MPI_Comm_rank(MPI_COMM_WORLD, &rank);
46
47   if (nprocs < 3)
48     printf("MBI ERROR: This test needs at least 3 processes to produce a bug!\\n");
49
50   MPI_Comm newcom = MPI_COMM_WORLD;
51   MPI_Datatype type = MPI_INT;
52
53   int src = 0; int dest = 0;
54   int stag = 1; int rtag = 1;
55   int buff_size = N;
56
57   @{init1}@
58   @{init2}@
59   @{init3}@
60
61   if (rank == 0) {
62     src = 1;
63     @{start1}@
64     @{operation1}@
65     @{fini1}@
66   } else if (rank == 1) {
67     src = 2; dest = 0;
68     @{start2}@
69     @{change_arg}@
70     @{operation2}@
71     @{fini2}@
72   } else if (rank == 2) {
73     dest = 1;
74     @{start3}@
75     @{operation3}@
76     @{fini3}@
77   }
78
79   @{free1}@
80   @{free2}@
81   @{free3}@
82
83   MPI_Finalize();
84   printf("Rank %d finished normally\\n", rank);
85   return 0;
86 }
87 """
88
89 for s in gen.send:
90     for r in gen.recv:
91         for sr in gen.sendrecv:
92             patterns = {}
93             patterns = {'s': s, 'r': r, 'sr': sr}
94             patterns['origin'] = "RTED"
95             patterns['generatedby'] = f'DO NOT EDIT: this file was generated by {os.path.basename(sys.argv[0])}. DO NOT EDIT.'
96
97             patterns['init1'] = gen.init[r]("1").replace("buf1=-1", "buf1[N]={-1}")
98             patterns['start1'] = gen.start[r]("1")
99             patterns['operation1'] = gen.operation[r]("1")
100             patterns['fini1'] = gen.fini[r]("1")
101             patterns['free1'] = gen.free[r]("1")
102
103             patterns['init2'] = gen.init[sr]("2")
104             patterns['start2'] = gen.start[sr]("2")
105             patterns['operation2'] = gen.operation[sr]("2")
106             patterns['fini2'] = gen.fini[sr]("2")
107             patterns['free2'] = gen.free[sr]("2")
108
109             patterns['init3'] = gen.init[s]("3").replace("buf3=rank", "buf3[N]={rank}")
110             patterns['start3'] = gen.start[s]("3")
111             patterns['operation3'] = gen.operation[s]("3")
112             patterns['fini3'] = gen.fini[s]("3")
113             patterns['free3'] = gen.free[s]("3")
114
115             patterns['change_arg'] = ''
116
117             # Generate a code with distinct buffer
118             replace = patterns.copy()
119             replace['origin'] = 'MBI'
120             replace['shortdesc'] = 'Correct usage of Sendrecv function.'
121             replace['longdesc'] = 'Correct usage of Sendrecv function.'
122             replace['outcome'] = 'OK'
123             replace['errormsg'] = 'OK'
124             gen.make_file(template, f'InvalidParam_Buffer_{s}_{sr}_{r}_ok.c', replace)
125
126             # Generate a code with non distinct buffer
127             replace = patterns.copy()
128             replace['shortdesc'] = 'Invalid buffer on Sendrecv function.'
129             replace['longdesc'] = 'Invalid buffer on Sendrecv, the two buffers must be distinct.'
130             replace['outcome'] = 'ERROR: InvalidBuffer'
131             replace['errormsg'] = '@{sr}@ at @{filename}@:@{line:MBIERROR}@ send buffer and recv buffer must be distinct.'
132             replace['change_arg'] = gen.write[sr]("2")
133             replace['operation2'] = gen.operation[sr]("2")  + " /* MBIERROR */"
134             gen.make_file(template, f'InvalidParam_Buffer_{s}_{sr}_{r}_nok.c', replace)