mirror of
https://github.com/CLIUtils/CLI11.git
synced 2025-04-29 20:23:55 +00:00
Add escaping to quoted strings, differentiate between literal and regular strings. The goal is to make string processing in config files as close as possible to toml standards. This means handing escape sequences including unicode, and differentiating between literal strings and regular strings in files and when splitting the command line. Also allowing variable names in the files to be quoted. This PR gets partway there. Removes some hacks from the previous PR to deal with unusual option names and replaces with the quoted names. --------- Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
98 lines
2.7 KiB
C++
98 lines
2.7 KiB
C++
// Copyright (c) 2017-2023, University of Cincinnati, developed by Henry Schreiner
|
|
// under NSF AWARD 1414736 and by the respective contributors.
|
|
// All rights reserved.
|
|
//
|
|
// SPDX-License-Identifier: BSD-3-Clause
|
|
|
|
#include "../fuzz/fuzzApp.hpp"
|
|
#include "app_helper.hpp"
|
|
|
|
std::string loadFailureFile(const std::string &type, int index) {
|
|
std::string fileName(TEST_FILE_FOLDER "/fuzzFail/");
|
|
fileName.append(type);
|
|
fileName += std::to_string(index);
|
|
std::ifstream crashFile(fileName, std::ios::in | std::ios::binary);
|
|
if(crashFile) {
|
|
std::vector<char> buffer(std::istreambuf_iterator<char>(crashFile), {});
|
|
|
|
std::string cdata(buffer.begin(), buffer.end());
|
|
return cdata;
|
|
}
|
|
return std::string{};
|
|
}
|
|
|
|
TEST_CASE("app_fail") {
|
|
CLI::FuzzApp fuzzdata;
|
|
auto app = fuzzdata.generateApp();
|
|
|
|
int index = GENERATE(range(1, 4));
|
|
std::string optionString;
|
|
auto parseData = loadFailureFile("fuzz_app_fail", index);
|
|
if(index >= 3 && parseData.size() > 25) {
|
|
optionString = parseData.substr(0, 25);
|
|
parseData.erase(0, 25);
|
|
}
|
|
|
|
try {
|
|
|
|
if(!optionString.empty()) {
|
|
app->add_option(optionString, fuzzdata.buffer);
|
|
}
|
|
try {
|
|
app->parse(parseData);
|
|
} catch(const CLI::ParseError & /*e*/) {
|
|
}
|
|
} catch(const CLI::ConstructionError & /*e*/) {
|
|
}
|
|
}
|
|
|
|
TEST_CASE("file_fail") {
|
|
CLI::FuzzApp fuzzdata;
|
|
auto app = fuzzdata.generateApp();
|
|
|
|
int index = GENERATE(range(1, 5));
|
|
auto parseData = loadFailureFile("fuzz_file_fail", index);
|
|
std::stringstream out(parseData);
|
|
try {
|
|
app->parse_from_stream(out);
|
|
} catch(const CLI::ParseError & /*e*/) {
|
|
}
|
|
}
|
|
|
|
TEST_CASE("app_file_gen_fail") {
|
|
CLI::FuzzApp fuzzdata;
|
|
auto app = fuzzdata.generateApp();
|
|
|
|
int index = GENERATE(range(1, 40));
|
|
std::string optionString, flagString;
|
|
auto parseData = loadFailureFile("fuzz_app_file_fail", index);
|
|
if(parseData.size() > 25) {
|
|
optionString = parseData.substr(0, 25);
|
|
parseData.erase(0, 25);
|
|
}
|
|
if(parseData.size() > 25) {
|
|
flagString = parseData.substr(0, 25);
|
|
parseData.erase(0, 25);
|
|
}
|
|
try {
|
|
|
|
if(!optionString.empty()) {
|
|
app->add_option(optionString, fuzzdata.buffer);
|
|
}
|
|
if(!flagString.empty()) {
|
|
app->add_flag(flagString, fuzzdata.intbuffer);
|
|
}
|
|
try {
|
|
app->parse(parseData);
|
|
} catch(const CLI::ParseError & /*e*/) {
|
|
return;
|
|
}
|
|
} catch(const CLI::ConstructionError & /*e*/) {
|
|
return;
|
|
}
|
|
std::string configOut = app->config_to_str();
|
|
app->clear();
|
|
std::stringstream out(configOut);
|
|
app->parse_from_stream(out);
|
|
}
|