Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
[MBI] Import generator_utils as gen.
[simgrid.git] / teshsuite / smpi / MBI / RMAReqLifecycleGenerator.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: Lacking
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: @{rmafeature}@
25 END_MPI_FEATURES
26
27 BEGIN_MBI_TESTS
28   $ mpirun -np 2 ${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 20
39
40 int main(int argc, char **argv) {
41   int rank, numProcs;
42
43   MPI_Init(&argc, &argv);
44   MPI_Comm_size(MPI_COMM_WORLD, &numProcs);
45   MPI_Comm_rank(MPI_COMM_WORLD, &rank);
46
47   if (numProcs < 2)
48     printf("MBI ERROR: This test needs at least 2 processes to produce a bug!\\n");
49
50   int *winbuf = malloc(N * sizeof(int));
51
52   MPI_Win win;
53   MPI_Win_create(winbuf, N * sizeof(int), 1, MPI_INFO_NULL, MPI_COMM_WORLD, &win);
54
55   MPI_Datatype type = MPI_INT;
56   int target = 1;
57
58   @{epoch}@
59
60   if (rank == 0) {
61     @{epoch2}@
62
63     @{init}@
64     @{operation}@
65
66     @{finEpoch2}@
67   }
68
69   @{finEpoch}@
70
71   MPI_Win_free(&win);
72
73   free(winbuf);
74
75   MPI_Finalize();
76
77   printf("Rank %d finished normally\\n", rank);
78   return 0;
79 }
80 """
81
82
83 for e1 in gen.epoch:
84     for p in gen.rma:
85         patterns = {}
86         patterns = {'e1': e1, 'p': p}
87         patterns['origin'] = "MPI-Corrbench"
88         patterns['generatedby'] = f'DO NOT EDIT: this file was generated by {os.path.basename(sys.argv[0])}. DO NOT EDIT.'
89         patterns['rmafeature'] = 'Yes'
90         patterns['p'] = p
91         patterns['e1'] = e1
92         patterns['epoch'] = gen.epoch[e1]("1")
93         patterns['finEpoch'] = gen.finEpoch[e1]("1")
94         patterns['epoch2'] = ""
95         patterns['finEpoch2'] = ""
96         patterns['init'] = gen.init[p]("1")
97         patterns['operation'] = gen.operation[p]("1")
98
99         # Generate a code correct
100         replace = patterns
101         replace['shortdesc'] = 'Correct code'
102         replace['longdesc'] = 'Correct code'
103         replace['outcome'] = 'OK'
104         replace['errormsg'] = 'OK'
105         gen.make_file(template, f'ReqLifecycle_RMA_{e1}_{p}_ok.c', replace)
106
107         # Generate a code with missing open epoch
108         replace = patterns
109         replace['shortdesc'] = f"Request lifecycle, missing open {e1} epoch"
110         replace['longdesc'] = f"Request lifecycle, missing open {e1} epoch"
111         replace['outcome'] = 'ERROR: MissingStart'
112         replace['errormsg'] = '@{e1}@ at @{filename}@:@{line:MBIERROR}@ has missing'
113         replace['epoch'] = f"/* MBIERROR MISSING: {gen.epoch[e1]('1')} */"
114         gen.make_file(template, f'ReqLifecycle_RMA_MissingOpen_{e1}_{p}_nok.c', replace)
115
116         # Generate a code with missing close epoch
117         replace = patterns
118         replace['shortdesc'] = f"Request lifecycle, missing close {e1} epoch"
119         replace['longdesc'] = f"Request lifecycle, missing close {e1} epoch"
120         replace['outcome'] = 'ERROR: MissingWait'
121         replace['errormsg'] = '@{e1}@ at @{filename}@:@{line:MBIERROR}@ has missing'
122         replace['epoch'] = gen.epoch[e1]("1")
123         replace['finEpoch'] = f"/* MBIERROR MISSING: {gen.finEpoch[e1]('1')} */"
124         gen.make_file(template, f'ReqLifecycle_RMA_MissingClose_{e1}_{p}_nok.c', replace)
125
126 for e1 in gen.epoch:
127     for e2 in gen.epoch:
128         for p in gen.rma:
129             patterns = {}
130             patterns = {'e1': e1, 'e2': e2, 'p': p}
131             patterns['origin'] = "MPI-Corrbench"
132             patterns['generatedby'] = f'DO NOT EDIT: this file was generated by {os.path.basename(sys.argv[0])}. DO NOT EDIT.'
133             patterns['rmafeature'] = 'Yes'
134             patterns['p'] = p
135             patterns['e1'] = e1
136             patterns['e2'] = e2
137             patterns['epoch'] = gen.epoch[e1]("1")
138             patterns['finEpoch'] = gen.finEpoch[e1]("1")
139             patterns['epoch2'] = gen.epoch[e2]("1") + " /* MBIERROR */"
140             patterns['finEpoch2'] = gen.finEpoch[e2]("1") + " /* MBIERROR */"
141             patterns['init'] = gen.init[p]("1")
142             patterns['operation'] = gen.operation[p]("1")
143
144             # Generate a code with epoch into an epoch
145             replace = patterns
146             replace['shortdesc'] = f"Request lifecycle, {e2} epoch into {e1} epoch"
147             replace['longdesc'] = f"Request lifecycle, {e2} epoch into {e1} epoch"
148             replace['outcome'] = 'ERROR: MissingWait' #FIXME: New type of error
149             replace['errormsg'] = '@{e2}@ at @{filename}@:@{line:MBIERROR}@ has in an other epoch'
150             gen.make_file(template, f'ReqLifecycle_RMA_TwoEpoch_{e1}_{e2}_{p}_nok.c', replace)