diff --git a/pom.xml b/pom.xml index add9853..ad5b812 100644 --- a/pom.xml +++ b/pom.xml @@ -263,4 +263,4 @@ https://oss.sonatype.org/service/local/staging/deploy/maven2/ - \ No newline at end of file + diff --git a/src/test/java/org/testcontainers/containers/TarantoolCartridgeMigrationsTest.java b/src/test/java/org/testcontainers/containers/TarantoolCartridgeMigrationsTest.java new file mode 100644 index 0000000..da54cc3 --- /dev/null +++ b/src/test/java/org/testcontainers/containers/TarantoolCartridgeMigrationsTest.java @@ -0,0 +1,124 @@ +package org.testcontainers.containers; + +import org.junit.Assert; +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; +import org.slf4j.LoggerFactory; +import org.testcontainers.containers.output.Slf4jLogConsumer; +import org.testcontainers.junit.jupiter.Container; +import org.testcontainers.junit.jupiter.Testcontainers; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.io.OutputStream; +import java.net.HttpURLConnection; +import java.net.MalformedURLException; +import java.net.URL; +import java.nio.charset.StandardCharsets; +import java.time.Duration; +import java.util.HashMap; +import java.util.Map; + +@Testcontainers +public class TarantoolCartridgeMigrationsTest { + + @Container + private static final TarantoolCartridgeContainer container = + new TarantoolCartridgeContainer( + "Dockerfile", + "cartridge/instances.yml", + "cartridge/topology.lua") + .withDirectoryBinding("cartridge") + .withStartupTimeout(Duration.ofSeconds(300)) + .withLogConsumer(new Slf4jLogConsumer( + LoggerFactory.getLogger(TarantoolCartridgeStaticContainerTest.class))); + + @BeforeAll + public static void test_start_container() { + if (!container.isRunning()) { + try { + container.start(); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + } + + @AfterAll + public static void clear_stop_container() { + if (container.isRunning()) { + container.stop(); + } + } + + @Test + public void test_migrations_migrator() throws Exception { + container.executeCommand("require('migrator').up()").get(); + } + + @Test + public void test_migrations_curl() throws IOException, InterruptedException { + + String urlStr = "http://" + container.getRouterHost() + ":" + "8081" + "/migrations/up"; + int code = -1; + org.testcontainers.containers.Container.ExecResult answer = container.execInContainer("curl", "-X", "POST", urlStr); + code = answer.getExitCode(); + Assert.assertEquals(0, code); + } + + @Test + public void test_migrations_http() throws Exception { + + HttpURLConnection connection; + OutputStream os = null; + InputStreamReader inputStreamReader = null; + BufferedReader bfR = null; + StringBuilder strBuilder = new StringBuilder(); + + Map bodyHttpPostRequest = new HashMap<>(); + byte[] outSteamByte = bodyHttpPostRequest.toString().getBytes(StandardCharsets.UTF_8); + + try { + String urlStr = "http://" + container.getRouterHost() + ":" + container.getAPIPort() + "/migrations/up"; + connection = createConnection(urlStr); + os = connection.getOutputStream(); + os.write(outSteamByte); + + if (connection.getResponseCode() == HttpURLConnection.HTTP_OK) { + inputStreamReader = new InputStreamReader(connection.getInputStream()); + bfR = new BufferedReader(inputStreamReader); + String line; + while ((line = bfR.readLine()) != null) { + strBuilder.append(line); + } + } + + } catch (MalformedURLException ex) { + } catch (IOException e) { + } finally { + inputStreamReader.close(); + os.close(); + bfR.close(); + } + Assert.assertTrue(strBuilder.toString().contains("applied")); + } + + public HttpURLConnection createConnection(String urlStr) throws IOException { + HttpURLConnection connection = null; + URL url = new URL(urlStr); + + connection = (HttpURLConnection) url.openConnection(); + connection.setRequestMethod("POST"); + connection.setDoOutput(true); + connection.setDoInput(true); + connection.setRequestProperty("Content-Type", "application/json"); + connection.setConnectTimeout(200); + connection.setReadTimeout(200); + connection.connect(); + + return connection; + } + +} diff --git a/src/test/resources/cartridge/init.lua b/src/test/resources/cartridge/init.lua index c9c18f9..93799bc 100644 --- a/src/test/resources/cartridge/init.lua +++ b/src/test/resources/cartridge/init.lua @@ -28,6 +28,7 @@ end -- For faster set up, discovery all buckets at once require('vshard.consts').BUCKET_CHUNK_SIZE = 30000 +require('migrator') local cartridge = require('cartridge') local ok, err = cartridge.cfg({ @@ -38,6 +39,7 @@ local ok, err = cartridge.cfg({ 'app.roles.api_router', 'app.roles.api_storage', 'app.roles.custom', + 'migrator', }, cluster_cookie = 'testapp-cluster-cookie', }) diff --git "a/src/test/resources/cartridge/migrations/001_spa\321\201e_test.lua" "b/src/test/resources/cartridge/migrations/001_spa\321\201e_test.lua" new file mode 100644 index 0000000..89dc336 --- /dev/null +++ "b/src/test/resources/cartridge/migrations/001_spa\321\201e_test.lua" @@ -0,0 +1,31 @@ +return{ + + up = function() + local utils = require('migrator.utils') + + local spaceTest = box.schema.space.create('spaceTest', { if_not_exists = true }) + spaceTest:format({ + { name = 'sessionId', type = 'string' }, + { name = 'data', type = 'map', is_nullable = true }, + { name = 'ts', type = 'number' }, + + -- vshard bucket id + { name = 'bucket_id', type = 'unsigned', is_nullable = false }, + }) + + spaceTest:create_index('primary', { parts = { { field = 'sessionId' } }, + unique = true, + if_not_exists = true }) + + spaceTest:create_index('bucket_id', { + parts = { 'bucket_id' }, + unique = false, + if_not_exists = true + }) + + utils.register_sharding_key('spaceTest', { 'sessionId' }) + + return true + + end +} diff --git a/src/test/resources/cartridge/testapp-scm-1.rockspec b/src/test/resources/cartridge/testapp-scm-1.rockspec index 355acf7..62fe199 100644 --- a/src/test/resources/cartridge/testapp-scm-1.rockspec +++ b/src/test/resources/cartridge/testapp-scm-1.rockspec @@ -9,6 +9,7 @@ dependencies = { 'lua >= 5.1', 'cartridge == 2.7.3-1', 'crud == 0.10.0-1', + 'migrations == 0.4.1-1', } build = { type = 'none';