public void TrainBaselineStatusScenario_WhenConnectionIsEstablishedWithT2G_UnknownTrainsAreRemoved()
        {
            TrainBaselineStatusData expectedValueTrain1 = new TrainBaselineStatusData(TRAIN_NAME_1, TRAIN_VEHICLE_ID_1, true, DEFAULT_BASELINE, BaselineStatusUpdater.NoBaselineVersion, DEFAULT_PIS_VERSION, BaselineProgressStatusEnum.UNKNOWN);
            Dictionary <string, TrainBaselineStatusData> expectedStatuses = new Dictionary <string, TrainBaselineStatusData>();

            expectedStatuses.Add(expectedValueTrain1.TrainId, expectedValueTrain1);


            // Initialize the history log database

            UpdateHistoryLog(expectedValueTrain1);
            UpdateHistoryLog(new TrainBaselineStatusData("TRAIN-2", 2, false, "5.4.3.3"));
            UpdateHistoryLog(new TrainBaselineStatusData("TRAIN-0", 0, false, "1.0.0.0"));

            // Initialize services
            CreateT2GServicesStub();
            _hostIdentificationService.Close();

            _dataStoreServiceStub.InitializeRemoteDataStoreMockWithDefaultBehavior();
            InitializeTrain(TRAIN_NAME_1, TRAIN_VEHICLE_ID_1, true, TRAIN_IP_1, TRAIN_DATA_PACKAGE_PORT_1, commLinkEnum._2G3G, false);
            InitializeDataPackageService(false);
            InitializePISGroundSession();
            ReopenIdentificationService();


            WaitPisGroundIsConnectedWithT2G(true);

            // Wait that history log was updated.
            WaitTrainBaselineStatusesEquals(expectedStatuses, "When PIS-Ground establish a connection with T2G, unknown train by T2G are not removed from the train baseline status database.");
        }
        public void TrainBaselineStatusScenario_OnStartupAllTrainAreOffline()
        {
            TrainBaselineStatusData valueTrain1 = new TrainBaselineStatusData(TRAIN_NAME_1, TRAIN_VEHICLE_ID_1, false, DEFAULT_BASELINE);
            TrainBaselineStatusData valueTrain2 = new TrainBaselineStatusData("TRAIN-2", 2, false, "5.4.3.3");
            TrainBaselineStatusData valueTrain3 = new TrainBaselineStatusData("TRAIN-0", 0, false, "1.0.0.0");
            Dictionary <string, TrainBaselineStatusData> expectedStatuses = new Dictionary <string, TrainBaselineStatusData>();

            expectedStatuses.Add(valueTrain1.TrainId, valueTrain1.Clone());
            expectedStatuses.Add(valueTrain2.TrainId, valueTrain2.Clone());
            expectedStatuses.Add(valueTrain3.TrainId, valueTrain3.Clone());


            // Initialize the history log database
            valueTrain1.OnlineStatus = true;
            valueTrain3.OnlineStatus = true;
            UpdateHistoryLog(valueTrain1);
            UpdateHistoryLog(valueTrain2);
            UpdateHistoryLog(valueTrain3);
            valueTrain1.OnlineStatus = false;
            valueTrain3.OnlineStatus = false;

            // Initialize services
            _dataStoreServiceStub.InitializeRemoteDataStoreMockWithDefaultBehavior();
            InitializeDataPackageService(false);
            InitializePISGroundSession();

            // Wait that history log was updated.
            WaitTrainBaselineStatusesEquals(expectedStatuses, "On startup of PIS-Ground, train baselines status are not set to state offline");
        }
        public void TrainBaselineStatusScenario_OnSystemChangedNotificationUpdateTrainNumber()
        {
            TrainBaselineStatusData valueTrain1 = new TrainBaselineStatusData(TRAIN_NAME_1, TRAIN_VEHICLE_ID_1, true, DEFAULT_BASELINE, BaselineStatusUpdater.NoBaselineVersion, DEFAULT_PIS_VERSION, BaselineProgressStatusEnum.UNKNOWN);
            TrainBaselineStatusData valueTrain2 = new TrainBaselineStatusData(TRAIN_NAME_2, TRAIN_VEHICLE_ID_2, false, "5.4.3.3", BaselineStatusUpdater.NoBaselineVersion, DEFAULT_PIS_VERSION, BaselineProgressStatusEnum.UNKNOWN);
            TrainBaselineStatusData valueTrain3 = new TrainBaselineStatusData(TRAIN_NAME_0, TRAIN_VEHICLE_ID_0, false, "1.0.0.0", BaselineStatusUpdater.NoBaselineVersion, DEFAULT_PIS_VERSION, BaselineProgressStatusEnum.UNKNOWN);
            Dictionary <string, TrainBaselineStatusData> expectedStatuses = new Dictionary <string, TrainBaselineStatusData>();

            expectedStatuses.Add(valueTrain1.TrainId, valueTrain1.Clone());
            expectedStatuses.Add(valueTrain2.TrainId, valueTrain2.Clone());
            expectedStatuses.Add(valueTrain3.TrainId, valueTrain3.Clone());


            // Initialize the history log database
            valueTrain1.OnlineStatus = false;
            valueTrain3.OnlineStatus = true;
            UpdateHistoryLog(valueTrain1);
            UpdateHistoryLog(valueTrain2);
            UpdateHistoryLog(valueTrain3);
            valueTrain1.OnlineStatus = true;
            valueTrain3.OnlineStatus = false;

            // Initialize services
            CreateT2GServicesStub();

            _dataStoreServiceStub.InitializeRemoteDataStoreMockWithDefaultBehavior();
            InitializeTrain(TRAIN_NAME_1, TRAIN_VEHICLE_ID_1, true, TRAIN_IP_1, TRAIN_DATA_PACKAGE_PORT_1, commLinkEnum._2G3G, true);
            InitializeTrain(TRAIN_NAME_2, TRAIN_VEHICLE_ID_2, false, TRAIN_IP_2, TRAIN_DATA_PACKAGE_PORT_2, commLinkEnum._2G3G, false, "5.4.3.3");
            InitializeTrain(TRAIN_NAME_0, TRAIN_VEHICLE_ID_0, false, TRAIN_IP_0, TRAIN_DATA_PACKAGE_PORT_0, commLinkEnum.wifi, false, "1.0.0.0");

            InitializeDataPackageService(false);
            InitializePISGroundSession();

            // Wait that history log was on expected status.
            WaitTrainBaselineStatusesEquals(expectedStatuses, "Online statuses of train not updated in train baseline status when PIS-Ground connect with T2G");


            // TRAIN-1 become train number 100
            valueTrain1.TrainNumber = "100";
            expectedStatuses[valueTrain1.TrainId] = valueTrain1.Clone();
            expectedStatuses[valueTrain2.TrainId] = valueTrain2.Clone();
            expectedStatuses[valueTrain3.TrainId] = valueTrain3.Clone();

            _identificationServiceStub.UpdateSystem(valueTrain1.TrainId, Convert.ToInt32(valueTrain1.TrainNumber, CultureInfo.InvariantCulture), valueTrain1.OnlineStatus, 0, DEFAULT_MISSION, commLinkEnum.wifi, TRAIN_IP_1);

            WaitTrainBaselineStatusesEquals(expectedStatuses, "T2G - OnSystemChanged does not update the train number field in train baseline statuses database.");

            // TRAIN-2 become train number 200
            // TRAIN-1 become train number 1000
            valueTrain1.TrainNumber = "1000";
            valueTrain2.TrainNumber = "200";
            expectedStatuses[valueTrain1.TrainId] = valueTrain1.Clone();
            expectedStatuses[valueTrain2.TrainId] = valueTrain2.Clone();
            expectedStatuses[valueTrain3.TrainId] = valueTrain3.Clone();

            _identificationServiceStub.UpdateSystem(valueTrain1.TrainId, Convert.ToInt32(valueTrain1.TrainNumber, CultureInfo.InvariantCulture), valueTrain1.OnlineStatus, 0, DEFAULT_MISSION, commLinkEnum.wifi, TRAIN_IP_1);
            _identificationServiceStub.UpdateSystem(valueTrain2.TrainId, Convert.ToInt32(valueTrain2.TrainNumber, CultureInfo.InvariantCulture), valueTrain2.OnlineStatus, 0, DEFAULT_MISSION, commLinkEnum.wifi, TRAIN_IP_2);

            WaitTrainBaselineStatusesEquals(expectedStatuses, "T2G - OnSystemChanged does not update the train number field in train baseline statuses database.");
        }
        public void TrainBaselineStatusScenario_OnSystemDeletedNotificationNominal()
        {
            TrainBaselineStatusData valueTrain1 = new TrainBaselineStatusData(TRAIN_NAME_1, TRAIN_VEHICLE_ID_1, true, DEFAULT_BASELINE, BaselineStatusUpdater.NoBaselineVersion, DEFAULT_PIS_VERSION, BaselineProgressStatusEnum.UNKNOWN);
            TrainBaselineStatusData valueTrain2 = new TrainBaselineStatusData(TRAIN_NAME_2, TRAIN_VEHICLE_ID_2, true, "5.4.3.3", BaselineStatusUpdater.NoBaselineVersion, DEFAULT_PIS_VERSION, BaselineProgressStatusEnum.UNKNOWN);
            TrainBaselineStatusData valueTrain3 = new TrainBaselineStatusData(TRAIN_NAME_0, TRAIN_VEHICLE_ID_0, false, "1.0.0.0", BaselineStatusUpdater.NoBaselineVersion, DEFAULT_PIS_VERSION, BaselineProgressStatusEnum.UNKNOWN);
            Dictionary <string, TrainBaselineStatusData> expectedStatuses = new Dictionary <string, TrainBaselineStatusData>();

            expectedStatuses.Add(valueTrain1.TrainId, valueTrain1.Clone());
            expectedStatuses.Add(valueTrain2.TrainId, valueTrain2.Clone());
            expectedStatuses.Add(valueTrain3.TrainId, valueTrain3.Clone());


            // Initialize the history log database
            valueTrain1.OnlineStatus = false;
            valueTrain3.OnlineStatus = true;
            UpdateHistoryLog(valueTrain1);
            UpdateHistoryLog(valueTrain2);
            UpdateHistoryLog(valueTrain3);
            valueTrain1.OnlineStatus = true;
            valueTrain3.OnlineStatus = false;

            // Initialize services
            CreateT2GServicesStub();

            _dataStoreServiceStub.InitializeRemoteDataStoreMockWithDefaultBehavior();
            InitializeTrain(TRAIN_NAME_1, TRAIN_VEHICLE_ID_1, true, TRAIN_IP_1, TRAIN_DATA_PACKAGE_PORT_1, commLinkEnum._2G3G, true);
            InitializeTrain(TRAIN_NAME_2, TRAIN_VEHICLE_ID_2, true, TRAIN_IP_2, TRAIN_DATA_PACKAGE_PORT_2, commLinkEnum._2G3G, false, "5.4.3.3");
            InitializeTrain(TRAIN_NAME_0, TRAIN_VEHICLE_ID_0, false, TRAIN_IP_0, TRAIN_DATA_PACKAGE_PORT_0, commLinkEnum.wifi, false, "1.0.0.0");

            InitializeDataPackageService(false);
            InitializePISGroundSession();

            // Wait that history log was on expected status.
            WaitTrainBaselineStatusesEquals(expectedStatuses, "Online statuses of train not updated in train baseline status when PIS-Ground connect with T2G");


            // Remove TRAIN-0
            expectedStatuses.Remove(valueTrain3.TrainId);
            _identificationServiceStub.DeleteSystem(valueTrain3.TrainId);

            WaitNotificationSend(NotificationIdEnum.DeletedElement, valueTrain3.TrainId);
            WaitTrainBaselineStatusesEquals(expectedStatuses, "T2G - OnSystemDeleted does not remove the deleted train in train baseline statuses database.");

            // Delete TRAIN-2
            expectedStatuses.Remove(valueTrain2.TrainId);
            _identificationServiceStub.DeleteSystem(valueTrain2.TrainId);

            WaitNotificationSend(NotificationIdEnum.DeletedElement, valueTrain2.TrainId);
            WaitTrainBaselineStatusesEquals(expectedStatuses, "T2G - OnSystemDeleted does not remove the deleted train in train baseline statuses database.");

            // Delete TRAIN-1
            expectedStatuses.Remove(valueTrain1.TrainId);
            _identificationServiceStub.DeleteSystem(valueTrain1.TrainId);

            WaitNotificationSend(NotificationIdEnum.DeletedElement, valueTrain1.TrainId);
            WaitTrainBaselineStatusesEquals(expectedStatuses, "T2G - OnSystemDeleted does not remove the deleted train in train baseline statuses database.");
        }
        public void TrainBaselineStatusScenario_OnMessageChangedUpdateThePisSoftwareVersion()
        {
            TrainBaselineStatusData valueTrain1 = new TrainBaselineStatusData(TRAIN_NAME_1, TRAIN_VEHICLE_ID_1, true, DEFAULT_BASELINE, BaselineStatusUpdater.NoBaselineVersion, DEFAULT_PIS_VERSION, BaselineProgressStatusEnum.UNKNOWN);
            TrainBaselineStatusData valueTrain2 = new TrainBaselineStatusData(TRAIN_NAME_2, TRAIN_VEHICLE_ID_2, true, "5.4.3.3", BaselineStatusUpdater.NoBaselineVersion, DEFAULT_PIS_VERSION, BaselineProgressStatusEnum.UNKNOWN);
            TrainBaselineStatusData valueTrain3 = new TrainBaselineStatusData(TRAIN_NAME_0, TRAIN_VEHICLE_ID_0, false, "1.0.0.0", BaselineStatusUpdater.NoBaselineVersion, DEFAULT_PIS_VERSION, BaselineProgressStatusEnum.UNKNOWN);
            Dictionary <string, TrainBaselineStatusData> expectedStatuses = new Dictionary <string, TrainBaselineStatusData>();

            expectedStatuses.Add(valueTrain1.TrainId, valueTrain1.Clone());
            expectedStatuses.Add(valueTrain2.TrainId, valueTrain2.Clone());
            expectedStatuses.Add(valueTrain3.TrainId, valueTrain3.Clone());

            // Initialize services
            CreateT2GServicesStub();

            _dataStoreServiceStub.InitializeRemoteDataStoreMockWithDefaultBehavior();

            InitializeTrain(TRAIN_NAME_1, TRAIN_VEHICLE_ID_1, true, TRAIN_IP_1, TRAIN_DATA_PACKAGE_PORT_1, commLinkEnum._2G3G, true);
            InitializeTrain(TRAIN_NAME_0, TRAIN_VEHICLE_ID_0, false, TRAIN_IP_0, TRAIN_DATA_PACKAGE_PORT_0, commLinkEnum.wifi, false, "1.0.0.0");
            InitializeTrain(TRAIN_NAME_2, TRAIN_VEHICLE_ID_2, true, TRAIN_IP_2, TRAIN_DATA_PACKAGE_PORT_2, commLinkEnum._2G3G, false, "5.4.3.3");

            InitializeDataPackageService(false);
            InitializePISGroundSession();

            // Wait that history log was on expected status.
            WaitTrainBaselineStatusesEquals(expectedStatuses, "Online statuses of train not updated in train baseline status when PIS-Ground connect with T2G");


            // Update pis.version message of TRAIN-0
            valueTrain3.PisOnBoardVersion         = "5.16.3.2";
            expectedStatuses[valueTrain1.TrainId] = valueTrain1.Clone();
            expectedStatuses[valueTrain2.TrainId] = valueTrain2.Clone();
            expectedStatuses[valueTrain3.TrainId] = valueTrain3.Clone();
            _vehicleInfoServiceStub.UpdateMessageData(new VersionMessage(valueTrain3.TrainId, valueTrain3.PisOnBoardVersion));

            WaitTrainBaselineStatusesEquals(expectedStatuses, "T2G - OnMessageChanged does not update the pis onboard software version in train baseline statuses database.");

            // Update pis.version message of TRAIN-1
            valueTrain1.PisOnBoardVersion         = "5.18.0.0";
            expectedStatuses[valueTrain1.TrainId] = valueTrain1.Clone();
            expectedStatuses[valueTrain2.TrainId] = valueTrain2.Clone();
            expectedStatuses[valueTrain3.TrainId] = valueTrain3.Clone();
            _vehicleInfoServiceStub.UpdateMessageData(new VersionMessage(valueTrain1.TrainId, valueTrain1.PisOnBoardVersion));

            WaitTrainBaselineStatusesEquals(expectedStatuses, "T2G - OnMessageChanged does not update the pis onboard software version in train baseline statuses database.");

            // Update pis.version message of TRAIN-2
            valueTrain2.PisOnBoardVersion         = "5.20.0.0";
            expectedStatuses[valueTrain1.TrainId] = valueTrain1.Clone();
            expectedStatuses[valueTrain2.TrainId] = valueTrain2.Clone();
            expectedStatuses[valueTrain3.TrainId] = valueTrain3.Clone();
            _vehicleInfoServiceStub.UpdateMessageData(new VersionMessage(valueTrain2.TrainId, valueTrain2.PisOnBoardVersion));

            WaitTrainBaselineStatusesEquals(expectedStatuses, "T2G - OnMessageChanged does not update the pis onboard software version in train baseline statuses database.");
        }
        /// <summary>Compares the content of two TrainBaselineStatusExtendedData objects.</summary>
        /// <param name="object1">First object to be compared.</param>
        /// <param name="object2">Second object to be compared.</param>
        /// <returns>true if equal, false if not.</returns>
        public static bool AreEqual(TrainBaselineStatusExtendedData object1, TrainBaselineStatusExtendedData object2)
        {
            bool lEqual = object1 != null &&
                          object2 != null &&
                          object1.AssignedFutureBaseline == object2.AssignedFutureBaseline &&
                          object1.AssignedCurrentBaseline == object2.AssignedCurrentBaseline &&
                          object1.IsT2GPollingRequired == object2.IsT2GPollingRequired &&
                          object1.OnBoardFutureBaseline == object2.OnBoardFutureBaseline &&
                          TrainBaselineStatusData.AreEqual(object1.Status, object2.Status);

            return(lEqual);
        }
        public void TrainBaselineStatusExtendedData_UpdateAfterCreation_SystemOffline_WithPisVersionSetAndCurrentBaselineVersion()
        {
            TrainBaselineStatusExtendedData data = new TrainBaselineStatusExtendedData();

            SystemInfo system = CreateSystem(TrainName_1, TrainId_1, false, InitializedPisVersion, BaselineWithCurrentOnly);

            data.Update(system);

            TrainBaselineStatusData         expectedStatusData = new TrainBaselineStatusData(TrainName_1, TrainId_1, system.IsOnline, CurrentBaselineVersion, NoBaselineVersion, PisVersionString, BaselineProgressStatusEnum.UNKNOWN);
            TrainBaselineStatusExtendedData expectedData       = new TrainBaselineStatusExtendedData(expectedStatusData, null, NoBaselineVersion, null, false);

            Assert.AreEqual(expectedData, data, "Method TrainBaselineStatusExtendedData.Update didn't behave as expected");
        }
        public void TrainBaselineStatusExtendedData_UpdateAfterCreation_SystemOffline_WithoutT2GMessage()
        {
            TrainBaselineStatusExtendedData data = new TrainBaselineStatusExtendedData();

            SystemInfo system = CreateSystem(TrainName_1, TrainId_1, false);

            data.Update(system);

            TrainBaselineStatusData         expectedStatusData = new TrainBaselineStatusData(TrainName_1, TrainId_1, system.IsOnline, NoBaselineVersion, NoBaselineVersion, string.Empty, BaselineProgressStatusEnum.UNKNOWN);
            TrainBaselineStatusExtendedData expectedData       = new TrainBaselineStatusExtendedData(expectedStatusData, null, NoBaselineVersion, null, false);

            Assert.AreEqual(expectedData, data, "Method TrainBaselineStatusExtendedData.Update didn't behave as expected");
        }
 /// <summary>
 /// Initializes a new instance of the TrainBaselineStatusExtendedData class.
 /// </summary>
 /// <param name="status">The basic status information.</param>
 /// <param name="assignedFutureBaseline">The extended information: assigned future baseline version.</param>
 /// <param name="onBoardFutureBaseline">The extended information: on board future baseline version.</param>
 /// <param name="assignedCurrentBaseline">The assigned current baseline.</param>
 /// <param name="isT2GPollingRequired">true if T2G must be ask for possible on-going transfer.</param>
 public TrainBaselineStatusExtendedData(
     TrainBaselineStatusData status,
     string assignedFutureBaseline,
     string onBoardFutureBaseline,
     string assignedCurrentBaseline,
     bool isT2GPollingRequired)
 {
     Status = status;
     AssignedFutureBaseline  = assignedFutureBaseline;
     OnBoardFutureBaseline   = onBoardFutureBaseline;
     IsT2GPollingRequired    = isT2GPollingRequired;
     AssignedCurrentBaseline = assignedCurrentBaseline;
 }
        public void TrainBaselineStatusExtendedData_UpdateExisting_Offline_StatusUnknown_CurrentAndFutureVersionUnset_WithOfflineSystem_WithoutAnyT2GMessage()
        {
            TrainBaselineStatusData         statusData = new TrainBaselineStatusData(TrainName_1, TrainId_1, false, NoBaselineVersion, NoBaselineVersion, string.Empty, BaselineProgressStatusEnum.UNKNOWN);
            TrainBaselineStatusExtendedData data       = new TrainBaselineStatusExtendedData(statusData);


            SystemInfo system = CreateSystem(TrainName_1, TrainId_1, false);

            data.Update(system);


            TrainBaselineStatusData         expectedStatusData = new TrainBaselineStatusData(TrainName_1, TrainId_1, system.IsOnline, NoBaselineVersion, NoBaselineVersion, string.Empty, BaselineProgressStatusEnum.UNKNOWN);
            TrainBaselineStatusExtendedData expectedData       = new TrainBaselineStatusExtendedData(expectedStatusData, null, NoBaselineVersion, null, false);

            Assert.AreEqual(expectedData, data, "Method TrainBaselineStatusExtendedData.Update didn't behave as expected");
        }
        public void TrainBaselineStatusScenario_WhenConnectionIsEstablishedWithT2G_NewTrainsAreAddedToTrainBaselineStatus()
        {
            TrainBaselineStatusData expectedValue = new TrainBaselineStatusData(TRAIN_NAME_1, TRAIN_VEHICLE_ID_1, true, DEFAULT_BASELINE, BaselineStatusUpdater.NoBaselineVersion, DEFAULT_PIS_VERSION, BaselineProgressStatusEnum.UNKNOWN);
            Dictionary <string, TrainBaselineStatusData> expectedStatuses = new Dictionary <string, TrainBaselineStatusData>();

            expectedStatuses.Add(TRAIN_NAME_1, expectedValue);

            CreateT2GServicesStub();
            _hostIdentificationService.Close();
            _dataStoreServiceStub.InitializeRemoteDataStoreMockWithDefaultBehavior();
            InitializeTrain(TRAIN_NAME_1, TRAIN_VEHICLE_ID_1, true, TRAIN_IP_1, TRAIN_DATA_PACKAGE_PORT_1, commLinkEnum._2G3G, false);
            InitializeDataPackageService(false);
            InitializePISGroundSession();

            ReopenIdentificationService();
            WaitPisGroundIsConnectedWithT2G(true);

            WaitTrainBaselineStatusesEquals(expectedStatuses, "Newly discovered train are not added as expected into the TrainBaselineStatus database when a connection with T2G is established");
        }
        public void TrainBaselineStatusExtendedData_UpdateExisting_Offline_StatusTransferPlanned_CurrentVersionAndFutureVersionUnset_AssignedFutureSet_WithOfflineSystem_WithoutAnyT2GMessage()
        {
            TrainBaselineStatusData statusData = new TrainBaselineStatusData(TrainName_1, TrainId_1, false, NoBaselineVersion, NoBaselineVersion, string.Empty, BaselineProgressStatusEnum.TRANSFER_PLANNED);

            statusData.RequestId = RequestId;
            statusData.TaskId    = TaskId;
            TrainBaselineStatusExtendedData data = new TrainBaselineStatusExtendedData(statusData, FutureBaselineversion, NoBaselineVersion, NoBaselineVersion, true);


            SystemInfo system = CreateSystem(TrainName_1, TrainId_1, false);

            data.Update(system);


            TrainBaselineStatusData expectedStatusData = new TrainBaselineStatusData(TrainName_1, TrainId_1, system.IsOnline, NoBaselineVersion, FutureBaselineversion, string.Empty, BaselineProgressStatusEnum.TRANSFER_PLANNED);

            expectedStatusData.RequestId = RequestId;
            expectedStatusData.TaskId    = TaskId;
            TrainBaselineStatusExtendedData expectedData = new TrainBaselineStatusExtendedData(expectedStatusData, FutureBaselineversion, NoBaselineVersion, NoBaselineVersion, true);

            Assert.AreEqual(expectedData, data, "Method TrainBaselineStatusExtendedData.Update didn't behave as expected");
        }
        public void TrainBaselineStatusScenario_OnSystemChangedNotificationAddNewTrain()
        {
            TrainBaselineStatusData valueTrain1 = new TrainBaselineStatusData(TRAIN_NAME_1, TRAIN_VEHICLE_ID_1, true, DEFAULT_BASELINE, BaselineStatusUpdater.NoBaselineVersion, DEFAULT_PIS_VERSION, BaselineProgressStatusEnum.UNKNOWN);
            TrainBaselineStatusData valueTrain2 = new TrainBaselineStatusData(TRAIN_NAME_2, TRAIN_VEHICLE_ID_2, true, "5.4.3.3", BaselineStatusUpdater.NoBaselineVersion, DEFAULT_PIS_VERSION, BaselineProgressStatusEnum.UNKNOWN);
            TrainBaselineStatusData valueTrain3 = new TrainBaselineStatusData(TRAIN_NAME_0, TRAIN_VEHICLE_ID_0, false, "1.0.0.0", BaselineStatusUpdater.NoBaselineVersion, DEFAULT_PIS_VERSION, BaselineProgressStatusEnum.UNKNOWN);
            Dictionary <string, TrainBaselineStatusData> expectedStatuses = new Dictionary <string, TrainBaselineStatusData>();


            // Initialize services
            CreateT2GServicesStub();

            _dataStoreServiceStub.InitializeRemoteDataStoreMockWithDefaultBehavior();

            InitializeDataPackageService(false);
            InitializePISGroundSession();

            // Wait that history log was on expected status.
            WaitTrainBaselineStatusesEquals(expectedStatuses, "Online statuses of train not updated in train baseline status when PIS-Ground connect with T2G");


            // TRAIN-1 become train online
            expectedStatuses.Add(valueTrain1.TrainId, valueTrain1.Clone());
            InitializeTrain(TRAIN_NAME_1, TRAIN_VEHICLE_ID_1, true, TRAIN_IP_1, TRAIN_DATA_PACKAGE_PORT_1, commLinkEnum._2G3G, true);

            WaitTrainBaselineStatusesEquals(expectedStatuses, "T2G - OnSystemChanged does not update the train number field in train baseline statuses database.");

            // TRAIN-0 added
            expectedStatuses.Add(valueTrain3.TrainId, valueTrain3.Clone());
            InitializeTrain(TRAIN_NAME_0, TRAIN_VEHICLE_ID_0, false, TRAIN_IP_0, TRAIN_DATA_PACKAGE_PORT_0, commLinkEnum.wifi, false, "1.0.0.0");

            WaitTrainBaselineStatusesEquals(expectedStatuses, "T2G - OnSystemChanged does not update the train number field in train baseline statuses database.");

            // TRAIN-2 added
            expectedStatuses.Add(valueTrain2.TrainId, valueTrain2.Clone());
            InitializeTrain(TRAIN_NAME_2, TRAIN_VEHICLE_ID_2, true, TRAIN_IP_2, TRAIN_DATA_PACKAGE_PORT_2, commLinkEnum._2G3G, false, "5.4.3.3");

            WaitTrainBaselineStatusesEquals(expectedStatuses, "T2G - OnSystemChanged does not update the train number field in train baseline statuses database.");
        }
        public void TrainBaselineStatusScenario_OnlineStatusOfTrainBaselineUpdateWhenCommunicationIsEstablishedWithT2G()
        {
            TrainBaselineStatusData valueTrain1 = new TrainBaselineStatusData(TRAIN_NAME_1, TRAIN_VEHICLE_ID_1, true, DEFAULT_BASELINE, BaselineStatusUpdater.NoBaselineVersion, DEFAULT_PIS_VERSION, BaselineProgressStatusEnum.UNKNOWN);
            TrainBaselineStatusData valueTrain2 = new TrainBaselineStatusData(TRAIN_NAME_2, TRAIN_VEHICLE_ID_2, true, "5.4.3.3", BaselineStatusUpdater.NoBaselineVersion, DEFAULT_PIS_VERSION, BaselineProgressStatusEnum.UNKNOWN);
            TrainBaselineStatusData valueTrain3 = new TrainBaselineStatusData(TRAIN_NAME_0, TRAIN_VEHICLE_ID_0, false, "1.0.0.0", BaselineStatusUpdater.NoBaselineVersion, DEFAULT_PIS_VERSION, BaselineProgressStatusEnum.UNKNOWN);
            Dictionary <string, TrainBaselineStatusData> expectedStatuses = new Dictionary <string, TrainBaselineStatusData>();

            expectedStatuses.Add(valueTrain1.TrainId, valueTrain1.Clone());
            expectedStatuses.Add(valueTrain2.TrainId, valueTrain2.Clone());
            expectedStatuses.Add(valueTrain3.TrainId, valueTrain3.Clone());


            // Initialize the history log database
            valueTrain1.OnlineStatus = false;
            valueTrain3.OnlineStatus = true;
            UpdateHistoryLog(valueTrain1);
            UpdateHistoryLog(valueTrain2);
            UpdateHistoryLog(valueTrain3);
            valueTrain1.OnlineStatus = true;
            valueTrain3.OnlineStatus = false;

            // Initialize services
            CreateT2GServicesStub();
            _hostIdentificationService.Close();

            _dataStoreServiceStub.InitializeRemoteDataStoreMockWithDefaultBehavior();
            InitializeTrain(TRAIN_NAME_1, TRAIN_VEHICLE_ID_1, true, TRAIN_IP_1, TRAIN_DATA_PACKAGE_PORT_1, commLinkEnum._2G3G, true);
            InitializeTrain(TRAIN_NAME_2, TRAIN_VEHICLE_ID_2, true, TRAIN_IP_2, TRAIN_DATA_PACKAGE_PORT_2, commLinkEnum._2G3G, false, "5.4.3.3");
            InitializeTrain(TRAIN_NAME_0, TRAIN_VEHICLE_ID_0, false, TRAIN_IP_0, TRAIN_DATA_PACKAGE_PORT_0, commLinkEnum.wifi, false, "1.0.0.0");

            InitializeDataPackageService(false);
            InitializePISGroundSession();
            ReopenIdentificationService();
            WaitPisGroundIsConnectedWithT2G(true);

            // Wait that history log was updated.
            WaitTrainBaselineStatusesEquals(expectedStatuses, "Online statuses of train not updated in train baseline status when PIS-Ground connect with T2G");
        }
        /// <summary>
        /// Fetch information from the specified system object and update the value of the managed object.
        /// </summary>
        /// <param name="info">The system information to synchronize with.</param>
        /// <exception cref="ArgumentNullException">info is null</exception>
        /// <exception cref="ArgumentOutOfRangeException">The specified info object has a different system identifier than current object.</exception>
        public void Update(SystemInfo info)
        {
            if (info == null)
            {
                throw new ArgumentNullException("info");
            }
            else if (Status == null)
            {
                Status = new TrainBaselineStatusData(info.SystemId, info.VehiclePhysicalId, info.IsOnline, BaselineStatusUpdater.NoBaselineVersion);
            }
            else if (info.SystemId != Status.TrainId)
            {
                throw new ArgumentOutOfRangeException("info");
            }

            ushort currentValue;

            if (!ushort.TryParse(Status.TrainNumber, NumberStyles.Integer, CultureInfo.InvariantCulture, out currentValue) || info.VehiclePhysicalId != currentValue)
            {
                Status.TrainNumber = info.VehiclePhysicalId.ToString(CultureInfo.InvariantCulture);
            }

            Status.OnlineStatus = info.IsOnline;
            if (info.PisVersion != null && !string.IsNullOrEmpty(info.PisVersion.VersionPISSoftware))
            {
                Status.PisOnBoardVersion = info.PisVersion.VersionPISSoftware;
            }


            if (info.PisBaseline != null && info.PisBaseline.IsInitialized)
            {
                string lNotificationCurrentVersion = info.PisBaseline.CurrentVersionOut;
                string lNotificationFutureVersion  = info.PisBaseline.FutureVersionOut;

                if (lNotificationCurrentVersion != null &&
                    lNotificationFutureVersion != null)
                {
                    if (lNotificationCurrentVersion.Length == 0)
                    {
                        lNotificationCurrentVersion = BaselineStatusUpdater.NoBaselineVersion;
                    }

                    if (lNotificationFutureVersion.Length == 0)
                    {
                        lNotificationFutureVersion = BaselineStatusUpdater.NoBaselineVersion;
                    }

                    string lEffectiveFutureVersion = IsValidVersion(AssignedFutureBaseline) ? AssignedFutureBaseline :
                                                     IsValidVersion(AssignedCurrentBaseline) ? AssignedCurrentBaseline :
                                                     IsValidVersion(Status.FutureBaselineVersion) ? Status.FutureBaselineVersion :
                                                     BaselineStatusUpdater.NoBaselineVersion;


                    OnBoardFutureBaseline = lNotificationFutureVersion;
                    if (Status != null)
                    {
                        switch (Status.ProgressStatus)
                        {
                        case BaselineProgressStatusEnum.UPDATED:

                            if (Status.CurrentBaselineVersion != lNotificationCurrentVersion)
                            {
                                // The current baseline changed unexpectedly

                                Status.ProgressStatus         = BaselineProgressStatusEnum.UNKNOWN;
                                Status.RequestId              = Guid.Empty;
                                Status.TaskId                 = 0;
                                Status.CurrentBaselineVersion = lNotificationCurrentVersion;
                            }

                            Status.FutureBaselineVersion = lNotificationFutureVersion;
                            IsT2GPollingRequired         = false;
                            break;

                        case BaselineProgressStatusEnum.DEPLOYED:

                            if (lEffectiveFutureVersion == lNotificationCurrentVersion)
                            {
                                // The future baseline has been promoted to current

                                Status.ProgressStatus = BaselineProgressStatusEnum.UPDATED;
                            }
                            else if (lEffectiveFutureVersion != lNotificationFutureVersion)
                            {
                                // The future baseline changed unexpectedly

                                Status.ProgressStatus = BaselineProgressStatusEnum.UNKNOWN;
                                Status.RequestId      = Guid.Empty;
                                Status.TaskId         = 0;
                            }
                            else
                            {
                                // Nothing special occurred
                                Status.FutureBaselineVersion = lEffectiveFutureVersion;
                            }

                            Status.CurrentBaselineVersion = lNotificationCurrentVersion;
                            Status.FutureBaselineVersion  = lNotificationFutureVersion;
                            IsT2GPollingRequired          = false;
                            break;

                        case BaselineProgressStatusEnum.TRANSFER_COMPLETED:
                        case BaselineProgressStatusEnum.TRANSFER_IN_PROGRESS:
                        case BaselineProgressStatusEnum.TRANSFER_PAUSED:
                        case BaselineProgressStatusEnum.TRANSFER_PLANNED:

                            // Expect that request id is set when we are in these statuses and we expect a future version
                            if (Status.RequestId == Guid.Empty || !IsValidVersion(lEffectiveFutureVersion))
                            {
                                Status.FutureBaselineVersion  = lNotificationFutureVersion;
                                Status.CurrentBaselineVersion = lNotificationCurrentVersion;
                                Status.TaskId         = 0;
                                Status.ProgressStatus = BaselineProgressStatusEnum.UNKNOWN;
                            }
                            else if (lEffectiveFutureVersion == lNotificationCurrentVersion && IsValidVersion(lNotificationCurrentVersion))
                            {
                                // The assigned baseline has been promoted to current baseline
                                // Note: In the current state, the future baseline is set to the assigned baseline.

                                Status.ProgressStatus        = BaselineProgressStatusEnum.UPDATED;
                                Status.FutureBaselineVersion = lNotificationFutureVersion;
                                IsT2GPollingRequired         = false;
                            }
                            else if (lEffectiveFutureVersion == lNotificationFutureVersion)
                            {
                                // The assigned baseline has been promoted to future baseline
                                // Note: In the current state, the future baseline is set to the assigned baseline.

                                Status.ProgressStatus = BaselineProgressStatusEnum.DEPLOYED;
                                IsT2GPollingRequired  = false;
                            }
                            else
                            {
                                Status.FutureBaselineVersion = lEffectiveFutureVersion;
                                if (!IsValidVersion(AssignedFutureBaseline) && !IsValidVersion(AssignedCurrentBaseline))
                                {
                                    AssignedFutureBaseline = lEffectiveFutureVersion;
                                }
                            }

                            // Do not update the future baseline since in the current state,
                            // it is set to the assigned baseline (not the on board baseline)
                            Status.CurrentBaselineVersion = lNotificationCurrentVersion;
                            break;

                        case BaselineProgressStatusEnum.UNKNOWN:

                            if (Status.RequestId != Guid.Empty)
                            {
                                if (IsValidVersion(lEffectiveFutureVersion))
                                {
                                    if (lEffectiveFutureVersion == lNotificationCurrentVersion)
                                    {
                                        // The assigned baseline has been promoted to current baseline

                                        Status.ProgressStatus = BaselineProgressStatusEnum.UPDATED;
                                        IsT2GPollingRequired  = false;
                                    }
                                    else if (lEffectiveFutureVersion == lNotificationFutureVersion)
                                    {
                                        // The assigned baseline has been promoted to future baseline
                                        // Note: In the current state, the future baseline is set to the assigned baseline.

                                        Status.ProgressStatus = BaselineProgressStatusEnum.DEPLOYED;
                                        IsT2GPollingRequired  = false;
                                    }
                                    else
                                    {
                                        // Nothing to do
                                    }
                                }
                            }

                            Status.CurrentBaselineVersion = lNotificationCurrentVersion;
                            Status.FutureBaselineVersion  = lNotificationFutureVersion;
                            break;
                        }
                    }
                }
            }
            else
            {
                // Pis Baseline is not initialized yet. Only ensure that future version is set.
                OnBoardFutureBaseline = BaselineStatusUpdater.NoBaselineVersion;

                if (Status.RequestId != Guid.Empty)
                {
                    string lEffectiveFutureVersion = IsValidVersion(AssignedFutureBaseline) ? AssignedFutureBaseline :
                                                     IsValidVersion(AssignedCurrentBaseline) ? AssignedCurrentBaseline :
                                                     BaselineStatusUpdater.NoBaselineVersion;

                    // Perform update only if we expect a future version and current baseline is not set to future version
                    if (IsValidVersion(lEffectiveFutureVersion) && Status.CurrentBaselineVersion != lEffectiveFutureVersion)
                    {
                        Status.FutureBaselineVersion = lEffectiveFutureVersion;
                    }
                }
            }

            if (Status != null)
            {
                if (Status.ProgressStatus == BaselineProgressStatusEnum.UPDATED)
                {
                    Status.RequestId     = Guid.Empty;
                    Status.TaskId        = 0;
                    IsT2GPollingRequired = false;
                }
                else if (Status.RequestId == Guid.Empty)
                {
                    Status.TaskId        = 0;
                    IsT2GPollingRequired = false;
                }

                if (string.IsNullOrEmpty(Status.FutureBaselineVersion))
                {
                    Status.FutureBaselineVersion = BaselineStatusUpdater.NoBaselineVersion;
                }

                if (string.IsNullOrEmpty(Status.CurrentBaselineVersion))
                {
                    Status.CurrentBaselineVersion = BaselineStatusUpdater.NoBaselineVersion;
                }
            }
        }
 /// <summary>
 /// Initializes a new instance of the TrainBaselineStatusExtendedData class.
 /// </summary>
 /// <param name="status">The basic status information.</param>
 public TrainBaselineStatusExtendedData(
     TrainBaselineStatusData status) : this(status, null, null, null, true)
 {
     // No logic body
 }
 /// <summary>
 /// Updates the history log database with information provided by data..
 /// </summary>
 /// <param name="data">The train baseline status information to write into database.</param>
 protected void UpdateHistoryLog(TrainBaselineStatusData data)
 {
     HistoryLogger.UpdateTrainBaselineStatus(data.TrainId, data.RequestId, data.TaskId, data.TrainNumber, data.OnlineStatus, data.ProgressStatus, data.ProgressStatusState, data.CurrentBaselineVersion, data.FutureBaselineVersion, data.PisOnBoardVersion);
 }