blob: 9cc76686a19f1d86a4a8864d29cddb55851f9db6 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.servicecomb.serviceregistry.registry.cache;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import org.apache.servicecomb.serviceregistry.registry.cache.AggregateMicroserviceCacheTest.MockMicroserviceCache;
import org.apache.servicecomb.serviceregistry.registry.cache.AggregateMicroserviceCacheTest.MockServiceRegistry;
import org.apache.servicecomb.serviceregistry.registry.cache.MicroserviceCache.MicroserviceCacheStatus;
import org.junit.Before;
import org.junit.Test;
import org.junit.jupiter.api.Assertions;
public class AggregateServiceRegistryCacheTest {
private MicroserviceCacheKey microserviceCacheKey;
private MockServiceRegistry mockServiceRegistry0;
private MockServiceRegistry mockServiceRegistry1;
private MockServiceRegistry mockServiceRegistry2;
private AggregateServiceRegistryCache aggregateServiceRegistryCache;
@Before
public void before() {
microserviceCacheKey = MicroserviceCacheKey.builder()
.serviceName("svc").appId("app").env("env").build();
mockServiceRegistry0 = new MockServiceRegistry()
.setName("s0")
.addCache(new MockMicroserviceCache(
microserviceCacheKey,
MicroserviceCacheStatus.NO_CHANGE));
mockServiceRegistry1 = new MockServiceRegistry()
.setName("s1")
.addCache(new MockMicroserviceCache(
microserviceCacheKey,
MicroserviceCacheStatus.REFRESHED))
.addCache(new MockMicroserviceCache(
MicroserviceCacheKey.builder().serviceName("svc2").appId("app").env("env").build(),
MicroserviceCacheStatus.NO_CHANGE));
mockServiceRegistry2 = new MockServiceRegistry()
.setName("s2")
.addCache(new MockMicroserviceCache(
microserviceCacheKey,
MicroserviceCacheStatus.SERVICE_NOT_FOUND));
aggregateServiceRegistryCache = new AggregateServiceRegistryCache(
Arrays.asList(mockServiceRegistry0, mockServiceRegistry1, mockServiceRegistry2));
}
@Test
public void findServiceCache() {
MicroserviceCache serviceCache = aggregateServiceRegistryCache.findServiceCache(
MicroserviceCacheKey.builder().serviceName("svc").appId("app").env("env").build()
);
Assertions.assertTrue(serviceCache instanceof AggregateMicroserviceCache);
AggregateMicroserviceCache aggregateMicroserviceCache = (AggregateMicroserviceCache) serviceCache;
Assertions.assertEquals(2, aggregateMicroserviceCache.caches.size());
Assertions.assertSame(mockServiceRegistry0.findMicroserviceCache(microserviceCacheKey),
aggregateMicroserviceCache.caches.get(mockServiceRegistry0.getName()));
Assertions.assertSame(mockServiceRegistry1.findMicroserviceCache(microserviceCacheKey),
aggregateMicroserviceCache.caches.get(mockServiceRegistry1.getName()));
// aggregateMicroserviceCache holds the cache of svc
Assertions.assertEquals(1, aggregateServiceRegistryCache.microserviceCache.size());
Assertions.assertNotNull(aggregateServiceRegistryCache.microserviceCache.get(microserviceCacheKey));
MicroserviceCache serviceCache2 = aggregateServiceRegistryCache.findServiceCache(
MicroserviceCacheKey.builder().serviceName("svc2").appId("app").env("env").build()
);
Assertions.assertTrue(serviceCache2 instanceof AggregateMicroserviceCache);
AggregateMicroserviceCache aggregateMicroserviceCache2 = (AggregateMicroserviceCache) serviceCache2;
Assertions.assertEquals(1, aggregateMicroserviceCache2.caches.size());
Assertions.assertSame(
mockServiceRegistry1.findMicroserviceCache(
MicroserviceCacheKey.builder().serviceName("svc2").appId("app").env("env").build()),
aggregateMicroserviceCache2.caches.get(mockServiceRegistry1.getName()));
Assertions.assertEquals(2, aggregateServiceRegistryCache.microserviceCache.size());
Assertions.assertNotNull(aggregateServiceRegistryCache.microserviceCache.get(
MicroserviceCacheKey.builder().serviceName("svc2").appId("app").env("env").build()
));
}
@Test
public void findServiceCache_not_found() {
MicroserviceCache serviceCache = aggregateServiceRegistryCache.findServiceCache(
MicroserviceCacheKey.builder().serviceName("svc-not-exist").appId("app").env("env").build()
);
Assertions.assertTrue(serviceCache instanceof AggregateMicroserviceCache);
Assertions.assertEquals(MicroserviceCacheStatus.SERVICE_NOT_FOUND, serviceCache.getStatus());
AggregateMicroserviceCache aggregateMicroserviceCache = (AggregateMicroserviceCache) serviceCache;
Assertions.assertEquals(0, aggregateMicroserviceCache.caches.size());
Assertions.assertEquals(3, aggregateMicroserviceCache.serviceRegistries.size());
// should remove the cache of not existing microservice
Assertions.assertEquals(0, aggregateServiceRegistryCache.microserviceCache.size());
}
@Test
public void onMicroserviceCacheRefreshed() {
MicroserviceCacheKey microserviceCacheKey =
MicroserviceCacheKey.builder().serviceName("svc").appId("app").env("env").build();
MicroserviceCacheKey microserviceCacheKey2 =
MicroserviceCacheKey.builder().serviceName("svc2").appId("app").env("env").build();
aggregateServiceRegistryCache.onMicroserviceCacheRefreshed(new MicroserviceCacheRefreshedEvent(
Collections.singletonList(
new MockMicroserviceCache(
microserviceCacheKey,
MicroserviceCacheStatus.REFRESHED
)
)
));
Assertions.assertTrue(aggregateServiceRegistryCache.microserviceCache.isEmpty());
MicroserviceCache serviceCache = aggregateServiceRegistryCache.findServiceCache(microserviceCacheKey);
MicroserviceCache serviceCache2 = aggregateServiceRegistryCache.findServiceCache(microserviceCacheKey2);
Assertions.assertEquals("1", serviceCache.getRevisionId());
Assertions.assertEquals("1", serviceCache2.getRevisionId());
aggregateServiceRegistryCache.onMicroserviceCacheRefreshed(new MicroserviceCacheRefreshedEvent(
Collections.singletonList(
new MockMicroserviceCache(
microserviceCacheKey,
MicroserviceCacheStatus.REFRESHED
)
)
));
Assertions.assertEquals("2", serviceCache.getRevisionId());
Assertions.assertEquals("1", serviceCache2.getRevisionId());
// test watcher
ArrayList<Object> refreshedCaches = new ArrayList<>();
aggregateServiceRegistryCache.setCacheRefreshedWatcher(refreshedCaches::addAll);
aggregateServiceRegistryCache.onMicroserviceCacheRefreshed(new MicroserviceCacheRefreshedEvent(
Arrays.asList(
new MockMicroserviceCache(
microserviceCacheKey,
MicroserviceCacheStatus.REFRESHED
),
new MockMicroserviceCache(
microserviceCacheKey2,
MicroserviceCacheStatus.REFRESHED
)
)
));
Assertions.assertEquals("3", serviceCache.getRevisionId());
Assertions.assertEquals("2", serviceCache2.getRevisionId());
Assertions.assertEquals(2, refreshedCaches.size());
Assertions.assertSame(serviceCache, refreshedCaches.get(0));
Assertions.assertSame(serviceCache2, refreshedCaches.get(1));
refreshedCaches.clear();
// test removing not existing service cache
((MockMicroserviceCache) mockServiceRegistry0.findMicroserviceCache(microserviceCacheKey))
.setStatus(MicroserviceCacheStatus.SERVICE_NOT_FOUND);
((MockMicroserviceCache) mockServiceRegistry1.findMicroserviceCache(microserviceCacheKey))
.setStatus(MicroserviceCacheStatus.SERVICE_NOT_FOUND);
aggregateServiceRegistryCache.onMicroserviceCacheRefreshed(new MicroserviceCacheRefreshedEvent(
Arrays.asList(
new MockMicroserviceCache(
microserviceCacheKey,
MicroserviceCacheStatus.REFRESHED
),
new MockMicroserviceCache(
microserviceCacheKey2,
MicroserviceCacheStatus.REFRESHED
)
)
));
Assertions.assertEquals("4", serviceCache.getRevisionId());
Assertions.assertEquals("3", serviceCache2.getRevisionId());
Assertions.assertEquals(2, refreshedCaches.size());
Assertions.assertSame(serviceCache, refreshedCaches.get(0));
Assertions.assertSame(serviceCache2, refreshedCaches.get(1));
Assertions.assertEquals(MicroserviceCacheStatus.SERVICE_NOT_FOUND, serviceCache.getStatus());
// not existing service cache removed, only serviceCache2 is left
Assertions.assertEquals(1, aggregateServiceRegistryCache.microserviceCache.size());
Assertions.assertSame(serviceCache2, aggregateServiceRegistryCache.microserviceCache.get(microserviceCacheKey2));
}
}