diff --git a/Makefile.in b/Makefile.in index 4dc2555..4110365 100644 --- a/Makefile.in +++ b/Makefile.in @@ -20,6 +20,9 @@ V=@ PROGRAMS=\ + cache_check \ + cache_restore \ + \ thin_check \ thin_dump \ thin_restore \ @@ -65,6 +68,7 @@ PDATA_OBJECTS=$(subst .cc,.o,$(SOURCE)) CXX_PROGRAM_SOURCE=\ caching/cache_check.cc \ + caching/cache_restore.cc \ \ thin-provisioning/thin_check.cc \ thin-provisioning/thin_dump.cc \ @@ -228,13 +232,19 @@ CACHE_CHECK_SOURCE=\ persistent-data/space-maps/careful_alloc.cc \ persistent-data/transaction_manager.cc \ caching/superblock.cc - CACHE_CHECK_OBJECTS=$(subst .cc,.o,$(CACHE_CHECK_SOURCE)) -cache_check: $(CACHE_CHECK_OBJECTS) caching/check.o +CACHE_RESTORE_SOURCE=$(SOURCE) +CACHE_RESTORE_OBJECTS=$(subst .cc,.o,$(CACHE_RESTORE_SOURCE)) + +cache_check: $(CACHE_CHECK_OBJECTS) caching/cache_check.o @echo " [LD] $@" $(V) $(CXX) $(CXXFLAGS) $(LDFLAGS) -o $@ $+ $(LIBS) +cache_restore: $(CACHE_RESTORE_OBJECTS) caching/cache_restore.o + @echo " [LD] $@" + $(V) $(CXX) $(CXXFLAGS) $(LDFLAGS) -o $@ $+ $(LIBS) $(LIBEXPAT) + DEPEND_FILES=\ $(subst .cc,.d,$(SOURCE)) \ $(subst .cc,.d,$(TEST_SOURCE)) \ @@ -275,7 +285,7 @@ include unit-tests/Makefile .PHONEY: features -features: thin_check cache_check +features: $(PROGRAMS) cucumber --no-color --format progress test: features unit-test diff --git a/caching/cache_check.cc b/caching/cache_check.cc index ad7d41c..3de52dc 100644 --- a/caching/cache_check.cc +++ b/caching/cache_check.cc @@ -1,21 +1,3 @@ -// Copyright (C) 2011 Red Hat, Inc. All rights reserved. -// -// This file is part of the thin-provisioning-tools source. -// -// thin-provisioning-tools is free software: you can redistribute it -// and/or modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation, either version 3 of -// the License, or (at your option) any later version. -// -// thin-provisioning-tools is distributed in the hope that it will be -// useful, but WITHOUT ANY WARRANTY; without even the implied warranty -// of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License along -// with thin-provisioning-tools. If not, see -// . - #include #include #include @@ -30,6 +12,9 @@ #include #include +#include "base/error_state.h" +#include "base/nested_output.h" + using namespace std; //---------------------------------------------------------------- diff --git a/caching/cache_restore.cc b/caching/cache_restore.cc new file mode 100644 index 0000000..b02aa2a --- /dev/null +++ b/caching/cache_restore.cc @@ -0,0 +1,82 @@ +#include "version.h" + +#include +#include +#include +#include + +using namespace std; + +//---------------------------------------------------------------- + +namespace { + void usage(ostream &out, string const &cmd) { + out << "Usage: " << cmd << " [options]" << endl + << "Options:" << endl + << " {-h|--help}" << endl + << " {-i|--input} " << endl + << " {-o|--output} " << endl + << " {-V|--version}" << endl; + } +} + +int main(int argc, char **argv) +{ + int c; + string input, output; + char const *prog_name = basename(argv[0]); + char const *short_opts = "hi:o:V"; + option const long_opts[] = { + { "help", no_argument, NULL, 'h'}, + { "input", required_argument, NULL, 'i' }, + { "output", required_argument, NULL, 'o'}, + { "version", no_argument, NULL, 'V'}, + { NULL, no_argument, NULL, 0 } + }; + + while ((c = getopt_long(argc, argv, short_opts, long_opts, NULL)) != -1) { + switch(c) { + case 'h': + usage(cout, prog_name); + return 0; + + case 'i': + input = optarg; + break; + + case 'o': + output = optarg; + break; + + case 'V': + cout << THIN_PROVISIONING_TOOLS_VERSION << endl; + return 0; + + default: + usage(cerr, prog_name); + return 1; + } + } + + if (argc != optind) { + usage(cerr, prog_name); + return 1; + } + + if (input.empty()) { + cerr << "No input file provided." << endl << endl; + usage(cerr, prog_name); + return 1; + } + + if (output.empty()) { + cerr << "No output file provided." << endl << endl; + usage(cerr, prog_name); + return 1; + } + + return 0; +} + +//---------------------------------------------------------------- + diff --git a/features/cache_restore.feature b/features/cache_restore.feature new file mode 100644 index 0000000..4ab9594 --- /dev/null +++ b/features/cache_restore.feature @@ -0,0 +1,48 @@ +Feature: thin_restore + Scenario: print version (-V flag) + When I run cache_restore with -V + Then it should pass with version + + Scenario: print version (--version flag) + When I run cache_restore with --version + Then it should pass with version + + Scenario: print help (-h) + When I run cache_restore with -h + Then it should pass with: + + """ + Usage: cache_restore [options] + Options: + {-h|--help} + {-i|--input} + {-o|--output} + {-V|--version} + """ + + Scenario: print help (--help) + When I run cache_restore with -h + Then it should pass with: + + """ + Usage: cache_restore [options] + Options: + {-h|--help} + {-i|--input} + {-o|--output} + {-V|--version} + """ + + Scenario: missing input file + When I run cache_restore with -o metadata.bin + Then it should fail with: + """ + No input file provided. + """ + + Scenario: missing output file + When I run cache_restore with -i metadata.xml + Then it should fail with: + """ + No output file provided. + """ diff --git a/features/step_definitions/cache_steps.rb b/features/step_definitions/cache_steps.rb index edba139..d82b923 100644 --- a/features/step_definitions/cache_steps.rb +++ b/features/step_definitions/cache_steps.rb @@ -55,3 +55,12 @@ end Then /^usage to stderr$/ do assert_partial_output(USAGE, all_stderr) end + +When(/^I run cache_check with (.*?)$/) do |opts| + run_simple("cache_check #{opts} #{dev_file}", false) +end + +When(/^I run cache_restore with (.*?)$/) do |opts| + run_simple("cache_restore #{opts}", false) +end +