Skip to content

Commit 53380fa

Browse files
committed
added a few more checks for nesting that tests revealed
1 parent a42137f commit 53380fa

3 files changed

Lines changed: 139 additions & 51 deletions

File tree

FolderSync/Program.cs

Lines changed: 23 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -43,13 +43,12 @@ private static string CheckPath(string? path)
4343

4444
private static string CheckLogFilePath(string? filePath)
4545
{
46-
string logFileName = $"SyncLog_{DateTime.Now.ToString("dd-MM-yyyy")}.log";
4746
if (Directory.Exists(filePath))
48-
return Path.Combine(filePath, logFileName);
47+
return filePath;
4948
else
5049
{
51-
Console.WriteLine($"The directory {filePath} does not exist, defaulting to {Path.Combine(Directory.GetCurrentDirectory(), "Log.log")}");
52-
return Path.Combine(Directory.GetCurrentDirectory(), logFileName);
50+
Console.WriteLine($"The directory {filePath} does not exist, defaulting to {Path.Combine(Directory.GetCurrentDirectory())}");
51+
return Path.Combine(Directory.GetCurrentDirectory());
5352
}
5453
}
5554

@@ -65,9 +64,14 @@ private static bool ArePathsNested(string source, string dest)
6564

6665
private static void CreateLogFile(string path)
6766
{
68-
if(!File.Exists(path))
67+
if (!File.Exists(path))
6968
File.Create(path).Dispose();
7069
}
70+
71+
private static bool IsPathInProgramDir(string path)
72+
{
73+
return path.StartsWith(Directory.GetCurrentDirectory()) || Directory.GetCurrentDirectory().StartsWith(path);
74+
}
7175

7276
private static Config ParseArgs(IConfiguration config) // ParseArgs needs to be redone into something testable. I NEED TO FIGURE OUT HOW TO PREVENT NESTING OF SOURCE AND BAcKUP ROOTS
7377
{
@@ -84,8 +88,8 @@ private static Config ParseArgs(IConfiguration config) // ParseArgs needs to be
8488
if (string.IsNullOrEmpty(source) || string.IsNullOrEmpty(dest))
8589
throw new ArgumentException("Argument for source or destination folder is either empty or not a valid directory on your system");
8690

87-
source = !ArePathsNested(source, dest) ? config["sourceFolder"] : throw new ArgumentException("The source and backup folders cannot be nested within each other");
88-
dest = !ArePathsNested(source, dest) ? config["destFolder"] : throw new ArgumentException("The source and backup folders cannot be nested within each other");
91+
source = !ArePathsNested(source, dest) && !IsPathInProgramDir(source) ? config["sourceFolder"] : throw new ArgumentException("The source and backup folders cannot be nested within each other");
92+
dest = !ArePathsNested(source, dest) && !IsPathInProgramDir(dest) ? config["destFolder"] : throw new ArgumentException("The source and backup folders cannot be nested within each other");
8993

9094
folderSyncConfig.SourceFolder = source;
9195
folderSyncConfig.BackupFolder = dest;
@@ -98,8 +102,18 @@ private static Config ParseArgs(IConfiguration config) // ParseArgs needs to be
98102
}
99103
else
100104
{
101-
CreateLogFile(log);
102-
folderSyncConfig.LogFilePath = log;
105+
if (!ArePathsNested(source, log) && !ArePathsNested(dest, log))
106+
{
107+
CreateLogFile(Path.Combine(log, logFileName));
108+
folderSyncConfig.LogFilePath = log;
109+
}
110+
else
111+
{
112+
Console.WriteLine("The log folder cannot be nested within the source or backup folder. Defaulting to program directory.");
113+
string currentDir = Directory.GetCurrentDirectory();
114+
CreateLogFile(Path.Combine(currentDir, logFileName));
115+
folderSyncConfig.LogFilePath = currentDir;
116+
}
103117
}
104118

105119
return folderSyncConfig;

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,4 +3,4 @@ Launch FolderSync with the following arguments. Note that use of absolute paths
33
<br>*--syncPeriod 10*</br>
44
<br>*--source /home/sampleSource* or *--source C:\\sampleSource*</br>
55
<br>*--dest /home/sampleDest* or *--dest C:\\sampleDest*</br>
6-
<br>*--log /home/Log* or *--log C:\\LogFolder* &rarr; log is saved as *SyncLog_day-month-year hour:minute.log*</br>
6+
<br>*--log /home/Log* or *--log C:\\LogFolder* &rarr; log is saved as *SyncLog_day-month-year*</br>

Tests/ParseArgsTests.cs

Lines changed: 115 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -4,15 +4,22 @@
44
[assembly: CollectionBehavior(DisableTestParallelization = true)]
55
namespace Tests
66
{
7-
public class ParseArgsTests
7+
public class ParseArgsTests : IDisposable
88
{
9+
string _testDir;
10+
public ParseArgsTests()
11+
{
12+
_testDir = Path.Combine(Path.GetTempPath(), "TestRoot");
13+
Directory.CreateDirectory(_testDir);
14+
}
15+
916
[Fact]
1017
public void TestValidArguments_Succeeds()
1118
{
1219
string period = "15";
13-
string sourceFolder = Path.Combine(Path.GetTempPath(), "SourceFolder");
14-
string destFolder = Path.Combine(Path.GetTempPath(), "BackupFolder");
15-
string logFolder = Path.Combine(Path.GetTempPath(), "Logs");
20+
string sourceFolder = Path.Combine(_testDir, "SourceFolder");
21+
string destFolder = Path.Combine(_testDir, "BackupFolder");
22+
string logFolder = Path.Combine(_testDir, "Logs");
1623
if (!Directory.Exists(sourceFolder))
1724
Directory.CreateDirectory(sourceFolder);
1825
if (!Directory.Exists(destFolder))
@@ -21,6 +28,7 @@ public void TestValidArguments_Succeeds()
2128
Directory.CreateDirectory(logFolder);
2229
Assert.True(Directory.Exists(sourceFolder));
2330
Assert.True(Directory.Exists(destFolder));
31+
Assert.True(Directory.Exists(logFolder));
2432

2533
string[] args = new string[] { "--syncPeriod", period, "--sourceFolder", sourceFolder, "--destFolder", destFolder, "--log", logFolder };
2634
IConfiguration cmdArgs = new ConfigurationBuilder().AddCommandLine(args).Build();
@@ -30,20 +38,20 @@ public void TestValidArguments_Succeeds()
3038
Assert.Equal(Int32.Parse(period), config.SyncPeriod);
3139
Assert.Equal(sourceFolder, config.SourceFolder);
3240
Assert.Equal(destFolder, config.BackupFolder);
33-
Assert.Equal(Path.Combine(logFolder, $"SyncLog_{DateTime.Now.ToString("dd-MM-yyyy")}.log"), config.LogFilePath);
34-
35-
Directory.Delete(sourceFolder, true);
36-
Directory.Delete(destFolder, true);
37-
Directory.Delete(logFolder, true);
41+
string[] logPathAbs = Directory.GetFiles(logFolder, "*.log");
42+
Assert.Single(logPathAbs);
43+
string logName = Path.GetFileName(logPathAbs[0]);
44+
Assert.True(logName.StartsWith("SyncLog_"));
45+
Assert.Equal(logFolder, config.LogFilePath);
3846
}
3947

4048
[Fact]
4149
public void TestInvalidPeriod_DefaultsTo60()
4250
{
4351
string period = "-5";
44-
string sourceFolder = Path.Combine(Path.GetTempPath(), "SourceFolder");
45-
string destFolder = Path.Combine(Path.GetTempPath(), "BackupFolder");
46-
string logFolder = Path.Combine(Path.GetTempPath(), "Logs");
52+
string sourceFolder = Path.Combine(_testDir, "SourceFolder");
53+
string destFolder = Path.Combine(_testDir, "BackupFolder");
54+
string logFolder = Path.Combine(_testDir, "Logs");
4755
if (!Directory.Exists(sourceFolder))
4856
Directory.CreateDirectory(sourceFolder);
4957
if (!Directory.Exists(destFolder))
@@ -61,19 +69,19 @@ public void TestInvalidPeriod_DefaultsTo60()
6169
Assert.Equal(60, config.SyncPeriod);
6270
Assert.Equal(sourceFolder, config.SourceFolder);
6371
Assert.Equal(destFolder, config.BackupFolder);
64-
Assert.Equal(Path.Combine(logFolder, $"SyncLog_{DateTime.Now.ToString("dd-MM-yyyy")}.log"), config.LogFilePath);
65-
66-
Directory.Delete(sourceFolder, true);
67-
Directory.Delete(destFolder, true);
68-
Directory.Delete(logFolder, true);
72+
string[] logPathAbs = Directory.GetFiles(logFolder, "*.log");
73+
Assert.Single(logPathAbs);
74+
string logName = Path.GetFileName(logPathAbs[0]);
75+
Assert.True(logName.StartsWith("SyncLog_"));
76+
Assert.Equal(logFolder, config.LogFilePath);
6977
}
7078

7179
[Fact]
7280
public void TestMissingSourceFolder_Fails()
7381
{
7482
string period = "15";
75-
string destFolder = Path.Combine(Path.GetTempPath(), "BackupFolder");
76-
string logFolder = Path.Combine(Path.GetTempPath(), "Logs");
83+
string destFolder = Path.Combine(_testDir, "BackupFolder");
84+
string logFolder = Path.Combine(_testDir, "Logs");
7785
if (!Directory.Exists(destFolder))
7886
Directory.CreateDirectory(destFolder);
7987
if (!Directory.Exists(logFolder))
@@ -85,17 +93,14 @@ public void TestMissingSourceFolder_Fails()
8593
var parseArgs = typeof(FolderSync.FolderSync).GetMethod("ParseArgs", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Static);
8694
var ex = Assert.Throws<TargetInvocationException>(() => parseArgs.Invoke(null, new object[] { cmdArgs }));
8795
Assert.IsType<ArgumentException>(ex.InnerException);
88-
89-
Directory.Delete(destFolder, true);
90-
Directory.Delete(logFolder, true);
9196
}
9297

9398
[Fact]
9499
public void TestMissingBackupFolder_Fails()
95100
{
96101
string period = "15";
97-
string sourceFolder = Path.Combine(Path.GetTempPath(), "SourceFolder");
98-
string logFolder = Path.Combine(Path.GetTempPath(), "Logs");
102+
string sourceFolder = Path.Combine(_testDir, "SourceFolder");
103+
string logFolder = Path.Combine(_testDir, "Logs");
99104
if (!Directory.Exists(sourceFolder))
100105
Directory.CreateDirectory(sourceFolder);
101106
if (!Directory.Exists(logFolder))
@@ -107,18 +112,15 @@ public void TestMissingBackupFolder_Fails()
107112
var parseArgs = typeof(FolderSync.FolderSync).GetMethod("ParseArgs", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Static);
108113
var ex = Assert.Throws<TargetInvocationException>(() => parseArgs.Invoke(null, new object[] { cmdArgs }));
109114
Assert.IsType<ArgumentException>(ex.InnerException);
110-
111-
Directory.Delete(sourceFolder, true);
112-
Directory.Delete(logFolder, true);
113115
}
114116

115117
[Fact]
116118
public void TestNestedPaths_Fails()
117119
{
118120
string period = "15";
119-
string sourceFolder = Path.Combine(Path.GetTempPath(), "SourceFolder");
121+
string sourceFolder = Path.Combine(_testDir, "SourceFolder");
120122
string destFolder = Path.Combine(sourceFolder, "BackupFolder");
121-
string logFolder = Path.Combine(Path.GetTempPath(), "Logs");
123+
string logFolder = Path.Combine(_testDir, "Logs");
122124
if (!Directory.Exists(sourceFolder))
123125
Directory.CreateDirectory(sourceFolder);
124126
if (!Directory.Exists(logFolder))
@@ -130,18 +132,55 @@ public void TestNestedPaths_Fails()
130132
var parseArgs = typeof(FolderSync.FolderSync).GetMethod("ParseArgs", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Static);
131133
var ex = Assert.Throws<TargetInvocationException>(() => parseArgs.Invoke(null, new object[] { cmdArgs }));
132134
Assert.IsType<ArgumentException>(ex.InnerException);
135+
}
136+
137+
[Fact]
138+
public void SourcePathCannotBeInProgramDir_Fails()
139+
{
140+
string period = "15";
141+
string sourceFolder = Directory.GetCurrentDirectory();
142+
string destFolder = Path.Combine(_testDir, "BackupFolder");
143+
string logFolder = Path.Combine(_testDir, "Logs");
144+
if (!Directory.Exists(destFolder))
145+
Directory.CreateDirectory(destFolder);
146+
if (!Directory.Exists(logFolder))
147+
Directory.CreateDirectory(logFolder);
148+
Assert.True(Directory.Exists(destFolder));
133149

134-
Directory.Delete(sourceFolder, true);
135-
Directory.Delete(logFolder, true);
150+
string[] args = new string[] { "--syncPeriod", period, "--sourceFolder", sourceFolder, "--destFolder", destFolder, "--log", logFolder };
151+
IConfiguration cmdArgs = new ConfigurationBuilder().AddCommandLine(args).Build();
152+
var parseArgs = typeof(FolderSync.FolderSync).GetMethod("ParseArgs", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Static);
153+
var ex = Assert.Throws<TargetInvocationException>(() => parseArgs.Invoke(null, new object[] { cmdArgs }));
154+
Assert.IsType<ArgumentException>(ex.InnerException);
155+
}
156+
157+
[Fact]
158+
public void BackupPathCannotBeInProgramDir_Fails()
159+
{
160+
string period = "15";
161+
string sourceFolder = Path.Combine(_testDir, "SourceFolder");
162+
string destFolder = Path.Combine(Directory.GetCurrentDirectory(), "BackupFolder");
163+
string logFolder = Path.Combine(_testDir, "Logs");
164+
if (!Directory.Exists(destFolder))
165+
Directory.CreateDirectory(destFolder);
166+
if (!Directory.Exists(logFolder))
167+
Directory.CreateDirectory(logFolder);
168+
Assert.True(Directory.Exists(destFolder));
169+
170+
string[] args = new string[] { "--syncPeriod", period, "--sourceFolder", sourceFolder, "--destFolder", destFolder, "--log", logFolder };
171+
IConfiguration cmdArgs = new ConfigurationBuilder().AddCommandLine(args).Build();
172+
var parseArgs = typeof(FolderSync.FolderSync).GetMethod("ParseArgs", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Static);
173+
var ex = Assert.Throws<TargetInvocationException>(() => parseArgs.Invoke(null, new object[] { cmdArgs }));
174+
Assert.IsType<ArgumentException>(ex.InnerException);
136175
}
137176

138177
[Fact]
139178
public void TestInvalidLogPath_DefaultsToCurrentDirectory()
140179
{
141180
string period = "15";
142-
string sourceFolder = Path.Combine(Path.GetTempPath(), "SourceFolder");
143-
string destFolder = Path.Combine(Path.GetTempPath(), "BackupFolder");
144-
string logFolder = Path.Combine(Path.GetTempPath(), "NonExistentLogs");
181+
string sourceFolder = Path.Combine(_testDir, "SourceFolder");
182+
string destFolder = Path.Combine(_testDir, "BackupFolder");
183+
string logFolder = Path.Combine(_testDir, "NonExistentLogs");
145184
if (!Directory.Exists(sourceFolder))
146185
Directory.CreateDirectory(sourceFolder);
147186
if (!Directory.Exists(destFolder))
@@ -157,18 +196,20 @@ public void TestInvalidLogPath_DefaultsToCurrentDirectory()
157196
Assert.Equal(Int32.Parse(period), config.SyncPeriod);
158197
Assert.Equal(sourceFolder, config.SourceFolder);
159198
Assert.Equal(destFolder, config.BackupFolder);
160-
Assert.Equal(Path.Combine(Directory.GetCurrentDirectory(), $"SyncLog_{DateTime.Now.ToString("dd-MM-yyyy")}.log"), config.LogFilePath);
161199

162-
Directory.Delete(sourceFolder, true);
163-
Directory.Delete(destFolder, true);
200+
string[] finalLog = Directory.GetFiles(Directory.GetCurrentDirectory(), "*.log");
201+
Assert.Single(finalLog);
202+
string logName = Path.GetFileName(finalLog[0]);
203+
Assert.True(logName.StartsWith("SyncLog_"));
204+
Assert.Equal(Directory.GetCurrentDirectory(), config.LogFilePath);
164205
}
165206

166207
[Fact]
167208
public void TestMissingLogPath_DefaultsToCurrentDirectory()
168209
{
169210
string period = "15";
170-
string sourceFolder = Path.Combine(Path.GetTempPath(), "SourceFolder");
171-
string destFolder = Path.Combine(Path.GetTempPath(), "BackupFolder");
211+
string sourceFolder = Path.Combine(_testDir, "SourceFolder");
212+
string destFolder = Path.Combine(_testDir, "BackupFolder");
172213
if (!Directory.Exists(sourceFolder))
173214
Directory.CreateDirectory(sourceFolder);
174215
if (!Directory.Exists(destFolder))
@@ -185,9 +226,34 @@ public void TestMissingLogPath_DefaultsToCurrentDirectory()
185226
Assert.Equal(sourceFolder, config.SourceFolder);
186227
Assert.Equal(destFolder, config.BackupFolder);
187228
Assert.Equal(Path.Combine(Directory.GetCurrentDirectory(), $"SyncLog_{DateTime.Now.ToString("dd-MM-yyyy")}.log"), config.LogFilePath);
229+
}
188230

189-
Directory.Delete(sourceFolder, true);
190-
Directory.Delete(destFolder, true);
231+
[Fact]
232+
public void TestNestedLogFileInSource()
233+
{
234+
string period = "15";
235+
string sourceFolder = Path.Combine(_testDir, "SourceFolder");
236+
string destFolder = Path.Combine(_testDir, "BackupFolder");
237+
string logFolder = Path.Combine(_testDir, sourceFolder);
238+
if (!Directory.Exists(sourceFolder))
239+
Directory.CreateDirectory(sourceFolder);
240+
if (!Directory.Exists(destFolder))
241+
Directory.CreateDirectory(destFolder);
242+
if (!Directory.Exists(logFolder))
243+
Directory.CreateDirectory(logFolder);
244+
Assert.True(Directory.Exists(sourceFolder));
245+
246+
string[] args = new string[] { "--syncPeriod", period, "--sourceFolder", sourceFolder, "--destFolder", destFolder, "--log", logFolder };
247+
IConfiguration cmdArgs = new ConfigurationBuilder().AddCommandLine(args).Build();
248+
var parseArgs = typeof(FolderSync.FolderSync).GetMethod("ParseArgs", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Static);
249+
Config config = (Config)parseArgs.Invoke(null, new object[] { cmdArgs });
250+
251+
string fixedLogFolder = Directory.GetCurrentDirectory();
252+
Assert.Equal(fixedLogFolder, config.LogFilePath);
253+
string[] finalLog = Directory.GetFiles(Directory.GetCurrentDirectory(), "*.log");
254+
Assert.Single(finalLog);
255+
string logName = Path.GetFileName(finalLog[0]);
256+
Assert.True(logName.StartsWith("SyncLog_"));
191257
}
192258

193259
[Fact]
@@ -198,5 +264,13 @@ public void TestNoArguments_Fails()
198264
var parseArgs = typeof(FolderSync.FolderSync).GetMethod("ParseArgs", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Static);
199265
Assert.Throws<TargetInvocationException>(() => parseArgs.Invoke(null, new object[] { cmdArgs }));
200266
}
267+
268+
public void Dispose()
269+
{
270+
Directory.Delete(_testDir, true);
271+
string[] logFiles = Directory.GetFiles(Directory.GetCurrentDirectory(), "*.log");
272+
foreach (var log in logFiles)
273+
File.Delete(log);
274+
}
201275
}
202276
}

0 commit comments

Comments
 (0)