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: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to