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

Last change on this file since 5613 was 5613, checked in by faldebey, 20 months ago

different updates to CoRE

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.