blob: 44b6cd20ac0fa99d2b4437fbc2aeae2bade01ca6 [file] [log] [blame]
/*
* Copyright (C) 2015 Google Inc.
*
* 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 com.google.caliper.platform;
import static com.google.common.base.Preconditions.checkNotNull;
import com.google.common.base.Predicate;
import com.google.common.collect.ImmutableSet;
import java.io.File;
import java.util.Collection;
import java.util.Map;
/**
* An abstraction of the platform within which caliper (both the scheduler and the actual workers)
* will run.
*/
public abstract class Platform {
private final Platform.Type platformType;
public Platform(Type platformType) {
this.platformType = checkNotNull(platformType);
}
/**
* Get the executable for the virtual machine for this platform.
*
* @param vmHome the home directory of the virtual machine, allows testing across multiple vms on
* the same platform in one go.
*/
public abstract File vmExecutable(File vmHome);
/**
* Additional virtual machine arguments common to all instruments that are passed to a worker.
*/
public abstract ImmutableSet<String> commonInstrumentVmArgs();
/**
* The name of the platform type.
*/
public String name() {
return platformType.name;
}
/**
* Additional arguments that should be passed to a worker.
*/
public abstract ImmutableSet<String> workerProcessArgs();
/**
* The class path that should be used to run a worker..
*/
public abstract String workerClassPath();
/**
* Checks to see whether the specific class is supported on this platform.
*
* <p>This checks to see whether {@link SupportedPlatform} specifies a {@link Type} that
* matches this platform.
*
* @param clazz the class to check.
* @return true if it is supported, false otherwise.
*/
public boolean supports(Class<?> clazz) {
SupportedPlatform annotation = clazz.getAnnotation(SupportedPlatform.class);
if (annotation == null) {
// Support must be explicitly declared.
return false;
}
Platform.Type[] types = annotation.value();
for (Type type : types) {
if (type.equals(platformType)) {
return true;
}
}
return false;
}
/**
* Get the input arguments for the current running JVM.
*/
public abstract Collection<String> inputArguments();
/**
* Selects the names of properties that will be used to populate the
* {@link com.google.caliper.model.VmSpec} for a specific run.
*/
public abstract Predicate<String> vmPropertiesToRetain();
/**
* Checks that the vm options are appropriate for this platform, throws an exception if they are
* not.
*/
public abstract void checkVmProperties(Map<String, String> options);
/**
* Get the default vm home directory.
*/
public File defaultVmHomeDir() {
// Currently both supported platforms use java.home property to refer to the 'home' directory
// of the vm, in the case of Android it is the directory containing the dalvikvm executable.
return new File(System.getProperty("java.home"));
}
/**
* Get the home directory of a custom virtual machine.
* @param vmGroupMap the configuration properties for all VMs, may contain default properties that
* apply to all VMs.
* @param vmConfigName the name of the VM within the configuration, used to access VM specific
* properties from the {@code vmGroupMap}.
* @throws VirtualMachineException if there was a problem with the VM, either the configuration
* or the file system.
*/
public abstract File customVmHomeDir(Map<String, String> vmGroupMap, String vmConfigName)
throws VirtualMachineException;
/**
* The type of platforms supported.
*/
public enum Type {
DALVIK("Dalvik"),
JVM("Java");
private final String name;
Type(String name) {
this.name = name;
}
}
}