summaryrefslogtreecommitdiff
path: root/lib/backupstore/StoreTestUtils.h
blob: 39013422acb164a73d69fdab1bb4d8004552493a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
// --------------------------------------------------------------------------
//
// File
//		Name:    StoreTestUtils.h
//		Purpose: Utilities for housekeeping and checking a test store
//		Created: 18/02/14
//
// --------------------------------------------------------------------------

#ifndef STORETESTUTILS__H
#define STORETESTUTILS__H

#include "Test.h"

class BackupProtocolCallable;
class BackupProtocolClient;
class SocketStreamTLS;
class TLSContext;

//! Simplifies calling setUp() with the current function name in each test.
#define SETUP() if (!setUp(__FUNCTION__)) return true; // skip this test

//! Holds the expected reference counts of each object.
extern std::vector<uint32_t> ExpectedRefCounts;

//! Holds the PID of the currently running bbstored test server.
extern int bbstored_pid;

//! Sets up (cleans up) test environment at the start of every test.
bool setUp(const char* function_name);

//! Checks account for errors and shuts down daemons at end of every test.
void tearDown();

//! Sets the expected refcount of an object, resizing vector if necessary.
void set_refcount(int64_t ObjectID, uint32_t RefCount = 1);

//! Initialises a TLSContext object using the standard certficate filenames.
void init_context(TLSContext& rContext);

//! Opens a connection to the server (bbstored).
std::auto_ptr<SocketStream> open_conn(const char *hostname,
	TLSContext& rContext);

//! Opens a connection to the server (bbstored) and logs in.
std::auto_ptr<BackupProtocolCallable> test_server_login(const char *hostname,
	TLSContext& rContext, int flags = 0);

//! Checks the number of files of each type in the store against expectations.
bool check_num_files(int files, int old, int deleted, int dirs);

//! Checks the number of blocks in files of each type against expectations.
bool check_num_blocks(BackupProtocolCallable& Client, int Current, int Old,
	int Deleted, int Dirs, int Total);

//! Checks an account for errors, returning the number of errors found and fixed.
int check_account_for_errors(Log::Level log_level = Log::WARNING);

//! Checks an account for errors, returning true if it's OK, for use in assertions.
bool check_account(Log::Level log_level = Log::WARNING);

//! Runs housekeeping on an account, to remove old and deleted files if necessary.
int64_t run_housekeeping(BackupStoreAccountDatabase::Entry& rAccount);

//! Runs housekeeping and checks the account, returning true if it's OK.
bool run_housekeeping_and_check_account();

//! Tests that all object reference counts have the expected values.
bool check_reference_counts();

//! Starts the bbstored test server running, which must not already be running.
bool StartServer();

//! Stops the currently running bbstored test server.
bool StopServer(bool wait_for_process = false);

//! Creates the standard test account, for example after delete_account().
bool create_account(int soft, int hard);

//! Deletes the standard test account, for testing behaviour with no account.
bool delete_account();

#define TEST_COMMAND_RETURNS_ERROR_OR(protocol, command, error, or_statements) \
	{ \
		TEST_CHECK_THROWS_OR(protocol . command, ConnectionException, \
			Conn_Protocol_UnexpectedReply, or_statements); \
		int type, subtype; \
		protocol.GetLastError(type, subtype); \
		if (type == BackupProtocolError::ErrorType) \
		{ \
			TEST_EQUAL_LINE(BackupProtocolError::error, subtype, \
				"command returned error: " << \
				BackupProtocolError::GetMessage(subtype)); \
			if (subtype != BackupProtocolError::error) \
			{ \
				or_statements; \
			} \
		} \
		else \
		{ \
			TEST_FAIL_WITH_MESSAGE("command returned success"); \
			or_statements; \
		} \
	} 

#define TEST_COMMAND_RETURNS_ERROR(protocol, command, error) \
	TEST_COMMAND_RETURNS_ERROR_OR(protocol, command, error,)

#endif // STORETESTUTILS__H