blob: f7a5007351d3c19d22e811763dd7b003553904bb [file] [log] [blame]
Madan Jampani5e5b3d62016-02-01 16:03:33 -08001/*
Brian O'Connor5ab426f2016-04-09 01:19:45 -07002 * Copyright 2016-present Open Networking Laboratory
Madan Jampani5e5b3d62016-02-01 16:03:33 -08003 *
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.resources.impl;
17
Aaron Kruglikovc0c27c02016-06-07 16:05:00 -070018import com.google.common.util.concurrent.Uninterruptibles;
Madan Jampani35708a92016-07-06 10:48:19 -070019
Madan Jampani5e5b3d62016-02-01 16:03:33 -080020import io.atomix.AtomixClient;
21import io.atomix.catalyst.serializer.Serializer;
22import io.atomix.catalyst.transport.Address;
Madan Jampani630e7ac2016-05-31 11:34:05 -070023import io.atomix.catalyst.transport.local.LocalServerRegistry;
Aaron Kruglikovc0c27c02016-06-07 16:05:00 -070024import io.atomix.catalyst.transport.netty.NettyTransport;
Madan Jampani5e5b3d62016-02-01 16:03:33 -080025import io.atomix.copycat.client.CopycatClient;
26import io.atomix.copycat.server.CopycatServer;
27import io.atomix.copycat.server.storage.Storage;
28import io.atomix.copycat.server.storage.StorageLevel;
Madan Jampani630e7ac2016-05-31 11:34:05 -070029import io.atomix.manager.internal.ResourceManagerState;
Madan Jampani5e5b3d62016-02-01 16:03:33 -080030import io.atomix.resource.ResourceType;
Aaron Kruglikovc0c27c02016-06-07 16:05:00 -070031import org.onlab.junit.TestTools;
32import org.onosproject.store.primitives.impl.CatalystSerializers;
Madan Jampani5e5b3d62016-02-01 16:03:33 -080033
Madan Jampani5e5b3d62016-02-01 16:03:33 -080034import java.util.ArrayList;
35import java.util.List;
36import java.util.concurrent.CompletableFuture;
37import java.util.concurrent.CountDownLatch;
Aaron Kruglikovc0c27c02016-06-07 16:05:00 -070038import java.util.concurrent.atomic.AtomicInteger;
Madan Jampani5e5b3d62016-02-01 16:03:33 -080039
40/**
Aaron Kruglikovb5a41e52016-06-23 15:37:41 -070041 * Base class for various Atomix tests.
Madan Jampani5e5b3d62016-02-01 16:03:33 -080042 */
43public abstract class AtomixTestBase {
Aaron Kruglikovb5a41e52016-06-23 15:37:41 -070044 protected static LocalServerRegistry registry = new LocalServerRegistry();
45 protected static List<Address> members = new ArrayList<>();
46 protected static List<CopycatClient> copycatClients = new ArrayList<>();
47 protected static List<CopycatServer> copycatServers = new ArrayList<>();
48 protected static List<AtomixClient> atomixClients = new ArrayList<>();
49 protected static List<CopycatServer> atomixServers = new ArrayList<>();
50 protected static Serializer serializer = CatalystSerializers.getSerializer();
51 protected static AtomicInteger port = new AtomicInteger(49200);
Madan Jampani5e5b3d62016-02-01 16:03:33 -080052
53 /**
54 * Creates a new resource state machine.
55 *
56 * @return A new resource state machine.
57 */
58 protected abstract ResourceType resourceType();
59
60 /**
61 * Returns the next server address.
62 *
63 * @return The next server address.
64 */
Aaron Kruglikovb5a41e52016-06-23 15:37:41 -070065 private static Address nextAddress() {
Aaron Kruglikovc0c27c02016-06-07 16:05:00 -070066 Address address = new Address("127.0.0.1",
67 TestTools.findAvailablePort(port.getAndIncrement()));
Madan Jampani5e5b3d62016-02-01 16:03:33 -080068 members.add(address);
69 return address;
70 }
71
72 /**
73 * Creates a set of Copycat servers.
74 */
Aaron Kruglikovb5a41e52016-06-23 15:37:41 -070075 protected static List<CopycatServer> createCopycatServers(int nodes)
76 throws Throwable {
Madan Jampani5e5b3d62016-02-01 16:03:33 -080077 List<CopycatServer> servers = new ArrayList<>();
78
79 List<Address> members = new ArrayList<>();
Madan Jampani5e5b3d62016-02-01 16:03:33 -080080
81 for (int i = 0; i < nodes; i++) {
Aaron Kruglikovc0c27c02016-06-07 16:05:00 -070082 Address address = nextAddress();
83 members.add(address);
84 CopycatServer server = createCopycatServer(address);
85 if (members.size() <= 1) {
Aaron Kruglikov6afeccd2016-07-05 13:17:01 -070086 server.bootstrap().join();
Aaron Kruglikovc0c27c02016-06-07 16:05:00 -070087 } else {
Aaron Kruglikovb5a41e52016-06-23 15:37:41 -070088 server.join(members).join();
Aaron Kruglikovc0c27c02016-06-07 16:05:00 -070089 }
Madan Jampani5e5b3d62016-02-01 16:03:33 -080090 servers.add(server);
91 }
92
Madan Jampani5e5b3d62016-02-01 16:03:33 -080093 return servers;
94 }
95
96 /**
97 * Creates a Copycat server.
98 */
Aaron Kruglikovb5a41e52016-06-23 15:37:41 -070099 protected static CopycatServer createCopycatServer(Address address) {
Madan Jampani630e7ac2016-05-31 11:34:05 -0700100 CopycatServer server = CopycatServer.builder(address)
Aaron Kruglikovc0c27c02016-06-07 16:05:00 -0700101 .withTransport(NettyTransport.builder().withThreads(1).build())
Madan Jampani5e5b3d62016-02-01 16:03:33 -0800102 .withStorage(Storage.builder()
Aaron Kruglikovc0c27c02016-06-07 16:05:00 -0700103 .withStorageLevel(StorageLevel.MEMORY)
104 .build())
Madan Jampani65f24bb2016-03-15 15:16:18 -0700105 .withStateMachine(ResourceManagerState::new)
Madan Jampani5e5b3d62016-02-01 16:03:33 -0800106 .withSerializer(serializer.clone())
Madan Jampani5e5b3d62016-02-01 16:03:33 -0800107 .build();
108 copycatServers.add(server);
109 return server;
110 }
111
Aaron Kruglikovb5a41e52016-06-23 15:37:41 -0700112 public static void clearTests() throws Exception {
Madan Jampani5e5b3d62016-02-01 16:03:33 -0800113 registry = new LocalServerRegistry();
114 members = new ArrayList<>();
Madan Jampani5e5b3d62016-02-01 16:03:33 -0800115
116 CompletableFuture<Void> closeClients =
117 CompletableFuture.allOf(atomixClients.stream()
Madan Jampani35708a92016-07-06 10:48:19 -0700118 .map(AtomixClient::close)
119 .toArray(CompletableFuture[]::new));
120 closeClients.join();
Madan Jampani5e5b3d62016-02-01 16:03:33 -0800121
Madan Jampani35708a92016-07-06 10:48:19 -0700122 CompletableFuture<Void> closeServers =
123 CompletableFuture.allOf(copycatServers.stream()
124 .map(CopycatServer::shutdown)
125 .toArray(CompletableFuture[]::new));
126 closeServers.join();
Madan Jampani5e5b3d62016-02-01 16:03:33 -0800127
Madan Jampani35708a92016-07-06 10:48:19 -0700128 atomixClients.clear();
129 copycatServers.clear();
Madan Jampani5e5b3d62016-02-01 16:03:33 -0800130 }
131
Madan Jampani5e5b3d62016-02-01 16:03:33 -0800132
133 /**
134 * Creates a Atomix client.
135 */
Madan Jampani630e7ac2016-05-31 11:34:05 -0700136 protected AtomixClient createAtomixClient() {
Madan Jampani5e5b3d62016-02-01 16:03:33 -0800137 CountDownLatch latch = new CountDownLatch(1);
Madan Jampani630e7ac2016-05-31 11:34:05 -0700138 AtomixClient client = AtomixClient.builder()
Aaron Kruglikovc0c27c02016-06-07 16:05:00 -0700139 .withTransport(NettyTransport.builder().withThreads(1).build())
Madan Jampani5e5b3d62016-02-01 16:03:33 -0800140 .withSerializer(serializer.clone())
Madan Jampani5e5b3d62016-02-01 16:03:33 -0800141 .build();
Madan Jampani630e7ac2016-05-31 11:34:05 -0700142 client.connect(members).thenRun(latch::countDown);
Madan Jampani5e5b3d62016-02-01 16:03:33 -0800143 atomixClients.add(client);
144 Uninterruptibles.awaitUninterruptibly(latch);
145 return client;
146 }
147}