diff --git a/Libraries/SPTarkov.Server.Core/Callbacks/GameCallbacks.cs b/Libraries/SPTarkov.Server.Core/Callbacks/GameCallbacks.cs index 048d0d1a..99739a08 100644 --- a/Libraries/SPTarkov.Server.Core/Callbacks/GameCallbacks.cs +++ b/Libraries/SPTarkov.Server.Core/Callbacks/GameCallbacks.cs @@ -54,15 +54,15 @@ public class GameCallbacks( /// Save profiles on game close /// /// - public ValueTask GameLogout(string url, EmptyRequestData _, string sessionID) + public async ValueTask GameLogout(string url, EmptyRequestData _, string sessionID) { - _saveServer.SaveProfile(sessionID); - return new ValueTask(_httpResponseUtil.GetBody( + await _saveServer.SaveProfileAsync(sessionID); + return _httpResponseUtil.GetBody( new GameLogoutResponseData { Status = "ok" } - )); + ); } /// diff --git a/Libraries/SPTarkov.Server.Core/Callbacks/LauncherCallbacks.cs b/Libraries/SPTarkov.Server.Core/Callbacks/LauncherCallbacks.cs index 595c8594..7bef8fcd 100644 --- a/Libraries/SPTarkov.Server.Core/Callbacks/LauncherCallbacks.cs +++ b/Libraries/SPTarkov.Server.Core/Callbacks/LauncherCallbacks.cs @@ -26,10 +26,10 @@ public class LauncherCallbacks( return new ValueTask(output ?? "FAILED"); } - public ValueTask Register(string url, RegisterData info, string sessionID) + public async ValueTask Register(string url, RegisterData info, string sessionID) { - var output = _launcherController.Register(info); - return new ValueTask(string.IsNullOrEmpty(output) ? "FAILED" : "OK"); + var output = await _launcherController.Register(info); + return string.IsNullOrEmpty(output) ? "FAILED" : "OK"; } public ValueTask Get(string url, LoginRequestData info, string sessionID) diff --git a/Libraries/SPTarkov.Server.Core/Callbacks/LauncherV2Callbacks.cs b/Libraries/SPTarkov.Server.Core/Callbacks/LauncherV2Callbacks.cs index bda1b574..a66b36a4 100644 --- a/Libraries/SPTarkov.Server.Core/Callbacks/LauncherV2Callbacks.cs +++ b/Libraries/SPTarkov.Server.Core/Callbacks/LauncherV2Callbacks.cs @@ -43,26 +43,26 @@ public class LauncherV2Callbacks( )); } - public ValueTask Register(RegisterData info) + public async ValueTask Register(RegisterData info) { - return new ValueTask(_httpResponseUtil.NoBody( + return _httpResponseUtil.NoBody( new LauncherV2RegisterResponse { - Response = _launcherV2Controller.Register(info), + Response = await _launcherV2Controller.Register(info), Profiles = _profileController.GetMiniProfiles() } - )); + ); } - public ValueTask PasswordChange(ChangeRequestData info) + public async ValueTask PasswordChange(ChangeRequestData info) { - return new ValueTask(_httpResponseUtil.NoBody( + return _httpResponseUtil.NoBody( new LauncherV2PasswordChangeResponse { - Response = _launcherV2Controller.PasswordChange(info), + Response = await _launcherV2Controller.PasswordChange(info), Profiles = _profileController.GetMiniProfiles() } - )); + ); } public ValueTask Remove(LoginRequestData info) diff --git a/Libraries/SPTarkov.Server.Core/Callbacks/PrestigeCallbacks.cs b/Libraries/SPTarkov.Server.Core/Callbacks/PrestigeCallbacks.cs index 3967fb8e..78e8d4be 100644 --- a/Libraries/SPTarkov.Server.Core/Callbacks/PrestigeCallbacks.cs +++ b/Libraries/SPTarkov.Server.Core/Callbacks/PrestigeCallbacks.cs @@ -31,10 +31,10 @@ public class PrestigeCallbacks( /// /// Session/player id /// - public ValueTask ObtainPrestige(string url, ObtainPrestigeRequestList info, string sessionID) + public async ValueTask ObtainPrestige(string url, ObtainPrestigeRequestList info, string sessionID) { - _prestigeController.ObtainPrestige(sessionID, info); + await _prestigeController.ObtainPrestige(sessionID, info); - return new ValueTask(_httpResponseUtil.NullResponse()); + return _httpResponseUtil.NullResponse(); } } diff --git a/Libraries/SPTarkov.Server.Core/Callbacks/ProfileCallbacks.cs b/Libraries/SPTarkov.Server.Core/Callbacks/ProfileCallbacks.cs index 48f93d61..17c5bd88 100644 --- a/Libraries/SPTarkov.Server.Core/Callbacks/ProfileCallbacks.cs +++ b/Libraries/SPTarkov.Server.Core/Callbacks/ProfileCallbacks.cs @@ -22,15 +22,15 @@ public class ProfileCallbacks( /// Handle client/game/profile/create /// /// - public ValueTask CreateProfile(string url, ProfileCreateRequestData info, string sessionID) + public async ValueTask CreateProfile(string url, ProfileCreateRequestData info, string sessionID) { - var id = _profileController.CreateProfile(info, sessionID); - return new ValueTask(_httpResponse.GetBody( + var id = await _profileController.CreateProfile(info, sessionID); + return _httpResponse.GetBody( new CreateProfileResponse { UserId = id } - )); + ); } /// diff --git a/Libraries/SPTarkov.Server.Core/Callbacks/SaveCallbacks.cs b/Libraries/SPTarkov.Server.Core/Callbacks/SaveCallbacks.cs index 7214d8ab..b8297068 100644 --- a/Libraries/SPTarkov.Server.Core/Callbacks/SaveCallbacks.cs +++ b/Libraries/SPTarkov.Server.Core/Callbacks/SaveCallbacks.cs @@ -20,19 +20,19 @@ public class SaveCallbacks( public async Task OnLoad() { _backupService.StartBackupSystem(); - _saveServer.Load(); + await _saveServer.LoadAsync(); } - public Task OnUpdate(long secondsSinceLastRun) + public async Task OnUpdate(long secondsSinceLastRun) { if (secondsSinceLastRun < _coreConfig.ProfileSaveIntervalInSeconds) { // Not enough time has passed since last run, exit early - return Task.FromResult(false); + return false; } - _saveServer.Save(); + await _saveServer.SaveAsync(); - return Task.FromResult(true); + return true; } } diff --git a/Libraries/SPTarkov.Server.Core/Controllers/LauncherController.cs b/Libraries/SPTarkov.Server.Core/Controllers/LauncherController.cs index 1b6ffb44..62a4a59d 100644 --- a/Libraries/SPTarkov.Server.Core/Controllers/LauncherController.cs +++ b/Libraries/SPTarkov.Server.Core/Controllers/LauncherController.cs @@ -97,7 +97,7 @@ public class LauncherController( /// /// /// - public string Register(RegisterData info) + public async Task Register(RegisterData info) { foreach (var kvp in _saveServer.GetProfiles()) { @@ -107,14 +107,14 @@ public class LauncherController( } } - return CreateAccount(info); + return await CreateAccount(info); } /// /// /// /// - protected string CreateAccount(RegisterData info) + protected async Task CreateAccount(RegisterData info) { var profileId = GenerateProfileId(); var scavId = GenerateProfileId(); @@ -130,8 +130,8 @@ public class LauncherController( }; _saveServer.CreateProfile(newProfileDetails); - _saveServer.LoadProfile(profileId); - _saveServer.SaveProfile(profileId); + await _saveServer.LoadProfileAsync(profileId); + await _saveServer.SaveProfileAsync(profileId); return profileId; } diff --git a/Libraries/SPTarkov.Server.Core/Controllers/LauncherV2Controller.cs b/Libraries/SPTarkov.Server.Core/Controllers/LauncherV2Controller.cs index 9d5ea553..74e007cb 100644 --- a/Libraries/SPTarkov.Server.Core/Controllers/LauncherV2Controller.cs +++ b/Libraries/SPTarkov.Server.Core/Controllers/LauncherV2Controller.cs @@ -71,7 +71,7 @@ public class LauncherV2Controller( /// /// /// - public bool Register(RegisterData info) + public async Task Register(RegisterData info) { foreach (var session in _saveServer.GetProfiles()) { @@ -81,7 +81,7 @@ public class LauncherV2Controller( } } - CreateAccount(info); + await CreateAccount(info); return true; } @@ -90,7 +90,7 @@ public class LauncherV2Controller( /// /// /// - public bool PasswordChange(ChangeRequestData info) + public async Task PasswordChange(ChangeRequestData info) { var sessionId = GetSessionId(info); @@ -105,7 +105,7 @@ public class LauncherV2Controller( } _saveServer.GetProfile(sessionId).ProfileInfo!.Password = info.Change; - _saveServer.SaveProfile(sessionId); + await _saveServer.SaveProfileAsync(sessionId); return true; } @@ -162,7 +162,7 @@ public class LauncherV2Controller( /// /// /// - protected string CreateAccount(RegisterData info) + protected async Task CreateAccount(RegisterData info) { var profileId = GenerateProfileId(); var scavId = GenerateProfileId(); @@ -179,8 +179,8 @@ public class LauncherV2Controller( _saveServer.CreateProfile(newProfileDetails); - _saveServer.LoadProfile(profileId); - _saveServer.SaveProfile(profileId); + await _saveServer.LoadProfileAsync(profileId); + await _saveServer.SaveProfileAsync(profileId); return profileId; } diff --git a/Libraries/SPTarkov.Server.Core/Controllers/PrestigeController.cs b/Libraries/SPTarkov.Server.Core/Controllers/PrestigeController.cs index 2690ae3f..57b06ae0 100644 --- a/Libraries/SPTarkov.Server.Core/Controllers/PrestigeController.cs +++ b/Libraries/SPTarkov.Server.Core/Controllers/PrestigeController.cs @@ -59,7 +59,7 @@ public class PrestigeController( /// /// /// - public void ObtainPrestige( + public async Task ObtainPrestige( string sessionId, ObtainPrestigeRequestList request) { @@ -75,7 +75,7 @@ public class PrestigeController( profile.SptData.PendingPrestige = pendingPrestige; profile.ProfileInfo.IsWiped = true; - _saveServer.SaveProfile(sessionId); + await _saveServer.SaveProfileAsync(sessionId); } } } diff --git a/Libraries/SPTarkov.Server.Core/Controllers/ProfileController.cs b/Libraries/SPTarkov.Server.Core/Controllers/ProfileController.cs index bd186684..e11277a3 100644 --- a/Libraries/SPTarkov.Server.Core/Controllers/ProfileController.cs +++ b/Libraries/SPTarkov.Server.Core/Controllers/ProfileController.cs @@ -118,9 +118,9 @@ public class ProfileController( /// Create profile request /// Player id /// Player id - public virtual string CreateProfile(ProfileCreateRequestData request, string sessionId) + public virtual async ValueTask CreateProfile(ProfileCreateRequestData request, string sessionId) { - return _createProfileService.CreateProfile(sessionId, request); + return await _createProfileService.CreateProfile(sessionId, request); } /// diff --git a/Libraries/SPTarkov.Server.Core/Servers/SaveServer.cs b/Libraries/SPTarkov.Server.Core/Servers/SaveServer.cs index 82720d33..930f6c50 100644 --- a/Libraries/SPTarkov.Server.Core/Servers/SaveServer.cs +++ b/Libraries/SPTarkov.Server.Core/Servers/SaveServer.cs @@ -56,7 +56,7 @@ public class SaveServer( /// /// Load all profiles in /user/profiles folder into memory (this.profiles) /// - public void Load() + public async Task LoadAsync() { // get files to load if (!_fileUtil.DirectoryExists(profileFilepath)) @@ -70,7 +70,7 @@ public class SaveServer( var stopwatch = Stopwatch.StartNew(); foreach (var file in files) { - LoadProfile(_fileUtil.StripExtension(file)); + await LoadProfileAsync(_fileUtil.StripExtension(file)); } stopwatch.Stop(); @@ -83,13 +83,13 @@ public class SaveServer( /// /// Save changes for each profile from memory into user/profiles json /// - public void Save() + public async Task SaveAsync() { // Save every profile var totalTime = 0L; foreach (var sessionID in profiles) { - totalTime += SaveProfile(sessionID.Key); + totalTime += await SaveProfileAsync(sessionID.Key); } if (_logger.IsLogEnabled(LogLevel.Debug)) @@ -196,14 +196,14 @@ public class SaveServer( /// Execute saveLoadRouters callbacks after being loaded into memory. /// /// ID of profile to store in memory - public void LoadProfile(string sessionID) + public async Task LoadProfileAsync(string sessionID) { var filename = $"{sessionID}.json"; var filePath = $"{profileFilepath}{filename}"; if (_fileUtil.FileExists(filePath)) // File found, store in profiles[] { - profiles[sessionID] = _jsonUtil.DeserializeFromFile(filePath); + profiles[sessionID] = await _jsonUtil.DeserializeFromFileAsync(filePath); } // Run callbacks @@ -220,7 +220,7 @@ public class SaveServer( /// /// Profile id (user/profiles/id.json) /// Time taken to save the profile in seconds - public long SaveProfile(string sessionID) + public async Task SaveProfileAsync(string sessionID) { var filePath = $"{profileFilepath}{sessionID}.json"; @@ -250,12 +250,12 @@ public class SaveServer( var start = Stopwatch.StartNew(); var jsonProfile = _jsonUtil.Serialize(profiles[sessionID], !_configServer.GetConfig().Features.CompressProfile); - var fmd5 = _hashUtil.GenerateMd5ForData(jsonProfile); + var fmd5 = await _hashUtil.GenerateHashForDataAsync(HashingAlgorithm.MD5, jsonProfile); if (!saveMd5.TryGetValue(sessionID, out var currentMd5) || currentMd5 != fmd5) { saveMd5[sessionID] = fmd5; // save profile to disk - _fileUtil.WriteFile(filePath, jsonProfile); + await _fileUtil.WriteFileAsync(filePath, jsonProfile); } start.Stop(); diff --git a/Libraries/SPTarkov.Server.Core/Services/BackupService.cs b/Libraries/SPTarkov.Server.Core/Services/BackupService.cs index aea47c39..c4feb7d1 100644 --- a/Libraries/SPTarkov.Server.Core/Services/BackupService.cs +++ b/Libraries/SPTarkov.Server.Core/Services/BackupService.cs @@ -46,22 +46,22 @@ public class BackupService /// /// Start the backup interval if enabled in config. /// - public void StartBackupSystem() + public async Task StartBackupSystem() { if (!_backupConfig.BackupInterval.Enabled) { // Not backing up at regular intervals, run once and exit - Init(); + await Init(); return; } - _backupIntervalTimer = new Timer( + _backupIntervalTimer = new Timer(async _ => { try { - Init(); + await Init(); } catch (Exception ex) { @@ -79,7 +79,7 @@ public class BackupService /// This method orchestrates the profile backup service. Handles copying profiles to a backup directory and cleaning /// up old backups if the number exceeds the configured maximum. /// - public void Init() + public async Task Init() { if (!IsEnabled()) { @@ -129,7 +129,7 @@ public class BackupService } // Write a copy of active mods. - _fileUtil.WriteFile(Path.Combine(targetDir, "activeMods.json"), _jsonUtil.Serialize(_activeServerMods)); + await _fileUtil.WriteFileAsync(Path.Combine(targetDir, "activeMods.json"), _jsonUtil.Serialize(_activeServerMods)); if (_logger.IsLogEnabled(LogLevel.Debug)) { diff --git a/Libraries/SPTarkov.Server.Core/Services/Cache/BundleHashCacheService.cs b/Libraries/SPTarkov.Server.Core/Services/Cache/BundleHashCacheService.cs index 61b78871..6a5ca0af 100644 --- a/Libraries/SPTarkov.Server.Core/Services/Cache/BundleHashCacheService.cs +++ b/Libraries/SPTarkov.Server.Core/Services/Cache/BundleHashCacheService.cs @@ -43,7 +43,7 @@ public class BundleHashCacheService( public bool CalculateAndMatchHash(string bundlePath) { var fileContents = _fileUtil.ReadFile(bundlePath); - var generatedHash = _hashUtil.GenerateMd5ForData(fileContents); + var generatedHash = _hashUtil.GenerateHashForData(HashingAlgorithm.MD5, fileContents); return MatchWithStoredHash(bundlePath, generatedHash); } @@ -51,7 +51,7 @@ public class BundleHashCacheService( public void CalculateAndStoreHash(string bundlePath) { var fileContents = _fileUtil.ReadFile(bundlePath); - var generatedHash = _hashUtil.GenerateMd5ForData(fileContents); + var generatedHash = _hashUtil.GenerateHashForData(HashingAlgorithm.MD5, fileContents); StoreValue(bundlePath, generatedHash); } diff --git a/Libraries/SPTarkov.Server.Core/Services/Cache/ModHashCacheService.cs b/Libraries/SPTarkov.Server.Core/Services/Cache/ModHashCacheService.cs index de66683b..a42083e5 100644 --- a/Libraries/SPTarkov.Server.Core/Services/Cache/ModHashCacheService.cs +++ b/Libraries/SPTarkov.Server.Core/Services/Cache/ModHashCacheService.cs @@ -42,14 +42,14 @@ public class ModHashCacheService( public bool CalculateAndCompareHash(string modName, string modContent) { - var generatedHash = _hashUtil.GenerateSha1ForData(modContent); + var generatedHash = _hashUtil.GenerateHashForData(HashingAlgorithm.SHA1, modContent); return MatchWithStoredHash(modName, generatedHash); } public void CalculateAndStoreHash(string modName, string modContent) { - var generatedHash = _hashUtil.GenerateSha1ForData(modContent); + var generatedHash = _hashUtil.GenerateHashForData(HashingAlgorithm.SHA1, modContent); StoreValue(modName, generatedHash); } diff --git a/Libraries/SPTarkov.Server.Core/Services/CircleOfCultistService.cs b/Libraries/SPTarkov.Server.Core/Services/CircleOfCultistService.cs index b634698f..01d222d0 100644 --- a/Libraries/SPTarkov.Server.Core/Services/CircleOfCultistService.cs +++ b/Libraries/SPTarkov.Server.Core/Services/CircleOfCultistService.cs @@ -549,7 +549,7 @@ public class CircleOfCultistService( // Key is sacrificed items separated by commas, a dash, then the rewards separated by commas var key = $"{{{required}-{reward}}}"; - return _hashUtil.GenerateMd5ForData(key); + return _hashUtil.GenerateHashForData(HashingAlgorithm.MD5, key); } /// @@ -887,7 +887,7 @@ public class CircleOfCultistService( protected string CreateSacrificeCacheKey(IEnumerable requiredItems) { var concat = string.Join(",", requiredItems.OrderBy(item => item)); - return _hashUtil.GenerateMd5ForData(concat); + return _hashUtil.GenerateHashForData(HashingAlgorithm.MD5, concat); } /// diff --git a/Libraries/SPTarkov.Server.Core/Services/CreateProfileService.cs b/Libraries/SPTarkov.Server.Core/Services/CreateProfileService.cs index 7f68271f..69fbe20f 100644 --- a/Libraries/SPTarkov.Server.Core/Services/CreateProfileService.cs +++ b/Libraries/SPTarkov.Server.Core/Services/CreateProfileService.cs @@ -40,7 +40,7 @@ public class CreateProfileService( MailSendService _mailSendService ) { - public string CreateProfile(string sessionId, ProfileCreateRequestData request) + public async ValueTask CreateProfile(string sessionId, ProfileCreateRequestData request) { var account = _cloner.Clone(_saveServer.GetProfile(sessionId)); var profileTemplateClone = _cloner.Clone(_profileHelper.GetProfileTemplateForSide(account.ProfileInfo.Edition, request.Side)); @@ -207,12 +207,12 @@ public class CreateProfileService( _saveServer.GetProfile(sessionId).CharacterData.ScavData = _playerScavGenerator.Generate(sessionId); // Store minimal profile and reload it - _saveServer.SaveProfile(sessionId); - _saveServer.LoadProfile(sessionId); + await _saveServer.SaveProfileAsync(sessionId); + await _saveServer.LoadProfileAsync(sessionId); // Completed account creation _saveServer.GetProfile(sessionId).ProfileInfo.IsWiped = false; - _saveServer.SaveProfile(sessionId); + await _saveServer.SaveProfileAsync(sessionId); return pmcData.Id; } diff --git a/Libraries/SPTarkov.Server.Core/Services/LocationLifecycleService.cs b/Libraries/SPTarkov.Server.Core/Services/LocationLifecycleService.cs index 72191c99..eece18bd 100644 --- a/Libraries/SPTarkov.Server.Core/Services/LocationLifecycleService.cs +++ b/Libraries/SPTarkov.Server.Core/Services/LocationLifecycleService.cs @@ -722,7 +722,7 @@ public class LocationLifecycleService pmcProfile.Info.LastTimePlayedAsSavage = _timeUtil.GetTimeStamp(); // Force a profile save - _saveServer.SaveProfile(sessionId); + _saveServer.SaveProfileAsync(sessionId); } /// diff --git a/Libraries/SPTarkov.Server.Core/Utils/FileUtil.cs b/Libraries/SPTarkov.Server.Core/Utils/FileUtil.cs index dcf337b1..37dd403d 100644 --- a/Libraries/SPTarkov.Server.Core/Utils/FileUtil.cs +++ b/Libraries/SPTarkov.Server.Core/Utils/FileUtil.cs @@ -90,6 +90,31 @@ public class FileUtil() File.WriteAllBytes(filePath, fileContent); } + public async Task WriteFileAsync(string filePath, string fileContent) + { + if (!DirectoryExists(Path.GetDirectoryName(filePath))) + { + CreateDirectory(Path.GetDirectoryName(filePath)); + } + + if (!FileExists(filePath)) + { + CreateFile(filePath); + } + + await File.WriteAllTextAsync(filePath, fileContent); + } + + public async Task WriteFileAsync(string filePath, byte[] fileContent) + { + if (!FileExists(filePath)) + { + CreateFile(filePath); + } + + await File.WriteAllBytesAsync(filePath, fileContent); + } + private void CreateFile(string filePath) { var stream = File.Create(filePath); diff --git a/Libraries/SPTarkov.Server.Core/Utils/HashUtil.cs b/Libraries/SPTarkov.Server.Core/Utils/HashUtil.cs index 7bc89fe8..38e4a507 100644 --- a/Libraries/SPTarkov.Server.Core/Utils/HashUtil.cs +++ b/Libraries/SPTarkov.Server.Core/Utils/HashUtil.cs @@ -50,16 +50,6 @@ public partial class HashUtil(RandomUtil _randomUtil) return MongoIdRegex().IsMatch(stringToCheck); } - public string GenerateMd5ForData(string data) - { - return GenerateHashForData(HashingAlgorithm.MD5, data); - } - - public string GenerateSha1ForData(string data) - { - return GenerateHashForData(HashingAlgorithm.SHA1, data); - } - public uint GenerateCrc32ForData(string data) { return Crc32.HashToUInt32(new ArraySegment(Encoding.UTF8.GetBytes(data))); @@ -89,6 +79,36 @@ public partial class HashUtil(RandomUtil _randomUtil) throw new NotImplementedException($"Provided hash algorithm: {algorithm} is not supported."); } + /// + /// Create a hash for the data parameter asynchronously + /// + /// algorithm to use to hash + /// data to be hashed + /// A task which contains the hash value + /// thrown if the provided algorithm is not implemented + /// > + public async Task GenerateHashForDataAsync(HashingAlgorithm algorithm, string data) + { + switch (algorithm) + { + case HashingAlgorithm.MD5: + { + await using var ms = new MemoryStream(Encoding.UTF8.GetBytes(data)); + var md5HashData = await MD5.HashDataAsync(ms); + return Convert.ToHexString(md5HashData).Replace("-", string.Empty); + } + + case HashingAlgorithm.SHA1: + { + await using var ms = new MemoryStream(Encoding.UTF8.GetBytes(data)); + var sha1HashData = await SHA1.HashDataAsync(ms); + return Convert.ToHexString(sha1HashData).Replace("-", string.Empty); + } + } + + throw new NotImplementedException($"Provided hash algorithm: {algorithm} is not supported."); + } + /// /// Generates an account ID for a profile /// diff --git a/UnitTests/Tests/Utils/HashUtilTests.cs b/UnitTests/Tests/Utils/HashUtilTests.cs index de9c21ad..95c4c2a3 100644 --- a/UnitTests/Tests/Utils/HashUtilTests.cs +++ b/UnitTests/Tests/Utils/HashUtilTests.cs @@ -62,7 +62,7 @@ public class HashUtilTests [DataRow("123456789", "25F9E794323B453885F5181F1B624D0B", "Not valid output, expected '25F9E794323B453885F5181F1B624D0B'")] public void GenerateValidMd5Test(string input, string expectedOutput, string failMessage) { - var result = _hashUtil.GenerateMd5ForData(input); + var result = _hashUtil.GenerateHashForData(HashingAlgorithm.MD5,input); Assert.AreEqual( expectedOutput, result,