This is an automated email from the ASF dual-hosted git repository.

jchen21 pushed a commit to branch feature/GEODE-6511
in repository https://gitbox.apache.org/repos/asf/geode.git


The following commit(s) were added to refs/heads/feature/GEODE-6511 by this 
push:
     new 82da1b8  Add more tests
82da1b8 is described below

commit 82da1b8baef8e7701c787411b6704c768272c9c6
Author: Ben Ross <[email protected]>
AuthorDate: Tue Mar 12 16:20:43 2019 -0700

    Add more tests
    
    Co-authored-by: Ben Ross <[email protected]>
    Co-authored-by: Jianxia Chen <[email protected]>
---
 .../cli/DestroyDataSourceCommandDUnitTest.java     | 90 +++++++++++++++++++++-
 .../cli/ListDataSourceCommandDUnitTest.java        | 12 +++
 .../apache/geode/internal/jndi/JNDIInvoker.java    | 11 +--
 3 files changed, 106 insertions(+), 7 deletions(-)

diff --git 
a/geode-connectors/src/distributedTest/java/org/apache/geode/connectors/jdbc/internal/cli/DestroyDataSourceCommandDUnitTest.java
 
b/geode-connectors/src/distributedTest/java/org/apache/geode/connectors/jdbc/internal/cli/DestroyDataSourceCommandDUnitTest.java
index 6615c06..c482405 100644
--- 
a/geode-connectors/src/distributedTest/java/org/apache/geode/connectors/jdbc/internal/cli/DestroyDataSourceCommandDUnitTest.java
+++ 
b/geode-connectors/src/distributedTest/java/org/apache/geode/connectors/jdbc/internal/cli/DestroyDataSourceCommandDUnitTest.java
@@ -62,7 +62,7 @@ public class DestroyDataSourceCommandDUnitTest {
     gfsh.connectAndVerify(locator);
 
     gfsh.execute(
-        "create data-source --name=datasource1 
--url=\"jdbc:derby:memory:newDB;create=true\" --pooled=false");
+        "create data-source --name=datasource1 
--url=\"jdbc:derby:memory:newDB;create=true\"");
   }
 
   @Test
@@ -72,7 +72,7 @@ public class DestroyDataSourceCommandDUnitTest {
         .invokeInEveryMember(
             () -> 
assertThat(JNDIInvoker.getBindingNamesRecursively(JNDIInvoker.getJNDIContext()))
                 .containsKey("java:datasource1").containsValue(
-                    
"org.apache.geode.internal.datasource.GemFireBasicDataSource"),
+                    "com.zaxxer.hikari.HikariDataSource"),
             server1, server2);
 
     gfsh.executeAndAssertThat("destroy data-source 
--name=datasource1").statusIsSuccess()
@@ -120,6 +120,69 @@ public class DestroyDataSourceCommandDUnitTest {
     });
   }
 
+  @Test
+  public void testDestroySimpleDataSource() throws Exception {
+    // drop the default pooled data source
+    gfsh.executeAndAssertThat("destroy data-source 
--name=datasource1").statusIsSuccess();
+
+    // create a simple data source, i.e. non-pooled data source
+    gfsh.execute(
+        "create data-source --name=datasource2 
--url=\"jdbc:derby:memory:newDB;create=true\" --pooled=false");
+
+    // assert that there is a datasource
+    VMProvider
+        .invokeInEveryMember(
+            () -> 
assertThat(JNDIInvoker.getBindingNamesRecursively(JNDIInvoker.getJNDIContext()))
+                .containsKey("java:datasource2").containsValue(
+                    
"org.apache.geode.internal.datasource.GemFireBasicDataSource"),
+            server1, server2);
+
+
+    gfsh.executeAndAssertThat("destroy data-source 
--name=datasource2").statusIsSuccess()
+        .tableHasColumnOnlyWithValues("Member", "server-1", "server-2")
+        .tableHasColumnOnlyWithValues("Message",
+            "Data source \"datasource2\" destroyed on \"server-1\"",
+            "Data source \"datasource2\" destroyed on \"server-2\"");
+
+    // verify cluster config is updated
+    locator.invoke(() -> {
+      InternalLocator internalLocator = ClusterStartupRule.getLocator();
+      AssertionsForClassTypes.assertThat(internalLocator).isNotNull();
+      InternalConfigurationPersistenceService ccService =
+          internalLocator.getConfigurationPersistenceService();
+      Configuration configuration = ccService.getConfiguration("cluster");
+      Document document = 
XmlUtils.createDocumentFromXml(configuration.getCacheXmlContent());
+      NodeList jndiBindings = document.getElementsByTagName("jndi-binding");
+
+      
AssertionsForClassTypes.assertThat(jndiBindings.getLength()).isEqualTo(0);
+
+      boolean found = false;
+      for (int i = 0; i < jndiBindings.getLength(); i++) {
+        Element eachBinding = (Element) jndiBindings.item(i);
+        if (eachBinding.getAttribute("jndi-name").equals("datasource2")) {
+          found = true;
+          break;
+        }
+      }
+      AssertionsForClassTypes.assertThat(found).isFalse();
+    });
+
+    // verify datasource does not exists
+    VMProvider.invokeInEveryMember(
+        () -> 
AssertionsForClassTypes.assertThat(JNDIInvoker.getNoOfAvailableDataSources())
+            .isEqualTo(0),
+        server1, server2);
+
+    // bounce server1 and assert that there is still no datasource received 
from cluster config
+    server1.stop(false);
+    server1 = cluster.startServerVM(1, locator.getPort());
+
+    // verify no datasource from cluster config
+    server1.invoke(() -> {
+      
AssertionsForClassTypes.assertThat(JNDIInvoker.getNoOfAvailableDataSources()).isEqualTo(0);
+    });
+  }
+
   private void createTable() {
     executeSql("create table mySchema.myRegion (id varchar(10) primary key, 
name varchar(10))");
   }
@@ -196,4 +259,27 @@ public class DestroyDataSourceCommandDUnitTest {
       dropTable();
     }
   }
+
+  @Test
+  public void destroySimpleDataSourceFailsIfInUseByJdbcMapping() throws 
Exception {
+    // create a simple data source, i.e. non-pooled data source
+    gfsh.execute(
+        "create data-source --name=datasource2 
--url=\"jdbc:derby:memory:newDB;create=true\" --pooled=false");
+
+    gfsh.executeAndAssertThat("create region --name=myRegion 
--type=REPLICATE").statusIsSuccess();
+    createTable();
+    try {
+      gfsh.executeAndAssertThat(
+          "create jdbc-mapping --data-source=datasource2 --pdx-name=" + 
IdAndName.class.getName()
+              + " --region=myRegion --schema=mySchema")
+          .statusIsSuccess();
+
+      gfsh.executeAndAssertThat("destroy data-source 
--name=datasource2").statusIsError()
+          .containsOutput(
+              "Data source named \"datasource2\" is still being used by region 
\"myRegion\"."
+                  + " Use destroy jdbc-mapping --region=myRegion and then try 
again.");
+    } finally {
+      dropTable();
+    }
+  }
 }
diff --git 
a/geode-connectors/src/distributedTest/java/org/apache/geode/connectors/jdbc/internal/cli/ListDataSourceCommandDUnitTest.java
 
b/geode-connectors/src/distributedTest/java/org/apache/geode/connectors/jdbc/internal/cli/ListDataSourceCommandDUnitTest.java
index 66b589a..ca3df16 100644
--- 
a/geode-connectors/src/distributedTest/java/org/apache/geode/connectors/jdbc/internal/cli/ListDataSourceCommandDUnitTest.java
+++ 
b/geode-connectors/src/distributedTest/java/org/apache/geode/connectors/jdbc/internal/cli/ListDataSourceCommandDUnitTest.java
@@ -163,6 +163,18 @@ public class ListDataSourceCommandDUnitTest {
   }
 
   @Test
+  public void listDataSourceForPooledDataSourceByDefault() {
+    gfsh.executeAndAssertThat(
+        "create data-source --name=pooledDataSource 
--url=\"jdbc:derby:memory:newDB;create=true\" 
--pooled-data-source-factory-class=org.apache.geode.internal.jta.CacheJTAPooledDataSourceFactory
 
--pool-properties={'name':'prop1','value':'value1'},{'name':'pool.prop2','value':'value2'}")
+        .statusIsSuccess().tableHasColumnOnlyWithValues("Member", "server-1");
+
+    gfsh.executeAndAssertThat("list data-source").statusIsSuccess()
+        .tableHasRowWithValues("name", "pooled", "in use", "url", 
"pooledDataSource", "true",
+            "false",
+            "jdbc:derby:memory:newDB;create=true");
+  }
+
+  @Test
   public void listDataSourceWithMultipleDataSourcesListsAll() {
     gfsh.executeAndAssertThat(
         "create data-source --name=simple --pooled=false 
--url=\"jdbc:derby:memory:newDB;create=true\" --username=joe 
--password=myPassword")
diff --git 
a/geode-core/src/main/java/org/apache/geode/internal/jndi/JNDIInvoker.java 
b/geode-core/src/main/java/org/apache/geode/internal/jndi/JNDIInvoker.java
index 5c050d3..944673e 100644
--- a/geode-core/src/main/java/org/apache/geode/internal/jndi/JNDIInvoker.java
+++ b/geode-core/src/main/java/org/apache/geode/internal/jndi/JNDIInvoker.java
@@ -48,8 +48,7 @@ import 
org.apache.geode.internal.datasource.ClientConnectionFactoryWrapper;
 import org.apache.geode.internal.datasource.ConfigProperty;
 import org.apache.geode.internal.datasource.DataSourceCreateException;
 import org.apache.geode.internal.datasource.DataSourceFactory;
-import org.apache.geode.internal.datasource.GemFireBasicDataSource;
-import org.apache.geode.internal.datasource.GemFireConnPooledDataSource;
+import org.apache.geode.internal.datasource.GemFireTransactionDataSource;
 import org.apache.geode.internal.jta.TransactionManagerImpl;
 import org.apache.geode.internal.jta.TransactionUtils;
 import org.apache.geode.internal.jta.UserTransactionImpl;
@@ -409,9 +408,11 @@ public class JNDIInvoker {
   public static boolean checkForInvalidDataSource(String name) {
     Object dataSource = dataSourceMap.get(name);
 
-    if (dataSource == null || dataSource instanceof GemFireBasicDataSource
-        || dataSource instanceof GemFireConnPooledDataSource) {
-      return false;
+    if (dataSource != null) {
+      if (dataSource instanceof DataSource
+          && !(dataSource instanceof GemFireTransactionDataSource)) {
+        return false;
+      }
     }
     return true;
   }

Reply via email to