Skip to content

Commit

Permalink
Allow for programmatic configuration of protocol settings in master-2…
Browse files Browse the repository at this point in the history
….x branch (#959)
  • Loading branch information
devhawk authored and shargon committed Jul 26, 2019
1 parent 425eaa7 commit 661c140
Show file tree
Hide file tree
Showing 2 changed files with 120 additions and 4 deletions.
96 changes: 96 additions & 0 deletions neo.UnitTests/UT_ProtocolSettings.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,96 @@
using FluentAssertions;
using Microsoft.Extensions.Configuration;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using System;
using System.Collections.Generic;
using System.Reflection;
using System.Text;

namespace Neo.UnitTests
{
[TestClass]
public class UT_ProtocolSettings
{
const uint mainNetMagic = 0x746E41u;

// since ProtocolSettings.Default is designed to be writable only once, use reflection to
// reset the underlying _default field to null before and after running tests in this class.
static void ResetProtocolSettings()
{
var defaultField = typeof(ProtocolSettings)
.GetField("_default", BindingFlags.Static | BindingFlags.NonPublic);
defaultField.SetValue(null, null);
}

[TestInitialize]
public void Initialize()
{
ResetProtocolSettings();
}

[TestCleanup]
public void Cleanup()
{
ResetProtocolSettings();
}

[TestMethod]
public void Default_Magic_should_be_mainnet_Magic_value()
{
ProtocolSettings.Default.Magic.Should().Be(mainNetMagic);
}

[TestMethod]
public void Can_initialize_ProtocolSettings()
{
var expectedMagic = 12345u;

var dict = new Dictionary<string, string>()
{
{ "ProtocolConfiguration:Magic", $"{expectedMagic}" }
};

var config = new ConfigurationBuilder().AddInMemoryCollection(dict).Build();
ProtocolSettings.Initialize(config).Should().BeTrue();
ProtocolSettings.Default.Magic.Should().Be(expectedMagic);
}

[TestMethod]
public void Cant_initialize_ProtocolSettings_after_default_settings_used()
{
ProtocolSettings.Default.Magic.Should().Be(mainNetMagic);

var updatedMagic = 54321u;
var dict = new Dictionary<string, string>()
{
{ "ProtocolConfiguration:Magic", $"{updatedMagic}" }
};

var config = new ConfigurationBuilder().AddInMemoryCollection(dict).Build();
ProtocolSettings.Initialize(config).Should().BeFalse();
ProtocolSettings.Default.Magic.Should().Be(mainNetMagic);
}

[TestMethod]
public void Cant_initialize_ProtocolSettings_twice()
{
var expectedMagic = 12345u;
var dict = new Dictionary<string, string>()
{
{ "ProtocolConfiguration:Magic", $"{expectedMagic}" }
};

var config = new ConfigurationBuilder().AddInMemoryCollection(dict).Build();
ProtocolSettings.Initialize(config).Should().BeTrue();

var updatedMagic = 54321u;
dict = new Dictionary<string, string>()
{
{ "ProtocolConfiguration:Magic", $"{updatedMagic}" }
};
config = new ConfigurationBuilder().AddInMemoryCollection(dict).Build();
ProtocolSettings.Initialize(config).Should().BeFalse();
ProtocolSettings.Default.Magic.Should().Be(expectedMagic);
}
}
}
28 changes: 24 additions & 4 deletions neo/ProtocolSettings.cs
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading;

namespace Neo
{
Expand All @@ -16,12 +17,31 @@ public class ProtocolSettings
public Fixed8 LowPriorityThreshold { get; }
public uint SecondsPerBlock { get; }

public static ProtocolSettings Default { get; }
static ProtocolSettings _default;

static ProtocolSettings()
static bool UpdateDefault(IConfiguration configuration)
{
IConfigurationSection section = new ConfigurationBuilder().AddJsonFile("protocol.json", true).Build().GetSection("ProtocolConfiguration");
Default = new ProtocolSettings(section);
var settings = new ProtocolSettings(configuration.GetSection("ProtocolConfiguration"));
return null == Interlocked.CompareExchange(ref _default, settings, null);
}

public static bool Initialize(IConfiguration configuration)
{
return UpdateDefault(configuration);
}

public static ProtocolSettings Default
{
get
{
if (_default == null)
{
var configuration = new ConfigurationBuilder().AddJsonFile("protocol.json", true).Build();
UpdateDefault(configuration);
}

return _default;
}
}

private ProtocolSettings(IConfigurationSection section)
Expand Down

0 comments on commit 661c140

Please sign in to comment.