/*
* Copyright 2012 NGDATA nv
*
* 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.lilyproject.lilyservertestfw.integration;
import javax.management.ObjectName;
import javax.management.remote.JMXConnector;
import javax.management.remote.JMXConnectorFactory;
import javax.management.remote.JMXServiceURL;
import java.io.InputStream;
import org.junit.Test;
import org.lilyproject.client.LilyClient;
import org.lilyproject.repository.api.Repository;
import org.lilyproject.tools.import_.cli.JsonImport;
import static org.junit.Assert.assertEquals;
public class ResetLilyStateTest {
/**
* The purpose of this test is to check that after resetLilyState, and when continuing to use
* the same LilyClient instance, the schema cache in the local client is emptied.
*/
@Test
public void testSchemaCacheEmptyAfterResetLilyState() throws Exception {
LilyClient lilyClient = new LilyClient(System.getProperty("zkConn", "localhost:2181"), 20000);
Repository repository = lilyClient.getRepository();
for (int i = 0; i < 2; i++) {
resetLilyState();
// Just call a dummy method to wait for the repository to become available
repository.newRecord();
// Give caches some time to notice the changes going on
Thread.sleep(2000);
// Check that the field type and record type caches are empty
assertEquals(0, repository.getTypeManager().getRecordTypes().size());
assertEquals(0, repository.getTypeManager().getRecordTypesWithoutCache().size());
// There's always the last vtag field type defined
assertEquals(1, repository.getTypeManager().getFieldTypes().size());
assertEquals(1, repository.getTypeManager().getFieldTypesWithoutCache().size());
// Load a schema
InputStream is = ResetLilyStateTest.class.getResourceAsStream("schema.json");
JsonImport.loadSchema(repository, is);
is.close();
// Create a record to assure the schema we just created is in the cache.
// If the cache would not have been cleared correctly (which is ruled out already
// by the above assertions), then record creation might fail because it uses the
// schema IDs of the types from the previous run.
repository.recordBuilder()
.defaultNamespace("com.mycompany")
.recordType("Type1")
.field("field1", "foo")
.create();
}
lilyClient.close();
}
private void resetLilyState() throws Exception {
JMXServiceURL url = new JMXServiceURL("service:jmx:rmi://localhost:10102/jndi/rmi://localhost:10102/jmxrmi");
JMXConnector connector = JMXConnectorFactory.connect(url);
connector.connect();
ObjectName lilyLauncher = new ObjectName("LilyLauncher:name=Launcher");
connector.getMBeanServerConnection().invoke(lilyLauncher, "resetLilyState", new Object[0], new String[0]);
connector.close();
}
/**
* The purpose of this test is to check that the schema cache keeps refreshing after resetLilyState
* has been called, and existing LilyClient instances are continued to be used.
* This would fail if the schema cache wouldn't detect that all paths were erased from ZooKeeper, and
* that it hence has to install new ZooKeeper watchers.
*/
@Test
public void testSchemaCacheRefreshingAfterResetLilyState() throws Exception {
// Create two LilyClient's: each will have its own schema cache
LilyClient lilyClient1 = new LilyClient(System.getProperty("zkConn", "localhost:2181"), 20000);
Repository repository1 = lilyClient1.getRepository();
LilyClient lilyClient2 = new LilyClient(System.getProperty("zkConn", "localhost:2181"), 20000);
Repository repository2 = lilyClient2.getRepository();
resetLilyState();
// After resetLilyState, there should be no types
assertEquals(0, repository2.getTypeManager().getRecordTypes().size());
// Create schema via client 1
InputStream is = ResetLilyStateTest.class.getResourceAsStream("schema.json");
JsonImport.loadSchema(repository1, is);
is.close();
// Give client 2 just a bit of time to refresh its cache
Thread.sleep(2000);
// Check client 2 knows the type know
assertEquals(1, repository2.getTypeManager().getRecordTypes().size());
lilyClient1.close();
lilyClient2.close();
}
}