From f14dc4febd1884a770e0c6235fdd4cf441b57dd8 Mon Sep 17 00:00:00 2001 From: Ahmed Shariff Date: Sun, 11 Dec 2022 23:59:55 -0800 Subject: [PATCH 1/2] FileSaver backup session dir if session dir already exists --- Assets/UXF/Scripts/DataHandling/FileSaver.cs | 47 +++++++++++++++++--- 1 file changed, 42 insertions(+), 5 deletions(-) diff --git a/Assets/UXF/Scripts/DataHandling/FileSaver.cs b/Assets/UXF/Scripts/DataHandling/FileSaver.cs index 34bb6705..0adf7aaf 100644 --- a/Assets/UXF/Scripts/DataHandling/FileSaver.cs +++ b/Assets/UXF/Scripts/DataHandling/FileSaver.cs @@ -1,11 +1,8 @@ -using System.Collections; -using System.Collections.Generic; +using System.Collections.Generic; using UnityEngine; -using UnityEngine.Events; using System; using System.IO; using System.Threading; -using System.Linq; using System.Globalization; namespace UXF @@ -32,6 +29,16 @@ public class FileSaver : LocalFileDataHander [Tooltip("Enable to print debug messages to the console.")] public bool verboseDebug = false; + /// + /// Enable backing up the session directory if it already exists when a session starts. If + /// not true, this will overwrite the is the UXF runs with the same experiment name, ppid, + /// and session number again. + /// + [Tooltip("Enable backing up the session directory if it already exists when a session starts. If" + + "not true, this will overwrite the is the UXF runs with the same experiment name, ppid," + + "and session number again.")] + public bool backupSessionIfExists = true; + /// /// An action which does nothing. /// @@ -46,7 +53,6 @@ public class FileSaver : LocalFileDataHander bool quitting = false; - /// /// Starts the FileSaver Worker thread. /// @@ -59,6 +65,37 @@ public override void SetUp() quitting = false; Directory.CreateDirectory(base.StoragePath); + string sessionDirectory = GetSessionPath(session.experimentName, session.ppid, session.number); + if (Directory.Exists(sessionDirectory)) + { + Utilities.UXFDebugLogWarning($"Session directory {sessionDirectory} already exists."); + if (backupSessionIfExists) + { + string suffix = Directory.GetLastWriteTime(sessionDirectory).ToString("dd-MM-yyyy-HH-mm-FF"); + string backupSessionDirectory = $"{sessionDirectory}_{suffix}"; + + int idx = 1; + while (Directory.Exists(backupSessionDirectory)) + { + backupSessionDirectory = $"{backupSessionDirectory}_{idx}"; + } + + try + { + Directory.Move(sessionDirectory, backupSessionDirectory); + Utilities.UXFDebugLogWarning($"Trying to backup {sessionDirectory} to {backupSessionDirectory}."); + } + catch(Exception e) + { + Utilities.UXFDebugLogError($"Failed to backup {sessionDirectory} to {backupSessionDirectory} with exception ({e}): {e.Message}"); + throw e; + } + } + else + { + Utilities.UXFDebugLogWarning($"backupSessionIfExists is False. Content in {sessionDirectory} may be overwritten."); + } + } if (!IsActive) { From 7b8a450fc6ed0f21f28ffe0bb2a316e54a46307c Mon Sep 17 00:00:00 2001 From: Ahmed Shariff Date: Mon, 12 Dec 2022 11:48:52 -0800 Subject: [PATCH 2/2] Tests for backing up session files it they exist --- Assets/UXF/Tests/Editor/TestFileIOManager.cs | 82 ++++++++++++++++++++ 1 file changed, 82 insertions(+) diff --git a/Assets/UXF/Tests/Editor/TestFileIOManager.cs b/Assets/UXF/Tests/Editor/TestFileIOManager.cs index 1463c0ab..98a34e36 100644 --- a/Assets/UXF/Tests/Editor/TestFileIOManager.cs +++ b/Assets/UXF/Tests/Editor/TestFileIOManager.cs @@ -11,6 +11,7 @@ public class TestFileSaver string ppid = "test_ppid"; int sessionNum = 1; FileSaver fileSaver; + Session session; [SetUp] public void SetUp() @@ -18,6 +19,12 @@ public void SetUp() var gameObject = new GameObject(); fileSaver = gameObject.AddComponent(); fileSaver.verboseDebug = true; + if (Session.instance != null) GameObject.DestroyImmediate(Session.instance.gameObject); + session = gameObject.AddComponent(); + session.experimentName = "test_experiment"; + session.ppid = "P001"; + session.number = 1; + fileSaver.Initialise(session); } @@ -149,5 +156,80 @@ public void FileSaverRelPath() SystemInfo.operatingSystemFamily == OperatingSystemFamily.Windows ? "123" : "../123" ); } + + [Test] + public void TestBackupSession() + { + fileSaver.StoragePath = "test_output"; + fileSaver.backupSessionIfExists = true; + if (Directory.Exists(fileSaver.StoragePath)) + { + Directory.Delete(fileSaver.StoragePath, true); + } + + fileSaver.SetUp(); + + string fileName = "testMoveToBackup"; + fileSaver.HandleText("", session.experimentName, session.ppid, session.number, fileName, UXFDataType.TrialResults); + fileSaver.HandleText("", session.experimentName, session.ppid, session.number, fileName, UXFDataType.TrialResults); + fileSaver.HandleText("", session.experimentName, session.ppid, session.number, fileName, UXFDataType.TrialResults); + + fileSaver.CleanUp(); + System.Threading.Thread.Sleep(500); + + fileSaver.SetUp(); + + fileName = "testMoveToBackup"; + fileSaver.HandleText("", session.experimentName, session.ppid, session.number, fileName, UXFDataType.TrialResults); + fileSaver.HandleText("", session.experimentName, session.ppid, session.number, fileName, UXFDataType.TrialResults); + fileSaver.HandleText("", session.experimentName, session.ppid, session.number, fileName, UXFDataType.TrialResults); + + fileSaver.CleanUp(); + + string testFilesDirectory = fileSaver.GetSessionPath(session.experimentName, session.ppid, session.number); + + string[] directories = Directory.GetDirectories(Directory.GetParent(testFilesDirectory).ToString(), $"{FileSaver.SessionNumToName(1)}*", SearchOption.TopDirectoryOnly); + Assert.AreEqual(directories.Length, 2); + + Directory.Delete(fileSaver.StoragePath, true); + } + + [Test] + public void TestSessionOverwrite() + { + fileSaver.StoragePath = "test_output"; + fileSaver.backupSessionIfExists = false; + if (Directory.Exists(fileSaver.StoragePath)) + { + Directory.Delete(fileSaver.StoragePath, true); + } + + fileSaver.SetUp(); + + string fileName = "testMoveToBackup"; + fileSaver.HandleText("", session.experimentName, session.ppid, session.number, fileName, UXFDataType.TrialResults); + fileSaver.HandleText("", session.experimentName, session.ppid, session.number, fileName, UXFDataType.TrialResults); + fileSaver.HandleText("", session.experimentName, session.ppid, session.number, fileName, UXFDataType.TrialResults); + + fileSaver.CleanUp(); + System.Threading.Thread.Sleep(500); + + fileSaver.SetUp(); + + fileName = "testMoveToBackup"; + fileSaver.HandleText("", session.experimentName, session.ppid, session.number, fileName, UXFDataType.TrialResults); + fileSaver.HandleText("", session.experimentName, session.ppid, session.number, fileName, UXFDataType.TrialResults); + fileSaver.HandleText("", session.experimentName, session.ppid, session.number, fileName, UXFDataType.TrialResults); + + fileSaver.CleanUp(); + + string testFilesDirectory = fileSaver.GetSessionPath(session.experimentName, session.ppid, session.number); + + string[] directories = Directory.GetDirectories(Directory.GetParent(testFilesDirectory).ToString(), $"{FileSaver.SessionNumToName(1)}*", SearchOption.TopDirectoryOnly); + Assert.AreEqual(directories.Length, 1); + + Directory.Delete(fileSaver.StoragePath, true); + } } + }