1 /**
2 Copyright: Copyright (c) 2019, Joakim Brännström. All rights reserved.
3 License: $(LINK2 http://www.boost.org/LICENSE_1_0.txt, Boost Software License 1.0)
4 Author: Joakim Brännström (joakim.brannstrom@gmx.com)
5 */
6 module integration;
7
8 import core.thread : Thread;
9 import core.time : dur;
10
11 import config;
12
13 @("shall setup a test environment")
14 unittest {
15 makeTestArea;
16 }
17
18 @("shall snapshot local data to dest when executed backup")
19 unittest {
20 auto ta = makeTestArea;
21 ta.writeConfigFromTemplate(inTestData("test_local.toml"), ta.sandboxPath);
22 ta.writeDummyData("some data");
23
24 ta.execDs("backup").status.shouldEqual(0);
25
26 const found = ta.findFile("dst", "file.txt");
27 found.length.shouldEqual(1);
28 found[0].dirName.dirName.baseName.shouldEqual("dst");
29 readText(found[0]).shouldEqual("some data");
30 }
31
32 @("shall snapshot remote to local dest when executed backup")
33 unittest {
34 auto ta = makeTestArea;
35 ta.writeConfigFromTemplate(inTestData("test_remote_to_local.toml"), ta.sandboxPath);
36 ta.writeDummyData("some data");
37
38 ta.execDs("backup").status.shouldEqual(0);
39
40 const found = ta.findFile("dst", "file.txt");
41 found.length.shouldEqual(1);
42 found[0].dirName.dirName.baseName.shouldEqual("dst");
43 readText(found[0]).shouldEqual("some data");
44 }
45
46 @("shall snapshot local to remote dest when executed backup")
47 unittest {
48 auto ta = makeTestArea;
49 ta.writeConfigFromTemplate(inTestData("test_local_to_remote.toml"),
50 dsnapshotPath, ta.sandboxPath);
51 ta.writeDummyData("some data");
52
53 ta.execDs("backup").status.shouldEqual(0);
54
55 const found = ta.findFile("dst", "file.txt");
56 found.length.shouldEqual(1);
57 found[0].dirName.dirName.baseName.shouldEqual("dst");
58 readText(found[0]).shouldEqual("some data");
59 }
60
61 @("shall keep nr+1 snapshots from a multi-span configuration when executing backup")
62 unittest {
63 auto ta = makeTestArea;
64 ta.writeConfigFromTemplate(inTestData("test_multiple_spans.toml"), ta.sandboxPath);
65 ta.writeDummyData("some data");
66
67 foreach (a; 0 .. 16) {
68 Thread.sleep(20.dur!"msecs");
69 ta.execDs("backup").status.shouldEqual(0);
70 }
71
72 const found = ta.findFile("dst", "file.txt");
73 found.length.shouldEqual(14);
74 foreach (f; found) {
75 f.dirName.dirName.baseName.shouldEqual("dst");
76 readText(f).shouldEqual("some data");
77 }
78 }
79
80 @("shall calculate the disk usage of a local destination when executing diskusage")
81 unittest {
82 auto ta = makeTestArea;
83 ta.writeConfigFromTemplate(inTestData("test_local.toml"), ta.sandboxPath);
84 ta.writeDummyData("0123456789");
85
86 ta.execDs("backup").status.shouldEqual(0);
87 auto res = ta.execDs("diskusage", "-s", "a");
88
89 res.status.shouldEqual(0);
90 ta.sandboxPath.shouldBeIn(res.output);
91 "total".shouldBeIn(res.output);
92 }
93
94 @("shall calculate the disk usage of a remote destination when executing diskusage")
95 unittest {
96 auto ta = makeTestArea;
97 ta.writeConfigFromTemplate(inTestData("test_local_to_remote.toml"),
98 dsnapshotPath, ta.sandboxPath);
99 ta.writeDummyData("0123456789");
100
101 ta.execDs("backup").status.shouldEqual(0);
102 auto res = ta.execDs("diskusage", "-s", "a");
103
104 res.status.shouldEqual(0);
105 ta.sandboxPath.shouldBeIn(res.output);
106 "total".shouldBeIn(res.output);
107 }
108
109 @("shall verify the configuration when executing verifyconfig")
110 unittest {
111 auto ta = makeTestArea;
112 ta.writeConfigFromTemplate(inTestData("test_local_to_remote.toml"),
113 dsnapshotPath, ta.sandboxPath);
114
115 auto res = ta.execDs("verifyconfig");
116
117 res.status.shouldEqual(0);
118 "Done".shouldBeIn(res.output);
119 }
120
121 @("shall restore the latest local snapshot to destination when executing restore")
122 unittest {
123 auto ta = makeTestArea;
124 ta.writeConfigFromTemplate(inTestData("test_local.toml"), ta.sandboxPath);
125
126 ta.writeDummyData("0123456789");
127 ta.execDs("backup").status.shouldEqual(0);
128 Thread.sleep(10.dur!"msecs");
129 ta.writeDummyData("9876543210");
130 ta.execDs("backup").status.shouldEqual(0);
131 ta.execDs("restore", "-s", "a", "--dst", ta.inSandboxPath("restore")).status.shouldEqual(0);
132
133 const found = ta.findFile("restore", "file.txt");
134 found.length.shouldEqual(1);
135 // the one closest to the configured snapshot time is "best". The time is
136 // now-5min so the first snapshot should be restored.
137 readText(found[0]).shouldEqual("0123456789");
138 }
139
140 @("shall restore the latest remote snapshot to destination when executing restore")
141 unittest {
142 auto ta = makeTestArea;
143 ta.writeConfigFromTemplate(inTestData("test_local_to_remote.toml"),
144 dsnapshotPath, ta.sandboxPath);
145
146 ta.writeDummyData("0123456789");
147 ta.execDs("backup").status.shouldEqual(0);
148 Thread.sleep(10.dur!"msecs");
149 ta.writeDummyData("9876543210");
150 ta.execDs("backup").status.shouldEqual(0);
151 ta.execDs("restore", "-s", "a", "--dst", ta.inSandboxPath("restore")).status.shouldEqual(0);
152
153 const found = ta.findFile("restore", "file.txt");
154 found.length.shouldEqual(1);
155 // the one closest to the configured snapshot time is "best". The time is
156 // now-5min so the first snapshot should be restored.
157 readText(found[0]).shouldEqual("0123456789");
158 }