summaryrefslogtreecommitdiff
path: root/src/test/java/com/zaxxer/hikari/pool/MetricsTrackerTest.java
blob: 494fd4db30f9662fac1f13803250fb3a61b7704a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
package com.zaxxer.hikari.pool;

import com.zaxxer.hikari.HikariDataSource;
import com.zaxxer.hikari.metrics.IMetricsTracker;
import com.zaxxer.hikari.mocks.StubDataSource;
import org.junit.Test;

import java.sql.Connection;
import java.sql.SQLTransientConnectionException;
import java.util.concurrent.TimeUnit;

import static com.zaxxer.hikari.pool.TestElf.newHikariDataSource;
import static junit.framework.TestCase.fail;
import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.assertThat;
import static org.junit.Assert.assertTrue;

/**
 * @author wvuong@chariotsolutions.com on 2/16/17.
 */
public class MetricsTrackerTest
{

   @Test(expected = SQLTransientConnectionException.class)
   public void connectionTimeoutIsRecorded() throws Exception
   {
      int timeoutMillis = 1000;
      int timeToCreateNewConnectionMillis = timeoutMillis * 2;

      StubDataSource stubDataSource = new StubDataSource();
      stubDataSource.setConnectionAcquistionTime(timeToCreateNewConnectionMillis);

      StubMetricsTracker metricsTracker = new StubMetricsTracker();

      try (HikariDataSource ds = newHikariDataSource()) {
         ds.setMinimumIdle(0);
         ds.setMaximumPoolSize(1);
         ds.setConnectionTimeout(timeoutMillis);
         ds.setDataSource(stubDataSource);
         ds.setMetricsTrackerFactory((poolName, poolStats) -> metricsTracker);

         try (Connection c = ds.getConnection()) {
            fail("Connection shouldn't have been successfully created due to configured connection timeout");

         } finally {
            // assert that connection timeout was measured
            assertThat(metricsTracker.connectionTimeoutRecorded, is(true));
            // assert that measured time to acquire connection should be roughly equal or greater than the configured connection timeout time
            assertTrue(metricsTracker.connectionAcquiredNanos >= TimeUnit.NANOSECONDS.convert(timeoutMillis, TimeUnit.MILLISECONDS));
         }
      }
   }

   private static class StubMetricsTracker implements IMetricsTracker
   {

      private Long connectionCreatedMillis;
      private Long connectionAcquiredNanos;
      private Long connectionBorrowedMillis;
      private boolean connectionTimeoutRecorded;

      @Override
      public void recordConnectionCreatedMillis(long connectionCreatedMillis)
      {
         this.connectionCreatedMillis = connectionCreatedMillis;
      }

      @Override
      public void recordConnectionAcquiredNanos(long elapsedAcquiredNanos)
      {
         this.connectionAcquiredNanos = elapsedAcquiredNanos;
      }

      @Override
      public void recordConnectionUsageMillis(long elapsedBorrowedMillis)
      {
         this.connectionBorrowedMillis = elapsedBorrowedMillis;
      }

      @Override
      public void recordConnectionTimeout()
      {
         this.connectionTimeoutRecorded = true;
      }
   }
}