cmsdk: Add classpathtests.
Change-Id: I78f21934046a8a8917dc59f5423986a7077f4531
This commit is contained in:
parent
c56b48eac0
commit
8fc6affd38
|
@ -0,0 +1,26 @@
|
|||
/**
|
||||
* Copyright (c) 2015, The CyanogenMod Project
|
||||
*
|
||||
* 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.cyanogenmod.tests.versioning.unit;
|
||||
|
||||
/**
|
||||
* Created by Adnan on 9/25/15.
|
||||
*/
|
||||
public class ClassPathException extends Exception {
|
||||
|
||||
public ClassPathException(String message) {
|
||||
super("should not have " + message + " !");
|
||||
}
|
||||
}
|
|
@ -0,0 +1,158 @@
|
|||
/**
|
||||
* Copyright (c) 2015, The CyanogenMod Project
|
||||
*
|
||||
* 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.cyanogenmod.tests.versioning.unit;
|
||||
|
||||
import android.test.AndroidTestCase;
|
||||
import android.test.suitebuilder.annotation.LargeTest;
|
||||
import android.test.suitebuilder.annotation.SmallTest;
|
||||
import dalvik.system.DexFile;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Enumeration;
|
||||
|
||||
/**
|
||||
* Created by adnan on 9/22/15.
|
||||
*/
|
||||
public class ClassPathTest extends AndroidTestCase {
|
||||
|
||||
private static final String CYANOGENMOD_NAMESPACE = "cyanogenmod";
|
||||
private static final String PATH_TO_SYSTEM_FRAMEWORK = "/system/framework";
|
||||
|
||||
private ArrayList<String> mKnownSdkClasses;
|
||||
|
||||
@Override
|
||||
protected void setUp() throws Exception {
|
||||
super.setUp();
|
||||
mKnownSdkClasses = getLoadedClasses();
|
||||
}
|
||||
|
||||
@SmallTest
|
||||
public void testClassLoaderGivesSDKClasses() {
|
||||
/**
|
||||
* Verify we can retrieve our sdk classes from this package
|
||||
*/
|
||||
assertNotNull(mKnownSdkClasses);
|
||||
assertTrue(mKnownSdkClasses.size() > 0);
|
||||
}
|
||||
|
||||
@LargeTest
|
||||
public void testBootClassPathIsClean() {
|
||||
File path = new File(PATH_TO_SYSTEM_FRAMEWORK);
|
||||
File[] files = path.listFiles();
|
||||
assertNotNull(files);
|
||||
|
||||
/**
|
||||
* Everything in the in the boot class path needs to not
|
||||
* contain the sdk. Verify integrity of runtime below.
|
||||
*/
|
||||
final String bootClassPath = System.getenv("BOOTCLASSPATH");
|
||||
|
||||
ArrayList<String> classPathJars = new ArrayList<String>();
|
||||
|
||||
if (bootClassPath != null) {
|
||||
String[] bootClassPathElements = bootClassPath.split(":");
|
||||
for (String element : bootClassPathElements) {
|
||||
classPathJars.add(element);
|
||||
}
|
||||
} else {
|
||||
throw new AssertionError("No BOOTCLASSPATH defined! ");
|
||||
}
|
||||
|
||||
for (String classPathJar : classPathJars) {
|
||||
try {
|
||||
File jar = new File(classPathJar);
|
||||
DexFile dexFile = new DexFile(jar);
|
||||
assertTrue(isJarClean(dexFile));
|
||||
} catch (IOException e) {
|
||||
throw new AssertionError("Unable to find jar! " + classPathJar +
|
||||
"\nException " + e.toString());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@SmallTest
|
||||
public void testSystemServerClassPathIsClean() {
|
||||
/**
|
||||
* Everything in the in the system server class path shouldn't have oat files
|
||||
* it doesn't matter if it contains the sdk or not since the classes won't be loaded
|
||||
* as part of the system class loader
|
||||
*/
|
||||
final String systemserverclasspath = System.getenv("SYSTEMSERVERCLASSPATH");
|
||||
|
||||
ArrayList<String> classPathJars = new ArrayList<String>();
|
||||
|
||||
if (systemserverclasspath != null) {
|
||||
String[] bootClassPathElements = systemserverclasspath.split(":");
|
||||
for (String element : bootClassPathElements) {
|
||||
classPathJars.add(element);
|
||||
}
|
||||
} else {
|
||||
throw new AssertionError("No SYSTEMSERVERCLASSPATH defined! ");
|
||||
}
|
||||
|
||||
for (String classPathJar : classPathJars) {
|
||||
try {
|
||||
File jar = new File(classPathJar);
|
||||
DexFile dexFile = new DexFile(jar);
|
||||
fail("IOException should have been thrown, dex file "
|
||||
+ dexFile.getName() + " should not have an oat file");
|
||||
} catch (IOException expected) {
|
||||
expected.printStackTrace();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private ArrayList<String> getLoadedClasses() {
|
||||
ArrayList<String> listOfClasses = new ArrayList<String>();
|
||||
try {
|
||||
DexFile dexFile = new DexFile(new File(mContext.getPackageCodePath()));
|
||||
Enumeration<String> enumeration = dexFile.entries();
|
||||
|
||||
while (enumeration.hasMoreElements()){
|
||||
String className = enumeration.nextElement();
|
||||
if (className.startsWith(CYANOGENMOD_NAMESPACE)) {
|
||||
listOfClasses.add(className);
|
||||
}
|
||||
}
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
return listOfClasses;
|
||||
}
|
||||
|
||||
private void processAndCompare(String name) throws ClassPathException {
|
||||
if (mKnownSdkClasses.contains(name)) {
|
||||
throw new ClassPathException(name);
|
||||
}
|
||||
}
|
||||
|
||||
private boolean isJarClean(DexFile dexFile) throws AssertionError {
|
||||
Enumeration<String> enumeration = dexFile.entries();
|
||||
|
||||
while (enumeration.hasMoreElements()) {
|
||||
try {
|
||||
processAndCompare(enumeration.nextElement());
|
||||
} catch (ClassPathException e) {
|
||||
throw new AssertionError("Jar file "
|
||||
+ dexFile.getName() + " " + e.getMessage());
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue