5c5366c9f274a7a8316f134db14b89651570e6b1
[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 collection.mutable.ArrayBuffer
43 import org.junit.{After, Test, Before}
44 import gr.grnet.aquarium.{StoreConfigurator, LogicTestsAssumptions}
45 import gr.grnet.aquarium.store.memory.MemStore
46 import gr.grnet.aquarium.event.resource.ResourceEventModel
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.insertResourceEvent(event)
61   }
62
63   @Test
64   def testFindEventById(): Unit = {
65     assumeTrue(LogicTestsAssumptions.EnableStoreTests)
66
67     val event = nextResourceEvent()
68     val store = config.resourceEventStore
69
70     store.insertResourceEvent(event)
71
72     store.findResourceEventById(event.id)
73   }
74
75   @Test
76   def testfindEventsByUserId(): Unit = {
77     assumeTrue(LogicTestsAssumptions.EnableStoreTests)
78     val events = new ArrayBuffer[ResourceEventModel]()
79     val store = config.resourceEventStore
80
81     (1 to 100).foreach {
82       n =>
83         val e = nextResourceEvent
84         events += e
85         store.insertResourceEvent(e)
86     }
87
88     val mostUsedId = events
89       .map{x => x.userID}
90       .groupBy(identity)
91       .mapValues(_.size)
92       .foldLeft(("",0))((acc, kv) => if (kv._2 > acc._2) kv else acc)._1
93
94     val result = store.findResourceEventsByUserId(mostUsedId)(None)
95     assertEquals(events.filter(p => p.userID.equals(mostUsedId)).size, result.size)
96   }
97
98   @Test
99   def testMultipleMongos = {
100     assumeTrue(LogicTestsAssumptions.EnableStoreTests)
101     val a = getMongo
102     val b = getMongo
103     //assertEquals(a.Connection.mongo.get.hashCode(), b.Connection.mongo.get.hashCode())
104   }
105
106   @After
107   def after: Unit = {
108     if (isInMemStore) return
109
110     val a = getMongo
111
112     val col = a.mongo.getDB(
113       MasterConfigurator.get(Keys.persistence_db)
114     ).getCollection(MongoDBStore.RESOURCE_EVENTS_COLLECTION)
115
116     //val res = col.find
117     //while (res.hasNext)
118     //  col.remove(res.next)
119   }
120
121   private lazy val config = configurator
122   private val isInMemStore = config.resourceEventStore.isInstanceOf[MemStore]
123   private def getMongo = config.resourceEventStore.asInstanceOf[MongoDBStore]
124 }