diff --git a/dao/pom.xml b/dao/pom.xml index 4cddf8ba91..7686f10033 100644 --- a/dao/pom.xml +++ b/dao/pom.xml @@ -174,6 +174,11 @@ h2 test + + ru.yandex.qatools.embed + postgresql-embedded + test + diff --git a/dao/src/test/java/org/thingsboard/server/dao/CustomPostgresUnit.java b/dao/src/test/java/org/thingsboard/server/dao/CustomPostgresUnit.java new file mode 100644 index 0000000000..c0025ce9d7 --- /dev/null +++ b/dao/src/test/java/org/thingsboard/server/dao/CustomPostgresUnit.java @@ -0,0 +1,109 @@ +/** + * Copyright © 2016-2017 The Thingsboard Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.thingsboard.server.dao; + +import com.google.common.base.Charsets; +import com.google.common.io.Resources; +import lombok.extern.slf4j.Slf4j; +import org.junit.Before; +import org.junit.rules.ExternalResource; +import org.junit.rules.TestRule; +import org.junit.runner.Description; +import org.junit.runners.model.Statement; +import ru.yandex.qatools.embed.postgresql.EmbeddedPostgres; + +import java.io.IOException; +import java.io.InputStream; +import java.net.URL; +import java.sql.Connection; +import java.sql.DriverManager; +import java.sql.SQLException; +import java.util.List; +import java.util.Properties; + +import static ru.yandex.qatools.embed.postgresql.distribution.Version.Main.V9_6; + +/** + * Created by Valerii Sosliuk on 6/24/2017. + */ +@Slf4j +public class CustomPostgresUnit extends ExternalResource { + + private static final String HOST = "host"; + private static final String PORT = "port"; + private static final String DATABASE = "database"; + private static final String USERNAME = "username"; + private static final String PASSWORD = "password"; + + private List sqlFiles; + private Properties properties; + + private EmbeddedPostgres postgres; + + public CustomPostgresUnit(List sqlFiles, String configurationFileName) { + this.sqlFiles = sqlFiles; + this.properties = loadProperties(configurationFileName); + } + + @Override + public void before() { + postgres = new EmbeddedPostgres(V9_6); + load(); + } + + @Override + public void after() { + postgres.stop(); + } + + private void load() { + Connection conn = null; + try { + String url = postgres.start(properties.getProperty(HOST), + Integer.parseInt(properties.getProperty(PORT)), + properties.getProperty(DATABASE), + properties.getProperty(USERNAME), + properties.getProperty(PASSWORD)); + + conn = DriverManager.getConnection(url); + for (String sqlFile : sqlFiles) { + URL sqlFileUrl = Resources.getResource(sqlFile); + String sql = Resources.toString(sqlFileUrl, Charsets.UTF_8); + conn.createStatement().execute(sql); + } + } catch (IOException | SQLException e) { + throw new RuntimeException("Unable to start embedded postgres. Reason: " + e.getMessage(), e); + } finally { + if (conn != null) { + try { + conn.close(); + } catch (SQLException e) { + log.error(e.getMessage(), e); + } + } + } + } + + private Properties loadProperties(String fileName) { + final Properties properties = new Properties(); + try (final InputStream stream = this.getClass().getClassLoader().getResourceAsStream(fileName)) { + properties.load(stream); + return properties; + } catch (IOException e) { + throw new RuntimeException(e.getMessage(), e); + } + } +} diff --git a/dao/src/test/java/org/thingsboard/server/dao/DaoTestSuite.java b/dao/src/test/java/org/thingsboard/server/dao/DaoTestSuite.java index 845c4c67c8..9d2b38ed6e 100644 --- a/dao/src/test/java/org/thingsboard/server/dao/DaoTestSuite.java +++ b/dao/src/test/java/org/thingsboard/server/dao/DaoTestSuite.java @@ -20,9 +20,16 @@ import org.junit.ClassRule; import org.junit.extensions.cpsuite.ClasspathSuite; import org.junit.extensions.cpsuite.ClasspathSuite.ClassnameFilters; import org.junit.runner.RunWith; +import ru.yandex.qatools.embed.postgresql.EmbeddedPostgres; +import java.io.IOException; +import java.sql.Connection; +import java.sql.DriverManager; +import java.sql.SQLException; import java.util.Arrays; +import static ru.yandex.qatools.embed.postgresql.distribution.Version.Main.V9_6; + @RunWith(ClasspathSuite.class) @ClassnameFilters({ "org.thingsboard.server.dao.service.*Test", @@ -41,4 +48,10 @@ public class DaoTestSuite { new ClassPathCQLDataSet("cassandra/system-data.cql", false, false), new ClassPathCQLDataSet("system-test.cql", false, false)), "cassandra-test.yaml", 30000l); + + @ClassRule + public static CustomPostgresUnit postgresUnit = new CustomPostgresUnit( + Arrays.asList("postgres/schema.sql", "postgres/system-data.sql"), + "postgres-embedded-test.properties"); + } diff --git a/dao/src/test/resources/jpa-test.properties b/dao/src/test/resources/jpa-test.properties index 80ae6ffc29..f2ce4b2df9 100644 --- a/dao/src/test/resources/jpa-test.properties +++ b/dao/src/test/resources/jpa-test.properties @@ -5,7 +5,7 @@ sql.enabled=true spring.jpa.show-sql=false spring.jpa.hibernate.ddl-auto=validate -spring.datasource.url=jdbc:postgresql://localhost:5432/thingsboard +spring.datasource.url=jdbc:postgresql://localhost:5433/thingsboard spring.datasource.username=postgres spring.datasource.password=postgres diff --git a/dao/src/test/resources/postgres-embedded-test.properties b/dao/src/test/resources/postgres-embedded-test.properties new file mode 100644 index 0000000000..557aad5905 --- /dev/null +++ b/dao/src/test/resources/postgres-embedded-test.properties @@ -0,0 +1,5 @@ +host: localhost +port: 5433 +database: thingsboard +username: postgres +password: postgres \ No newline at end of file diff --git a/pom.xml b/pom.xml index d09e4ca517..393fbbaea4 100755 --- a/pom.xml +++ b/pom.xml @@ -745,6 +745,13 @@ com.h2database h2 ${h2.version} + test + + + ru.yandex.qatools.embed + postgresql-embedded + 2.2 + test com.sun.winsw