2 * Copyright 2012 GRNET S.A. All rights reserved.
4 * Redistribution and use in source and binary forms, with or
5 * without modification, are permitted provided that the following
8 * 1. Redistributions of source code must retain the above
9 * copyright notice, this list of conditions and the following
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.
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.
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.
36 package gr.grnet.aquarium.logic.test
39 import org.junit.Assert._
40 import gr.grnet.aquarium.{StoreConfigurator}
41 import gr.grnet.aquarium.util.date.TimeHelpers
42 import gr.grnet.aquarium.logic.accounting.Policy
46 * Tests for the Policy resolution algorithms
48 * @author Georgios Gousios <gousiosg@gmail.com>
50 class PolicyTest extends DSLTestBase with StoreConfigurator {
53 def testReloadPolicies: Unit = {
55 def copyModifyFile(from: String, to: String) = {
56 val extra = " - agreement:\n overrides: default\n name: foobar"
57 val out = new java.io.BufferedWriter(new java.io.FileWriter(to) );
58 io.Source.fromFile(from).getLines.map(x => x + "\n").foreach(s => out.write(s,0,s.length));
63 //Initial policy file, read from class path
64 Policy.withConfigurator(configurator)
65 val pol = Policy.policies.get
67 val f = Policy.policyFile
70 //Touch the file to trigger reloading with non changed state
72 f.setLastModified(System.currentTimeMillis)
73 var polNew = Policy.reloadPolicies
75 assertEquals(pol.keys.size, polNew.keys.size)
76 //assertEquals(pol.keys.head, polNew.keys.head)
78 //Copy the file and add a new element -> new policy
79 val fileCopy = new File(f.getParent, "policy.yaml.old")
81 copyModifyFile(fileCopy.getAbsolutePath,
82 (new File(fileCopy.getParent, "policy.yaml")).getAbsolutePath)
84 polNew = Policy.reloadPolicies
85 assertEquals(pol.keys.size + 1, polNew.keys.size)
86 val policyEffectivities = Policy.policies.get.keySet.toList.sortWith((x,y) => if (y.from after x.from) true else false)
87 testSuccessiveTimeslots(policyEffectivities)
88 testNoGaps(policyEffectivities)
92 def testLoadStore: Unit = {
95 val policies = configurator.policyStore
96 policies.storePolicyEntry(this.dsl.toPolicyEntry)
98 val copy1 = this.dsl.copy(algorithms = List())
99 policies.storePolicyEntry(copy1.toPolicyEntry)
101 val copy2 = this.dsl.copy(pricelists = List())
102 policies.storePolicyEntry(copy2.toPolicyEntry)
104 var pol = policies.loadPolicyEntriesAfter(TimeHelpers.nowMillis)
107 pol = policies.loadPolicyEntriesAfter(0)
108 assertEquals(3, pol.size)
109 assertEquals(pol.head.policyYAML, this.dsl.toYAML)
110 assertEquals(pol.tail.head.policyYAML, copy1.toYAML)
111 assertEquals(pol.tail.tail.head.policyYAML, copy2.toYAML)