/// <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);
			}
		}
示例#4
0
        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();
 }
示例#6
0
        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;
 }
示例#9
0
 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();
 }
示例#12
0
        /// <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);
        }
示例#13
0
 /// <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)
 {
 }
示例#14
0
        // TODO during workshops: participants & organizers handling

        public void Dispose() => DateTimeProvider.ResetImplementations();
示例#15
0
 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;
            }
示例#18
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");
        }
示例#19
0
 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;
 }
示例#21
0
 public EventPublisher(IEventingRepoFactory repoFactory, DateTimeProvider dtProvider, TimeSpan cacheDuration)
     : this(repoFactory, dtProvider, cacheDuration, InvokeOptions.Default)
 {
 }
示例#22
0
 public void TearDown()
 {
     DateTimeProvider.ResetInstance();
 }
示例#23
0
            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());
            }
示例#24
0
 /// <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 void ResetDateTimeProvider()
 {
     DateTimeProvider.ResetToDefault();
 }
示例#26
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.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());
        }
示例#28
0
 public DateLabeller(DateTimeProvider dateTimeProvider)
 {
     this.dateTimeProvider = dateTimeProvider;
 }
 /// <summary>
 /// Protected constructor.
 /// </summary>
 /// <param name="config">The config class.</param>
 protected TraceListener(AppConfig config)
 {
     this.config           = config;
     this.dateTimeProvider = new DefaultDateTimeProvider();
 }
        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);
        }
示例#34
0
 public UrlTrigger(DateTimeProvider dtProvider, HttpWrapper httpWrapper) : base(dtProvider)
 {
     this.httpRequest = httpWrapper;
 }
示例#35
0
        /// <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;
		}
示例#38
0
 public EventPublisher(IEventingRepoFactory repoFactory, DateTimeProvider dtProvider)
     : this(repoFactory, dtProvider, TimeSpan.FromSeconds(30))
 {
 }
示例#39
0
 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;
 }