blob: 918eae321fafa8b60276d94d03996a445857077c [file] [log] [blame]
Jordan Halterman948d6592017-04-20 17:18:24 -07001/*
Brian O'Connora09fe5b2017-08-03 21:12:30 -07002 * Copyright 2017-present Open Networking Foundation
Jordan Halterman948d6592017-04-20 17:18:24 -07003 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16package org.onosproject.store.primitives.impl;
17
18import java.util.HashMap;
19import java.util.Set;
20import java.util.UUID;
21import java.util.concurrent.CompletableFuture;
22import java.util.concurrent.Executor;
23import java.util.function.Consumer;
24
25import com.google.common.collect.Sets;
26import org.junit.Test;
27import org.onosproject.cluster.PartitionId;
28import org.onosproject.store.primitives.DistributedPrimitiveCreator;
29import org.onosproject.store.primitives.PartitionService;
30import org.onosproject.store.primitives.TransactionId;
31import org.onosproject.store.serializers.KryoNamespaces;
32import org.onosproject.store.service.AsyncConsistentMap;
33import org.onosproject.store.service.ConsistentMapBuilder;
34import org.onosproject.store.service.MapEventListener;
35import org.onosproject.store.service.Serializer;
36import org.onosproject.store.service.StorageService;
37
38import static org.easymock.EasyMock.anyObject;
39import static org.easymock.EasyMock.anyString;
40import static org.easymock.EasyMock.expect;
41import static org.easymock.EasyMock.expectLastCall;
42import static org.easymock.EasyMock.mock;
43import static org.easymock.EasyMock.replay;
44import static org.junit.Assert.assertSame;
45
46/**
47 * Transaction manager test.
48 */
49public class TransactionManagerTest {
50
51 @Test
52 public void testTransactionMapCaching() throws Exception {
53 AsyncConsistentMap asyncMap = mock(AsyncConsistentMap.class);
54 expect(asyncMap.name()).andReturn("foo");
55 expect(asyncMap.addListener(anyObject(MapEventListener.class), anyObject(Executor.class)))
56 .andReturn(CompletableFuture.completedFuture(null)).anyTimes();
57 asyncMap.addStatusChangeListener(anyObject(Consumer.class));
58 expectLastCall().anyTimes();
59 expect(asyncMap.entrySet()).andReturn(CompletableFuture.completedFuture(new HashMap<>().entrySet())).anyTimes();
60
61 ConsistentMapBuilder mapBuilder = mock(ConsistentMapBuilder.class);
62 expect(mapBuilder.withName(anyString())).andReturn(mapBuilder).anyTimes();
63 expect(mapBuilder.withSerializer(anyObject(Serializer.class))).andReturn(mapBuilder).anyTimes();
64 expect(mapBuilder.buildAsyncMap()).andReturn(asyncMap).anyTimes();
65
66 DistributedPrimitiveCreator primitiveCreator = mock(DistributedPrimitiveCreator.class);
67 expect(primitiveCreator.newAsyncConsistentMap(anyString(), anyObject(Serializer.class)))
68 .andReturn(asyncMap).anyTimes();
69
70 StorageService storageService = mock(StorageService.class);
71 expect(storageService.consistentMapBuilder()).andReturn(mapBuilder);
72
73 PartitionService partitionService = mock(PartitionService.class);
74 Set<PartitionId> partitionIds = Sets.newHashSet(PartitionId.from(1), PartitionId.from(2), PartitionId.from(3));
75 expect(partitionService.getAllPartitionIds())
76 .andReturn(partitionIds).anyTimes();
77 expect(partitionService.getNumberOfPartitions())
78 .andReturn(partitionIds.size()).anyTimes();
79 expect(partitionService.getDistributedPrimitiveCreator(anyObject(PartitionId.class)))
80 .andReturn(primitiveCreator).anyTimes();
81
82 replay(storageService, partitionService, asyncMap, primitiveCreator, mapBuilder);
83
Jordan Halterman93fd0122017-08-03 21:38:36 -070084 TransactionManager transactionManager = new TransactionManager(storageService, partitionService, 128);
Jordan Halterman948d6592017-04-20 17:18:24 -070085 TransactionId transactionId = TransactionId.from(UUID.randomUUID().toString());
86 TransactionCoordinator transactionCoordinator = new TransactionCoordinator(transactionId, transactionManager);
87 Serializer serializer = Serializer.using(KryoNamespaces.API);
88
89 PartitionedTransactionalMap<String, String> transactionalMap1 = (PartitionedTransactionalMap)
90 transactionManager.getTransactionalMap("foo", serializer, transactionCoordinator);
91 PartitionedTransactionalMap<String, String> transactionalMap2 = (PartitionedTransactionalMap)
92 transactionManager.getTransactionalMap("foo", serializer, transactionCoordinator);
93
94 assertSame(transactionalMap1.partitions.get(PartitionId.from(1)).transaction.transactionalObject,
95 transactionalMap2.partitions.get(PartitionId.from(1)).transaction.transactionalObject);
96 assertSame(transactionalMap1.partitions.get(PartitionId.from(2)).transaction.transactionalObject,
97 transactionalMap2.partitions.get(PartitionId.from(2)).transaction.transactionalObject);
98 assertSame(transactionalMap1.partitions.get(PartitionId.from(3)).transaction.transactionalObject,
99 transactionalMap2.partitions.get(PartitionId.from(3)).transaction.transactionalObject);
100 }
101
102}