You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@labs.apache.org by si...@apache.org on 2011/05/20 15:47:56 UTC
svn commit: r1125389 - in /labs/magma/trunk/database-mock: ./ src/ src/main/
src/main/java/ src/main/java/org/ src/main/java/org/apache/
src/main/java/org/apache/magma/ src/main/java/org/apache/magma/database/
src/main/java/org/apache/magma/database/mo...
Author: simoneg
Date: Fri May 20 13:47:55 2011
New Revision: 1125389
URL: http://svn.apache.org/viewvc?rev=1125389&view=rev
Log:
Simple Database Mock for tests
Added:
labs/magma/trunk/database-mock/pom.xml
labs/magma/trunk/database-mock/src/
labs/magma/trunk/database-mock/src/main/
labs/magma/trunk/database-mock/src/main/java/
labs/magma/trunk/database-mock/src/main/java/org/
labs/magma/trunk/database-mock/src/main/java/org/apache/
labs/magma/trunk/database-mock/src/main/java/org/apache/magma/
labs/magma/trunk/database-mock/src/main/java/org/apache/magma/database/
labs/magma/trunk/database-mock/src/main/java/org/apache/magma/database/mock/
labs/magma/trunk/database-mock/src/main/java/org/apache/magma/database/mock/InstallMockDatabaseOnDemand.aj
labs/magma/trunk/database-mock/src/main/java/org/apache/magma/database/mock/InstallMockDatabaseOnProperty.aj
labs/magma/trunk/database-mock/src/main/java/org/apache/magma/database/mock/MagMockDatabase.java
labs/magma/trunk/database-mock/src/main/java/org/apache/magma/database/mock/MockDatabase.java
labs/magma/trunk/database-mock/src/main/resources/
labs/magma/trunk/database-mock/src/test/
labs/magma/trunk/database-mock/src/test/java/
labs/magma/trunk/database-mock/src/test/java/org/
labs/magma/trunk/database-mock/src/test/java/org/apache/
labs/magma/trunk/database-mock/src/test/java/org/apache/magma/
labs/magma/trunk/database-mock/src/test/java/org/apache/magma/database/
labs/magma/trunk/database-mock/src/test/java/org/apache/magma/database/mock/
labs/magma/trunk/database-mock/src/test/java/org/apache/magma/database/mock/FullClassAnnotationTest.java
labs/magma/trunk/database-mock/src/test/java/org/apache/magma/database/mock/OnBeforeAnnotationTest.java
labs/magma/trunk/database-mock/src/test/java/org/apache/magma/database/mock/WithPropertyTest.java
labs/magma/trunk/database-mock/src/test/java/org/apache/magma/database/mock/domain/
labs/magma/trunk/database-mock/src/test/java/org/apache/magma/database/mock/domain/BeanWithOwnId.java
labs/magma/trunk/database-mock/src/test/java/org/apache/magma/database/mock/domain/SimpleBean.java
labs/magma/trunk/database-mock/src/test/resources/
labs/magma/trunk/database-mock/src/test/resources/META-INF/
labs/magma/trunk/database-mock/src/test/resources/META-INF/magma.properties
Added: labs/magma/trunk/database-mock/pom.xml
URL: http://svn.apache.org/viewvc/labs/magma/trunk/database-mock/pom.xml?rev=1125389&view=auto
==============================================================================
--- labs/magma/trunk/database-mock/pom.xml (added)
+++ labs/magma/trunk/database-mock/pom.xml Fri May 20 13:47:55 2011
@@ -0,0 +1,27 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+ <modelVersion>4.0.0</modelVersion>
+ <parent>
+ <artifactId>magma-parent</artifactId>
+ <groupId>org.apache.magma</groupId>
+ <version>3</version>
+ </parent>
+ <groupId>org.apache.magma</groupId>
+ <artifactId>database-mock</artifactId>
+ <version>0.0.3-SNAPSHOT</version>
+ <packaging>magma</packaging>
+ <name>Mock database implementation for tests</name>
+ <dependencies>
+ <dependency>
+ <groupId>org.apache.magma</groupId>
+ <artifactId>foundation-database</artifactId>
+ <version>0.0.3-SNAPSHOT</version>
+ <scope>compile</scope>
+ </dependency>
+ <dependency>
+ <groupId>junit</groupId>
+ <artifactId>junit</artifactId>
+ <version>4.8.2</version>
+ <scope>test</scope>
+ </dependency>
+ </dependencies>
+</project>
\ No newline at end of file
Added: labs/magma/trunk/database-mock/src/main/java/org/apache/magma/database/mock/InstallMockDatabaseOnDemand.aj
URL: http://svn.apache.org/viewvc/labs/magma/trunk/database-mock/src/main/java/org/apache/magma/database/mock/InstallMockDatabaseOnDemand.aj?rev=1125389&view=auto
==============================================================================
--- labs/magma/trunk/database-mock/src/main/java/org/apache/magma/database/mock/InstallMockDatabaseOnDemand.aj (added)
+++ labs/magma/trunk/database-mock/src/main/java/org/apache/magma/database/mock/InstallMockDatabaseOnDemand.aj Fri May 20 13:47:55 2011
@@ -0,0 +1,74 @@
+package org.apache.magma.database.mock;
+
+
+import org.apache.magma.database.Database;
+
+
+public aspect InstallMockDatabaseOnDemand {
+
+ // TODO replace this with annotation matching if possible
+ declare precedence : InstallMockDatabaseOnDemand, *;
+
+ public static interface UsingMockDb {
+
+ }
+
+ declare parents : (@MagMockDatabase *) implements UsingMockDb;
+
+ private MagMockDatabase ann = null;
+ private MagMockDatabase clann = null;
+ private MockDatabase md = null;
+
+ Object around(MagMockDatabase myann):
+ execution(* UsingMockDb+.*(..))
+ && @this(myann)
+ {
+ if (clann != null) return proceed(myann);
+ clann = myann;
+ md = null;
+ try {
+ Object ret = proceed(myann);
+ return ret;
+ } finally {
+ clann = null;
+ if (ann == null) md = null;
+ }
+ }
+
+ Object around(MagMockDatabase myann):
+ execution(* *.*(..))
+ && @annotation(myann)
+ {
+ if (ann != null) return proceed(myann);
+ ann = myann;
+ md = null;
+ try {
+ Object ret = proceed(myann);
+ return ret;
+ } finally {
+ ann = null;
+ if (clann == null) md = null;
+ }
+ }
+
+ Database around() :
+ call(Database.new(..))
+ {
+ if (ann == null && clann == null) {
+ return proceed();
+ }
+ if (md != null) {
+ System.out.println("Reusing md");
+ return md;
+ }
+ System.out.println("Creating with " + clann + " " + ann);
+ md = new MockDatabase();
+ if (ann != null) {
+ if (ann.clean()) md.clean();
+ } else if (clann != null) {
+ if (clann.clean()) md.clean();
+ }
+ return md;
+ }
+
+}
Added: labs/magma/trunk/database-mock/src/main/java/org/apache/magma/database/mock/InstallMockDatabaseOnProperty.aj
URL: http://svn.apache.org/viewvc/labs/magma/trunk/database-mock/src/main/java/org/apache/magma/database/mock/InstallMockDatabaseOnProperty.aj?rev=1125389&view=auto
==============================================================================
--- labs/magma/trunk/database-mock/src/main/java/org/apache/magma/database/mock/InstallMockDatabaseOnProperty.aj (added)
+++ labs/magma/trunk/database-mock/src/main/java/org/apache/magma/database/mock/InstallMockDatabaseOnProperty.aj Fri May 20 13:47:55 2011
@@ -0,0 +1,18 @@
+package org.apache.magma.database.mock;
+
+import org.apache.magma.database.Database;
+import org.apache.magma.settings.Settings;
+
+public aspect InstallMockDatabaseOnProperty {
+
+ declare precedence: InstallMockDatabaseOnDemand, InstallMockDatabaseOnProperty, *;
+
+ Database around() : call(Database.new(..)) {
+ String set = Settings.get("magma.mockDatabase");
+ if (set != null && set.startsWith("t")) {
+ return new MockDatabase();
+ }
+ return proceed();
+ }
+
+}
Added: labs/magma/trunk/database-mock/src/main/java/org/apache/magma/database/mock/MagMockDatabase.java
URL: http://svn.apache.org/viewvc/labs/magma/trunk/database-mock/src/main/java/org/apache/magma/database/mock/MagMockDatabase.java?rev=1125389&view=auto
==============================================================================
--- labs/magma/trunk/database-mock/src/main/java/org/apache/magma/database/mock/MagMockDatabase.java (added)
+++ labs/magma/trunk/database-mock/src/main/java/org/apache/magma/database/mock/MagMockDatabase.java Fri May 20 13:47:55 2011
@@ -0,0 +1,14 @@
+package org.apache.magma.database.mock;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+@Retention(RetentionPolicy.RUNTIME)
+@Target({ElementType.METHOD, ElementType.TYPE})
+public @interface MagMockDatabase {
+
+ public boolean clean() default true;
+
+}
Added: labs/magma/trunk/database-mock/src/main/java/org/apache/magma/database/mock/MockDatabase.java
URL: http://svn.apache.org/viewvc/labs/magma/trunk/database-mock/src/main/java/org/apache/magma/database/mock/MockDatabase.java?rev=1125389&view=auto
==============================================================================
--- labs/magma/trunk/database-mock/src/main/java/org/apache/magma/database/mock/MockDatabase.java (added)
+++ labs/magma/trunk/database-mock/src/main/java/org/apache/magma/database/mock/MockDatabase.java Fri May 20 13:47:55 2011
@@ -0,0 +1,139 @@
+package org.apache.magma.database.mock;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import org.apache.magma.database.Database;
+import org.apache.magma.database.DatabasePersisted;
+import org.apache.magma.database.InstallIdByDefault.WithDefaultId;
+import org.apache.magma.database.LogicallyNamed;
+
+public class MockDatabase extends Database {
+
+ private static Map<Class, Set> collected = new HashMap<Class, Set>();
+ private static Map<Class, Map<String, Object>> byName = new HashMap<Class, Map<String,Object>>();
+ private static Map<Class, Map<Object, Object>> byId = new HashMap<Class, Map<Object,Object>>();
+ private volatile static long lastId = 0;
+
+
+ public static <T> Set<T> getAll(Class<T> clazz) {
+ Set<T> ret = new HashSet<T>();
+ for (Map.Entry<Class, Set> entry : collected.entrySet()) {
+ if (entry.getKey().isAssignableFrom(clazz)) {
+ ret.addAll((Set<T>)entry.getValue());
+ }
+ }
+ return ret;
+ }
+
+ public static void clean() {
+ collected.clear();
+ byName.clear();
+ byId.clear();
+ }
+
+ public static void store(Object bean) {
+ Set set = collected.get(bean.getClass());
+ if (set == null) {
+ set = new HashSet();
+ collected.put(bean.getClass(), set);
+ }
+ set.add(bean);
+
+
+ if (bean instanceof DatabasePersisted) {
+ Object pk = ((DatabasePersisted)bean).getPrimaryKey();
+ if (pk == null || (pk instanceof Long && (Long)pk == 0)) {
+ if (bean instanceof WithDefaultId) {
+ long id = lastId++;
+ ((WithDefaultId)bean).setId(id);
+ pk = id;
+ }
+ // TODO throw exception? Warn somehow?
+ }
+ Map<Object,Object> ids = byId.get(bean.getClass());
+ if (ids == null) {
+ ids = new HashMap<Object, Object>();
+ byId.put(bean.getClass(), ids);
+ }
+ ids.put(pk, bean);
+ }
+ if (bean instanceof LogicallyNamed) {
+ LogicallyNamed ln = (LogicallyNamed) bean;
+ String name = ln.getLogicalName();
+ if (name == null) {
+ name = ln.computeLogicalName();
+ if (name != null) {
+ name = name.toLowerCase();
+ name = name.replace(' ', '-');
+ name = name.replaceAll("--", "-");
+ }
+ ln.setLogicalName(name);
+ }
+ Map<String, Object> names = byName.get(bean.getClass());
+ if (names == null) {
+ names = new HashMap<String, Object>();
+ byName.put(bean.getClass(), names);
+ }
+ String nname = name;
+ int cnt = 1;
+ while (names.containsKey(nname)) nname = name + (cnt++);
+ names.put(nname, bean);
+ }
+ }
+
+ public static Object findId(Class clazz, Object id) {
+ for (Map.Entry<Class, Map<Object,Object>> entry : byId.entrySet()) {
+ if (entry.getKey().isAssignableFrom(clazz)) {
+ Object ret = entry.getValue().get(id);
+ if (ret != null) return ret;
+ }
+ }
+ return null;
+ }
+
+ public static Object findName(Class clazz, String name) {
+ for (Map.Entry<Class, Map<String,Object>> entry : byName.entrySet()) {
+ if (entry.getKey().isAssignableFrom(clazz)) {
+ Object ret = entry.getValue().get(name);
+ if (ret != null) return ret;
+ }
+ }
+ return null;
+ }
+
+ @Override
+ public void save(Object bean) {
+ store(bean);
+ }
+
+ @Override
+ public <T extends LogicallyNamed> T named(Class<T> clazz, String logicalName) {
+ if (logicalName == null) throw new IllegalArgumentException("Searching a null logicalName");
+ return (T) findName(clazz, logicalName);
+ }
+
+ @Override
+ public <T> List<T> query(Class<T> clazz, int from, int page, String query, Object... params) {
+ return new ArrayList<T>(getAll(clazz));
+ /*
+ if (from == 0 && page == 0 && query.trim().length() == 0) {
+ return new ArrayList<T>(getAll(clazz));
+ }
+ throw new UnsupportedOperationException();
+ */
+ }
+
+ @Override
+ public <T> T load(Class<T> clazz, Object... id) {
+ if (id.length == 1) {
+ return (T)findId(clazz, id[0]);
+ } else {
+ return (T)findId(clazz, id);
+ }
+ }
+}
Added: labs/magma/trunk/database-mock/src/test/java/org/apache/magma/database/mock/FullClassAnnotationTest.java
URL: http://svn.apache.org/viewvc/labs/magma/trunk/database-mock/src/test/java/org/apache/magma/database/mock/FullClassAnnotationTest.java?rev=1125389&view=auto
==============================================================================
--- labs/magma/trunk/database-mock/src/test/java/org/apache/magma/database/mock/FullClassAnnotationTest.java (added)
+++ labs/magma/trunk/database-mock/src/test/java/org/apache/magma/database/mock/FullClassAnnotationTest.java Fri May 20 13:47:55 2011
@@ -0,0 +1,73 @@
+package org.apache.magma.database.mock;
+
+import static org.hamcrest.CoreMatchers.*;
+import static org.junit.matchers.JUnitMatchers.*;
+import static org.junit.Assert.*;
+
+import org.apache.magma.database.Database;
+import org.apache.magma.database.mock.domain.SimpleBean;
+import org.junit.Test;
+
+
+@MagMockDatabase
+public class FullClassAnnotationTest {
+
+ @Test
+ public void simpleWriteRead() throws Exception {
+ Database db = new Database();
+
+ SimpleBean sb = new SimpleBean();
+ sb.setName("Test");
+
+ db.save(sb);
+
+ SimpleBean sb2 = db.load(SimpleBean.class, sb.getId());
+
+ assertThat(sb2, sameInstance(sb));
+
+ sb2 = db.named(SimpleBean.class, "test");
+
+ assertThat(sb2, sameInstance(sb));
+ }
+
+ @MagMockDatabase(clean=false)
+ public void createFalse() {
+ Database db = new Database();
+
+ SimpleBean sb = new SimpleBean();
+ sb.setName("Test");
+
+ db.save(sb);
+ }
+
+ @Test
+ public void subAnnotatedFalse() throws Exception {
+ for (int i = 0; i < 5; i++) createFalse();
+
+ Database db = new Database();
+ assertThat(db, instanceOf(MockDatabase.class));
+ assertTrue("Not enough beans in database, got " + MockDatabase.getAll(SimpleBean.class).size(), MockDatabase.getAll(SimpleBean.class).size() >= 5);
+ }
+
+ @MagMockDatabase(clean=true)
+ public void createTrue() {
+ Database db = new Database();
+
+ SimpleBean sb = new SimpleBean();
+ sb.setName("Test");
+
+ db.save(sb);
+ }
+
+ @Test
+ public void subAnnotatedTrue() throws Exception {
+ for (int i = 0; i < 5; i++) createTrue();
+
+ Database db = new Database();
+ assertThat(db, instanceOf(MockDatabase.class));
+ assertThat("too many beans in database", MockDatabase.getAll(SimpleBean.class).size(), equalTo(1));
+ }
+
+
+
+}
Added: labs/magma/trunk/database-mock/src/test/java/org/apache/magma/database/mock/OnBeforeAnnotationTest.java
URL: http://svn.apache.org/viewvc/labs/magma/trunk/database-mock/src/test/java/org/apache/magma/database/mock/OnBeforeAnnotationTest.java?rev=1125389&view=auto
==============================================================================
--- labs/magma/trunk/database-mock/src/test/java/org/apache/magma/database/mock/OnBeforeAnnotationTest.java (added)
+++ labs/magma/trunk/database-mock/src/test/java/org/apache/magma/database/mock/OnBeforeAnnotationTest.java Fri May 20 13:47:55 2011
@@ -0,0 +1,28 @@
+package org.apache.magma.database.mock;
+
+import static org.hamcrest.CoreMatchers.*;
+import static org.junit.Assert.*;
+
+import org.apache.magma.database.Database;
+import org.apache.magma.database.mock.domain.SimpleBean;
+import org.junit.Before;
+import org.junit.Test;
+
+@MagMockDatabase(clean=false)
+public class OnBeforeAnnotationTest {
+
+ @Before
+ @MagMockDatabase
+ public void create() {
+ Database db = new Database();
+ db.save(new SimpleBean());
+ }
+
+ @Test
+ public void checkBefore() throws Exception {
+ Database db = new Database();
+ assertThat(MockDatabase.getAll(SimpleBean.class).size(), equalTo(1));
+
+ }
+
+}
Added: labs/magma/trunk/database-mock/src/test/java/org/apache/magma/database/mock/WithPropertyTest.java
URL: http://svn.apache.org/viewvc/labs/magma/trunk/database-mock/src/test/java/org/apache/magma/database/mock/WithPropertyTest.java?rev=1125389&view=auto
==============================================================================
--- labs/magma/trunk/database-mock/src/test/java/org/apache/magma/database/mock/WithPropertyTest.java (added)
+++ labs/magma/trunk/database-mock/src/test/java/org/apache/magma/database/mock/WithPropertyTest.java Fri May 20 13:47:55 2011
@@ -0,0 +1,19 @@
+package org.apache.magma.database.mock;
+
+import static org.hamcrest.CoreMatchers.*;
+import static org.junit.Assert.*;
+
+import org.apache.magma.database.Database;
+import org.apache.magma.settings.Settings;
+import org.junit.Test;
+
+
+public class WithPropertyTest {
+
+ @Test
+ public void checkProp() throws Exception {
+ Database db = new Database();
+ assertThat(db, instanceOf(MockDatabase.class));
+ }
+
+}
Added: labs/magma/trunk/database-mock/src/test/java/org/apache/magma/database/mock/domain/BeanWithOwnId.java
URL: http://svn.apache.org/viewvc/labs/magma/trunk/database-mock/src/test/java/org/apache/magma/database/mock/domain/BeanWithOwnId.java?rev=1125389&view=auto
==============================================================================
--- labs/magma/trunk/database-mock/src/test/java/org/apache/magma/database/mock/domain/BeanWithOwnId.java (added)
+++ labs/magma/trunk/database-mock/src/test/java/org/apache/magma/database/mock/domain/BeanWithOwnId.java Fri May 20 13:47:55 2011
@@ -0,0 +1,30 @@
+package org.apache.magma.database.mock.domain;
+
+import javax.persistence.Entity;
+import javax.persistence.Id;
+
+import org.apache.magma.beans.MagmaBean;
+
+@MagmaBean
+@Entity
+public class BeanWithOwnId {
+
+ private String id;
+ private String name;
+
+ @Id
+ public String getId() {
+ return id;
+ }
+ public void setId(String id) {
+ this.id = id;
+ }
+
+ public String getName() {
+ return name;
+ }
+ public void setName(String name) {
+ this.name = name;
+ }
+
+}
Added: labs/magma/trunk/database-mock/src/test/java/org/apache/magma/database/mock/domain/SimpleBean.java
URL: http://svn.apache.org/viewvc/labs/magma/trunk/database-mock/src/test/java/org/apache/magma/database/mock/domain/SimpleBean.java?rev=1125389&view=auto
==============================================================================
--- labs/magma/trunk/database-mock/src/test/java/org/apache/magma/database/mock/domain/SimpleBean.java (added)
+++ labs/magma/trunk/database-mock/src/test/java/org/apache/magma/database/mock/domain/SimpleBean.java Fri May 20 13:47:55 2011
@@ -0,0 +1,32 @@
+package org.apache.magma.database.mock.domain;
+
+import javax.persistence.Entity;
+
+import org.apache.magma.beans.MagmaBean;
+import org.apache.magma.database.Database;
+import org.apache.magma.database.LogicallyNamed;
+
+@MagmaBean
+@Entity
+public class SimpleBean implements LogicallyNamed {
+
+ private String name;
+
+ public String getName() {
+ return name;
+ }
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public String computeLogicalName() {
+ return this.name;
+ }
+
+
+ public void persistMe() {
+ Database db = new Database();
+ db.save(this);
+ }
+
+}
Added: labs/magma/trunk/database-mock/src/test/resources/META-INF/magma.properties
URL: http://svn.apache.org/viewvc/labs/magma/trunk/database-mock/src/test/resources/META-INF/magma.properties?rev=1125389&view=auto
==============================================================================
--- labs/magma/trunk/database-mock/src/test/resources/META-INF/magma.properties (added)
+++ labs/magma/trunk/database-mock/src/test/resources/META-INF/magma.properties Fri May 20 13:47:55 2011
@@ -0,0 +1 @@
+magma.mockDatabase=true
\ No newline at end of file
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@labs.apache.org
For additional commands, e-mail: commits-help@labs.apache.org