0dc28d251e615b93de42b2297da497384ad9e7ab
[aquarium] / src / test / scala / gr / grnet / aquarium / store / mongodb / EventStoreTest.scala
1 /*
2  * Copyright 2011-2012 GRNET S.A. All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or
5  * without modification, are permitted provided that the following
6  * conditions are met:
7  *
8  *   1. Redistributions of source code must retain the above
9  *      copyright notice, this list of conditions and the following
10  *      disclaimer.
11  *
12  *   2. Redistributions in binary form must reproduce the above
13  *      copyright notice, this list of conditions and the following
14  *      disclaimer in the documentation and/or other materials
15  *      provided with the distribution.
16  *
17  * THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
18  * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
19  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
20  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
21  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
22  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
23  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
24  * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
25  * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
26  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
27  * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
28  * POSSIBILITY OF SUCH DAMAGE.
29  *
30  * The views and conclusions contained in the software and
31  * documentation are those of the authors and should not be
32  * interpreted as representing official policies, either expressed
33  * or implied, of GRNET S.A.
34  */
35
36 package gr.grnet.aquarium.store.mongodb
37
38 import org.junit.Assert._
39 import org.junit.Assume._
40 import gr.grnet.aquarium.Configurator._
41 import gr.grnet.aquarium.util.{RandomEventGenerator, TestMethods}
42 import gr.grnet.aquarium.logic.events.ResourceEvent
43 import collection.mutable.ArrayBuffer
44 import org.junit.{After, Test, Before}
45 import gr.grnet.aquarium.{StoreConfigurator, LogicTestsAssumptions}
46 import gr.grnet.aquarium.store.memory.MemStore
47
48 /**
49  * @author Georgios Gousios <gousiosg@gmail.com>
50  */
51 class EventStoreTest extends TestMethods
52 with RandomEventGenerator with StoreConfigurator {
53
54   @Test
55   def testStoreEvent() = {
56     assumeTrue(LogicTestsAssumptions.EnableStoreTests)
57
58     val event = nextResourceEvent()
59     val store = config.resourceEventStore
60     val result = store.storeResourceEvent(event)
61
62     assert(result.isJust)
63   }
64
65   @Test
66   def testFindEventById(): Unit = {
67     assumeTrue(LogicTestsAssumptions.EnableStoreTests)
68
69     val event = nextResourceEvent()
70     val store = config.resourceEventStore
71
72     val result1 = store.storeResourceEvent(event)
73     assert(result1.isJust)
74
75     val result2 = store.findResourceEventById(event.id)
76     assertNotNone(result2)
77   }
78
79   @Test
80   def testfindEventsByUserId(): Unit = {
81     assumeTrue(LogicTestsAssumptions.EnableStoreTests)
82     val events = new ArrayBuffer[ResourceEvent]()
83     val store = config.resourceEventStore
84
85     (1 to 100).foreach {
86       n =>
87         val e = nextResourceEvent
88         events += e
89         store.storeResourceEvent(e)
90     }
91
92     val mostUsedId = events
93       .map{x => x.userID}
94       .groupBy(identity)
95       .mapValues(_.size)
96       .foldLeft(("",0))((acc, kv) => if (kv._2 > acc._2) kv else acc)._1
97
98     val result = store.findResourceEventsByUserId(mostUsedId)(None)
99     assertEquals(events.filter(p => p.userID.equals(mostUsedId)).size, result.size)
100   }
101
102   @Test
103   def testMultipleMongos = {
104     assumeTrue(LogicTestsAssumptions.EnableStoreTests)
105     val a = getMongo
106     val b = getMongo
107     //assertEquals(a.Connection.mongo.get.hashCode(), b.Connection.mongo.get.hashCode())
108   }
109
110   @After
111   def after: Unit = {
112     if (isInMemStore) return
113
114     val a = getMongo
115
116     val col = a.mongo.getDB(
117       MasterConfigurator.get(Keys.persistence_db)
118     ).getCollection(MongoDBStore.RESOURCE_EVENTS_COLLECTION)
119
120     //val res = col.find
121     //while (res.hasNext)
122     //  col.remove(res.next)
123   }
124
125   private lazy val config = configurator
126   private val isInMemStore = config.resourceEventStore.isInstanceOf[MemStore]
127   private def getMongo = config.resourceEventStore.asInstanceOf[MongoDBStore]
128 }