public async Task LoadsIncompleteConfigAsync() { var workDir = Common.GetWorkDir(); await IoHelpers.TryDeleteDirectoryAsync(workDir); CoordinatorParameters coordinatorParameters = new(workDir); // Create the config first with default value. using WabiSabiCoordinator coordinator = new(coordinatorParameters, NewMockRpcClient(), new CoinJoinIdStore()); await coordinator.StartAsync(CancellationToken.None); await coordinator.StopAsync(CancellationToken.None); // Remove a line. var configPath = Path.Combine(workDir, "WabiSabiConfig.json"); var lines = File.ReadAllLines(configPath); var incompleteLines = lines.Where(x => !x.Contains("ReleaseUtxoFromPrisonAfter", StringComparison.Ordinal)).ToArray(); Assert.NotEqual(lines.Length, incompleteLines.Length); File.WriteAllLines(configPath, incompleteLines); // Assert the new default value is loaded. CoordinatorParameters coordinatorParameters2 = new(workDir); using WabiSabiCoordinator coordinator2 = new(coordinatorParameters2, NewMockRpcClient(), new CoinJoinIdStore()); await coordinator2.StartAsync(CancellationToken.None); var defaultValue = TimeSpanJsonConverter.Parse("0d 3h 0m 0s"); Assert.Equal(TimeSpan.FromHours(3), defaultValue); Assert.Equal(defaultValue, coordinator2.Config.ReleaseUtxoFromPrisonAfter); await coordinator2.StopAsync(CancellationToken.None); // Assert the new default value is serialized. lines = File.ReadAllLines(configPath); Assert.Contains(lines, x => x.Contains("\"ReleaseUtxoFromPrisonAfter\": \"0d 3h 0m 0s\"", StringComparison.Ordinal)); }
public DefaultValueTimeSpanAttribute(string json) : base(TimeSpanJsonConverter.Parse(json)) { }