예제 #1
0
        public void Run_all_MySQL_migrations_work()
        {
            // Arrange
            int expectedNbMigration = Directory.GetFiles(MySQL.MigrationFolder).Length;
            var cnn    = _dbContainer.CreateDbConnection();
            var evolve = new Evolve(cnn, msg => _output.WriteLine(msg))
            {
                EmbeddedResourceAssemblies = new[] { typeof(TestContext).Assembly },
                EmbeddedResourceFilters    = new[] { MySQL.MigrationFolderFilter },
                CommandTimeout             = 25
            };

            // Assert
            evolve.AssertInfoIsSuccessful(cnn, expectedNbRows: 0)
            .AssertMigrateIsSuccessful(cnn, expectedNbMigration)
            .AssertMigrateThrows <EvolveValidationException>(cnn, e => e.EmbeddedResourceAssemblies = new List <Assembly>(), locations: MySQL.ChecksumMismatchFolder)
            .AssertRepairIsSuccessful(cnn, expectedNbReparation: 1)
            .AssertMigrateIsSuccessful(cnn, expectedNbMigration: 0)
            .AssertEraseThrows <EvolveConfigurationException>(cnn, e => e.IsEraseDisabled = true)
            .AssertEraseIsSuccessful(cnn, e => e.IsEraseDisabled = false)
            .AssertMigrateIsSuccessful(cnn, expectedNbMigration, null, locations: MySQL.MigrationFolder)
            .AssertMigrateIsSuccessful(cnn, expectedNbMigration: 1, e => e.MustEraseOnValidationError = true, locations: MySQL.ChecksumMismatchFolder)
            .AssertEraseIsSuccessful(cnn, e => e.IsEraseDisabled = false)
            .AssertMigrateIsSuccessful(cnn, expectedNbMigration, null, locations: MySQL.MigrationFolder)
            .AssertRepairIsSuccessful(cnn, expectedNbReparation: 0, locations: MySQL.RepeatableFolder)
            .AssertMigrateIsSuccessful(cnn, expectedNbMigration: 1)
            .AssertMigrateIsSuccessful(cnn, expectedNbMigration: 0)
            .AssertInfoIsSuccessful(cnn, expectedNbRows: expectedNbMigration + 2);
        }
예제 #2
0
        public void Run_all_CockroachDB_migrations_work()
        {
            // Arrange
            var cnn    = _dbContainer.CreateDbConnection();
            var evolve = new Evolve(cnn, msg => _output.WriteLine(msg))
            {
                Schemas = new[] { "evolve", "defaultdb" }, // MetadataTableSchema = evolve | migrations = defaultdb
            };

            // Assert
            evolve.AssertInfoIsSuccessfulV2(cnn)
            .ChangeLocations(CockroachDB.MigrationFolder)
            .AssertInfoIsSuccessfulV2(cnn)
            .AssertMigrateIsSuccessfulV2(cnn)
            .AssertInfoIsSuccessfulV2(cnn);

            evolve.ChangeLocations(CockroachDB.ChecksumMismatchFolder)
            .AssertMigrateThrows <EvolveValidationException>(cnn)
            .AssertRepairIsSuccessful(cnn, expectedNbReparation: 1)
            .ChangeLocations(CockroachDB.MigrationFolder)
            .AssertInfoIsSuccessfulV2(cnn);

            evolve.ChangeLocations()
            .AssertEraseThrows <EvolveConfigurationException>(cnn, e => e.IsEraseDisabled = true)
            .AssertEraseIsSuccessful(cnn, e => e.IsEraseDisabled = false)
            .AssertInfoIsSuccessfulV2(cnn);

            evolve.ChangeLocations(CockroachDB.MigrationFolder)
            .AssertMigrateIsSuccessfulV2(cnn)
            .AssertInfoIsSuccessfulV2(cnn);
        }
예제 #3
0
    void Start()
    {
        canMove = true;

        //SpawnPoint
        //respawnPosition = transform.position;

        theLevelManager           = FindObjectOfType <LevelManager>();
        lastPositionScript        = FindObjectOfType <LastPosition>();
        evolveScript              = FindObjectOfType <Evolve>();
        tvPlayer                  = FindObjectOfType <PlayerController>();
        transformationCloudScript = FindObjectOfType <TransformationCloud>();
        hurtPlayerScript          = FindObjectOfType <HurtPlayer>();


        //Assign variables
        rb2d = gameObject.GetComponent <Rigidbody2D>();
        anim = gameObject.GetComponent <Animator>();

        //Start with full health
        currentHealth = maxHealth;

        //tvPlayer = FindObjectOfType<PlayerController>();

        transform.position = lastPositionScript.pos;
    }
예제 #4
0
        public void Execute()
        {
            try
            {
                using (var conn = _connectionFactory.GetConnection())
                {
                    conn.Open();

                    _logger.LogInformation("MySQL connectivity OK!");

                    var evolve = new Evolve(conn, msg => _logger.LogInformation(msg))
                    {
                        EmbeddedResourceAssemblies = new[] { typeof(MySqlServerVerificationStartupAction).Assembly },
                        IsEraseDisabled            = true
                    };

                    evolve.Migrate();
                }
            }
            catch (Exception ex)
            {
                _logger.LogError(ex, "Failed to connect to MySQL");

                throw;
            }
        }
예제 #5
0
        public void Run_all_SQLite_migrations_work()
        {
            var cnn    = new SQLiteConnection($@"Data Source={Path.GetTempPath() + Guid.NewGuid().ToString()}.db;");
            var evolve = new Evolve(cnn, msg => _output.WriteLine(msg))
            {
                Locations = new List <string> {
                    TestContext.SQLite.MigrationFolder
                },
                Placeholders = new Dictionary <string, string> {
                    ["${table4}"] = "table_4"
                },
            };

            int nbMigration = Directory.GetFiles(TestContext.SQLite.MigrationFolder).Length;

            // Migrate Sql_Scripts\Migration
            evolve.Migrate();
            Assert.True(evolve.NbMigration == nbMigration, $"{nbMigration} migrations should have been applied, not {evolve.NbMigration}.");

            // Migrate: nothing to do. Database is already up to date.
            evolve.Migrate();
            Assert.True(evolve.NbMigration == 0, $"There should be no more migration after a successful one, not {evolve.NbMigration}.");

            // Migrate Sql_Scripts\Checksum_mismatch: validation should fail due to a checksum mismatch.
            evolve.Locations = new List <string> {
                TestContext.SQLite.ChecksumMismatchFolder
            };
            Assert.Throws <EvolveValidationException>(() => evolve.Migrate());

            // Repair sucessfull
            evolve.Repair();
            Assert.True(evolve.NbReparation == 1, $"There should be 1 migration repaired, not {evolve.NbReparation}.");

            // Migrate: nothing to do. Database is already up to date.
            evolve.Migrate();
            Assert.True(evolve.NbMigration == 0, $"There should be no more migration after a successful one, not {evolve.NbMigration}.");

            // Erase cancelled (EraseDisabled = true)
            evolve.IsEraseDisabled = true;
            Assert.Throws <EvolveConfigurationException>(() => evolve.Erase());

            // Erase sucessfull
            evolve.IsEraseDisabled = false;
            evolve.Erase();
            Assert.True(evolve.NbSchemaErased == evolve.Schemas.Count(), $"{evolve.Schemas.Count()} schemas should have been erased, not {evolve.NbSchemaErased}.");

            // Migrate sucessfull after a validation error (MustEraseOnValidationError = true)
            evolve.Locations = new List <string> {
                TestContext.SQLite.MigrationFolder
            };                                                                          // Migrate Sql_Scripts\Migration
            evolve.Migrate();
            Assert.True(evolve.NbMigration == nbMigration, $"{nbMigration} migrations should have been applied, not {evolve.NbMigration}.");
            evolve.Locations = new List <string> {
                TestContext.SQLite.ChecksumMismatchFolder
            };                                                                                 // Migrate Sql_Scripts\Checksum_mismatch
            evolve.MustEraseOnValidationError = true;
            evolve.Migrate();
            Assert.True(evolve.NbSchemaErased == evolve.Schemas.Count(), $"{evolve.Schemas.Count()} schemas should have been erased, not {evolve.NbSchemaErased}.");
            Assert.True(evolve.NbMigration == 1, $"1 migration should have been applied, not {evolve.NbMigration}.");
        }
        public void Load_app_configuration_file_works()
        {
            var evolve = new Evolve(TestContext.AppConfigPath);

            Assert.Equal("Server=127.0.0.1;Port=5432;Database=myDataBase;User Id=myUsername;Password=myPassword;", evolve.ConnectionString);
            Assert.Equal("npgsql", evolve.Driver);
            Assert.True(new List <string>()
            {
                "migration", "dataset"
            }.SequenceEqual(evolve.Locations));
            Assert.Equal("utf-16", evolve.Encoding.BodyName);
            Assert.Equal("Ver", evolve.SqlMigrationPrefix);
            Assert.Equal("@", evolve.SqlMigrationSeparator);
            Assert.Equal(".query", evolve.SqlMigrationSuffix);
            Assert.Equal("my_shema", evolve.Schemas.Single());
            Assert.Equal("my_metadata_schema", evolve.MetadataTableSchema);
            Assert.Equal("metadata_store", evolve.MetadataTableName);
            Assert.Equal("@{", evolve.PlaceholderPrefix);
            Assert.Equal("@}", evolve.PlaceholderSuffix);
            Assert.Equal(new MigrationVersion("2_1_0"), evolve.TargetVersion);
            Assert.Equal(new MigrationVersion("1_1_0"), evolve.StartVersion);
            Assert.True(new List <string>()
            {
                "@{Schema@}", "@{Pwd@}"
            }.SequenceEqual(evolve.Placeholders.Keys));
            Assert.True(new List <string>()
            {
                "my_schema", "password"
            }.SequenceEqual(evolve.Placeholders.Values));
            Assert.True(evolve.IsEraseDisabled);
            Assert.True(evolve.MustEraseOnValidationError);
            Assert.Equal(evolve.Command, CommandOptions.Erase);
        }
예제 #7
0
        public static Evolve AssertValidationThrows <T>(this Evolve evolve, int errorCount) where T : Exception
        {
            var ex = Assert.Throws <T>(() => evolve.Validate());

            Assert.Contains($"{errorCount} error(s)", ex.Message);
            return(evolve);
        }
예제 #8
0
        public void Run_all_PostgreSQL_migrations_work()
        {
            // Arrange
            string[] locations           = AppVeyor ? new[] { PostgreSQL.MigrationFolder } : new[] { PostgreSQL.MigrationFolder, PostgreSQL.Migration11Folder }; // Add specific PostgreSQL 11 scripts
            int      expectedNbMigration = AppVeyor ? Directory.GetFiles(PostgreSQL.MigrationFolder).Length : Directory.GetFiles(PostgreSQL.MigrationFolder).Length + 1;
            var      cnn    = _dbContainer.CreateDbConnection();
            var      evolve = new Evolve(cnn, msg => _output.WriteLine(msg))
            {
                Schemas             = new[] { "public", "unittest" },
                MetadataTableSchema = "unittest",
                Placeholders        = new Dictionary <string, string> {
                    ["${schema1}"] = "unittest"
                }
            };

            // Assert
            evolve.AssertInfoIsSuccessful(cnn, expectedNbRows: 0)
            .AssertMigrateIsSuccessful(cnn, expectedNbMigration, null, locations)
            .AssertMigrateThrows <EvolveValidationException>(cnn, locations: PostgreSQL.ChecksumMismatchFolder)
            .AssertRepairIsSuccessful(cnn, expectedNbReparation: 1)
            .AssertMigrateIsSuccessful(cnn, expectedNbMigration: 0)
            .AssertMigrateThrows <EvolveValidationException>(cnn, locations: PostgreSQL.OutOfOrderFolder)
            .AssertMigrateIsSuccessful(cnn, expectedNbMigration: 1, e => e.OutOfOrder     = true)
            .AssertEraseThrows <EvolveConfigurationException>(cnn, e => e.IsEraseDisabled = true)
            .AssertEraseIsSuccessful(cnn, e => e.IsEraseDisabled = false)
            .AssertMigrateIsSuccessful(cnn, expectedNbMigration, null, locations)
            .AssertMigrateIsSuccessful(cnn, expectedNbMigration: 1, e => e.MustEraseOnValidationError = true, locations: PostgreSQL.ChecksumMismatchFolder)
            .AssertEraseIsSuccessful(cnn, e => e.IsEraseDisabled = false)
            .AssertMigrateIsSuccessful(cnn, expectedNbMigration, null, locations)
            .AssertRepairIsSuccessful(cnn, expectedNbReparation: 0, locations: PostgreSQL.RepeatableFolder)
            .AssertMigrateIsSuccessful(cnn, expectedNbMigration: 1)
            .AssertMigrateIsSuccessful(cnn, expectedNbMigration: 0)
            .AssertInfoIsSuccessful(cnn, expectedNbRows: expectedNbMigration + 3);
        }
예제 #9
0
        public void Scenario_check_validation()
        {
            // Step00: Validation succeeds when no script ever found
            Evolve.ChangeLocations(new[] { Path.Combine(ScenarioFolder, "Step00") })
            .AsserValidationIsSuccessful();

            // Step01: Validation failed when pending scripts are found
            //         And succeeds when they are all applied even with an `evolve-repeat-always` repeatable migration
            Evolve.ChangeLocations(new[] { Path.Combine(ScenarioFolder, "Step01") })
            .AssertValidationThrows <EvolveValidationException>(errorCount: 3);

            Evolve.AssertMigrateIsSuccessful(Cnn, repeatAlwaysCount: 1)
            .AsserValidationIsSuccessful();

            // Step02: Validation failed because of a missing script
            Evolve.ChangeLocations(new[] { Path.Combine(ScenarioFolder, "Step02") })
            .AssertValidationThrows <EvolveValidationException>(errorCount: 2);

            // Step03: Validation failed because of an invalid checksum
            Evolve.ChangeLocations(new[] { Path.Combine(ScenarioFolder, "Step03") })
            .AssertValidationThrows <EvolveValidationException>(errorCount: 1);

            // Step04: Validation failed because of new cheksum of an existing repeatable migration
            Evolve.ChangeLocations(new[] { Path.Combine(ScenarioFolder, "Step04") })
            .AssertValidationThrows <EvolveValidationException>(errorCount: 1);

            // Step01: Validation succeeds
            Evolve.ChangeLocations(new[] { Path.Combine(ScenarioFolder, "Step01") })
            .AsserValidationIsSuccessful();
        }
예제 #10
0
        public void Run_all_SQLite_migrations_work()
        {
            // Arrange
            int expectedNbMigration = Directory.GetFiles(SQLite.MigrationFolder).Length;
            var cnn    = new SQLiteConnection($@"Data Source={Path.GetTempPath() + Guid.NewGuid().ToString()}.db;");
            var evolve = new Evolve(cnn, msg => _output.WriteLine(msg))
            {
                Placeholders = new Dictionary <string, string> {
                    ["${table4}"] = "table_4"
                },
            };

            // Assert
            evolve.AssertInfoIsSuccessful(cnn, expectedNbRows: 0)
            .AssertMigrateIsSuccessful(cnn, expectedNbMigration, locations: SQLite.MigrationFolder)
            .AssertMigrateThrows <EvolveValidationException>(cnn, locations: SQLite.ChecksumMismatchFolder)
            .AssertRepairIsSuccessful(cnn, expectedNbReparation: 1)
            .AssertMigrateIsSuccessful(cnn, expectedNbMigration: 0)
            .AssertEraseThrows <EvolveConfigurationException>(cnn, e => e.IsEraseDisabled = true)
            .AssertEraseIsSuccessful(cnn, e => e.IsEraseDisabled = false)
            .AssertMigrateIsSuccessful(cnn, expectedNbMigration, null, locations: SQLite.MigrationFolder)
            .AssertMigrateIsSuccessful(cnn, expectedNbMigration: 1, e => e.MustEraseOnValidationError = true, locations: SQLite.ChecksumMismatchFolder)
            .AssertEraseIsSuccessful(cnn, e => e.IsEraseDisabled = false)
            .AssertMigrateIsSuccessful(cnn, expectedNbMigration, null, locations: SQLite.MigrationFolder)
            .AssertRepairIsSuccessful(cnn, expectedNbReparation: 0, locations: SQLite.RepeatableFolder)
            .AssertMigrateIsSuccessful(cnn, expectedNbMigration: 1)
            .AssertMigrateIsSuccessful(cnn, expectedNbMigration: 0)
            .AssertInfoIsSuccessful(cnn, expectedNbRows: expectedNbMigration + 2);
        }
예제 #11
0
    private void OnTriggerEnter(Collider collider)
    {
        if (collider.tag == "heal")
        {
            audioSource.PlayOneShot(lifeUpSFX, FXVolume);
            GameObject healingPod = collider.gameObject;
            currentHealth += healingPod.GetComponent <Heal>().numHealthToRestore;
            currentHealth  = Mathf.Min(currentHealth, maxHealth);
            healthBar.SetHealth(currentHealth);
            Destroy(healingPod);
        }

        if (collider.tag == "Pod")
        {
            if (havePodAlready)
            {
                return;
            }

            animator.ResetTrigger("Releasing");
            animator.SetTrigger("Holding");
            audioSource.PlayOneShot(pickUpSFX, FXVolume);

            havePodAlready = true;

            collider.isTrigger                  = false;
            collider.transform.parent           = transform;
            collider.transform.localPosition    = PickUpPosition;
            collider.transform.localEulerAngles = PickUpRotation;
            myPod = collider.gameObject;
            Evolve myEvolve = myPod.GetComponent <Evolve>();
            myEvolve.podActivated = true;
        }
    }
예제 #12
0
    void Start()
    {
        crouchTrigger.enabled = false;

        //Defaults to facing right.
        facingRight = true;

        //Enables mobility.
        canMove = true;

        //SpawnPoint
        respawnPosition = transform.position;

        //References to other scripts.
        theLevelManager     = FindObjectOfType <LevelManager>();
        lastPositionScript  = FindObjectOfType <LastPosition>();
        evolveScript        = FindObjectOfType <Evolve>();
        thePlayerController = FindObjectOfType <PlayerController>();
        playerGun           = FindObjectOfType <PlayerGun>();


        //Assign variables
        rb2d = gameObject.GetComponent <Rigidbody2D>();
        anim = gameObject.GetComponent <Animator>();

        //Start with full health
        currentHealth = maxHealth;

        transform.position = lastPositionScript.pos;
    }
        public void Load_multiple_json_configuration_files_works()
        {
            var evolve = new Evolve(TestContext.Json2ConfigPath, environmentName: "staging");

            Assert.Equal("Server=srv1;Port=5432;Database=myDataBase;User Id=myUsername;Password=myPassword;", evolve.ConnectionString);
            Assert.Equal("npgsql", evolve.Driver);
            Assert.True(new List <string>()
            {
                "migration"
            }.SequenceEqual(evolve.Locations));
            Assert.Equal("utf-16", evolve.Encoding.BodyName);
            Assert.Equal("Ver", evolve.SqlMigrationPrefix);
            Assert.Equal("@", evolve.SqlMigrationSeparator);
            Assert.Equal(".query", evolve.SqlMigrationSuffix);
            Assert.Equal("my_shema", evolve.Schemas.Single());
            Assert.Equal("my_metadata_schema", evolve.MetadataTableSchema);
            Assert.Equal("metadata_store", evolve.MetadataTableName);
            Assert.Equal("@{", evolve.PlaceholderPrefix);
            Assert.Equal("@}", evolve.PlaceholderSuffix);
            Assert.Equal(new MigrationVersion("2_1_0"), evolve.TargetVersion);
            Assert.Equal(new MigrationVersion("1_1_0"), evolve.StartVersion);
            Assert.True(new List <string>()
            {
                "@{Pwd@}", "@{Schema@}"
            }.SequenceEqual(evolve.Placeholders.Keys.OrderBy(x => x)));
            Assert.True(new List <string>()
            {
                "my_schema", "password"
            }.SequenceEqual(evolve.Placeholders.Values.OrderBy(x => x)));
            Assert.True(evolve.IsEraseDisabled);
            Assert.False(evolve.MustEraseOnValidationError);
            Assert.Equal(CommandOptions.Migrate, evolve.Command);
            Assert.False(evolve.EnableClusterMode);
            Assert.False(evolve.OutOfOrder);
        }
예제 #14
0
        public void Scenario_retry_repeatable_migrations_until_no_error()
        {
            // Assert
            Evolve.AssertInfoIsSuccessful(Cnn)
            .AssertMigrateThrows <EvolveException>(Cnn);

            Evolve.AssertMigrateIsSuccessful(Cnn, e => e.RetryRepeatableMigrationsUntilNoError = true);
        }
예제 #15
0
        public static Evolve AssertEraseThrows <T>(this Evolve evolve, IDbConnection cnn, Action <Evolve> arrange) where T : Exception
        {
            arrange(evolve);
            Assert.Throws <T>(() => evolve.Erase());
            Assert.True(cnn.State == ConnectionState.Closed);

            return(evolve);
        }
예제 #16
0
 // Use this for initialization
 void Start()
 {
     theSpriteRenderer      = GetComponent <SpriteRenderer>();
     theColliderBox.enabled = true;
     evolveScript           = FindObjectOfType <Evolve>();
     tvPlayer     = FindObjectOfType <PlayerController>();
     plasmaPlayer = FindObjectOfType <PlasmaPlayer>();
 }
예제 #17
0
        private static void StartSCProblem()
        {
            var bestClassifiers = new Individual[8];

            CultureInfo.DefaultThreadCurrentCulture = CultureInfo.InvariantCulture;
            ECActivator.AddSourceAssemblies(new[] { Assembly.GetAssembly(typeof(IEvolutionState)), Assembly.GetAssembly(typeof(MultiClassifierProblem)) });
            var             parameters    = Evolve.LoadParameterDatabase(new[] { "-file", @"Params\App\Iris\single.params" });
            IEvolutionState state         = Evolve.Initialize(parameters, 0);
            var             date          = DateTime.Now.Ticks.ToString();
            var             directoryName = "stats/" + date;
            var             directory     = System.IO.Directory.CreateDirectory(directoryName);
            var             writer        = new System.IO.StreamWriter(directoryName + "/multi_cl_stats.txt", false);

            //  IEvolutionState state = Evolve.Initialize(Evolve.LoadParameterDatabase(new[] { "-file", @"Params\App\Iris\single.params" }), 0);

            for (var i = 0; i < 8; i++)
            {
                // parameters = Evolve.LoadParameterDatabase(new[] { "-file", @"Params\App\Iris\single.params", "-stat.file", @"out1.stat" });
                if (i != 0)
                {
                    state = Evolve.Initialize(parameters, 0);
                }
                MultiClassificationClass.Current = MultiClassificationClass.Labels[i];
                // state.Output.FilePrefix = i.ToString();
                state.Run(EvolutionState.C_STARTED_FRESH);
                var best = ((SimpleStatistics)((SimpleEvolutionState)state).Statistics).BestOfRun[0];

                int humanGraph = state.Output.AddLog(directoryName + "/multi_cl_human_graph_" + MultiClassificationClass.Current + ".txt");
                int ecjGraph   = state.Output.AddLog(directoryName + "/multi_cl_ecj_graph_" + MultiClassificationClass.Current + ".txt");
                ((GPIndividual)best).Trees[0].PrintStyle = GPTree.PRINT_STYLE_DOT;
                ((GPIndividual)best).Trees[0].PrintTreeForHumans(state, humanGraph);
                ((GPIndividual)best).Trees[0].PrintTree(state, ecjGraph);

                state.Output.Close();
                // System.IO.File.Delete("out.stat");
                bestClassifiers[i] = best;

                var writer2 = new System.IO.StreamWriter(directoryName + "/classifier_code_" + MultiClassificationClass.Current + ".txt");
                var code    = TreeReader.PrintCodeFromTree(((GPIndividual)best).Trees[0]);
                writer2.Write(code);
                writer2.Close();

                var accuracy = (double)(1552 - ((KozaFitness)bestClassifiers[i].Fitness).StandardizedFitness) / 1552;
                writer.WriteLine("Klasyfikator dla gestu " + MultiClassificationClass.Labels[i]);
                writer.WriteLine("Ilość generacji: " + state.NumGenerations.ToString());
                writer.WriteLine("Rozmiar drzewa: " + ((GPIndividual)bestClassifiers[i]).Size.ToString());
                writer.WriteLine("Poprawność klasyfikacji: " + accuracy.ToString());
                writer.WriteLine();
                //    ((GPIndividual)bestClassifiers[0]).Trees[0].Child.Eval
                //((GPIndividual)bestClassifiers[0]).Trees[0].
                //  ((SingleClassifierProblem)state.Evaluator.p_problem)
            }

            writer.Close();

            CheckClassifierOnTestData(bestClassifiers, state, (int)ClassifierType.MULTI_CLASSIFIER, directoryName);
        }
예제 #18
0
        public void Run_all_MySQL_migrations_work()
        {
            var cnn    = new MySqlConnection($"Server=127.0.0.1;Port={TestContext.ContainerPort};Database={TestContext.DbName};Uid={TestContext.DbUser};Pwd={TestContext.DbPwd};");
            var evolve = new Evolve(cnn, msg => Debug.WriteLine(msg))
            {
                Locations = new List <string> {
                    TestContext.MigrationFolder
                },
            };

            int nbMigration = Directory.GetFiles(TestContext.MigrationFolder).Length;

            // Migrate Sql_Scripts\Migration
            evolve.Migrate();
            Assert.True(evolve.NbMigration == nbMigration, $"{nbMigration} migrations should have been applied, not {evolve.NbMigration}.");

            // Migrate: nothing to do. Database is already up to date.
            evolve.Migrate();
            Assert.True(evolve.NbMigration == 0, $"There should be no more migration after a successful one, not {evolve.NbMigration}.");

            // Migrate Sql_Scripts\Checksum_mismatch: validation should fail due to a checksum mismatch.
            evolve.Locations = new List <string> {
                TestContext.ChecksumMismatchFolder
            };
            Assert.Throws <EvolveValidationException>(() => evolve.Migrate());

            // Repair sucessfull
            evolve.Repair();
            Assert.True(evolve.NbReparation == 1, $"There should be 1 migration repaired, not {evolve.NbReparation}.");

            // Migrate: nothing to do. Database is already up to date.
            evolve.Migrate();
            Assert.True(evolve.NbMigration == 0, $"There should be no more migration after a successful one, not {evolve.NbMigration}.");

            // Erase cancelled (EraseDisabled = true)
            evolve.IsEraseDisabled = true;
            Assert.Throws <EvolveConfigurationException>(() => evolve.Erase());

            // Erase sucessfull
            evolve.IsEraseDisabled = false;
            evolve.Erase();
            Assert.True(evolve.NbSchemaErased == evolve.Schemas.Count(), $"{evolve.Schemas.Count()} schemas should have been erased, not {evolve.NbSchemaErased}.");

            // Migrate sucessfull after a validation error (MustEraseOnValidationError = true)
            evolve.Locations = new List <string> {
                TestContext.MigrationFolder
            };                                                                   // Migrate Sql_Scripts\Migration
            evolve.Migrate();
            Assert.True(evolve.NbMigration == nbMigration, $"{nbMigration} migrations should have been applied, not {evolve.NbMigration}.");
            evolve.Locations = new List <string> {
                TestContext.ChecksumMismatchFolder
            };                                                                          // Migrate Sql_Scripts\Checksum_mismatch
            evolve.MustEraseOnValidationError = true;
            evolve.Migrate();
            Assert.True(evolve.NbSchemaErased == evolve.Schemas.Count(), $"{evolve.Schemas.Count()} schemas should have been erased, not {evolve.NbSchemaErased}.");
            Assert.True(evolve.NbMigration == 1, $"1 migration should have been applied, not {evolve.NbMigration}.");
        }
예제 #19
0
        public void Scenario_retry_repeatable_migrations_until_no_progression()
        {
            // Arrange
            Evolve.RetryRepeatableMigrationsUntilNoError = true;

            // Assert
            Evolve.AssertInfoIsSuccessful(Cnn)
            .AssertMigrateThrows <EvolveException>(Cnn);
        }
예제 #20
0
        public void Scenario_skip_migration_until_target_version_is_reached()
        {
            // Arrange
            Evolve.SkipNextMigrations = true;
            Evolve.TargetVersion      = new("2_0");

            // Assert
            Evolve.AssertMigrateIsSuccessful(Cnn);
        }
예제 #21
0
        public static Evolve AssertEraseIsSuccessful(this Evolve evolve, IDbConnection cnn, Action <Evolve> arrange = null)
        {
            arrange?.Invoke(evolve);
            evolve.Erase();
            Assert.True(evolve.NbSchemaErased == evolve.Schemas.Count(), $"{evolve.Schemas.Count()} schemas should have been erased, not {evolve.NbSchemaErased}.");
            Assert.True(cnn.State == ConnectionState.Closed);

            return(evolve);
        }
예제 #22
0
 public void Scenario_repeatable_migration_executed_everytime()
 {
     for (int i = 1; i <= 3; i++)
     {
         Evolve.Migrate();
         Assert.True(Evolve.AppliedMigrations.Count == 1, $"This repeat always migration should be executed each time.");
         Assert.True(MetadataTable.GetAllAppliedRepeatableMigration().Count() == i);
         Assert.False(MetadataTable.GetAllAppliedMigration().Any());
     }
 }
예제 #23
0
        public static Evolve AssertInfoIsSuccessful(this Evolve evolve, IDbConnection cnn, int expectedNbRows)
        {
            var rows   = evolve.Info();
            int nbRows = rows?.Count() ?? 0;

            Assert.True(nbRows == expectedNbRows, $"{expectedNbRows} rows should have been returned, not {nbRows}.");
            Assert.True(cnn.State == ConnectionState.Closed);

            return(evolve);
        }
예제 #24
0
        public void Run_all_SQLServer_migrations_work()
        {
            // Arrange
            var cnn    = new SqlConnection(_dbContainer.GetCnxStr(DbName));
            var evolve = new Evolve(cnn, msg => _output.WriteLine(msg))
            {
                Placeholders = new Dictionary <string, string> {
                    ["${db}"] = DbName, ["${schema2}"] = "dbo"
                },
                TargetVersion = new MigrationVersion("8_9"),
            };

            // Assert
            evolve.AssertInfoIsSuccessful(cnn)
            .ChangeLocations(SqlServer.MigrationFolder)
            .AssertInfoIsSuccessful(cnn)
            .AssertMigrateIsSuccessful(cnn)
            .AssertInfoIsSuccessful(cnn);

            evolve.AssertMigrateThrows <EvolveConfigurationException>(cnn, e => e.StartVersion = new MigrationVersion("3.0"));

            evolve.ChangeLocations(SqlServer.ChecksumMismatchFolder)
            .AssertMigrateThrows <EvolveValidationException>(cnn, e => e.StartVersion = MigrationVersion.MinVersion)
            .AssertRepairIsSuccessful(cnn, expectedNbReparation: 1)
            .ChangeLocations(SqlServer.MigrationFolder)
            .AssertInfoIsSuccessful(cnn);

            evolve.ChangeLocations()
            .AssertEraseThrows <EvolveConfigurationException>(cnn, e => e.IsEraseDisabled = true)
            .AssertEraseIsSuccessful(cnn, e => e.IsEraseDisabled = false)
            .AssertInfoIsSuccessful(cnn);

            evolve.ChangeLocations(SqlServer.MigrationFolder)
            .AssertMigrateIsSuccessful(cnn)
            .AssertInfoIsSuccessful(cnn);

            evolve.ChangeLocations(SqlServer.ChecksumMismatchFolder)
            .AssertMigrateIsSuccessful(cnn, e => e.MustEraseOnValidationError = true)
            .AssertInfoIsSuccessful(cnn);


            evolve.ChangeLocations(SqlServer.MigrationFolder)
            .AssertEraseIsSuccessful(cnn, e => e.IsEraseDisabled = false)
            .AssertMigrateIsSuccessful(cnn, e => e.StartVersion  = new MigrationVersion("2.0"))
            .AssertInfoIsSuccessful(cnn);

            evolve.ChangeLocations(SqlServer.MigrationFolder)
            .AssertEraseIsSuccessful(cnn, e => e.IsEraseDisabled = false)
            .AssertMigrateIsSuccessful(cnn, e => e.StartVersion  = MigrationVersion.MinVersion)
            .AssertInfoIsSuccessful(cnn);

            evolve.ChangeLocations(SqlServer.RepeatableFolder)
            .AssertRepairIsSuccessful(cnn, expectedNbReparation: 0)
            .AssertMigrateIsSuccessful(cnn);
        }
예제 #25
0
        public void Scenario_drop_extension_should_work()
        {
            Evolve.Migrate();

            // Do not use Evolve.Erase() because in this case it will execute DROP SCHEMA
            // We want to force erase of the schema object by object.
            DbHelper.GetSchema(SchemaName).Erase();

            Assert.True(DbHelper.GetSchema(SchemaName).IsExists(), $"The schema [{SchemaName}] should exist.");
            Assert.True(DbHelper.GetSchema(SchemaName).IsEmpty(), $"The schema [{SchemaName}] should be empty.");
        }
예제 #26
0
        public void Run_all_Cassandra_integration_tests_work()
        {
            // Arrange
            int    expectedNbMigration  = Directory.GetFiles(CassandraDb.MigrationFolder).Length;
            string metadataKeyspaceName = "my_keyspace_1"; // this name must also be declared in _evolve.cassandra.json
            var    cnn    = _dbContainer.CreateDbConnection();
            var    evolve = new Evolve(cnn, msg => _output.WriteLine(msg))
            {
                CommandTimeout      = 25,
                MetadataTableSchema = metadataKeyspaceName,
                MetadataTableName   = "evolve_change_log",
                Placeholders        = new Dictionary <string, string> {
                    ["${keyspace}"] = metadataKeyspaceName
                },
                SqlMigrationSuffix = ".cql"
            };

            // Assert
            evolve.AssertInfoIsSuccessful(cnn, expectedNbRows: 0)
            .AssertMigrateIsSuccessful(cnn, expectedNbMigration, locations: CassandraDb.MigrationFolder)
            .AssertMigrateThrows <EvolveConfigurationException>(cnn, e => e.StartVersion = new MigrationVersion("3.0"))
            .AssertMigrateThrows <EvolveValidationException>(cnn, e => e.StartVersion    = MigrationVersion.MinVersion, CassandraDb.ChecksumMismatchFolder)
            .AssertRepairIsSuccessful(cnn, expectedNbReparation: 1)
            .AssertMigrateIsSuccessful(cnn, expectedNbMigration: 0)
            .AssertEraseThrows <EvolveConfigurationException>(cnn, e => e.IsEraseDisabled = true)
            .AssertEraseIsSuccessful(cnn, e => e.IsEraseDisabled = false)
            .AssertMigrateIsSuccessful(cnn, expectedNbMigration, locations: CassandraDb.MigrationFolder)
            .AssertMigrateIsSuccessful(cnn, expectedNbMigration: 1, e => e.MustEraseOnValidationError = true, CassandraDb.ChecksumMismatchFolder)
            .AssertEraseIsSuccessful(cnn, e => e.IsEraseDisabled = false)
            .AssertMigrateIsSuccessful(cnn, expectedNbMigration - 2, e => e.StartVersion = new MigrationVersion("3"), CassandraDb.MigrationFolder)
            .AssertMigrateIsSuccessful(cnn, expectedNbMigration: 0, e => e.StartVersion  = MigrationVersion.MinVersion)
            .AssertMigrateThrows <EvolveConfigurationException>(cnn, e => e.StartVersion = new MigrationVersion("3.0"))
            .AssertEraseIsSuccessful(cnn, e => e.StartVersion    = MigrationVersion.MinVersion)
            .AssertEraseIsSuccessful(cnn, e => e.IsEraseDisabled = false)
            .AssertMigrateIsSuccessful(cnn, expectedNbMigration, null, locations: CassandraDb.MigrationFolder)
            .AssertRepairIsSuccessful(cnn, expectedNbReparation: 0, locations: CassandraDb.RepeatableFolder)
            .AssertMigrateIsSuccessful(cnn, expectedNbMigration: 1)
            .AssertMigrateIsSuccessful(cnn, expectedNbMigration: 0)
            .AssertInfoIsSuccessful(cnn, expectedNbRows: expectedNbMigration + 2)
            .AssertEraseIsSuccessful(cnn, e => e.StartVersion = MigrationVersion.MinVersion);

            //DefaultKeyspaceReplicationStrategy
            evolve.Locations = new[] { CassandraDb.MigrationFolder };
            var configurationFileName = ConfigurationFile;

            File.Copy($"_{configurationFileName}", configurationFileName);
            var ex = Assert.Throws <EvolveSqlException>(() => evolve.Migrate());

            Assert.Contains("Not enough replicas available for query at consistency", ex.Message);
            File.Delete(configurationFileName);

            // Call the second part of the Cassandra integration tests
            DialectTest.Run_all_Cassandra_integration_tests_work(_dbContainer);
        }
예제 #27
0
 static void Main()
 {
     // This primes the activator so it knows where to look for types that will be created from parameters.
     ECActivator.AddSourceAssemblies(new []
     {
         Assembly.GetAssembly(typeof(IEvolutionState)),
         Assembly.GetAssembly(typeof(MaxOnes))
     });
     Evolve.Run(new [] { "-file", @"Params\App\Tutorial1\tutorial1.params" });
     Console.WriteLine("\nDone!");
     Console.ReadLine();
 }
예제 #28
0
        public static Evolve AssertRepairIsSuccessful(this Evolve evolve, IDbConnection cnn, int expectedNbReparation, params string[] locations)
        {
            if (locations.Any())
            {
                evolve.Locations = locations;
            }

            evolve.Repair();
            Assert.True(evolve.NbReparation == expectedNbReparation, $"There should be {expectedNbReparation} migration repaired, not {evolve.NbReparation}.");
            Assert.True(cnn.State == ConnectionState.Closed);
            return(evolve);
        }
예제 #29
0
        public static Evolve AssertInfoIsSuccessfulV2(this Evolve evolve, IDbConnection cnn)
        {
            // Act
            var rows   = evolve.Info();
            int nbRows = rows?.Count() ?? 0;

            // Assert
            Assert.True(nbRows == evolve.GetExpectedNbUiRow(), $"{evolve.GetExpectedNbUiRow()} rows should have been returned, not {nbRows}.");
            Assert.True(cnn.State == ConnectionState.Closed);

            return(evolve);
        }
예제 #30
0
 public void Tutorial2Basic()
 {
     // This primes the activator so it knows where to look for types that will be created from parameters.
     ECActivator.AddSourceAssemblies(new[]
     {
         Assembly.GetAssembly(typeof(IEvolutionState)),
         Assembly.GetAssembly(typeof(Evaluator)),
         Assembly.GetAssembly(typeof(AddSubtract))
     });
     Evolve.Run(new[] { "-file", @"App/Tutorial2/Params/App/Tutorial2/tutorial2.params" });
     context.WriteLine("\nDone!");
 }