source: icGREP/icgrep-devel/icgrep/combine/icgrep-test/icgrep-test.cpp @ 5516

Last change on this file since 5516 was 5516, checked in by faldebey, 21 months ago

added combinatorial testing tool

File size: 8.9 KB
Line 
1#include "icgrep-test.h"
2#include "../stringGen.h"
3#include <iostream>
4#include <vector>
5#include <string>
6#include <algorithm>
7#include <fstream>
8#include <boost/filesystem.hpp>
9#include <boost/iostreams/device/mapped_file.hpp>
10
11
12using namespace std;
13namespace io = boost::iostreams;
14
15IcgrepTest::IcgrepTest(){}
16
17void resetBash(string fileName){
18        ofstream file;
19        file.open(fileName);
20        file << "#!/bin/bash\n\n";
21        file << "echo \"Starting bash file: " << fileName << "\"\n";
22        file.close();
23}
24
25void clearDir(string dir){
26        namespace fs=boost::filesystem;
27        fs::path path_to_remove(dir);
28        for (fs::directory_iterator end_dir_it, it(path_to_remove); it!=end_dir_it; ++it) {
29                fs::remove_all(it->path());
30        }
31}
32void writeToBash(string fileName, string value){
33        ofstream file;
34        file.open(fileName, ios::app);
35        file << value << endl;
36        file.close();
37}
38void writetoFile(string content, string dir, int fileNo){
39        string fileName = dir + to_string(fileNo);
40        ofstream file;
41        file.open(fileName);
42        if (!file.is_open()){
43                cout << "Could not open input file\n";
44        }
45        file << content << endl;
46        file.close();
47}
48
49void IcgrepTest::prepare(){
50        clearDir("../icgrep/combine/regs");
51        clearDir("../icgrep/combine/files");
52        resetBash("../icgrep/combine/icgrep-test/grep/icgrep-bash.sh");
53        resetBash("../icgrep/combine/icgrep-test/grep/grep-bash.sh");
54        resetBash("../icgrep/combine/icgrep-test/pcre/icgrep-bash.sh");
55        resetBash("../icgrep/combine/icgrep-test/pcre/pcre-bash.sh");
56        remove("..//icgrep/combine/icgrep-test/grep/icgrep-result");
57        remove("..//icgrep/combine/icgrep-test/grep/grep-result");
58        remove("..//icgrep/combine/icgrep-test/pcre/icgrep-result");
59        remove("..//icgrep/combine/icgrep-test/pcre/pcre-result");
60}
61
62bool hasFlag(string flag, std::vector<string> flags){
63        return (std::find(flags.begin(), flags.end(), flag) != flags.end()) ? true : false;
64}
65
66std::vector<string> removeFlag(string flag, std::vector<string> flags){
67        flags.erase(std::remove(flags.begin(), flags.end(), flag), flags.end());
68        return flags;
69}
70
71void IcgrepTest::buildTest(string re, vector<string> flags, re::RE_Syntax syntax, int testNum){
72        cout << "test: " << testNum << endl;
73        cout << "RE: \'" << re << "\'" << endl;
74
75        string reDir = "../icgrep/combine/regs/reg";
76        string strDir = "../icgrep/combine/files/file";
77
78        StringGenerator strGen;
79        writetoFile(strGen.generate(re, flags, syntax) + "\n", strDir, testNum);
80
81        if (syntax == re::RE_Syntax::ERE){
82                string icgrepScript = "../icgrep/combine/icgrep-test/grep/icgrep-bash.sh";
83                string grepScript = "../icgrep/combine/icgrep-test/grep/grep-bash.sh";
84                string icgrepResult = "../icgrep/combine/icgrep-test/grep/icgrep-result";
85                string grepResult = "../icgrep/combine/icgrep-test/grep/grep-result";
86
87                writeToBash(icgrepScript, "echo \"" + re + "\" >> " + icgrepResult);
88                writeToBash(grepScript, "echo \"" + re + "\" >> " + grepResult);
89
90                if (hasFlag("-f", flags)){
91                        flags = removeFlag("-f", flags);
92                        flags = removeFlag("-e", flags);
93                        writetoFile(re, reDir, testNum);
94               
95                        writeToBash(icgrepScript, 
96                                "./icgrep " + strGen.stringifyVec(flags, " ") + " -f " + reDir + to_string(testNum)+
97                                 " " + strDir + to_string(testNum) + " >> " + icgrepResult + "\n");
98
99                        writeToBash(grepScript, 
100                                "grep " + strGen.stringifyVec(flags, " ") + " -f " + reDir + to_string(testNum) + 
101                                " " + strDir + to_string(testNum) + " >> " + grepResult + "\n");
102                       
103                }
104                else if (hasFlag("-e", flags)){
105                        flags = removeFlag("-f", flags);
106                        flags = removeFlag("-e", flags);
107                        writeToBash(icgrepScript, 
108                                "./icgrep " + strGen.stringifyVec(flags, " ") + " -e \'" + re + "\' " +
109                                " " + strDir + to_string(testNum) + " >> " + icgrepResult + "\n");
110
111                        writeToBash(grepScript, 
112                                "grep " + strGen.stringifyVec(flags, " ") + " -e \'" + re + "\' " +
113                                " " + strDir + to_string(testNum) + " >> " + grepResult + "\n");
114                }
115                else{
116                       
117                        writeToBash(icgrepScript, 
118                                "./icgrep " + strGen.stringifyVec(flags, " ") + " \'" + re + "\' " +
119                                " " + strDir + to_string(testNum) + " >> " + icgrepResult + "\n");
120
121                        writeToBash(grepScript, 
122                                "grep " + strGen.stringifyVec(flags, " ") + " \'" + re + "\' " +
123                                " " + strDir + to_string(testNum) + " >> " + grepResult + "\n");
124
125                }
126        }
127        else if (syntax == re::RE_Syntax::BRE){
128
129                string icgrepScript = "../icgrep/combine/icgrep-test/grep/icgrep-bash.sh";
130                string grepScript = "../icgrep/combine/icgrep-test/grep/grep-bash.sh";
131                string icgrepResult = "../icgrep/combine/icgrep-test/grep/icgrep-result";
132                string grepResult = "../icgrep/combine/icgrep-test/grep/grep-result";
133                vector<string> gflags;
134
135                writeToBash(icgrepScript, "echo \"" + re + "\" >> " + icgrepResult);
136                writeToBash(grepScript, "echo \"" + re + "\" >> " + grepResult);
137
138                if (hasFlag("-f", flags)){
139                        flags = removeFlag("-f", flags);
140                        flags = removeFlag("-e", flags);
141                        gflags = removeFlag("-G", flags);
142                        writetoFile(re, reDir, testNum);
143               
144                        writeToBash(icgrepScript, 
145                                "./icgrep " + strGen.stringifyVec(flags, " ") + " -f " + reDir + to_string(testNum) + 
146                                " " + strDir + to_string(testNum) + " >> " + icgrepResult + "\n");
147
148
149                        writeToBash(grepScript, 
150                                "grep " + strGen.stringifyVec(gflags, " ") + " -f " + reDir + to_string(testNum) + 
151                                " " + strDir + to_string(testNum) + " >> " + grepResult + "\n");
152
153                       
154                }
155                else if (hasFlag("-e", flags)){
156                        flags = removeFlag("-f", flags);
157                        flags = removeFlag("-e", flags);
158                        gflags = removeFlag("-G", flags);
159                        writeToBash(icgrepScript, 
160                                "./icgrep " + strGen.stringifyVec(flags, " ") + " -e \'" + re + "\' " +
161                                strDir + to_string(testNum) + " >> " + icgrepResult + "\n");
162
163                        writeToBash(grepScript, 
164                                "grep " + strGen.stringifyVec(gflags, " ") + " -e \'" + re + "\' " +
165                                strDir + to_string(testNum) + " >> " + grepResult + "\n");
166
167                }
168                else{
169                        gflags = removeFlag("-G", flags);
170                        writeToBash(icgrepScript, 
171                                "./icgrep " + strGen.stringifyVec(flags, " ") + " \'" + re + "\' " +
172                                strDir + to_string(testNum) + " >> " + icgrepResult + "\n");
173
174                        writeToBash(grepScript, 
175                                "grep " + strGen.stringifyVec(gflags, " ") + " \'" + re + "\' " +
176                                strDir + to_string(testNum) + " >> " + icgrepResult + "\n");
177
178                }
179        }
180        else {
181
182                string icgrepScript = "../icgrep/combine/icgrep-test/pcre/icgrep-bash.sh";
183                string pcreScript = "../icgrep/combine/icgrep-test/pcre/pcre-bash.sh";
184                string icgrepResult = "../icgrep/combine/icgrep-test/pcre/icgrep-result";
185                string pcreResult = "../icgrep/combine/icgrep-test/pcre/pcre-result";
186                vector<string> pflags;
187
188                writeToBash(icgrepScript, "echo \"" + re + "\" >> " + icgrepResult);
189                writeToBash(pcreScript, "echo \"" + re + "\" >> " + pcreResult);
190
191                if (hasFlag("-f", flags)){
192                        flags = removeFlag("-f", flags);
193                        flags = removeFlag("-e", flags);
194                        pflags = removeFlag("-P", flags);
195                        writetoFile(re, reDir, testNum);
196               
197                        writeToBash(icgrepScript, 
198                                "./icgrep " + strGen.stringifyVec(flags, " ") + " -f " + reDir + to_string(testNum) + 
199                                " " + strDir + to_string(testNum) + " >> " + icgrepResult + "\n");
200
201
202                        writeToBash(pcreScript, 
203                                "pcregrep " + strGen.stringifyVec(pflags, " ") + " -f " + reDir + to_string(testNum) + 
204                                " " + strDir + to_string(testNum) + " >> " + pcreResult + "\n");
205                       
206                }
207                else if (hasFlag("-e", flags)){
208                        flags = removeFlag("-f", flags);
209                        flags = removeFlag("-e", flags);
210                        pflags = removeFlag("-P", flags);
211                        writeToBash(icgrepScript, 
212                                "./icgrep " + strGen.stringifyVec(flags, " ") + " -e \'" + re + "\' " +
213                                strDir + to_string(testNum) + " >> " + icgrepResult + "\n");
214
215                        writeToBash(pcreScript, 
216                                "pcregrep " + strGen.stringifyVec(pflags, " ") + " -e \'" + re + "\' " +
217                                strDir + to_string(testNum) + " >> " + pcreResult + "\n");
218                       
219                }
220                else{
221                        pflags = removeFlag("-P", flags);
222                        writeToBash(icgrepScript, 
223                                "./icgrep " + strGen.stringifyVec(flags, " ") + " \'" + re + "\' " +
224                                strDir + to_string(testNum) + " >> " + icgrepResult + "\n");
225
226                        writeToBash(pcreScript, 
227                                "pcregrep " + strGen.stringifyVec(pflags, " ") + " \'" + re + "\' " +
228                                strDir + to_string(testNum) + " >> " + pcreResult + "\n");
229
230                }
231        }
232}
233
234void IcgrepTest::execute(){
235        system("../icgrep/combine/icgrep-test/grep/icgrep-bash.sh");
236        system("../icgrep/combine/icgrep-test/grep/grep-bash.sh");
237        system("../icgrep/combine/icgrep-test/pcre/icgrep-bash.sh");
238        system("../icgrep/combine/icgrep-test/pcre/pcre-bash.sh");
239}
240
241void compareResults(string dir1, string dir2, string testName){
242        io::mapped_file_source f1(dir1);
243    io::mapped_file_source f2(dir2);
244
245    if(    f1.size() == f2.size()
246        && std::equal(f1.data(), f1.data() + f1.size(), f2.data())
247       )
248        std::cout << testName << "test suceeded!\n";
249    else
250        std::cout << testName << "test FAILED!\n";
251}
252
253void IcgrepTest::getResult(){
254
255        compareResults("..//icgrep/combine/icgrep-test/grep/icgrep-result", "..//icgrep/combine/icgrep-test/grep/grep-result", "GNU grep");
256    compareResults("..//icgrep/combine/icgrep-test/pcre/icgrep-result", "..//icgrep/combine/icgrep-test/pcre/pcre-result", "PCRE grep");
257
258    cout << "Done\n";
259}
260
Note: See TracBrowser for help on using the repository browser.