2016-02-11 16:39:42 +01:00
|
|
|
#include <gtest/gtest.h>
|
|
|
|
#include <gmock/gmock.h>
|
|
|
|
#include <cryfs/config/CryConfigConsole.h>
|
|
|
|
#include <cryfs/config/CryCipher.h>
|
|
|
|
#include <cpp-utils/crypto/symmetric/ciphers.h>
|
2016-09-25 02:50:28 +02:00
|
|
|
#include <cpp-utils/io/NoninteractiveConsole.h>
|
2016-01-25 14:03:32 +01:00
|
|
|
#include "../testutils/MockConsole.h"
|
|
|
|
|
|
|
|
using namespace cryfs;
|
|
|
|
|
|
|
|
using boost::optional;
|
|
|
|
using boost::none;
|
2016-09-25 02:50:28 +02:00
|
|
|
using cpputils::NoninteractiveConsole;
|
2016-01-25 14:03:32 +01:00
|
|
|
using std::string;
|
|
|
|
using std::shared_ptr;
|
|
|
|
using std::make_shared;
|
|
|
|
using ::testing::_;
|
2018-10-19 20:34:51 +02:00
|
|
|
using ::testing::NiceMock;
|
2016-01-25 14:03:32 +01:00
|
|
|
using ::testing::Return;
|
|
|
|
using ::testing::ValuesIn;
|
|
|
|
using ::testing::HasSubstr;
|
|
|
|
using ::testing::UnorderedElementsAreArray;
|
|
|
|
using ::testing::WithParamInterface;
|
|
|
|
|
|
|
|
class CryConfigConsoleTest: public ::testing::Test {
|
|
|
|
public:
|
|
|
|
CryConfigConsoleTest()
|
2018-10-19 20:34:51 +02:00
|
|
|
: console(make_shared<NiceMock<MockConsole>>()),
|
2016-09-25 02:50:28 +02:00
|
|
|
cryconsole(console),
|
|
|
|
noninteractiveCryconsole(make_shared<NoninteractiveConsole>(console)) {
|
2016-01-25 14:03:32 +01:00
|
|
|
}
|
2018-10-19 20:34:51 +02:00
|
|
|
shared_ptr<NiceMock<MockConsole>> console;
|
2016-01-25 14:03:32 +01:00
|
|
|
CryConfigConsole cryconsole;
|
2016-02-21 01:34:21 +01:00
|
|
|
CryConfigConsole noninteractiveCryconsole;
|
2016-01-25 14:03:32 +01:00
|
|
|
};
|
|
|
|
|
|
|
|
class CryConfigConsoleTest_Cipher: public CryConfigConsoleTest {};
|
|
|
|
|
2016-01-25 14:33:40 +01:00
|
|
|
#define EXPECT_ASK_FOR_CIPHER() \
|
2016-09-25 02:50:28 +02:00
|
|
|
EXPECT_CALL(*console, askYesNo("Use default settings?", _)).Times(1).WillOnce(Return(false)); \
|
2016-01-25 14:33:40 +01:00
|
|
|
EXPECT_CALL(*console, ask(HasSubstr("block cipher"), UnorderedElementsAreArray(CryCiphers::supportedCipherNames()))).Times(1)
|
2016-01-25 14:03:32 +01:00
|
|
|
|
2016-03-01 17:45:48 +01:00
|
|
|
#define EXPECT_ASK_FOR_BLOCKSIZE() \
|
2016-09-25 02:50:28 +02:00
|
|
|
EXPECT_CALL(*console, askYesNo("Use default settings?", _)).Times(1).WillOnce(Return(false)); \
|
2016-03-01 17:45:48 +01:00
|
|
|
EXPECT_CALL(*console, ask(HasSubstr("block size"), _)).Times(1)
|
|
|
|
|
2016-09-25 20:05:38 +02:00
|
|
|
#define EXPECT_ASK_FOR_MISSINGBLOCKISINTEGRITYVIOLATION() \
|
|
|
|
EXPECT_CALL(*console, askYesNo("Use default settings?", _)).Times(1).WillOnce(Return(false)); \
|
|
|
|
EXPECT_CALL(*console, askYesNo(HasSubstr("missing block"), _)).Times(1)
|
2016-06-27 08:24:32 +02:00
|
|
|
|
2016-01-25 14:03:32 +01:00
|
|
|
TEST_F(CryConfigConsoleTest_Cipher, AsksForCipher) {
|
2016-01-25 14:33:40 +01:00
|
|
|
EXPECT_ASK_FOR_CIPHER().WillOnce(ChooseAnyCipher());
|
2016-01-25 14:03:32 +01:00
|
|
|
cryconsole.askCipher();
|
|
|
|
}
|
|
|
|
|
2016-01-25 14:33:40 +01:00
|
|
|
TEST_F(CryConfigConsoleTest_Cipher, ChooseDefaultCipher) {
|
2016-09-25 02:50:28 +02:00
|
|
|
EXPECT_CALL(*console, askYesNo("Use default settings?", _)).Times(1).WillOnce(Return(true));
|
2016-01-25 14:33:40 +01:00
|
|
|
EXPECT_CALL(*console, ask(HasSubstr("block cipher"), _)).Times(0);
|
|
|
|
string cipher = cryconsole.askCipher();
|
|
|
|
EXPECT_EQ(CryConfigConsole::DEFAULT_CIPHER, cipher);
|
2016-02-21 01:34:21 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
TEST_F(CryConfigConsoleTest_Cipher, ChooseDefaultCipherWhenNoninteractiveEnvironment) {
|
2016-09-25 02:50:28 +02:00
|
|
|
EXPECT_CALL(*console, askYesNo(HasSubstr("default"), _)).Times(0);
|
2016-02-21 01:34:21 +01:00
|
|
|
EXPECT_CALL(*console, ask(HasSubstr("block cipher"), _)).Times(0);
|
|
|
|
string cipher = noninteractiveCryconsole.askCipher();
|
|
|
|
EXPECT_EQ(CryConfigConsole::DEFAULT_CIPHER, cipher);
|
2016-01-25 14:33:40 +01:00
|
|
|
}
|
|
|
|
|
2016-03-01 17:45:48 +01:00
|
|
|
TEST_F(CryConfigConsoleTest_Cipher, AsksForBlocksize) {
|
|
|
|
EXPECT_ASK_FOR_BLOCKSIZE().WillOnce(Return(0));
|
|
|
|
cryconsole.askBlocksizeBytes();
|
|
|
|
}
|
|
|
|
|
2016-06-27 08:24:32 +02:00
|
|
|
TEST_F(CryConfigConsoleTest_Cipher, AsksForMissingBlockIsIntegrityViolation) {
|
|
|
|
EXPECT_ASK_FOR_MISSINGBLOCKISINTEGRITYVIOLATION().WillOnce(Return(true));
|
|
|
|
cryconsole.askMissingBlockIsIntegrityViolation();
|
|
|
|
}
|
|
|
|
|
2016-03-01 17:45:48 +01:00
|
|
|
TEST_F(CryConfigConsoleTest_Cipher, ChooseDefaultBlocksizeWhenNoninteractiveEnvironment) {
|
2016-09-25 02:50:28 +02:00
|
|
|
EXPECT_CALL(*console, askYesNo(HasSubstr("default"), _)).Times(0);
|
2016-03-01 17:45:48 +01:00
|
|
|
EXPECT_CALL(*console, ask(HasSubstr("block size"), _)).Times(0);
|
|
|
|
uint32_t blocksize = noninteractiveCryconsole.askBlocksizeBytes();
|
|
|
|
EXPECT_EQ(CryConfigConsole::DEFAULT_BLOCKSIZE_BYTES, blocksize);
|
|
|
|
}
|
|
|
|
|
2016-01-25 14:03:32 +01:00
|
|
|
class CryConfigConsoleTest_Cipher_Choose: public CryConfigConsoleTest_Cipher, public ::testing::WithParamInterface<string> {
|
|
|
|
public:
|
|
|
|
string cipherName = GetParam();
|
|
|
|
optional<string> cipherWarning = CryCiphers::find(cipherName).warning();
|
|
|
|
|
|
|
|
void EXPECT_DONT_SHOW_WARNING() {
|
2016-09-25 02:50:28 +02:00
|
|
|
EXPECT_CALL(*console, askYesNo(_, _)).Times(0);
|
2016-01-25 14:03:32 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
void EXPECT_SHOW_WARNING(const string &warning) {
|
2016-09-25 02:50:28 +02:00
|
|
|
EXPECT_CALL(*console, askYesNo(HasSubstr(warning), _)).WillOnce(Return(true));
|
2016-01-25 14:03:32 +01:00
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
TEST_P(CryConfigConsoleTest_Cipher_Choose, ChoosesCipherCorrectly) {
|
|
|
|
if (cipherWarning == none) {
|
|
|
|
EXPECT_DONT_SHOW_WARNING();
|
|
|
|
} else {
|
|
|
|
EXPECT_SHOW_WARNING(*cipherWarning);
|
|
|
|
}
|
|
|
|
|
|
|
|
EXPECT_ASK_FOR_CIPHER().WillOnce(ChooseCipher(cipherName));
|
|
|
|
|
|
|
|
string chosenCipher = cryconsole.askCipher();
|
|
|
|
EXPECT_EQ(cipherName, chosenCipher);
|
|
|
|
}
|
|
|
|
|
|
|
|
INSTANTIATE_TEST_CASE_P(CryConfigConsoleTest_Cipher_Choose, CryConfigConsoleTest_Cipher_Choose, ValuesIn(CryCiphers::supportedCipherNames()));
|