blob: b945dca72c692fe4c7d4de71c3f87a7e6ed0799f [file] [log] [blame]
/*
* 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.brooklyn.core.mgmt.rebind;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.util.Date;
import java.util.concurrent.TimeoutException;
import org.apache.brooklyn.api.entity.Entity;
import org.apache.brooklyn.config.ConfigKey;
import org.apache.brooklyn.core.config.ConfigKeys;
import org.apache.brooklyn.core.test.entity.TestApplication;
import org.apache.brooklyn.test.Asserts;
import org.apache.brooklyn.util.javalang.JavaClassNames;
import org.apache.brooklyn.util.os.Os;
import org.apache.brooklyn.util.osgi.VersionedName;
import org.apache.brooklyn.util.stream.Streams;
import org.apache.brooklyn.util.time.Time;
import org.osgi.framework.Version;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.testng.Assert;
import org.testng.annotations.Test;
import com.google.common.io.Files;
/** Tests ability to rebind to previous version serialization state, for various classes;
* and utils to create such state (edit the config key value then run main method).
*/
public class MiscClassesRebindTest extends RebindTestFixtureWithApp {
private static final ConfigKey<Object> TEST_KEY = ConfigKeys.builder(Object.class).name("testKey").build();
private static final Logger log = LoggerFactory.getLogger(MiscClassesRebindTest.class);
/** Method to facilitate creation of memento files */
private void createMemento() throws Exception {
setUp();
origApp = super.createApp();
// edit this, run this class's main method, then use the log output for your test case
origApp.config().set(TEST_KEY, new VersionedName("foo", Version.parseVersion("1.0.0.foo")));
RebindTestUtils.stopPersistence(origApp);
String fn = mementoDir + File.separator + "entities" + File.separator + origApp.getApplicationId();
log.info("Persisted to "+fn);
String yyyyMM = Time.makeDateString(new Date(), "yyyy-MM");
log.info("Set up your tests by copying from the persistence dir "+mementoDir+"\n\n"+
"cp "+fn+" "+
"src/test/resources/"+getClass().getPackage().getName().replaceAll("\\.", "/")+"/"+
JavaClassNames.cleanSimpleClassName(this)+"-"+yyyyMM+"-entity-"+origApp.getApplicationId()+".memento\n");
String content = Streams.readFullyString(new FileInputStream(new File(fn)));
log.info("Or paste the following contents there:\n"+content);
log.info("Then add the apache comment header there, and write your test doing loadEntityMemento(\""+yyyyMM+"\", \""+origApp.getApplicationId()+"\")");
}
public static void main(String[] args) throws Exception {
new MiscClassesRebindTest().createMemento();
// halt to keep memento dir
Runtime.getRuntime().halt(0);
}
public TestApplication createApp() { /* no-op here for most tests */ return null; }
protected Entity loadEntityMemento(String label, String entityId) throws Exception {
String mementoResourceName = JavaClassNames.cleanSimpleClassName(this) + "-" + label + "-entity-" + entityId+".memento";
String memento = Streams.readFullyString(getClass().getResourceAsStream(mementoResourceName));
File persistedEntityFile = new File(mementoDir, Os.mergePaths("entities", entityId));
Files.write(memento.getBytes(), persistedEntityFile);
return newApp = rebind();
}
protected String getEntityMementoContent() throws InterruptedException, TimeoutException, FileNotFoundException {
RebindTestUtils.stopPersistence(newApp);
String fn = mementoDir + File.separator + "entities" + File.separator + newApp.getApplicationId();
return Streams.readFullyString(new FileInputStream(new File(fn)));
}
@SuppressWarnings("unchecked")
protected <T> T getTestKeyFromEntityMemento(String label, String entityId, Class<T> type) throws Exception {
Entity e = loadEntityMemento(label, entityId);
return (T) e.getConfig(TEST_KEY);
}
}