From eb63d5ac16ba3236c13f4552d8bbe1f56b150511 Mon Sep 17 00:00:00 2001 From: "CMX\\vlutsenko" Date: Wed, 4 May 2022 18:21:35 +0500 Subject: [PATCH 1/3] Add tests migrations --- pom.xml | 13 +- .../TarantoolCartridgeMigrationsTest.java | 145 ++++++++++++++++++ src/test/resources/cartridge/init.lua | 2 + .../cartridge/migrations/001_spase_test.lua | 32 ++++ .../cartridge/testapp-scm-1.rockspec | 1 + 5 files changed, 192 insertions(+), 1 deletion(-) create mode 100644 src/test/java/org/testcontainers/containers/TarantoolCartridgeMigrationsTest.java create mode 100644 src/test/resources/cartridge/migrations/001_spase_test.lua diff --git a/pom.xml b/pom.xml index add9853..ffb6536 100644 --- a/pom.xml +++ b/pom.xml @@ -60,6 +60,17 @@ org.testcontainers testcontainers ${testcontainers.version} + + + junit + junit + + + + + junit + junit + 4.12 io.tarantool @@ -263,4 +274,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..422dfa7 --- /dev/null +++ b/src/test/java/org/testcontainers/containers/TarantoolCartridgeMigrationsTest.java @@ -0,0 +1,145 @@ +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.InputStream; +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.List; +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 start_container(){ + if (!container.isRunning()) { + try { + container.start(); + } catch (Exception e) { + e.printStackTrace(); + throw new RuntimeException(e); + } + } + + } + + @Test + public void test_migrations_migrator() throws Exception { + + if(container.isRunning()){ + try { + List resultMigration = container.executeCommand("require('migrator').up()").get(); + } catch (Exception e) { + e.printStackTrace(); + throw new RuntimeException(e); + } + } + } + + @Test + public void test_migrations_curl(){ + + if(container.isRunning()){ + String urlStr = "http://"+container.getRouterHost()+":"+"8081"+"/migrations/up"; + int code = -1; + try{ + org.testcontainers.containers.Container.ExecResult answer = container.execInContainer("curl", "-X", "POST", urlStr); + String out = answer.getStdout(); + code = answer.getExitCode(); + }catch (Exception e){ + e.printStackTrace(); + } + Assert.assertEquals(0,code); + } + } + + @Test + public void test_migrations_http() throws Exception { + + if(container.isRunning()){ + URL url = null; + HttpURLConnection connection = null; + 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"; + 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(); + + try { + os = connection.getOutputStream(); + os.write(outSteamByte); + }catch (Exception e){ + System.err.print(e.getMessage()); + } + + 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){ + ex.printStackTrace(); + } catch (IOException e){ + System.err.print(e.getMessage()); + }finally { + inputStreamReader.close(); + os.close(); + bfR.close(); + } + Assert.assertTrue(strBuilder.toString().contains("applied")); + } + } + + @AfterAll + public static void clear_stop_container(){ + if (container.isRunning()){ + container.stop(); + } + } +} 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_spase_test.lua b/src/test/resources/cartridge/migrations/001_spase_test.lua new file mode 100644 index 0000000..66dfa45 --- /dev/null +++ b/src/test/resources/cartridge/migrations/001_spase_test.lua @@ -0,0 +1,32 @@ +return{ + + up = function() + local utils = require('migrator.utils') + + local routerSessionContexts = box.schema.space.create('spaceTest', { if_not_exists = true }) + routerSessionContexts: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 }, + }) + + routerSessionContexts:create_index('primary', { parts = { { field = 'sessionId' } }, + unique = true, + if_not_exists = true }) + + routerSessionContexts: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'; From 7106290f95e76b582f0cc796295b4a997e65037c Mon Sep 17 00:00:00 2001 From: "CMX\\vlutsenko" Date: Wed, 4 May 2022 18:40:19 +0500 Subject: [PATCH 2/3] #20 Add tests migrations --- pom.xml | 11 ----------- .../containers/TarantoolCartridgeMigrationsTest.java | 2 +- 2 files changed, 1 insertion(+), 12 deletions(-) diff --git a/pom.xml b/pom.xml index ffb6536..ad5b812 100644 --- a/pom.xml +++ b/pom.xml @@ -60,17 +60,6 @@ org.testcontainers testcontainers ${testcontainers.version} - - - junit - junit - - - - - junit - junit - 4.12 io.tarantool diff --git a/src/test/java/org/testcontainers/containers/TarantoolCartridgeMigrationsTest.java b/src/test/java/org/testcontainers/containers/TarantoolCartridgeMigrationsTest.java index 422dfa7..dd14629 100644 --- a/src/test/java/org/testcontainers/containers/TarantoolCartridgeMigrationsTest.java +++ b/src/test/java/org/testcontainers/containers/TarantoolCartridgeMigrationsTest.java @@ -140,6 +140,6 @@ public void test_migrations_http() throws Exception { public static void clear_stop_container(){ if (container.isRunning()){ container.stop(); - } + } } } From 7552182e7cbf003771549d9adb48ad968897b738 Mon Sep 17 00:00:00 2001 From: "CMX\\vlutsenko" Date: Wed, 11 May 2022 15:31:37 +0500 Subject: [PATCH 3/3] #20 Refactoring --- .../TarantoolCartridgeMigrationsTest.java | 139 ++++++++---------- .../migrations/001_spa\321\201e_test.lua" | 9 +- 2 files changed, 63 insertions(+), 85 deletions(-) rename src/test/resources/cartridge/migrations/001_spase_test.lua => "src/test/resources/cartridge/migrations/001_spa\321\201e_test.lua" (71%) diff --git a/src/test/java/org/testcontainers/containers/TarantoolCartridgeMigrationsTest.java b/src/test/java/org/testcontainers/containers/TarantoolCartridgeMigrationsTest.java index dd14629..da54cc3 100644 --- a/src/test/java/org/testcontainers/containers/TarantoolCartridgeMigrationsTest.java +++ b/src/test/java/org/testcontainers/containers/TarantoolCartridgeMigrationsTest.java @@ -11,7 +11,6 @@ import java.io.BufferedReader; import java.io.IOException; -import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.net.HttpURLConnection; @@ -20,7 +19,6 @@ import java.nio.charset.StandardCharsets; import java.time.Duration; import java.util.HashMap; -import java.util.List; import java.util.Map; @Testcontainers @@ -38,108 +36,89 @@ public class TarantoolCartridgeMigrationsTest { LoggerFactory.getLogger(TarantoolCartridgeStaticContainerTest.class))); @BeforeAll - public static void start_container(){ + public static void test_start_container() { if (!container.isRunning()) { try { container.start(); } catch (Exception e) { - e.printStackTrace(); throw new RuntimeException(e); } } + } + @AfterAll + public static void clear_stop_container() { + if (container.isRunning()) { + container.stop(); + } } @Test public void test_migrations_migrator() throws Exception { - - if(container.isRunning()){ - try { - List resultMigration = container.executeCommand("require('migrator').up()").get(); - } catch (Exception e) { - e.printStackTrace(); - throw new RuntimeException(e); - } - } + container.executeCommand("require('migrator').up()").get(); } @Test - public void test_migrations_curl(){ - - if(container.isRunning()){ - String urlStr = "http://"+container.getRouterHost()+":"+"8081"+"/migrations/up"; - int code = -1; - try{ - org.testcontainers.containers.Container.ExecResult answer = container.execInContainer("curl", "-X", "POST", urlStr); - String out = answer.getStdout(); - code = answer.getExitCode(); - }catch (Exception e){ - e.printStackTrace(); - } - Assert.assertEquals(0,code); - } + 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 { - if(container.isRunning()){ - URL url = null; - HttpURLConnection connection = null; - 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"; - 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(); - - try { - os = connection.getOutputStream(); - os.write(outSteamByte); - }catch (Exception e){ - System.err.print(e.getMessage()); + 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); } - - 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){ - ex.printStackTrace(); - } catch (IOException e){ - System.err.print(e.getMessage()); - }finally { - inputStreamReader.close(); - os.close(); - bfR.close(); } - Assert.assertTrue(strBuilder.toString().contains("applied")); + + } catch (MalformedURLException ex) { + } catch (IOException e) { + } finally { + inputStreamReader.close(); + os.close(); + bfR.close(); } + Assert.assertTrue(strBuilder.toString().contains("applied")); } - @AfterAll - public static void clear_stop_container(){ - if (container.isRunning()){ - container.stop(); - } + 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/migrations/001_spase_test.lua "b/src/test/resources/cartridge/migrations/001_spa\321\201e_test.lua" similarity index 71% rename from src/test/resources/cartridge/migrations/001_spase_test.lua rename to "src/test/resources/cartridge/migrations/001_spa\321\201e_test.lua" index 66dfa45..89dc336 100644 --- a/src/test/resources/cartridge/migrations/001_spase_test.lua +++ "b/src/test/resources/cartridge/migrations/001_spa\321\201e_test.lua" @@ -3,8 +3,8 @@ return{ up = function() local utils = require('migrator.utils') - local routerSessionContexts = box.schema.space.create('spaceTest', { if_not_exists = true }) - routerSessionContexts:format({ + 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' }, @@ -13,11 +13,11 @@ return{ { name = 'bucket_id', type = 'unsigned', is_nullable = false }, }) - routerSessionContexts:create_index('primary', { parts = { { field = 'sessionId' } }, + spaceTest:create_index('primary', { parts = { { field = 'sessionId' } }, unique = true, if_not_exists = true }) - routerSessionContexts:create_index('bucket_id', { + spaceTest:create_index('bucket_id', { parts = { 'bucket_id' }, unique = false, if_not_exists = true @@ -27,6 +27,5 @@ return{ return true - end }