/// <summary> /// Initializes a new instance of the <see cref="StreamWriterRollingHelper"/>. /// </summary> /// <param name="owner">The <see cref="RollingFlatFileSink"/> to use.</param> public StreamWriterRollingHelper(RollingFlatFileSink owner) { this.owner = owner; this.dateTimeProvider = new DateTimeProvider(); this.performsRolling = this.owner.rollInterval != RollInterval.None || this.owner.rollSizeInBytes > 0; }
public StandardRandomizer(Random random, IRandomSymbolStringGenerator stringRandomizer, DateTimeProvider dateProvider, long dateTimeMinValue, long dateTimeMaxValue) { StandardRandomizer.Logger.Debug("Entering constructor"); this.random = random; this.stringRandomizer = stringRandomizer; this.dateProvider = dateProvider; this.dateTimeMinValue = dateTimeMinValue; this.dateTimeMaxValue = dateTimeMaxValue; StandardRandomizer.Logger.Debug("Exiting constructor"); }
public X10Controller(IProjectMonitor monitor, DateTimeProvider dateTimeProvider, X10Configuration configuration, ILampController lampController) { if (configuration != null && configuration.Enabled) { Trace.WriteLine("New X10Controller created"); this.lampController = lampController; this.dateTimeProvider = dateTimeProvider; this.configuration = configuration; this.monitor = monitor; monitor.Polled += new MonitorPolledEventHandler(Monitor_Polled); } }
public void OnAppStartup() { Database.SetInitializer <BitChangeSetManagerDbContext>(null); using (SqlConnection dbConnection = new SqlConnection(AppEnvironmentProvider.GetActiveAppEnvironment().GetConfig <string>("BitChangeSetManagerDbConnectionString"))) { using (BitChangeSetManagerDbContext dbContext = new BitChangeSetManagerDbContext(dbConnection)) { bool newDbCreated = dbContext.Database.CreateIfNotExists(); dbContext.Database.Initialize(force: true); if (newDbCreated == false) { return; } } } using (IDependencyResolver childResolver = DependencyManager.CreateChildDependencyResolver()) { IUnitOfWork unitOfWork = childResolver.Resolve <IUnitOfWork>(); using (unitOfWork.BeginWork()) { IBitChangeSetManagerRepository <User> usersRepository = childResolver.Resolve <IBitChangeSetManagerRepository <User> >(); string password = "******"; using (MD5 md5Hash = MD5.Create()) { byte[] data = md5Hash.ComputeHash(Encoding.UTF8.GetBytes(password)); StringBuilder sBuilder = new StringBuilder(); foreach (byte d in data) { sBuilder.Append(d.ToString("x2")); } password = sBuilder.ToString(); } byte[] userAvatar = Convert.FromBase64String("iVBORw0KGgoAAAANSUhEUgAAAQAAAAEACAYAAABccqhmAAAACXBIWXMAAAsTAAALEwEAmpwYAABCQWlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4KPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS42LWMwMTQgNzkuMTU2Nzk3LCAyMDE0LzA4LzIwLTA5OjUzOjAyICAgICAgICAiPgogICA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPgogICAgICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgICAgICAgICB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iCiAgICAgICAgICAgIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIKICAgICAgICAgICAgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iCiAgICAgICAgICAgIHhtbG5zOnN0RXZ0PSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VFdmVudCMiCiAgICAgICAgICAgIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIgogICAgICAgICAgICB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iCiAgICAgICAgICAgIHhtbG5zOnRpZmY9Imh0dHA6Ly9ucy5hZG9iZS5jb20vdGlmZi8xLjAvIgogICAgICAgICAgICB4bWxuczpleGlmPSJodHRwOi8vbnMuYWRvYmUuY29tL2V4aWYvMS4wLyI+CiAgICAgICAgIDx4bXA6Q3JlYXRlRGF0ZT4yMDE1LTExLTIxVDE1OjI5OjI5WjwveG1wOkNyZWF0ZURhdGU+CiAgICAgICAgIDx4bXA6TW9kaWZ5RGF0ZT4yMDE1LTExLTIyVDEwOjQzOjIyKzA1OjMwPC94bXA6TW9kaWZ5RGF0ZT4KICAgICAgICAgPHhtcDpNZXRhZGF0YURhdGU+MjAxNS0xMS0yMlQxMDo0MzoyMiswNTozMDwveG1wOk1ldGFkYXRhRGF0ZT4KICAgICAgICAgPHhtcDpDcmVhdG9yVG9vbD5BZG9iZSBQaG90b3Nob3AgQ0MgMjAxNCAoTWFjaW50b3NoKTwveG1wOkNyZWF0b3JUb29sPgogICAgICAgICA8ZGM6Zm9ybWF0PmltYWdlL3BuZzwvZGM6Zm9ybWF0PgogICAgICAgICA8eG1wTU06SGlzdG9yeT4KICAgICAgICAgICAgPHJkZjpTZXE+CiAgICAgICAgICAgICAgIDxyZGY6bGkgcmRmOnBhcnNlVHlwZT0iUmVzb3VyY2UiPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6YWN0aW9uPmNvbnZlcnRlZDwvc3RFdnQ6YWN0aW9uPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6cGFyYW1ldGVycz5mcm9tIGltYWdlL3BuZyB0byBhcHBsaWNhdGlvbi92bmQuYWRvYmUucGhvdG9zaG9wPC9zdEV2dDpwYXJhbWV0ZXJzPgogICAgICAgICAgICAgICA8L3JkZjpsaT4KICAgICAgICAgICAgICAgPHJkZjpsaSByZGY6cGFyc2VUeXBlPSJSZXNvdXJjZSI+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDphY3Rpb24+c2F2ZWQ8L3N0RXZ0OmFjdGlvbj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0Omluc3RhbmNlSUQ+eG1wLmlpZDpGN0NCMjUzMzM1MjA2ODExODIyQURDNzU2MTc0RDdBNjwvc3RFdnQ6aW5zdGFuY2VJRD4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OndoZW4+MjAxNS0xMS0yMlQwOTo0Mzo0NSswNTozMDwvc3RFdnQ6d2hlbj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OmNoYW5nZWQ+Lzwvc3RFdnQ6Y2hhbmdlZD4KICAgICAgICAgICAgICAgPC9yZGY6bGk+CiAgICAgICAgICAgICAgIDxyZGY6bGkgcmRmOnBhcnNlVHlwZT0iUmVzb3VyY2UiPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6YWN0aW9uPmNvbnZlcnRlZDwvc3RFdnQ6YWN0aW9uPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6cGFyYW1ldGVycz5mcm9tIGltYWdlL3BuZyB0byBhcHBsaWNhdGlvbi92bmQuYWRvYmUucGhvdG9zaG9wPC9zdEV2dDpwYXJhbWV0ZXJzPgogICAgICAgICAgICAgICA8L3JkZjpsaT4KICAgICAgICAgICAgICAgPHJkZjpsaSByZGY6cGFyc2VUeXBlPSJSZXNvdXJjZSI+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDphY3Rpb24+c2F2ZWQ8L3N0RXZ0OmFjdGlvbj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0Omluc3RhbmNlSUQ+eG1wLmlpZDpGOENCMjUzMzM1MjA2ODExODIyQURDNzU2MTc0RDdBNjwvc3RFdnQ6aW5zdGFuY2VJRD4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OndoZW4+MjAxNS0xMS0yMlQwOTo0Mzo0NSswNTozMDwvc3RFdnQ6d2hlbj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OmNoYW5nZWQ+Lzwvc3RFdnQ6Y2hhbmdlZD4KICAgICAgICAgICAgICAgPC9yZGY6bGk+CiAgICAgICAgICAgICAgIDxyZGY6bGkgcmRmOnBhcnNlVHlwZT0iUmVzb3VyY2UiPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6YWN0aW9uPnNhdmVkPC9zdEV2dDphY3Rpb24+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDppbnN0YW5jZUlEPnhtcC5paWQ6MTA0ZTIwYzAtMmExMi00NzgzLWExMTYtYzg5NzE2MTZiOTY4PC9zdEV2dDppbnN0YW5jZUlEPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6d2hlbj4yMDE1LTExLTIyVDEwOjQzOjIyKzA1OjMwPC9zdEV2dDp3aGVuPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6c29mdHdhcmVBZ2VudD5BZG9iZSBQaG90b3Nob3AgQ0MgMjAxNCAoTWFjaW50b3NoKTwvc3RFdnQ6c29mdHdhcmVBZ2VudD4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OmNoYW5nZWQ+Lzwvc3RFdnQ6Y2hhbmdlZD4KICAgICAgICAgICAgICAgPC9yZGY6bGk+CiAgICAgICAgICAgICAgIDxyZGY6bGkgcmRmOnBhcnNlVHlwZT0iUmVzb3VyY2UiPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6YWN0aW9uPmNvbnZlcnRlZDwvc3RFdnQ6YWN0aW9uPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6cGFyYW1ldGVycz5mcm9tIGFwcGxpY2F0aW9uL3ZuZC5hZG9iZS5waG90b3Nob3AgdG8gaW1hZ2UvcG5nPC9zdEV2dDpwYXJhbWV0ZXJzPgogICAgICAgICAgICAgICA8L3JkZjpsaT4KICAgICAgICAgICAgICAgPHJkZjpsaSByZGY6cGFyc2VUeXBlPSJSZXNvdXJjZSI+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDphY3Rpb24+ZGVyaXZlZDwvc3RFdnQ6YWN0aW9uPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6cGFyYW1ldGVycz5jb252ZXJ0ZWQgZnJvbSBhcHBsaWNhdGlvbi92bmQuYWRvYmUucGhvdG9zaG9wIHRvIGltYWdlL3BuZzwvc3RFdnQ6cGFyYW1ldGVycz4KICAgICAgICAgICAgICAgPC9yZGY6bGk+CiAgICAgICAgICAgICAgIDxyZGY6bGkgcmRmOnBhcnNlVHlwZT0iUmVzb3VyY2UiPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6YWN0aW9uPnNhdmVkPC9zdEV2dDphY3Rpb24+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDppbnN0YW5jZUlEPnhtcC5paWQ6NzdmNTk0MjEtMWM0Ni00OGYzLWEwYzMtNjBjZWVhM2ZjNTE4PC9zdEV2dDppbnN0YW5jZUlEPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6d2hlbj4yMDE1LTExLTIyVDEwOjQzOjIyKzA1OjMwPC9zdEV2dDp3aGVuPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6c29mdHdhcmVBZ2VudD5BZG9iZSBQaG90b3Nob3AgQ0MgMjAxNCAoTWFjaW50b3NoKTwvc3RFdnQ6c29mdHdhcmVBZ2VudD4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OmNoYW5nZWQ+Lzwvc3RFdnQ6Y2hhbmdlZD4KICAgICAgICAgICAgICAgPC9yZGY6bGk+CiAgICAgICAgICAgIDwvcmRmOlNlcT4KICAgICAgICAgPC94bXBNTTpIaXN0b3J5PgogICAgICAgICA8eG1wTU06RGVyaXZlZEZyb20gcmRmOnBhcnNlVHlwZT0iUmVzb3VyY2UiPgogICAgICAgICAgICA8c3RSZWY6aW5zdGFuY2VJRD54bXAuaWlkOjEwNGUyMGMwLTJhMTItNDc4My1hMTE2LWM4OTcxNjE2Yjk2ODwvc3RSZWY6aW5zdGFuY2VJRD4KICAgICAgICAgICAgPHN0UmVmOmRvY3VtZW50SUQ+eG1wLmRpZDpGN0NCMjUzMzM1MjA2ODExODIyQURDNzU2MTc0RDdBNjwvc3RSZWY6ZG9jdW1lbnRJRD4KICAgICAgICAgICAgPHN0UmVmOm9yaWdpbmFsRG9jdW1lbnRJRD54bXAuZGlkOkY3Q0IyNTMzMzUyMDY4MTE4MjJBREM3NTYxNzREN0E2PC9zdFJlZjpvcmlnaW5hbERvY3VtZW50SUQ+CiAgICAgICAgIDwveG1wTU06RGVyaXZlZEZyb20+CiAgICAgICAgIDx4bXBNTTpEb2N1bWVudElEPmFkb2JlOmRvY2lkOnBob3Rvc2hvcDplNzFkYWVjOS1kMTA4LTExNzgtOTU1NC1jMDUwNTIwYjZmMzE8L3htcE1NOkRvY3VtZW50SUQ+CiAgICAgICAgIDx4bXBNTTpJbnN0YW5jZUlEPnhtcC5paWQ6NzdmNTk0MjEtMWM0Ni00OGYzLWEwYzMtNjBjZWVhM2ZjNTE4PC94bXBNTTpJbnN0YW5jZUlEPgogICAgICAgICA8eG1wTU06T3JpZ2luYWxEb2N1bWVudElEPnhtcC5kaWQ6RjdDQjI1MzMzNTIwNjgxMTgyMkFEQzc1NjE3NEQ3QTY8L3htcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD4KICAgICAgICAgPHBob3Rvc2hvcDpDb2xvck1vZGU+MzwvcGhvdG9zaG9wOkNvbG9yTW9kZT4KICAgICAgICAgPHRpZmY6T3JpZW50YXRpb24+MTwvdGlmZjpPcmllbnRhdGlvbj4KICAgICAgICAgPHRpZmY6WFJlc29sdXRpb24+NzIwMDAwLzEwMDAwPC90aWZmOlhSZXNvbHV0aW9uPgogICAgICAgICA8dGlmZjpZUmVzb2x1dGlvbj43MjAwMDAvMTAwMDA8L3RpZmY6WVJlc29sdXRpb24+CiAgICAgICAgIDx0aWZmOlJlc29sdXRpb25Vbml0PjI8L3RpZmY6UmVzb2x1dGlvblVuaXQ+CiAgICAgICAgIDxleGlmOkNvbG9yU3BhY2U+NjU1MzU8L2V4aWY6Q29sb3JTcGFjZT4KICAgICAgICAgPGV4aWY6UGl4ZWxYRGltZW5zaW9uPjI1NjwvZXhpZjpQaXhlbFhEaW1lbnNpb24+CiAgICAgICAgIDxleGlmOlBpeGVsWURpbWVuc2lvbj4yNTY8L2V4aWY6UGl4ZWxZRGltZW5zaW9uPgogICAgICA8L3JkZjpEZXNjcmlwdGlvbj4KICAgPC9yZGY6UkRGPgo8L3g6eG1wbWV0YT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAKPD94cGFja2V0IGVuZD0idyI/PvH4Sk0AAAAgY0hSTQAAeiUAAICDAAD5/wAAgOkAAHUwAADqYAAAOpgAABdvkl/FRgAAJ79JREFUeNrsnXeYVeW5t++1y/QOM/QmfQAF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"); usersRepository.Add(new User { UserName = "******", Password = password, Culture = BitCulture.EnUs, AvatarImage = userAvatar }); usersRepository.Add(new User { UserName = "******", Password = password, Culture = BitCulture.FaIr, AvatarImage = userAvatar }); usersRepository.Add(new User { UserName = "******", Password = password, Culture = BitCulture.EnUs, AvatarImage = userAvatar }); usersRepository.Add(new User { UserName = "******", Password = password, Culture = BitCulture.FaIr, AvatarImage = userAvatar }); IBitChangeSetManagerRepository <Customer> customersRepository = childResolver.Resolve <IBitChangeSetManagerRepository <Customer> >(); IBitChangeSetManagerRepository <Delivery> deliveriesRepository = childResolver.Resolve <IBitChangeSetManagerRepository <Delivery> >(); IBitChangeSetManagerRepository <ChangeSet> changeSetsRepository = childResolver.Resolve <IBitChangeSetManagerRepository <ChangeSet> >(); IBitChangeSetManagerRepository <ChangeSetSeverity> changeSetSeveritiesRepository = childResolver.Resolve <IBitChangeSetManagerRepository <ChangeSetSeverity> >(); IBitChangeSetManagerRepository <ChangeSetDeliveryRequirement> changeSetDeliveryRequirementsRepository = childResolver.Resolve <IBitChangeSetManagerRepository <ChangeSetDeliveryRequirement> >(); IBitChangeSetManagerRepository <Province> provincesRepository = childResolver.Resolve <IBitChangeSetManagerRepository <Province> >(); IBitChangeSetManagerRepository <City> citiesRepository = childResolver.Resolve <IBitChangeSetManagerRepository <City> >(); IBitChangeSetManagerRepository <Constant> constantsRepository = childResolver.Resolve <IBitChangeSetManagerRepository <Constant> >(); Customer customer1 = new Customer { Name = "Customer1" }; Customer customer2 = new Customer { Name = "Customer2" }; customersRepository.AddRange(new[] { customer1, customer2 }); ChangeSetDeliveryRequirement changeSetDeliveryRequirement1 = new ChangeSetDeliveryRequirement { Title = "Deliver to all developers" }; ChangeSetDeliveryRequirement changeSetDeliveryRequirement2 = new ChangeSetDeliveryRequirement { Title = "Deliver to technical manager" }; ChangeSetDeliveryRequirement changeSetDeliveryRequirement3 = new ChangeSetDeliveryRequirement { Title = "No specific delivery is required" }; changeSetDeliveryRequirementsRepository.AddRange(new[] { changeSetDeliveryRequirement1, changeSetDeliveryRequirement2, changeSetDeliveryRequirement3 }); ChangeSetSeverity changeSetSeverity1 = new ChangeSetSeverity { Title = "Low" }; ChangeSetSeverity changeSetSeverity2 = new ChangeSetSeverity { Title = "Medium" }; ChangeSetSeverity changeSetSeverity3 = new ChangeSetSeverity { Title = "High" }; changeSetSeveritiesRepository.AddRange(new[] { changeSetSeverity1, changeSetSeverity2, changeSetSeverity3 }); ChangeSet changeSet1 = new ChangeSet { AssociatedCommitUrl = "http://github.com/bit-foundation/bit-framework", Description = "Desc1", Title = "ChangeSet1", DeliveryRequirementId = changeSetDeliveryRequirement1.Id, SeverityId = changeSetSeverity3.Id }; ChangeSet changeSet2 = new ChangeSet { AssociatedCommitUrl = "http://github.com/bit-foundation/bit-framework", Description = "Desc2", Title = "ChangeSet2", DeliveryRequirementId = changeSetDeliveryRequirement1.Id, SeverityId = changeSetSeverity3.Id }; changeSetsRepository.AddRange(new[] { changeSet1, changeSet2 }); Delivery delivery1 = new Delivery { ChangeSetId = changeSet1.Id, CustomerId = customer1.Id, DeliveredOn = DateTimeProvider.GetCurrentUtcDateTime() }; Delivery delivery2 = new Delivery { ChangeSetId = changeSet1.Id, CustomerId = customer2.Id, DeliveredOn = DateTimeProvider.GetCurrentUtcDateTime() }; Delivery delivery3 = new Delivery { ChangeSetId = changeSet2.Id, CustomerId = customer1.Id, DeliveredOn = DateTimeProvider.GetCurrentUtcDateTime() }; deliveriesRepository.AddRange(new[] { delivery1, delivery2, delivery3 }); Province province1 = new Province { Name = "Province1" }; Province province2 = new Province { Name = "Province2" }; Province province3 = new Province { Name = "Province3" }; provincesRepository.AddRange(new[] { province1, province2, province3 }); List <City> cities = new List <City>(); int num = 1; foreach (Province province in new[] { province1, province2, province3 }) { for (int i = 0; i < 100; i++) { cities.Add(new City { Name = $"City{num}{i}", ProvinceId = province.Id }); } num++; } citiesRepository.AddRange(cities); constantsRepository.AddRange(new[] { new Constant { Name = "Ans_Yes", Title = "Yes" }, new Constant { Name = "Ans_No", Title = "No" }, new Constant { Name = "Gender_Man", Title = "Man" }, new Constant { Name = "Gender_Woman", Title = "Woman" }, new Constant { Name = "Gender_Other", Title = "Other" } }); unitOfWork.CommitWork(); } } }
/// <summary> /// Protected constructor. /// </summary> /// <param name="config">The config class.</param> protected TraceListener(AppConfig config) { this.config = config; this.dateTimeProvider = new DefaultDateTimeProvider(); }
public void CanRewind() { using (NodeContext nodeContext = NodeContext.Create(this)) { var dateTimeProvider = new DateTimeProvider(); var cacheCoinView = new CachedCoinView(nodeContext.PersistentCoinView, dateTimeProvider, this.loggerFactory, new NodeStats(dateTimeProvider)); var tester = new CoinViewTester(cacheCoinView); Coin[] coinsA = tester.CreateCoins(5); Coin[] coinsB = tester.CreateCoins(1); tester.NewBlock(); cacheCoinView.Flush(); Assert.True(tester.Exists(coinsA[2])); Assert.True(tester.Exists(coinsB[0])); // Spend some coins. tester.Spend(coinsA[2]); tester.Spend(coinsB[0]); tester.NewBlock(); // This will save an empty RewindData instance tester.NewBlock(); // Create a new coin set/ Coin[] coinsC = tester.CreateCoins(1); tester.NewBlock(); Assert.True(tester.Exists(coinsA[0])); Assert.True(tester.Exists(coinsC[0])); Assert.False(tester.Exists(coinsA[2])); Assert.False(tester.Exists(coinsB[0])); // We need to rewind 3 times as we are now rewinding one block at a time. tester.Rewind(); // coinsC[0] should not exist any more. tester.Rewind(); // coinsA[2] should be spendable again. tester.Rewind(); // coinsB[2] should be spendable again. Assert.False(tester.Exists(coinsC[0])); Assert.True(tester.Exists(coinsA[2])); Assert.True(tester.Exists(coinsB[0])); // Spend some coins and esnure they are not spendable. tester.Spend(coinsA[2]); tester.Spend(coinsB[0]); tester.NewBlock(); cacheCoinView.Flush(); Assert.False(tester.Exists(coinsA[2])); Assert.False(tester.Exists(coinsB[0])); // Rewind so that coinsA[2] and coinsB[0] become spendable again. tester.Rewind(); Assert.True(tester.Exists(coinsA[2])); Assert.True(tester.Exists(coinsB[0])); // Create 7 coins in a new coin set and spend the first coin. Coin[] coinsD = tester.CreateCoins(7); tester.Spend(coinsD[0]); // Create a coin in a new coin set and spend it. Coin[] coinsE = tester.CreateCoins(1); tester.Spend(coinsE[0]); tester.NewBlock(); Assert.True(tester.Exists(coinsD[1])); Assert.False(tester.Exists(coinsD[0])); cacheCoinView.Flush(); // Creates another empty RewindData instance. tester.NewBlock(); // Rewind one block. tester.Rewind(); // coinsD[1] was never touched, so should remain unchanged. // coinsD[0] was spent but the block in which the changes happened was not yet rewound to, so it remains unchanged. // coinsE[0] was spent but the block in which the changes happened was not yet rewound to, so it remains unchanged. // coinsA[1] was not touched, so should remain unchanged. // coinsB[1] was not touched, so should remain unchanged. Assert.True(tester.Exists(coinsD[1])); Assert.False(tester.Exists(coinsD[0])); Assert.False(tester.Exists(coinsE[0])); Assert.True(tester.Exists(coinsA[2])); Assert.True(tester.Exists(coinsB[0])); // Rewind one block. tester.Rewind(); // coinsD[0] should now not exist in CoinView anymore. // coinsE[0] should now not exist in CoinView anymore. Assert.False(tester.Exists(coinsD[0])); Assert.False(tester.Exists(coinsE[0])); } }
public async Task InitializeAsync() { this.blockinfo = new List <Blockinfo>(); List <long> lst = blockinfoarr.Cast <long>().ToList(); for (int i = 0; i < lst.Count; i += 2) { this.blockinfo.Add(new Blockinfo { extranonce = (int)lst[i], nonce = (uint)lst[i + 1] }); } // Note that by default, these tests run with size accounting enabled. this.network = KnownNetworks.RegTest; byte[] hex = Encoders.Hex.DecodeData("04678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5f"); this.scriptPubKey = new Script(new[] { Op.GetPushOp(hex), OpcodeType.OP_CHECKSIG }); this.entry = new TestMemPoolEntryHelper(); this.chain = new ConcurrentChain(this.network); this.network.Consensus.Options = new ConsensusOptions(); IDateTimeProvider dateTimeProvider = DateTimeProvider.Default; var inMemoryCoinView = new InMemoryCoinView(this.chain.Tip.HashBlock); this.cachedCoinView = new CachedCoinView(inMemoryCoinView, dateTimeProvider, new LoggerFactory(), new NodeStats(dateTimeProvider)); var loggerFactory = new ExtendedLoggerFactory(); loggerFactory.AddConsoleWithFilters(); var nodeSettings = new NodeSettings(args: new string[] { "-checkpoints" }); var consensusSettings = new ConsensusSettings(nodeSettings); var networkPeerFactory = new NetworkPeerFactory(this.network, dateTimeProvider, loggerFactory, new PayloadProvider().DiscoverPayloads(), new SelfEndpointTracker(loggerFactory), new Mock <IInitialBlockDownloadState>().Object, new ConnectionManagerSettings()); var peerAddressManager = new PeerAddressManager(DateTimeProvider.Default, nodeSettings.DataFolder, loggerFactory, new SelfEndpointTracker(loggerFactory)); var peerDiscovery = new PeerDiscovery(new AsyncLoopFactory(loggerFactory), loggerFactory, this.network, networkPeerFactory, new NodeLifetime(), nodeSettings, peerAddressManager); var connectionSettings = new ConnectionManagerSettings(nodeSettings); var selfEndpointTracker = new SelfEndpointTracker(loggerFactory); var connectionManager = new ConnectionManager(dateTimeProvider, loggerFactory, this.network, networkPeerFactory, nodeSettings, new NodeLifetime(), new NetworkPeerConnectionParameters(), peerAddressManager, new IPeerConnector[] { }, peerDiscovery, selfEndpointTracker, connectionSettings, new VersionProvider(), new Mock <INodeStats>().Object); var peerBanning = new PeerBanning(connectionManager, loggerFactory, dateTimeProvider, peerAddressManager); var deployments = new NodeDeployments(this.network, this.chain); var genesis = this.network.GetGenesis(); var chainState = new ChainState() { BlockStoreTip = new ChainedHeader(genesis.Header, genesis.GetHash(), 0) }; this.ConsensusRules = new PowConsensusRuleEngine(this.network, loggerFactory, dateTimeProvider, this.chain, deployments, consensusSettings, new Checkpoints(), this.cachedCoinView, chainState, new InvalidBlockHashStore(dateTimeProvider), new NodeStats(dateTimeProvider)).Register(); this.consensus = ConsensusManagerHelper.CreateConsensusManager(this.network, chainState: chainState, inMemoryCoinView: inMemoryCoinView, chain: this.chain); await this.consensus.InitializeAsync(chainState.BlockStoreTip); this.entry.Fee(11); this.entry.Height(11); var dateTimeProviderSet = new DateTimeProviderSet { time = dateTimeProvider.GetTime(), timeutc = dateTimeProvider.GetUtcNow() }; this.DateTimeProvider = dateTimeProviderSet; this.mempool = new TxMempool(dateTimeProvider, new BlockPolicyEstimator(new MempoolSettings(nodeSettings), loggerFactory, nodeSettings), loggerFactory, nodeSettings); this.mempoolLock = new MempoolSchedulerLock(); // We can't make transactions until we have inputs // Therefore, load 100 blocks :) this.baseheight = 0; var blocks = new List <Block>(); this.txFirst = new List <Transaction>(); this.nonce = 0; for (int i = 0; i < this.blockinfo.Count; ++i) { Block block = this.network.CreateBlock(); block.Header.HashPrevBlock = this.consensus.Tip.HashBlock; block.Header.Version = 1; block.Header.Time = Utils.DateTimeToUnixTime(this.chain.Tip.GetMedianTimePast()) + 1; Transaction txCoinbase = this.network.CreateTransaction(); txCoinbase.Version = 1; txCoinbase.AddInput(new TxIn(new Script(new[] { Op.GetPushOp(this.blockinfo[i].extranonce), Op.GetPushOp(this.chain.Height) }))); // Ignore the (optional) segwit commitment added by CreateNewBlock (as the hardcoded nonces don't account for this) txCoinbase.AddOutput(new TxOut(Money.Zero, new Script())); block.AddTransaction(txCoinbase); if (this.txFirst.Count == 0) { this.baseheight = this.chain.Height; } if (this.txFirst.Count < 4) { this.txFirst.Add(block.Transactions[0]); } block.Header.Bits = block.Header.GetWorkRequired(this.network, this.chain.Tip); block.UpdateMerkleRoot(); while (!block.CheckProofOfWork()) { block.Header.Nonce = ++this.nonce; } // Serialization sets the BlockSize property. block = Block.Load(block.ToBytes(), this.network); var res = await this.consensus.BlockMinedAsync(block); if (res == null) { throw new InvalidOperationException(); } blocks.Add(block); } // Just to make sure we can still make simple blocks this.newBlock = AssemblerForTest(this).Build(this.chain.Tip, this.scriptPubKey); Assert.NotNull(this.newBlock); }
/// <summary> /// Initializes a new instance of the <see cref="LogEntry"/> class. /// </summary> /// <param name="config">The application configuration.</param> /// <param name="dateTimeProvider">The date and time provider.</param> public LogEntry(AppConfig config, DateTimeProvider dateTimeProvider) { this.config = config; this.dateTimeProvider = dateTimeProvider; }
public FilterTrigger(DateTimeProvider dtProvider) { this.dtProvider = dtProvider; }
/// <summary> /// Initializes a new instance of the <see cref="FileScrumTeamRepository" /> class. /// </summary> /// <param name="settings">The repository settings.</param> /// <param name="configuration">The configuration of the planning poker.</param> /// <param name="dateTimeProvider">The date-time provider.</param> /// <param name="logger">Logger instance to log events.</param> public FileScrumTeamRepository(IFileScrumTeamRepositorySettings settings, IPlanningPokerConfiguration configuration, DateTimeProvider dateTimeProvider, ILogger <FileScrumTeamRepository> logger) { _settings = settings ?? throw new ArgumentNullException(nameof(settings)); _configuration = configuration ?? new PlanningPokerConfiguration(); _dateTimeProvider = dateTimeProvider ?? new DateTimeProvider(); _folder = new Lazy <string>(GetFolder); _invalidCharacters = new Lazy <char[]>(GetInvalidCharacters); _logger = logger; }
public void CleanUp() { DateTimeProvider.ResetDateTime(); new DatabaseHelper().HardDeleteAll(); }
/// <summary> /// Default constructor for CohortPackagerHost /// </summary> /// <param name="globals"></param> /// <param name="jobStore"></param> /// <param name="fileSystem"></param> /// <param name="reporter"> /// Pass to override the default IJobReporter that will be created from /// Globals.CohortPackagerOptions.ReportFormat. That value should not be set if a reporter is passed. /// </param> /// <param name="notifier"></param> /// <param name="rabbitMqAdapter"></param> /// <param name="dateTimeProvider"></param> public CohortPackagerHost( [NotNull] GlobalOptions globals, [CanBeNull] ExtractJobStore jobStore = null, [CanBeNull] IFileSystem fileSystem = null, [CanBeNull] IJobReporter reporter = null, [CanBeNull] IJobCompleteNotifier notifier = null, [CanBeNull] IRabbitMqAdapter rabbitMqAdapter = null, [CanBeNull] DateTimeProvider dateTimeProvider = null ) : base(globals, rabbitMqAdapter) { if (jobStore == null) { MongoDbOptions mongoDbOptions = Globals.MongoDatabases.ExtractionStoreOptions; jobStore = new MongoExtractJobStore( MongoClientHelpers.GetMongoClient(mongoDbOptions, HostProcessName), mongoDbOptions.DatabaseName, dateTimeProvider ); } else if (dateTimeProvider != null) { throw new ArgumentException("jobStore and dateTimeProvider are mutually exclusive arguments"); } // If not passed a reporter or notifier, try and construct one from the given options string reportFormatStr = Globals.CohortPackagerOptions.ReportFormat; if (reporter == null) { reporter = JobReporterFactory.GetReporter( Globals.CohortPackagerOptions.ReporterType, jobStore, fileSystem ?? new FileSystem(), Globals.FileSystemOptions.ExtractRoot, reportFormatStr, Globals.CohortPackagerOptions.ReportNewLine ); } else { if (!string.IsNullOrWhiteSpace(reportFormatStr)) { throw new ArgumentException($"Passed an IJobReporter, but this conflicts with the ReportFormat of '{reportFormatStr}' in the given options"); } if (fileSystem != null) { throw new ArgumentException("Passed a fileSystem, but this will be unused as also passed an existing IJobReporter"); } } notifier ??= JobCompleteNotifierFactory.GetNotifier( Globals.CohortPackagerOptions.NotifierType ); _jobWatcher = new ExtractJobWatcher( globals.CohortPackagerOptions, jobStore, ExceptionCallback, notifier, reporter ); AddControlHandler(new CohortPackagerControlMessageHandler(_jobWatcher)); // Setup our consumers _requestInfoMessageConsumer = new ExtractionRequestInfoMessageConsumer(jobStore); _fileCollectionMessageConsumer = new ExtractFileCollectionMessageConsumer(jobStore); _anonFailedMessageConsumer = new AnonFailedMessageConsumer(jobStore); _anonVerificationMessageConsumer = new AnonVerificationMessageConsumer(jobStore); }
/// <summary> /// Initializes a new instance of the <see cref="AzurePlanningPokerController"/> class. /// </summary> /// <param name="dateTimeProvider">The date time provider to provide current date-time.</param> /// <param name="configuration">The configuration of the planning poker.</param> /// <param name="repository">The Scrum teams repository.</param> /// <param name="logger">Logger instance to log events.</param> public AzurePlanningPokerController(DateTimeProvider dateTimeProvider, IAzurePlanningPokerConfiguration configuration, IScrumTeamRepository repository, ILogger <PlanningPokerController> logger) : base(dateTimeProvider, configuration, repository, logger) { }
// TODO during workshops: participants & organizers handling public void Dispose() => DateTimeProvider.ResetImplementations();
public MeetingTests() { testMeeting = Model.Meeting.Meeting.Create("Test Title"); DateTimeProvider.SetUtcNowImplementation(() => DateTime.Parse("2020-09-24 17:00:00")); }
protected override bool IsValid(PropertyValidatorContext context) { var result = true; var handledUnits = (Optional <IEnumerable <HandledUnitDto> >)context.PropertyValue; if (handledUnits.HasValue && handledUnits.Value != null && handledUnits.Value.Any()) { var index = 0; foreach (var handledUnit in handledUnits.Value) { if (handledUnit != null && handledUnit.Products != null && handledUnit.Products.Any()) { var indexProduct = 0; foreach (var product in handledUnit.Products) { if (product != null) { var dateTimeProvider = new DateTimeProvider(); var resultDateTime = dateTimeProvider.Parse(product.BestBeforeDate); if (resultDateTime.HasValue) { var validIso = dateTimeProvider.CheckFormat(product.BestBeforeDate); if (validIso) { try { new DateOn(resultDateTime.Value); } catch { result = false; context.MessageFormatter.AppendArgument("Index", index); context.MessageFormatter.AppendArgument("IndexProduct", indexProduct); context.MessageFormatter.AppendArgument("Key", nameof(product.BestBeforeDate)); } } else { result = false; context.MessageFormatter.AppendArgument("Index", index); context.MessageFormatter.AppendArgument("IndexProduct", indexProduct); context.MessageFormatter.AppendArgument("Key", nameof(product.BestBeforeDate)); } } else { if (product.BestBeforeDate != null) { result = false; context.MessageFormatter.AppendArgument("Index", index); context.MessageFormatter.AppendArgument("IndexProduct", indexProduct); context.MessageFormatter.AppendArgument("Key", nameof(product.BestBeforeDate)); } } } indexProduct++; } } index++; } } return(result); }
/// <summary> /// Initialize a new instance of the <see cref="StreamWriterRollingHelper"/> class with a <see cref="RollingXmlTraceListener"/>. /// </summary> /// <param name="owner">The <see cref="RollingXmlTraceListener"/> to use.</param> public StreamWriterRollingHelper(RollingXmlTraceListener owner) { this.owner = owner; dateTimeProvider = new DateTimeProvider(); performsRolling = this.owner.rollInterval != RollInterval.None || this.owner.rollSizeInBytes > 0; }
public Program() { var dateTimeProvider = new DateTimeProvider(); var loggerSettingsProvider = new LoggerSettingsProvider(); var managedBlockSettingsProvider = new ManagedBlockSettingsProvider(); var logger = new Logger( dateTimeProvider, loggerSettingsProvider); var managedBlockConfigParseHandlers = new IManagedBlockConfigParseHandler[] { managedBlockSettingsProvider }; var managerSettingsProvider = new ManagerSettingsProvider() { DefaultBlockTag = "AutomatedDocking" }; var batteryBlockManager = new BatteryBlockManager(); var connectorManager = new ConnectorManager(); var functionalBlockManager = new FunctionalBlockManager(); var gasTankManager = new GasTankManager(); var landingGearManager = new LandingGearManager(); var managedBlockConfigManager = new ManagedBlockConfigManager( logger, managedBlockConfigParseHandlers, managerSettingsProvider); var dockingManagerSettingsProvider = new DockingManagerSettingsProvider(); var batteryBlockCollectionHandler = new BatteryBlockCollectionHandler( batteryBlockManager, logger, dockingManagerSettingsProvider); var connectorCollectionHandler = new ConnectorCollectionHandler( connectorManager, logger); var functionalBlockCollectionHandler = new FunctionalBlockCollectionHandler( functionalBlockManager, logger, dockingManagerSettingsProvider); var gasTankCollectionHandler = new GasTankCollectionHandler( gasTankManager, logger, dockingManagerSettingsProvider); var landingGearCollectionHandler = new LandingGearCollectionHandler( landingGearManager, logger, dockingManagerSettingsProvider); var managedBlockCollectionHandler = new ManagedBlockCollectionHandler( managedBlockConfigManager, managedBlockSettingsProvider, managerSettingsProvider, Me); var backgroundWorkerSettingsProvider = new BackgroundWorkerSettingsProvider(); var blockCollectionHandlers = new IBlockCollectionHandler[] { managedBlockCollectionHandler, batteryBlockCollectionHandler, connectorCollectionHandler, functionalBlockCollectionHandler, gasTankCollectionHandler, landingGearCollectionHandler }; var backgroundWorker = new BackgroundWorker( backgroundWorkerSettingsProvider, dateTimeProvider, Runtime); var blockCollectionManager = new BlockCollectionManager <IMyTerminalBlock>( blockCollectionHandlers, GridTerminalSystem); var programReloadHandler = new ProgramReloadHandler( backgroundWorker, blockCollectionManager); var configParseHandlers = new IConfigParseHandler[] { backgroundWorkerSettingsProvider, loggerSettingsProvider, managerSettingsProvider, dockingManagerSettingsProvider, programReloadHandler }; var configManager = new ConfigManager( configParseHandlers, logger, Me); var dockingManager = new DockingManager( logger, batteryBlockManager, connectorManager, functionalBlockManager, gasTankManager, landingGearManager); var echoProvider = new EchoProvider(Echo); _programManager = new ProgramManager( backgroundWorker, configManager, dockingManager, echoProvider, Runtime, logger); _programManager.Run("reload"); }
public StopWatchStack(DateTimeProvider dtProvider) { _dtProvider = dtProvider; }
// CCNET-1179: Include the configuration in the arguments. public ProjectMonitor(CCTrayProject configuration, ICruiseProjectManager cruiseProjectManager, ISingleServerMonitor serverMonitor, DateTimeProvider dateTimeProvider) { buildDurationTracker = new BuildDurationTracker(dateTimeProvider); this.cruiseProjectManager = cruiseProjectManager; this.serverMonitor = serverMonitor; this._configuration = configuration; }
public EventPublisher(IEventingRepoFactory repoFactory, DateTimeProvider dtProvider, TimeSpan cacheDuration) : this(repoFactory, dtProvider, cacheDuration, InvokeOptions.Default) { }
public void TearDown() { DateTimeProvider.ResetInstance(); }
public void TestRolling() { //MockedTime time = new MockedTime(); var dateTimeProviderMock = new Mock <DateTimeProvider>(); var currentTime = new DateTimeProvider().GetCurrentTimeInMilliseconds(); dateTimeProviderMock.Setup(time => time.GetCurrentTimeInMilliseconds()).Returns(currentTime); //HystrixRollingPercentile p = new HystrixRollingPercentile(time, 60000, 12, 1000, true); var configurationServiceMock = new Mock <IHystrixConfigurationService>(); configurationServiceMock.Setup(x => x.GetMetricsRollingPercentileEnabled()).Returns(true); HystrixRollingPercentile p = new HystrixRollingPercentile(dateTimeProviderMock.Object, 60000, 12, 1000, configurationServiceMock.Object); p.AddValue(1000); p.AddValue(1000); p.AddValue(1000); p.AddValue(2000); Assert.Equal(1, p.Buckets.Length); // no bucket turnover yet so percentile not yet generated Assert.Equal(0, p.GetPercentile(50)); currentTime += 6000; dateTimeProviderMock.Setup(time => time.GetCurrentTimeInMilliseconds()).Returns(currentTime); // still only 1 bucket until we touch it again Assert.Equal(1, p.Buckets.Length); // a bucket has been created so we have a new percentile Assert.Equal(1000, p.GetPercentile(50)); // now 2 buckets since getting a percentile causes bucket retrieval Assert.Equal(2, p.Buckets.Length); p.AddValue(1000); p.AddValue(500); // should still be 2 buckets Assert.Equal(2, p.Buckets.Length); p.AddValue(200); p.AddValue(200); p.AddValue(1600); p.AddValue(200); p.AddValue(1600); p.AddValue(1600); // we haven't progressed to a new bucket so the percentile should be the same and ignore the most recent bucket Assert.Equal(1000, p.GetPercentile(50)); // increment to another bucket so we include all of the above in the PercentileSnapshot currentTime += 6000; dateTimeProviderMock.Setup(time => time.GetCurrentTimeInMilliseconds()).Returns(currentTime); // the rolling version should have the same data as creating a snapshot like this PercentileSnapshot ps = new PercentileSnapshot(1000, 1000, 1000, 2000, 1000, 500, 200, 200, 1600, 200, 1600, 1600); Assert.Equal(ps.GetPercentile(0.15), p.GetPercentile(0.15)); Assert.Equal(ps.GetPercentile(0.50), p.GetPercentile(0.50)); Assert.Equal(ps.GetPercentile(0.90), p.GetPercentile(0.90)); Assert.Equal(ps.GetPercentile(0.995), p.GetPercentile(0.995)); //System.out.println("100th: " + ps.GetPercentile(100) + " " + p.GetPercentile(100)); //System.out.println("99.5th: " + ps.GetPercentile(99.5) + " " + p.GetPercentile(99.5)); //System.out.println("99th: " + ps.GetPercentile(99) + " " + p.GetPercentile(99)); //System.out.println("90th: " + ps.GetPercentile(90) + " " + p.GetPercentile(90)); //System.out.println("50th: " + ps.GetPercentile(50) + " " + p.GetPercentile(50)); //System.out.println("10th: " + ps.GetPercentile(10) + " " + p.GetPercentile(10)); // mean = 1000+1000+1000+2000+1000+500+200+200+1600+200+1600+1600/12 Assert.Equal(991, ps.GetMean()); }
public void ResetDateTimeProvider() { DateTimeProvider.ResetToDefault(); }
public async Task InitializeAsync() { this.blockinfo = new List <Blockinfo>(); List <long> lst = blockinfoarr.Cast <long>().ToList(); for (int i = 0; i < lst.Count; i += 2) { this.blockinfo.Add(new Blockinfo { extranonce = (int)lst[i], nonce = (uint)lst[i + 1] }); } // Note that by default, these tests run with size accounting enabled. this.network = KnownNetworks.Main; byte[] hex = Encoders.Hex.DecodeData("04678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5f"); this.scriptPubKey = new Script(new[] { Op.GetPushOp(hex), OpcodeType.OP_CHECKSIG }); this.newBlock = new BlockTemplate(this.network); this.entry = new TestMemPoolEntryHelper(); this.chain = new ConcurrentChain(this.network); this.network.Consensus.Options = new ConsensusOptions(); this.network.Consensus.Rules = new FullNodeBuilderConsensusExtension.PowConsensusRulesRegistration().GetRules(); IDateTimeProvider dateTimeProvider = DateTimeProvider.Default; this.cachedCoinView = new CachedCoinView(new InMemoryCoinView(this.chain.Tip.HashBlock), dateTimeProvider, new LoggerFactory()); var loggerFactory = new ExtendedLoggerFactory(); loggerFactory.AddConsoleWithFilters(); var nodeSettings = new NodeSettings(args: new string[] { "-checkpoints" }); var consensusSettings = new ConsensusSettings(nodeSettings); var networkPeerFactory = new NetworkPeerFactory(this.network, dateTimeProvider, loggerFactory, new PayloadProvider().DiscoverPayloads(), new SelfEndpointTracker(loggerFactory)); var peerAddressManager = new PeerAddressManager(DateTimeProvider.Default, nodeSettings.DataFolder, loggerFactory, new SelfEndpointTracker(loggerFactory)); var peerDiscovery = new PeerDiscovery(new AsyncLoopFactory(loggerFactory), loggerFactory, this.network, networkPeerFactory, new NodeLifetime(), nodeSettings, peerAddressManager); var connectionSettings = new ConnectionManagerSettings(nodeSettings); var selfEndpointTracker = new SelfEndpointTracker(loggerFactory); var connectionManager = new ConnectionManager(dateTimeProvider, loggerFactory, this.network, networkPeerFactory, nodeSettings, new NodeLifetime(), new NetworkPeerConnectionParameters(), peerAddressManager, new IPeerConnector[] { }, peerDiscovery, selfEndpointTracker, connectionSettings, new VersionProvider()); var blockPuller = new LookaheadBlockPuller(this.chain, connectionManager, new LoggerFactory()); var peerBanning = new PeerBanning(connectionManager, loggerFactory, dateTimeProvider, peerAddressManager); var deployments = new NodeDeployments(this.network, this.chain); this.ConsensusRules = new PowConsensusRules(this.network, loggerFactory, dateTimeProvider, this.chain, deployments, consensusSettings, new Checkpoints(), this.cachedCoinView, blockPuller).Register(); this.consensus = new ConsensusLoop(new AsyncLoopFactory(loggerFactory), new NodeLifetime(), this.chain, this.cachedCoinView, blockPuller, new NodeDeployments(this.network, this.chain), loggerFactory, new ChainState(new InvalidBlockHashStore(dateTimeProvider)), connectionManager, dateTimeProvider, new Signals.Signals(), consensusSettings, nodeSettings, peerBanning, this.ConsensusRules); await this.consensus.StartAsync(); this.entry.Fee(11); this.entry.Height(11); var date1 = new MemoryPoolTests.DateTimeProviderSet(); date1.time = dateTimeProvider.GetTime(); date1.timeutc = dateTimeProvider.GetUtcNow(); this.DateTimeProvider = date1; this.mempool = new TxMempool(dateTimeProvider, new BlockPolicyEstimator(new MempoolSettings(nodeSettings), new LoggerFactory(), nodeSettings), new LoggerFactory(), nodeSettings); this.mempoolLock = new MempoolSchedulerLock(); // Simple block creation, nothing special yet: this.newBlock = AssemblerForTest(this).Build(this.chain.Tip, this.scriptPubKey); this.chain.SetTip(this.newBlock.Block.Header); await this.consensus.ValidateAndExecuteBlockAsync(new PowRuleContext(new ValidationContext { Block = this.newBlock.Block }, this.network.Consensus, this.consensus.Tip, this.DateTimeProvider.GetTimeOffset()) { MinedBlock = true }); // We can't make transactions until we have inputs // Therefore, load 100 blocks :) this.baseheight = 0; var blocks = new List <Block>(); this.txFirst = new List <Transaction>(); for (int i = 0; i < this.blockinfo.Count; ++i) { Block block = Block.Load(this.newBlock.Block.ToBytes(this.network.Consensus.ConsensusFactory), this.network); block.Header.HashPrevBlock = this.chain.Tip.HashBlock; block.Header.Version = 1; block.Header.Time = Utils.DateTimeToUnixTime(this.chain.Tip.GetMedianTimePast()) + 1; Transaction txCoinbase = this.network.CreateTransaction(block.Transactions[0].ToBytes()); txCoinbase.Inputs.Clear(); txCoinbase.Version = 1; txCoinbase.AddInput(new TxIn(new Script(new[] { Op.GetPushOp(this.blockinfo[i].extranonce), Op.GetPushOp(this.chain.Height) }))); // Ignore the (optional) segwit commitment added by CreateNewBlock (as the hardcoded nonces don't account for this) txCoinbase.AddOutput(new TxOut(Money.Zero, new Script())); block.Transactions[0] = txCoinbase; if (this.txFirst.Count == 0) { this.baseheight = this.chain.Height; } if (this.txFirst.Count < 4) { this.txFirst.Add(block.Transactions[0]); } block.UpdateMerkleRoot(); block.Header.Nonce = this.blockinfo[i].nonce; this.chain.SetTip(block.Header); await this.consensus.ValidateAndExecuteBlockAsync(new PowRuleContext(new ValidationContext { Block = block }, this.network.Consensus, this.consensus.Tip, this.DateTimeProvider.GetTimeOffset()) { MinedBlock = true }); blocks.Add(block); } // Just to make sure we can still make simple blocks this.newBlock = AssemblerForTest(this).Build(this.chain.Tip, this.scriptPubKey); Assert.NotNull(this.newBlock); }
/// <summary> /// Gets the string that represents the report. /// </summary> /// <returns>HTML report</returns> public override string GetReportString() { DateTimeProvider _DateTimeProvider = new DateTimeProvider(true); StringBuilder sb = new StringBuilder(); //wpisujemy nag³ówek sb.Append(this.getHeader()); //najpierw robimy nag³ówek sb.Append(@"<tr><td width='1200'><table border='0' align='center'><tr><td><h1>CAS - CommServer</h1></td></tr></table></td><tr>"); sb.Append(@"<tr><td bgcolor='#021376' width='1200' height='1'></td></tr>"); sb.Append(@"<tr><td width='1200'>"); try { // //Miejsce na wlasciwe dane sb.Append(@"<table border='0' align='center' width='1200' class='t1'>"); sb.Append(@"<tr><td class='k1'>Report time </td><td class='k2'>" + _DateTimeProvider.GetCurrentTime().ToString() + "</td></tr>"); sb.Append(@"<tr><td class='k1'>Run Time [s] </td><td class='k2'>" + CommServerComponent.RunTime.ToString() + "</td></tr>"); sb.Append(@"<tr><td class='k1'>Configuration file </td><td class='k2'>" + UAOOI.ProcessObserver.Configuration.Settings.AppConfigManagement.filename + "</td></tr>"); sb.Append(@"<tr><td class='k1'>Program Name </td><td class='k2'>" + System.Reflection.Assembly.GetExecutingAssembly().GetName().FullName + "</td></tr>"); sb.Append(@"</table>"); } catch (Exception ex) { SignalError(sb, ex); } sb.Append(@"<Table border='0' width='400'> <TBody> <TR> <TD class='kk'><t>.......................................................................................</TD> </TR></TBODY></Table> "); // // bool first = true; //stations: sb.Append(@"<h2>Stations</h2>"); sb.Append(@"<table border='1' class='t2'>"); try { foreach (IHtmlOutput obj in Statistics.stationList) { if (first) { sb.Append(obj.GetHtmlTableRowDescription()); first = false; } sb.Append(obj.ToHtmlTableRow()); } } catch (Exception ex) { SignalError(sb, ex); } sb.Append(@"</table>"); //segments: sb.Append(@"<h2>Segments</h2><table border='1'>"); first = true; try { if (Statistics.segmentList.Count > 0) { foreach (IHtmlOutput obj in Statistics.segmentList) { if (first) { sb.Append(obj.GetHtmlTableRowDescription()); first = false; } sb.Append(obj.ToHtmlTableRow()); } } else { sb.Append("No segments are defined"); } } catch (Exception ex) { SignalError(sb, ex); } sb.Append(@"</table>"); sb.Append(@"<h4> * Values might be equal 0 when number of samples is less than 10.</h4>"); sb.Append(@"<h4>** Values might be equal 0 when number of samples is less than 20.</h4>"); //interfaces: first = true; sb.Append(@"<h2>Interfaces</h2><table border='1'>"); try { if (Statistics.interfaceList.Count > 0) { foreach (IHtmlOutput obj in Statistics.interfaceList) { if (first) { sb.Append(obj.GetHtmlTableRowDescription()); first = false; } sb.Append(obj.ToHtmlTableRow()); } } else { sb.Append("No interfaces are defined"); } } catch (Exception ex) { SignalError(sb, ex); } sb.Append(@"</table>"); //Protocols: first = true; sb.Append(@"<h2>Protocols</h2><table border='1'>"); try { foreach (ProtocolDsc curr in Protocol.GetProtDescriptions) { IHtmlOutput obj = new Diagnostic.CommseverProtocol(curr); if (first) { sb.Append(obj.GetHtmlTableRowDescription()); first = false; } sb.Append(obj.ToHtmlTableRow()); } } catch (Exception ex) { SignalError(sb, ex); } sb.Append(@"</table>"); //footer: sb.Append(this.getFooter()); return(sb.ToString()); }
public DateLabeller(DateTimeProvider dateTimeProvider) { this.dateTimeProvider = dateTimeProvider; }
public void GivenIHaveConfiguredTheDateTimeProviderToReturn(string dateTimeString) { var dateTime = DateTime.Parse(dateTimeString); DateTimeProvider.SetProvider(new FixedDateTime(dateTime)); }
/// <summary> /// Creates test chain with a consensus loop. /// </summary> public static async Task <TestChainContext> CreateAsync(Network network, string dataDir, Mock <IPeerAddressManager> mockPeerAddressManager = null) { var testChainContext = new TestChainContext() { Network = network }; testChainContext.NodeSettings = new NodeSettings(network, args: new string[] { $"-datadir={dataDir}" }); testChainContext.ConnectionSettings = new ConnectionManagerSettings(testChainContext.NodeSettings); testChainContext.LoggerFactory = testChainContext.NodeSettings.LoggerFactory; testChainContext.DateTimeProvider = DateTimeProvider.Default; testChainContext.Signals = new Signals.Signals(testChainContext.NodeSettings.LoggerFactory, null); testChainContext.AsyncProvider = new AsyncProvider(testChainContext.NodeSettings.LoggerFactory, testChainContext.Signals, new Mock <INodeLifetime>().Object); network.Consensus.Options = new ConsensusOptions(); new FullNodeBuilderConsensusExtension.PowConsensusRulesRegistration().RegisterRules(network.Consensus); var consensusSettings = new ConsensusSettings(testChainContext.NodeSettings); testChainContext.Checkpoints = new Checkpoints(); testChainContext.ChainIndexer = new ChainIndexer(network); testChainContext.ChainState = new ChainState(); testChainContext.InitialBlockDownloadState = new InitialBlockDownloadState(testChainContext.ChainState, testChainContext.Network, consensusSettings, new Checkpoints()); var inMemoryCoinView = new InMemoryCoinView(testChainContext.ChainIndexer.Tip.HashBlock); var cachedCoinView = new CachedCoinView(inMemoryCoinView, DateTimeProvider.Default, testChainContext.LoggerFactory, new NodeStats(new DateTimeProvider())); var dataFolder = new DataFolder(TestBase.AssureEmptyDir(dataDir)); testChainContext.PeerAddressManager = mockPeerAddressManager == null ? new PeerAddressManager(DateTimeProvider.Default, dataFolder, testChainContext.LoggerFactory, new SelfEndpointTracker(testChainContext.LoggerFactory, testChainContext.ConnectionSettings)) : mockPeerAddressManager.Object; testChainContext.MockConnectionManager = new Mock <IConnectionManager>(); testChainContext.MockReadOnlyNodesCollection = new Mock <IReadOnlyNetworkPeerCollection>(); testChainContext.MockConnectionManager.Setup(s => s.ConnectedPeers).Returns(testChainContext.MockReadOnlyNodesCollection.Object); testChainContext.MockConnectionManager.Setup(s => s.NodeSettings).Returns(testChainContext.NodeSettings); testChainContext.MockConnectionManager.Setup(s => s.ConnectionSettings).Returns(testChainContext.ConnectionSettings); testChainContext.ConnectionManager = testChainContext.MockConnectionManager.Object; var dateTimeProvider = new DateTimeProvider(); testChainContext.PeerBanning = new PeerBanning(testChainContext.ConnectionManager, testChainContext.LoggerFactory, testChainContext.DateTimeProvider, testChainContext.PeerAddressManager); var deployments = new NodeDeployments(testChainContext.Network, testChainContext.ChainIndexer); testChainContext.ConsensusRules = new PowConsensusRuleEngine(testChainContext.Network, testChainContext.LoggerFactory, testChainContext.DateTimeProvider, testChainContext.ChainIndexer, deployments, consensusSettings, testChainContext.Checkpoints, cachedCoinView, testChainContext.ChainState, new InvalidBlockHashStore(dateTimeProvider), new NodeStats(dateTimeProvider), testChainContext.AsyncProvider).Register(); testChainContext.HeaderValidator = new HeaderValidator(testChainContext.ConsensusRules, testChainContext.LoggerFactory); testChainContext.IntegrityValidator = new IntegrityValidator(testChainContext.ConsensusRules, testChainContext.LoggerFactory); testChainContext.PartialValidator = new PartialValidator(testChainContext.AsyncProvider, testChainContext.ConsensusRules, testChainContext.LoggerFactory); testChainContext.FullValidator = new FullValidator(testChainContext.ConsensusRules, testChainContext.LoggerFactory); var dBreezeSerializer = new DBreezeSerializer(network.Consensus.ConsensusFactory); var blockRepository = new BlockRepository(testChainContext.Network, dataFolder, testChainContext.LoggerFactory, dBreezeSerializer); var blockStoreFlushCondition = new BlockStoreQueueFlushCondition(testChainContext.ChainState, testChainContext.InitialBlockDownloadState); var blockStore = new BlockStoreQueue(testChainContext.ChainIndexer, testChainContext.ChainState, blockStoreFlushCondition, new Mock <StoreSettings>().Object, blockRepository, testChainContext.LoggerFactory, new Mock <INodeStats>().Object, testChainContext.AsyncProvider); blockStore.Initialize(); testChainContext.Consensus = ConsensusManagerHelper.CreateConsensusManager(network, dataDir); await testChainContext.Consensus.InitializeAsync(testChainContext.ChainIndexer.Tip); return(testChainContext); }
public void AddTimeData_WithSmallSampleSet_CalculatedCorrectly() { // Samples to be inserted to the state. var samples = new List <TestSample> { // Columns meanings: expectedIsUsed, expectedIsWarningOn, expectedIsTimeSyncOff, expectedTimeOffsetMs, timeOffsetSample, peerAddress // First group of samples does not affect adjusted time, so difference should be ~0 ms. TestSample.Outbound(true, false, false, 0, TimeSpan.FromSeconds(3.56), new IPAddress(1)), TestSample.Inbound(true, false, false, 0, TimeSpan.FromSeconds(13.123), new IPAddress(1)), TestSample.Outbound(false, false, false, 0, TimeSpan.FromSeconds(7.123), new IPAddress(1)), // IP address already used for outbound. TestSample.Outbound(true, false, false, 0, TimeSpan.FromSeconds(26.0), IPAddress.Parse("2000:0db8:85a3:1232:0000:8a2e:0370:7334")), TestSample.Outbound(false, false, false, 0, TimeSpan.FromSeconds(260), IPAddress.Parse("2000:0db8:85a3:1232:0000:8a2e:0370:7334")), // IP address already used for outbound. TestSample.Outbound(true, false, false, 0, TimeSpan.FromSeconds(-2126.0), new IPAddress(2)), TestSample.Inbound(true, false, false, 0, TimeSpan.FromSeconds(-391), new IPAddress(3)), // These samples will change adjusted time because next outbound is the 4th outbound and we are under the limits. TestSample.Outbound(true, false, false, 1280, TimeSpan.FromSeconds(-1), new IPAddress(4)), // 2 inbound, 4 outbound. 2/4 * 3 = 1.5 -> ceil -> 2 of each outbound { -2126000, -2126000, -391000, -1000, -1000, 3560, 3560, 13123, 26000, 26000 } -> median is 1280ms. TestSample.Inbound(true, false, false, 3560, TimeSpan.FromSeconds(23.6), new IPAddress(5)), // 3 inbound, 4 outbound. 3/4 * 3 = 2.25 -> ceil -> 3 of each outbound { -2126000, -2126000, -2126000, -391000, -1000, -1000, -1000, 3560, 3560, 3560, 13123, 23600, 26000, 26000, 26000 } -> median is 3560ms. TestSample.Inbound(true, false, false, 3560, TimeSpan.FromSeconds(236), new IPAddress(6)), // 4 inbound, 4 outbound. 4/4 * 3 = 3 -> ceil -> 3 of each outbound { -2126000, -2126000, -2126000, -391000, -1000, -1000, -1000, 3560, 3560, 3560, 13123, 23600, 26000, 26000, 26000, 236000 } -> median is 3560ms. TestSample.Outbound(true, false, false, 1236, TimeSpan.FromSeconds(1.236), new IPAddress(7)), // 4 inbound, 5 outbound. 4/5 * 3 = 2.4 -> ceil -> 3 of each outbound { -2126000, -2126000, -2126000, -391000, -1000, -1000, -1000, 1236, 1236, 1236, 3560, 3560, 3560, 13123, 23600, 26000, 26000, 26000, 236000 } -> median is 1236ms. TestSample.Inbound(true, false, false, 1236, TimeSpan.FromSeconds(-1001), new IPAddress(8)), // 5 inbound, 5 outbound. 5/5 * 3 = 3 -> ceil -> 3 of each outbound { -2126000, -2126000, -2126000, -391000, -1001, -1000, -1000, -1000, 1236, 1236, 1236, 3560, 3560, 3560, 13123, 23600, 26000, 26000, 26000, 236000 } -> median is 1236ms. TestSample.Inbound(true, false, false, 1236, TimeSpan.FromSeconds(-4.9236), new IPAddress(9)), // 6 inbound, 5 outbound. 6/5 * 3 = 3.6 -> ceil -> 4 of each outbound { -2126000, -2126000, -2126000, -2126000, -391000, -4923.6, -1001, -1000, -1000, -1000, -1000, 1236, 1236, 1236, 1236, 3560, 3560, 3560, 3560, 13123, 23600, 26000, 26000, 26000, 26000, 236000 } -> median is 1236ms. TestSample.Outbound(true, false, false, 118, TimeSpan.FromSeconds(-4444.444), new IPAddress(10)), // 6 inbound, 6 outbound. 6/6 * 3 = 3 -> ceil -> 3 of each outbound { -4444444, -4444444, -4444444, -2126000, -2126000, -2126000, -391000, -4923.6, -1001, -1000, -1000, -1000, 1236, 1236, 1236, 3560, 3560, 3560, 13123, 23600, 26000, 26000, 26000, 236000 } -> median is 118ms. }; int maliciousOffset = TimeSyncBehaviorState.MaxTimeOffsetSeconds - 1; // Introduce 100 malicious inbound and show we are protected from malicious inbounds. for (int i = 11; i < 111; i++) { // Median always lands on one of the outbounds no matter how many malicious inbounds. samples.Add(TestSample.Inbound(true, false, false, 1236, TimeSpan.FromSeconds(maliciousOffset), new IPAddress(i))); } // Add 3 malicious outbound which is 3/9 (33.3%) which is equal to the 33.3% of outbounds and show protected. // Median always lands on one of the non malicious outbound. samples.Add(TestSample.Outbound(true, false, false, 3560, TimeSpan.FromSeconds(maliciousOffset), new IPAddress(11))); samples.Add(TestSample.Outbound(true, false, false, 26000, TimeSpan.FromSeconds(maliciousOffset), new IPAddress(12))); samples.Add(TestSample.Outbound(true, false, false, 26000, TimeSpan.FromSeconds(maliciousOffset), new IPAddress(13))); // Add a 4th malicious outbound which is 4/10 (40%) which is greater that 33.3% of outbounds. Show we are not protected -> the offset gets set to the malicious value. samples.Add(TestSample.Outbound(true, false, false, maliciousOffset * 1000, TimeSpan.FromSeconds(maliciousOffset), new IPAddress(14))); var dateTimeProvider = new DateTimeProvider(); TimeSyncBehaviorState state = this.CreateTimeSyncBehaviorState(dateTimeProvider); for (int i = 0; i < samples.Count; i++) { bool used = state.AddTimeData(samples[i].PeerIpAddress, samples[i].InputTimeOffset, samples[i].IsInbound); Assert.Equal(samples[i].ExpectedIsUsed, used); Assert.Equal(samples[i].ExpectedIsSyncOff, state.SwitchedOffLimitReached); Assert.Equal(samples[i].ExpectedIsSyncOff, state.SwitchedOff); DateTime adjustedTime = dateTimeProvider.GetAdjustedTime(); DateTime normalTime = dateTimeProvider.GetUtcNow(); TimeSpan diff = adjustedTime - normalTime; Assert.True(Math.Abs(diff.TotalMilliseconds - samples[i].ExpectedTimeOffsetMs) < TimeEpsilonMs, $"Failed in sample at index: {i}. Actual offset milliseconds: {diff.TotalMilliseconds}. Expected offset milliseconds: {samples[i].ExpectedTimeOffsetMs}"); } }
public TestContext() { this.Network = KnownNetworks.RegTest; this.chain = new ConcurrentChain(this.Network); this.dateTimeProvider = new DateTimeProvider(); this.hashStore = new InvalidBlockHashStore(this.dateTimeProvider); this.coinView = new TestInMemoryCoinView(this.chain.Tip.HashBlock); this.HeaderValidator = new Mock <IHeaderValidator>(); this.HeaderValidator.Setup(hv => hv.ValidateHeader(It.IsAny <ChainedHeader>())).Returns(new ValidationContext()); this.nodeLifetime = new NodeLifetime(); this.ibd = new Mock <IInitialBlockDownloadState>(); this.BlockPuller = new Mock <IBlockPuller>(); this.BlockPuller.Setup(b => b.Initialize(It.IsAny <BlockPuller.OnBlockDownloadedCallback>())) .Callback <BlockPuller.OnBlockDownloadedCallback>((d) => { this.blockPullerBlockDownloadCallback = d; }); this.BlockStore = new Mock <IBlockStore>(); this.checkpoints = new Mock <ICheckpoints>(); this.ChainState = new Mock <IChainState>(); this.nodeStats = new NodeStats(this.dateTimeProvider); string[] param = new string[] { }; this.nodeSettings = new NodeSettings(this.Network, args: param); this.ConsensusSettings = new ConsensusSettings(this.nodeSettings); this.loggerFactory = this.nodeSettings.LoggerFactory; var connectionSettings = new ConnectionManagerSettings(this.nodeSettings); this.selfEndpointTracker = new SelfEndpointTracker(this.loggerFactory, connectionSettings); this.Network.Consensus.Options = new ConsensusOptions(); this.ruleRegistration = new FullNodeBuilderConsensusExtension.PowConsensusRulesRegistration(); this.ruleRegistration.RegisterRules(this.Network.Consensus); // Dont check PoW of a header in this test. this.Network.Consensus.HeaderValidationRules.RemoveAll(x => x.GetType() == typeof(CheckDifficultyPowRule)); this.ChainedHeaderTree = new ChainedHeaderTree( this.Network, this.loggerFactory, this.HeaderValidator.Object, this.checkpoints.Object, this.ChainState.Object, this.FinalizedBlockMock.Object, this.ConsensusSettings, this.hashStore); this.networkPeerFactory = new NetworkPeerFactory(this.Network, this.dateTimeProvider, this.loggerFactory, new PayloadProvider().DiscoverPayloads(), this.selfEndpointTracker, this.ibd.Object, new ConnectionManagerSettings(this.nodeSettings)); this.peerAddressManager = new PeerAddressManager(DateTimeProvider.Default, this.nodeSettings.DataFolder, this.loggerFactory, this.selfEndpointTracker); var peerDiscovery = new PeerDiscovery(new AsyncLoopFactory(this.loggerFactory), this.loggerFactory, this.Network, this.networkPeerFactory, this.nodeLifetime, this.nodeSettings, this.peerAddressManager); this.connectionManager = new ConnectionManager(this.dateTimeProvider, this.loggerFactory, this.Network, this.networkPeerFactory, this.nodeSettings, this.nodeLifetime, new NetworkPeerConnectionParameters(), this.peerAddressManager, new IPeerConnector[] { }, peerDiscovery, this.selfEndpointTracker, connectionSettings, new VersionProvider(), this.nodeStats); this.deployments = new NodeDeployments(this.Network, this.chain); this.consensusRules = new PowConsensusRuleEngine(this.Network, this.loggerFactory, this.dateTimeProvider, this.chain, this.deployments, this.ConsensusSettings, this.checkpoints.Object, this.coinView, this.ChainState.Object, this.hashStore, this.nodeStats); this.consensusRules.Register(); var tree = new ChainedHeaderTree(this.Network, this.loggerFactory, this.HeaderValidator.Object, this.checkpoints.Object, this.ChainState.Object, this.FinalizedBlockMock.Object, this.ConsensusSettings, this.hashStore); this.PartialValidator = new Mock <IPartialValidator>(); this.FullValidator = new Mock <IFullValidator>(); this.peerBanning = new PeerBanning(this.connectionManager, this.loggerFactory, this.dateTimeProvider, this.peerAddressManager); this.IntegrityValidator.Setup(i => i.VerifyBlockIntegrity(It.IsAny <ChainedHeader>(), It.IsAny <Block>())) .Returns(new ValidationContext()); ConsensusManager consensusManager = new ConsensusManager(tree, this.Network, this.loggerFactory, this.ChainState.Object, this.IntegrityValidator.Object, this.PartialValidator.Object, this.FullValidator.Object, this.consensusRules, this.FinalizedBlockMock.Object, new Stratis.Bitcoin.Signals.Signals(this.loggerFactory, null), this.peerBanning, this.ibd.Object, this.chain, this.BlockPuller.Object, this.BlockStore.Object, this.connectionManager, this.nodeStats, this.nodeLifetime, this.ConsensusSettings); this.TestConsensusManager = new TestConsensusManager(consensusManager); }
public UrlTrigger(DateTimeProvider dtProvider, HttpWrapper httpWrapper) : base(dtProvider) { this.httpRequest = httpWrapper; }
/// <summary> /// Invoked when the application is launched normally by the end user. Other entry points /// will be used such as when the application is launched to open a specific file. /// </summary> /// <param name="e">Details about the launch request and process.</param> protected override void OnLaunched(LaunchActivatedEventArgs e) { #if DEBUG if (System.Diagnostics.Debugger.IsAttached) { DebugSettings.EnableFrameRateCounter = true; } #endif Frame rootFrame = Window.Current.Content as Frame; // Do not repeat application initialization when the Window already has content, // just ensure that the window is active if (rootFrame == null) { // Create a Frame to act as the navigation context and navigate to the first page rootFrame = new Frame(); rootFrame.NavigationFailed += OnNavigationFailed; if (e.PreviousExecutionState == ApplicationExecutionState.Terminated) { //TODO: Load state from previously suspended application } // Place the frame in the current Window Window.Current.Content = rootFrame; } // add needed objects to IoC container var locator = Resources[LocaterResource] as ViewModelLocator; if (locator != null) { var container = locator.Container; container.Register(locator); var dateTimeTask = new DateTimeProvider(container); container.Register(dateTimeTask); dateTimeTask.Start(); var client = new MqttClient(MqttBrokerAddress); container.Register(client); var telemetryProvider = new TelemetryProvider(container); container.Register(telemetryProvider); var rssProvider = new RssProvider(container); container.Register(rssProvider); rssProvider.Start(); var speechInterpreter = new SpeechInterpreter(container); container.Register(speechInterpreter); speechInterpreter.Start(); var WeatherProvider = new WeatherProvider(container); container.Register(WeatherProvider); var ioProvider = new IOProvider(container); container.Register(ioProvider); } ApplicationView.GetForCurrentView().TryEnterFullScreenMode(); if (rootFrame.Content == null) { // When the navigation stack isn't restored navigate to the first page, // configuring the new page by passing required information as a navigation // parameter rootFrame.Navigate(typeof(MainPage), e.Arguments); } // Ensure the current window is active Window.Current.Activate(); if (locator != null) { var container = locator.Container; container.Register(Window.Current); } }
public void TestInitialize() { DateTimeProvider.Thaw(); DateTimeProvider.Reset(); }
public BuildDurationTracker(DateTimeProvider currentTimeProvider) { this.currentTimeProvider = currentTimeProvider; }
public EventPublisher(IEventingRepoFactory repoFactory, DateTimeProvider dtProvider) : this(repoFactory, dtProvider, TimeSpan.FromSeconds(30)) { }
public StopWatch(DateTimeProvider dtProvider) { _dtProvider = dtProvider; _start = dtProvider.Now; }
/// <summary> /// Initializes a new instance of the <see cref="SpaceTimeInformation">SpaceTimeInformation</see> class. /// <param name="location">The specific location that is occupied at this moment</param> /// </summary> public SpaceTimeInformation(GeographicLocation location) { PhysicalLocation = location; PointInTime = new DateTimeProvider().UtcNow; }