| /* |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you 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.apache.openjpa.instrumentation; |
| |
| import java.util.Random; |
| import java.util.Set; |
| |
| import javax.persistence.EntityManager; |
| |
| import org.apache.openjpa.lib.instrumentation.Instrument; |
| import org.apache.openjpa.lib.instrumentation.InstrumentationProvider; |
| import org.apache.openjpa.persistence.OpenJPAEntityManagerFactorySPI; |
| import org.apache.openjpa.persistence.OpenJPAEntityManagerSPI; |
| import org.apache.openjpa.persistence.test.SingleEMFTestCase; |
| |
| /** |
| * Verifies the configuration and usage of a simple instrumentation |
| * provider. |
| * @author jrbauer |
| * |
| */ |
| public class TestInstrumentationProvider extends SingleEMFTestCase { |
| |
| public static final String SINGLE_PROVIDER = |
| "org.apache.openjpa.instrumentation.SimpleProvider(Instrument='DataCache,QueryCache,QuerySQLCache')"; |
| |
| public static final String MULTI_PROVIDER = |
| "org.apache.openjpa.instrumentation.SimpleProvider(Instrument='DataCache,QueryCache,QuerySQLCache'), " + |
| "org.apache.openjpa.instrumentation.SecondProvider(Instrument='DataCache,QuerySQLCache')"; |
| |
| public static final String DC_PROVIDER = |
| "org.apache.openjpa.instrumentation.SimpleProvider(Instrument='DataCache')"; |
| |
| @Override |
| public void setUp() throws Exception { |
| super.setUp("openjpa.Instrumentation", |
| SINGLE_PROVIDER, |
| "openjpa.DataCache", |
| "true(EnableStatistics=true)", |
| "openjpa.QueryCache", |
| "true", |
| "openjpa.RemoteCommitProvider", |
| "sjvm"); |
| } |
| |
| /** |
| * Verifies simple instrumentation provider config with instruments defined |
| * for data cache and query cache. |
| */ |
| public void testProviderConfig() { |
| // Verify an EMF was created with the supplied instrumentation |
| assertNotNull(emf); |
| |
| // Verify the instrumentation value was stored in the config |
| String instrValue = emf.getConfiguration().getInstrumentation(); |
| assertEquals(instrValue, SINGLE_PROVIDER); |
| |
| // Verify an instrumentation manager is available |
| InstrumentationManager mgr = emf.getConfiguration().getInstrumentationManagerInstance(); |
| assertNotNull(mgr); |
| |
| // Verify the manager is managing the correct provider |
| Set<InstrumentationProvider> providers = mgr.getProviders(); |
| assertNotNull(providers); |
| assertEquals(1, providers.size()); |
| InstrumentationProvider provider = providers.iterator().next(); |
| assertEquals(provider.getClass(), SimpleProvider.class); |
| |
| // Verify the provider has instruments registered for the caches |
| Set<Instrument> instruments = provider.getInstruments(); |
| assertNotNull(instruments); |
| assertEquals(3,instruments.size()); |
| |
| // Lightweight verification of the instruments |
| Instrument inst = provider.getInstrumentByName(DCInstrument.NAME); |
| assertNotNull(inst); |
| assertTrue(inst instanceof DataCacheInstrument); |
| DataCacheInstrument dci = (DataCacheInstrument)inst; |
| assertEquals(dci.getCacheName(), "default"); |
| inst = provider.getInstrumentByName(QCInstrument.NAME); |
| assertNotNull(inst); |
| assertTrue(inst instanceof QueryCacheInstrument); |
| inst = provider.getInstrumentByName(QSCInstrument.NAME); |
| assertNotNull(inst); |
| assertTrue(inst instanceof PreparedQueryCacheInstrument); |
| } |
| |
| /** |
| * Verifies configuring and adding an instrument to a provider after the provider |
| * has been initialized within the persistence unit. |
| */ |
| public void testDynamicInstrumentConfig() { |
| InstrumentationManager mgr = emf.getConfiguration().getInstrumentationManagerInstance(); |
| assertNotNull(mgr); |
| |
| Set<InstrumentationProvider> providers = mgr.getProviders(); |
| assertNotNull(providers); |
| assertEquals(1, providers.size()); |
| InstrumentationProvider provider = providers.iterator().next(); |
| assertEquals(provider.getClass(), SimpleProvider.class); |
| |
| verifyBrokerLevelInstrument(provider); |
| } |
| |
| /** |
| * Verifies configuring and adding an instrumentation provider dynamically after |
| * the persistence unit has been created. |
| */ |
| public void testDynamicProviderConfig() { |
| InstrumentationManager mgr = emf.getConfiguration().getInstrumentationManagerInstance(); |
| assertNotNull(mgr); |
| |
| DynamicProvider dyp = new DynamicProvider(); |
| mgr.manageProvider(dyp); |
| verifyBrokerLevelInstrument(dyp); |
| assertTrue(dyp.isStarted()); |
| assertNotNull(dyp.getInstrumentByName(BrokerLevelInstrument.NAME)); |
| assertEquals(2, mgr.getProviders().size()); |
| } |
| |
| public void verifyBrokerLevelInstrument(InstrumentationProvider provider) { |
| // Create a new broker level instrument and register it with the |
| // provider |
| BrokerLevelInstrument bli = new BrokerLevelInstrument(); |
| provider.addInstrument(bli); |
| // Verify instrument has not been initialized or started |
| assertFalse(bli.isInitialized()); |
| assertFalse(bli.isStarted()); |
| |
| // Create a new EM/Broker |
| EntityManager em = emf.createEntityManager(); |
| // Vfy the instrument has been initialized and started |
| assertTrue(bli.isInitialized()); |
| assertTrue(bli.isStarted()); |
| // Close the EM/Broker |
| em.close(); |
| // Vfy the instrument has stopped |
| assertFalse(bli.isStarted()); |
| } |
| |
| /** |
| * Verifies the data cache metrics are available through simple instrumentation. |
| */ |
| public void testDataCacheInstrument() { |
| OpenJPAEntityManagerFactorySPI oemf = createEMF( |
| "openjpa.Instrumentation", DC_PROVIDER, |
| "openjpa.DataCache", "true(EnableStatistics=true)", |
| "openjpa.RemoteCommitProvider", "sjvm", |
| "openjpa.jdbc.SynchronizeMappings", "buildSchema", |
| CacheableEntity.class); |
| |
| // Verify an EMF was created with the supplied instrumentation |
| assertNotNull(oemf); |
| |
| // Verify the instrumentation value was stored in the config |
| String instrValue = oemf.getConfiguration().getInstrumentation(); |
| assertEquals(DC_PROVIDER, instrValue); |
| |
| // Verify an instrumentation manager is available |
| InstrumentationManager mgr = oemf.getConfiguration().getInstrumentationManagerInstance(); |
| assertNotNull(mgr); |
| |
| // Get the data cache instrument |
| Set<InstrumentationProvider> providers = mgr.getProviders(); |
| assertNotNull(providers); |
| assertEquals(1, providers.size()); |
| InstrumentationProvider provider = providers.iterator().next(); |
| assertEquals(provider.getClass(), SimpleProvider.class); |
| Instrument inst = provider.getInstrumentByName(DCInstrument.NAME); |
| assertNotNull(inst); |
| assertTrue(inst instanceof DataCacheInstrument); |
| DataCacheInstrument dci = (DataCacheInstrument)inst; |
| assertEquals(dci.getCacheName(), "default"); |
| |
| OpenJPAEntityManagerSPI oem = oemf.createEntityManager(); |
| |
| CacheableEntity ce = new CacheableEntity(); |
| int id = new Random().nextInt(); |
| ce.setId(id); |
| |
| oem.getTransaction().begin(); |
| oem.persist(ce); |
| oem.getTransaction().commit(); |
| oem.clear(); |
| assertTrue(oemf.getCache().contains(CacheableEntity.class, id)); |
| ce = oem.find(CacheableEntity.class, id); |
| |
| assertTrue(dci.getHitCount() > 0); |
| assertTrue(dci.getReadCount() > 0); |
| assertTrue(dci.getWriteCount() > 0); |
| |
| assertTrue(dci.getHitCount(CacheableEntity.class.getName()) > 0); |
| assertTrue(dci.getReadCount(CacheableEntity.class.getName()) > 0); |
| assertTrue(dci.getWriteCount(CacheableEntity.class.getName()) > 0); |
| |
| |
| closeEMF(oemf); |
| } |
| |
| /** |
| * Verifies multiple instrumentation providers can be specified. |
| */ |
| public void testMultipleProviderConfig() { |
| OpenJPAEntityManagerFactorySPI oemf = createEMF( |
| "openjpa.Instrumentation", |
| MULTI_PROVIDER, |
| "openjpa.DataCache", |
| "true(EnableStatistics=true)", |
| "openjpa.QueryCache", |
| "true", |
| "openjpa.RemoteCommitProvider", |
| "sjvm"); |
| |
| // Verify an EMF was created with the supplied instrumentation |
| assertNotNull(oemf); |
| |
| // Verify the instrumentation value was stored in the config |
| String instrValue = oemf.getConfiguration().getInstrumentation(); |
| assertEquals(MULTI_PROVIDER, instrValue); |
| |
| // Verify an instrumentation manager is available |
| InstrumentationManager mgr = oemf.getConfiguration().getInstrumentationManagerInstance(); |
| assertNotNull(mgr); |
| |
| // Verify the manager is managing the correct provider |
| Set<InstrumentationProvider> providers = mgr.getProviders(); |
| assertNotNull(providers); |
| assertEquals(2, providers.size()); |
| for (InstrumentationProvider provider : providers) { |
| assertTrue( provider instanceof SimpleProvider || |
| provider instanceof SecondProvider); |
| if (provider instanceof SimpleProvider) { |
| assertEquals(3, provider.getInstruments().size()); |
| } else { |
| assertEquals(2, provider.getInstruments().size()); |
| } |
| } |
| closeEMF(oemf); |
| } |
| } |