]> gerrit.simantics Code Review - simantics/platform.git/blob - tests/org.simantics.db.tests/src/org/simantics/db/tests/regression/bugs/Issue3420Test1.java
Added missing org.simantics.db.{tests,testing} plug-ins.
[simantics/platform.git] / tests / org.simantics.db.tests / src / org / simantics / db / tests / regression / bugs / Issue3420Test1.java
1 /*******************************************************************************
2  * Copyright (c) 2007, 2010 Association for Decentralized Information Management
3  * in Industry THTH ry.
4  * All rights reserved. This program and the accompanying materials
5  * are made available under the terms of the Eclipse Public License v1.0
6  * which accompanies this distribution, and is available at
7  * http://www.eclipse.org/legal/epl-v10.html
8  *
9  * Contributors:
10  *     VTT Technical Research Centre of Finland - initial API and implementation
11  *******************************************************************************/
12 package org.simantics.db.tests.regression.bugs;
13
14 import java.util.HashMap;
15 import java.util.Map;
16 import java.util.Set;
17 import java.util.TreeSet;
18 import java.util.Vector;
19
20 import org.junit.Test;
21 import org.simantics.db.ReadGraph;
22 import org.simantics.db.Resource;
23 import org.simantics.db.Session;
24 import org.simantics.db.WriteGraph;
25 import org.simantics.db.WriteOnlyGraph;
26 import org.simantics.db.common.request.DelayedWriteRequest;
27 import org.simantics.db.common.request.ReadRequest;
28 import org.simantics.db.common.request.WriteOnlyRequest;
29 import org.simantics.db.common.request.WriteRequest;
30 import org.simantics.db.exception.ClusterSetExistException;
31 import org.simantics.db.exception.DatabaseException;
32 import org.simantics.db.service.ClusteringSupport;
33 import org.simantics.db.service.XSupport;
34 import org.simantics.db.testing.base.ExistingDatabaseTest;
35 import org.simantics.layer0.Layer0;
36
37 /**
38  * Tests that cluster set can be used to explicitly control clustering.
39  */
40 public class Issue3420Test1 extends ExistingDatabaseTest {
41     private final boolean DEBUG = false;
42     private final Vector<Resource> clusterSets = new Vector<Resource>();
43     private final Vector<Resource> resources = new Vector<Resource>();
44     @Test
45     public void test() throws DatabaseException {
46         Session session = getSession();
47         init();
48         session.syncRequest(new Init());
49         session.syncRequest(new InitW());
50         session.syncRequest(new Check());
51         init();
52         session.syncRequest(new InitWO());
53         session.syncRequest(new Check());
54         init();
55         session.syncRequest(new InitWD());
56         initDWKraaKraa(session);
57         session.syncRequest(new Check());
58         session.syncRequest(new InitWD2());
59         initDWKraaKraa(session);
60         session.syncRequest(new Check());
61     }
62     private void init() {
63         resources.clear();
64         clusterSets.clear();
65         resources.setSize(1<<17);
66         clusterSets.setSize(14);
67         if (DEBUG)
68             System.out.println("Resource count=" + resources.size() + " cluster sets=" + clusterSets.size());
69     }
70     class Init extends WriteRequest {
71         @Override
72         public void perform(WriteGraph g) throws DatabaseException {
73             Layer0 l0 = Layer0.getInstance(g);
74             try {
75                 g.newClusterSet(l0.InstanceOf);
76             } catch (ClusterSetExistException e) {
77                 // Cluster set exist already. No problem.
78             }
79         }
80     }
81     class InitW extends WriteRequest {
82         @Override
83         public void perform(WriteGraph g) throws DatabaseException {
84             Layer0 l0 = Layer0.getInstance(g);
85             Resource oldDefault = g.setClusterSet4NewResource(l0.InstanceOf);
86             assertTrue(null == oldDefault);
87             for (int i=0; i<clusterSets.size(); ++i) {
88                 Resource r = g.newResource();
89                 g.newClusterSet(r);
90                 clusterSets.set(i, r);
91             }
92             assertTrue(l0.InstanceOf == g.setClusterSet4NewResource(oldDefault));
93             for (int i=0; i<resources.size(); ++i) {
94                 Resource r = clusterSets.get(i%clusterSets.size());
95                 resources.set(i, g.newResource(r));
96             }
97         }
98     }
99     class InitWD extends DelayedWriteRequest {
100         @Override
101         public void perform(WriteGraph g) throws DatabaseException {
102             for (int i=0; i<clusterSets.size(); ++i) {
103                 Resource r = g.newResource();
104                 g.newClusterSet(r);
105                 clusterSets.set(i, r);
106             }
107             for (int i=0; i<resources.size(); ++i) {
108                 Resource r = clusterSets.get(i%clusterSets.size());
109                 resources.set(i, g.newResource(r));
110             }
111         }
112     }
113     class InitWD2 extends DelayedWriteRequest {
114         @Override
115         public void perform(WriteGraph g) throws DatabaseException {
116             for (int i=0; i<clusterSets.size(); ++i) {
117                 Resource r = g.newResource();
118                 g.newClusterSet(r);
119                 clusterSets.set(i, r);
120             }
121             Layer0 l0 = Layer0.getInstance(g);
122             for (int i=0; i<resources.size(); ++i) {
123                 Resource r = clusterSets.get(i%clusterSets.size());
124                 Resource rr = g.newResource(r);
125                 g.claim(rr, l0.InstanceOf, l0.Entity);
126                 g.claimValue(rr, "value");
127                 resources.set(i, rr);
128             }
129         }
130     }
131     private void initDWKraaKraa(Session s)
132     throws DatabaseException {
133         XSupport xs = s.getService(XSupport.class);
134             for (int i=0; i<clusterSets.size(); ++i) {
135                 Resource r = xs.convertDelayedResourceToResource(clusterSets.get(i));
136                 clusterSets.set(i, r);
137             }
138             for (int i=0; i<resources.size(); ++i) {
139                 Resource r = xs.convertDelayedResourceToResource(resources.get(i));
140                 resources.set(i, r);
141             }
142     }
143     class InitWO extends WriteOnlyRequest {
144         @Override
145         public void perform(WriteOnlyGraph g) throws DatabaseException {
146             for (int i=0; i<clusterSets.size(); ++i) {
147                 Resource r = g.newResource();
148                 g.newClusterSet(r);
149                 clusterSets.set(i, r);
150             }
151             for (int i=0; i<resources.size(); ++i) {
152                 Resource r = clusterSets.get(i%clusterSets.size());
153                 resources.set(i, g.newResource(r));
154             }
155         }
156     }
157     class Check extends ReadRequest {
158         @Override
159         public void run(ReadGraph g) throws DatabaseException {
160             ClusteringSupport cs = g.getService(ClusteringSupport.class);
161             Map<Long, Integer> clusters = new HashMap<Long, Integer>();
162             for (int i=0; i<resources.size(); ++i){
163                 long cluster = cs.getCluster(resources.get(i));
164                 Integer count = clusters.get(cluster);
165                 if (null == count)
166                     count = 0;
167                 clusters.put(cluster, ++count);
168             }
169             Set<Long> sortedKeys = new TreeSet<Long>();
170             for (Map.Entry<Long, Integer> i : clusters.entrySet())
171                 sortedKeys.add(i.getKey());
172             long sum = 0;
173             for (long key : sortedKeys) {
174                 int count = clusters.get(key);
175                 if (DEBUG)
176                     System.out.println("cluster=" + key + " count=" + count);
177                 sum += count;
178             }
179             if (resources.size() != sum) {
180                 String msg = "Resource count mismatch. expected=" + resources.size() + " realized=" + sum;
181                 if (DEBUG)
182                     System.out.println(msg);
183                 fail(msg);
184             }
185         }
186     }
187 }