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

Last change on this file since 5620 was 5620, checked in by nmedfort, 19 months ago

Bug fixes for multigrep mode. Optional PabloKernel? branch hit counter added. Minor optimizations.

File size: 9.1 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#include <boost/algorithm/string/replace.hpp>
11
12
13using namespace std;
14namespace io = boost::iostreams;
15namespace fs=boost::filesystem;
16
17IcgrepTest::IcgrepTest(){}
18
19std::size_t directorySize(fs::path path)
20{
21        return std::count_if(fs::directory_iterator(path),
22                         fs::directory_iterator(), 
23                         [](const fs::directory_entry& e) { 
24                          return true;  });
25}
26
27void IcgrepTest::backup(){
28        int count = directorySize("../icgrep/combine/Archive");
29
30        fs::path src("../icgrep/combine/icgrep-test");
31        fs::path dst("../icgrep/combine/Archive/test" + to_string(count+1));
32        if (!fs::create_directory(dst))
33    {
34        throw std::runtime_error("Cannot create destination directory " + dst.string());
35    }
36
37        for (const auto& dirEnt : fs::recursive_directory_iterator{src})
38    {
39        const auto& path = dirEnt.path();
40        auto relativePathStr = path.string();
41        boost::replace_first(relativePathStr, src.string(), "");
42        fs::copy(path, dst / relativePathStr);
43    }
44}
45void IcgrepTest::resetBash(string fileName){
46        ofstream file;
47        file.open(fileName);
48        file << "#!/bin/bash\n\n";
49        file << "echo \"Starting bash file: " << fileName << "\"\n";
50        file.close();
51        //give permission.
52        string cmd = "chmod +x " + fileName;
53        system(cmd.c_str());
54}
55
56void IcgrepTest::clearDir(string dir){
57        fs::path path_to_remove(dir);
58        for (fs::directory_iterator end_dir_it, it(path_to_remove); it!=end_dir_it; ++it) {
59                fs::remove_all(it->path());
60        }
61}
62void IcgrepTest::writeToBash(string fileName, string value){
63        ofstream file;
64        file.open(fileName, ios::app);
65        file << value << endl;
66        file.close();
67}
68void IcgrepTest::writetoFile(string content, string dir, int fileNo){
69        string fileName = dir + to_string(fileNo);
70        ofstream file;
71        file.open(fileName);
72        if (!file.is_open()){
73                cerr << "Could not open input file\n";
74        }
75        file << content << endl;
76        file.close();
77}
78
79void IcgrepTest::prepare(){
80        backup();
81        clearDir("../icgrep/combine/icgrep-test/regs");
82        clearDir("../icgrep/combine/icgrep-test/files");
83        resetBash("../icgrep/combine/icgrep-test/grep/icgrep-bash.sh");
84        resetBash("../icgrep/combine/icgrep-test/grep/grep-bash.sh");
85        resetBash("../icgrep/combine/icgrep-test/ugrep/icgrep-bash.sh");
86        resetBash("../icgrep/combine/icgrep-test/ugrep/ugrep-bash.sh");
87        remove("..//icgrep/combine/icgrep-test/grep/icgrep-result");
88        remove("..//icgrep/combine/icgrep-test/grep/grep-result");
89        remove("..//icgrep/combine/icgrep-test/ugrep/icgrep-result");
90        remove("..//icgrep/combine/icgrep-test/ugrep/ugrep-result");
91}
92
93bool IcgrepTest::hasFlag(string flag, std::vector<string> flags){
94        for (auto f : flags){
95                if (strncmp(f.c_str(), flag.c_str(), flag.size()) == 0){
96                        return true;
97                }
98        }
99        return false;
100}
101
102std::vector<string> IcgrepTest::removeFlag(string flag, std::vector<string> flags){
103        int c = 0;
104        for (auto f : flags){
105                if (strncmp(f.c_str(), flag.c_str(), flag.size()) == 0){
106                        flags.erase(flags.begin()+c);
107                }
108                c++;
109        }
110        return flags;
111}
112
113void IcgrepTest::buildTest(string re, vector<string> flags, re::RE_Syntax syntax, int testNum){
114        cout << "test: " << testNum << endl;
115        cout << "RE: \'" << re << "\'" << endl;
116
117        string reDir = "../icgrep/combine/icgrep-test/regs/reg";
118        string strDir = "../icgrep/combine/icgrep-test/files/file";
119
120        StringGenerator strGen;
121        writetoFile(strGen.generate(re, flags, syntax) + "\n", strDir, testNum);
122        //remove icgrep specific flags for comparison.
123        vector<string> gflags = removeFlag("-t", flags);
124        gflags = removeFlag("-BlockSize", gflags);
125        gflags = removeFlag("-P", gflags);
126        gflags = removeFlag("-f", gflags);
127        gflags = removeFlag("-e", gflags);
128
129        if (syntax == re::RE_Syntax::ERE){
130                string icgrepScript = "../icgrep/combine/icgrep-test/grep/icgrep-bash.sh";
131                string grepScript = "../icgrep/combine/icgrep-test/grep/grep-bash.sh";
132                string icgrepResult = "../icgrep/combine/icgrep-test/grep/icgrep-result";
133                string grepResult = "../icgrep/combine/icgrep-test/grep/grep-result";
134
135                writeToBash(icgrepScript, "echo \"" + re + "\" | tee -a " + icgrepResult);
136                writeToBash(grepScript, "echo \"" + re + "\" | tee -a " + grepResult);
137
138                if (hasFlag("-f", flags)){
139                        flags = removeFlag("-f", flags);
140                        flags = removeFlag("-e", flags);
141                       
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                else if (hasFlag("-e", flags)){
149                        flags = removeFlag("-f", flags);
150                        flags = removeFlag("-e", flags);
151
152                        writeToBash(icgrepScript, 
153                                "./icgrep " + strGen.stringifyVec(flags, " ") + " -e \'" + re + "\' " +
154                                " " + strDir + to_string(testNum) + " >> " + icgrepResult + "\n");
155                }
156                else{
157                        writeToBash(icgrepScript, 
158                                "./icgrep " + strGen.stringifyVec(flags, " ") + " \'" + re + "\' " +
159                                " " + strDir + to_string(testNum) + " >> " + icgrepResult + "\n");
160                }
161
162                writeToBash(grepScript, 
163                        "grep " + strGen.stringifyVec(gflags, " ") + " \'" + re + "\' " +
164                        " " + strDir + to_string(testNum) + " >> " + grepResult + "\n");
165        }
166        else if (syntax == re::RE_Syntax::BRE){
167
168                string icgrepScript = "../icgrep/combine/icgrep-test/grep/icgrep-bash.sh";
169                string grepScript = "../icgrep/combine/icgrep-test/grep/grep-bash.sh";
170                string icgrepResult = "../icgrep/combine/icgrep-test/grep/icgrep-result";
171                string grepResult = "../icgrep/combine/icgrep-test/grep/grep-result";
172
173                writeToBash(icgrepScript, "echo \"" + re + "\" | tee -a " + icgrepResult);
174                writeToBash(grepScript, "echo \"" + re + "\" | tee -a " + grepResult);
175
176                if (hasFlag("-f", flags)){
177                        flags = removeFlag("-f", flags);
178                        flags = removeFlag("-e", flags);
179
180                        writetoFile(re, reDir, testNum);
181                        writeToBash(icgrepScript, 
182                                "./icgrep " + strGen.stringifyVec(flags, " ") + " -f " + reDir + to_string(testNum) + 
183                                " " + strDir + to_string(testNum) + " >> " + icgrepResult + "\n");
184
185                }
186                else if (hasFlag("-e", flags)){
187                        flags = removeFlag("-f", flags);
188                        flags = removeFlag("-e", flags);
189                       
190                        writeToBash(icgrepScript, 
191                                "./icgrep " + strGen.stringifyVec(flags, " ") + " -e \'" + re + "\' " +
192                                strDir + to_string(testNum) + " >> " + icgrepResult + "\n");
193                }
194                else{
195                        writeToBash(icgrepScript, 
196                                "./icgrep " + strGen.stringifyVec(flags, " ") + " \'" + re + "\' " +
197                                strDir + to_string(testNum) + " >> " + icgrepResult + "\n");
198                }
199
200                writeToBash(grepScript, 
201                        "grep " + strGen.stringifyVec(gflags, " ") + " \'" + re + "\' " +
202                        strDir + to_string(testNum) + " >> " + icgrepResult + "\n");
203        }
204        else {
205                gflags = removeFlag("-c", gflags);
206
207                string icgrepScript = "../icgrep/combine/icgrep-test/ugrep/icgrep-bash.sh";
208                string ugrepScript = "../icgrep/combine/icgrep-test/ugrep/ugrep-bash.sh";
209                string icgrepResult = "../icgrep/combine/icgrep-test/ugrep/icgrep-result";
210                string ugrepResult = "../icgrep/combine/icgrep-test/ugrep/ugrep-result";
211
212                writeToBash(icgrepScript, "echo \"" + re + "\" | tee -a " + icgrepResult);
213                writeToBash(ugrepScript, "echo \"" + re + "\" | tee -a " + ugrepResult);
214
215                if (hasFlag("-f", flags)){
216                        flags = removeFlag("-f", flags);
217                        flags = removeFlag("-e", flags);
218         
219                        writetoFile(re, reDir, testNum);
220                        writeToBash(icgrepScript, 
221                                "./icgrep " + strGen.stringifyVec(flags, " ") + " -f " + reDir + to_string(testNum) + 
222                                " " + strDir + to_string(testNum) + " >> " + icgrepResult + "\n");
223                }
224                else if (hasFlag("-e", flags)){
225                        flags = removeFlag("-f", flags);
226                        flags = removeFlag("-e", flags);
227
228                        writeToBash(icgrepScript, 
229                                "./icgrep " + strGen.stringifyVec(flags, " ") + " -e \'" + re + "\' " +
230                                strDir + to_string(testNum) + " >> " + icgrepResult + "\n");
231                }
232                else{
233                        writeToBash(icgrepScript, 
234                                "./icgrep " + strGen.stringifyVec(flags, " ") + " \'" + re + "\' " +
235                                strDir + to_string(testNum) + " >> " + icgrepResult + "\n");
236
237                }
238
239                writeToBash(ugrepScript, 
240                        "./ugrep " + strGen.stringifyVec(gflags, " ") + " \'" + re + "\' " +
241                        strDir + to_string(testNum) + " >> " + ugrepResult + "\n");
242
243        }
244}
245
246void IcgrepTest::execute(){
247        system("../icgrep/combine/icgrep-test/grep/icgrep-bash.sh");
248        system("../icgrep/combine/icgrep-test/grep/grep-bash.sh");
249        system("../icgrep/combine/icgrep-test/ugrep/icgrep-bash.sh");
250        system("../icgrep/combine/icgrep-test/ugrep/ugrep-bash.sh");
251}
252
253void compareResults(string dir1, string dir2, string testName){
254        io::mapped_file_source f1(dir1);
255    io::mapped_file_source f2(dir2);
256
257    if(    f1.size() == f2.size()
258        && std::equal(f1.data(), f1.data() + f1.size(), f2.data())
259       )
260        std::cout << testName << "test suceeded!\n";
261    else
262        std::cout << testName << "test FAILED!\n";
263}
264
265void IcgrepTest::getResult(){
266
267        compareResults("../icgrep/combine/icgrep-test/grep/icgrep-result", "../icgrep/combine/icgrep-test/grep/grep-result", "GNU grep");
268    compareResults("../icgrep/combine/icgrep-test/ugrep/icgrep-result", "../icgrep/combine/icgrep-test/ugrep/ugrep-result", "ICU grep");
269
270    cout << "End of test\n";
271}
272
Note: See TracBrowser for help on using the repository browser.