001: /* Copyright (C) 2004 - 2007 db4objects Inc. http://www.db4o.com
002:
003: This file is part of the db4o open source object database.
004:
005: db4o is free software; you can redistribute it and/or modify it under
006: the terms of version 2 of the GNU General Public License as published
007: by the Free Software Foundation and as clarified by db4objects' GPL
008: interpretation policy, available at
009: http://www.db4o.com/about/company/legalpolicies/gplinterpretation/
010: Alternatively you can write to db4objects, Inc., 1900 S Norfolk Street,
011: Suite 350, San Mateo, CA 94403, USA.
012:
013: db4o is distributed in the hope that it will be useful, but WITHOUT ANY
014: WARRANTY; without even the implied warranty of MERCHANTABILITY or
015: FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
016: for more details.
017:
018: You should have received a copy of the GNU General Public License along
019: with this program; if not, write to the Free Software Foundation, Inc.,
020: 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
021: package com.db4o.test.nativequery;
022:
023: import java.io.*;
024: import java.net.*;
025:
026: import org.apache.tools.ant.*;
027: import org.apache.tools.ant.types.*;
028:
029: import com.db4o.foundation.io.*;
030: import com.db4o.instrumentation.ant.Db4oFileEnhancerAntTask;
031: import com.db4o.instrumentation.main.*;
032: import com.db4o.nativequery.main.*;
033: import com.db4o.nativequery.optimization.*;
034: import com.db4o.query.*;
035: import com.db4o.test.util.*;
036:
037: import db4ounit.*;
038:
039: public class NQBuildTimeInstrumentationTestCase implements
040: TestLifeCycle {
041:
042: private final static String BASE_DIR = Path4.combine(Path4
043: .getTempPath(), "nqfileinstr");
044: private final static String SRC_DIR = Path4.combine(BASE_DIR,
045: "source");
046: private final static String TARGET_DIR = Path4.combine(BASE_DIR,
047: "target");
048: private final static Class[] CLAZZES = { ToBeInstrumented.class,
049: NotToBeInstrumented.class };
050:
051: public void testFileEnhancer() throws Exception {
052: Db4oFileEnhancer enhancer = new Db4oFileEnhancer(
053: new TranslateNQToSODAEdit());
054: enhancer.enhance(SRC_DIR, TARGET_DIR, new String[] {}, "");
055: assertInstrumented();
056: }
057:
058: public void testAntTask() throws Exception {
059: Db4oFileEnhancerAntTask antTask = new Db4oFileEnhancerAntTask();
060: Project project = new Project();
061: project.setBaseDir(new File(BASE_DIR));
062: FileSet fileSet = new FileSet();
063: fileSet.setProject(project);
064: fileSet.setDir(new File(SRC_DIR));
065: antTask.addSources(fileSet);
066: antTask.setTargetdir(TARGET_DIR);
067: antTask.add(new NQAntClassEditFactory());
068: antTask.execute();
069: assertInstrumented();
070: }
071:
072: private void assertInstrumented() throws MalformedURLException,
073: ClassNotFoundException, NoSuchMethodException {
074: ExcludingClassLoader excludingLoader = new ExcludingClassLoader(
075: getClass().getClassLoader(), CLAZZES);
076: URLClassLoader loader = new URLClassLoader(
077: new URL[] { new File(TARGET_DIR).toURI().toURL() },
078: excludingLoader);
079:
080: Class instrumented = loader.loadClass(ToBeInstrumented.class
081: .getName());
082: final Class[] queryClassSig = new Class[] { Query.class };
083: Assert.isNotNull(instrumented.getDeclaredMethod(
084: NativeQueryEnhancer.OPTIMIZE_QUERY_METHOD_NAME,
085: queryClassSig));
086: final Class uninstrumented = loader
087: .loadClass(NotToBeInstrumented.class.getName());
088: Assert.expect(NoSuchMethodException.class, new CodeBlock() {
089: public void run() throws Throwable {
090: uninstrumented.getDeclaredMethod(
091: NativeQueryEnhancer.OPTIMIZE_QUERY_METHOD_NAME,
092: queryClassSig);
093: }
094: });
095: }
096:
097: private void copyClassFile(String srcDir, Class clazz)
098: throws IOException {
099: File file = fileForClass(clazz);
100: String targetPath = Path4.combine(srcDir, clazz.getName()
101: .replace('.', '/')
102: + ".class");
103: File4.delete(targetPath);
104: File4.copy(file.getCanonicalPath(), targetPath);
105: }
106:
107: private File fileForClass(Class clazz) throws IOException {
108: String clazzName = clazz.getName();
109: int dotIdx = clazzName.lastIndexOf('.');
110: String simpleName = clazzName.substring(dotIdx + 1);
111: URL url = clazz.getResource(simpleName + ".class");
112: return new File(url.getPath());
113: }
114:
115: public void setUp() throws Exception {
116: File4.mkdirs(SRC_DIR);
117: File4.mkdirs(TARGET_DIR);
118: for (int clazzIdx = 0; clazzIdx < CLAZZES.length; clazzIdx++) {
119: copyClassFile(SRC_DIR, CLAZZES[clazzIdx]);
120: }
121: }
122:
123: public void tearDown() throws Exception {
124: }
125: }
|