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