diff --git a/.github/workflows/codecov.yml b/.github/workflows/codecov.yml new file mode 100644 index 00000000..73d0fdc1 --- /dev/null +++ b/.github/workflows/codecov.yml @@ -0,0 +1,29 @@ +name: Codecov CI + +on: + push: + branches: + - main + pull_request: + branches: + - main + +jobs: + test: + runs-on: ubuntu-latest + + steps: + - name: Checkout + uses: actions/checkout@v4 + - name: Set up JDK 18 + uses: actions/setup-java@v1 + with: + java-version: 18 + - name: Install dependencies + run: mvn install -DskipTests=true -Dmaven.javadoc.skip=true -B -V + - name: Run tests and collect coverage + run: mvn -B test + - name: Upload coverage to Codecov + uses: codecov/codecov-action@v4 + env: + CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }} \ No newline at end of file diff --git a/klein-consensus/klein-consensus-paxos/src/test/java/com/ofcoder/klein/consensus/paxos/ProposalTest.java b/klein-consensus/klein-consensus-paxos/src/test/java/com/ofcoder/klein/consensus/paxos/ProposalTest.java new file mode 100644 index 00000000..97c8e7e6 --- /dev/null +++ b/klein-consensus/klein-consensus-paxos/src/test/java/com/ofcoder/klein/consensus/paxos/ProposalTest.java @@ -0,0 +1,17 @@ +package com.ofcoder.klein.consensus.paxos; + +import junit.framework.TestCase; + +public class ProposalTest extends TestCase { + + public void testGetGroup() { + Proposal proposal = new Proposal(); + assertNull(proposal.getGroup()); + + proposal = new Proposal("group1", "data1"); + assertEquals("group1", proposal.getGroup()); + + proposal.setGroup("group2"); + assertEquals("group2", proposal.getGroup()); + } +} diff --git a/klein-core/src/main/java/com/ofcoder/klein/core/cache/CacheContainer.java b/klein-core/src/main/java/com/ofcoder/klein/core/cache/CacheContainer.java index 1293a0de..842fa3ea 100644 --- a/klein-core/src/main/java/com/ofcoder/klein/core/cache/CacheContainer.java +++ b/klein-core/src/main/java/com/ofcoder/klein/core/cache/CacheContainer.java @@ -47,7 +47,7 @@ public interface CacheContainer { * @param expire expire * @return the previous value associated with key, or null */ - Object put(String key, Object data, Long expire); + Object put(String key, Object data, long expire); /** * put element to cache if present, and set expire. @@ -57,7 +57,7 @@ public interface CacheContainer { * @param expire expire * @return the previous value associated with key, or null */ - Object putIfAbsent(String key, Object data, Long expire); + Object putIfAbsent(String key, Object data, long expire); /** * remove key from cache. diff --git a/klein-core/src/main/java/com/ofcoder/klein/core/cache/ClearExpiryCacheContainer.java b/klein-core/src/main/java/com/ofcoder/klein/core/cache/ClearExpiryCacheContainer.java index 66c173d6..bd40c574 100644 --- a/klein-core/src/main/java/com/ofcoder/klein/core/cache/ClearExpiryCacheContainer.java +++ b/klein-core/src/main/java/com/ofcoder/klein/core/cache/ClearExpiryCacheContainer.java @@ -65,16 +65,16 @@ protected int adjustTimeout(final int timeoutMs) { } @Override - public Object put(final String key, final Object data, final Long expire) { + public Object put(final String key, final Object data, final long expire) { Object d = _put(key, data, expire); waitClear(expire, key); return d; } - protected abstract Object _put(String key, Object data, Long expire); + protected abstract Object _put(String key, Object data, long expire); @Override - public Object putIfAbsent(final String key, final Object data, final Long expire) { + public Object putIfAbsent(final String key, final Object data, final long expire) { Object d = _putIfAbsent(key, data, expire); if (d == null) { waitClear(expire, key); @@ -82,7 +82,7 @@ public Object putIfAbsent(final String key, final Object data, final Long expire return d; } - protected abstract Object _putIfAbsent(String key, Object data, Long expire); + protected abstract Object _putIfAbsent(String key, Object data, long expire); private long roundToNextBucket(final long time) { return (time / expirationInterval + 1) * expirationInterval; diff --git a/klein-core/src/main/java/com/ofcoder/klein/core/cache/LruCacheContainer.java b/klein-core/src/main/java/com/ofcoder/klein/core/cache/LruCacheContainer.java index 89593d97..7e35ad4a 100644 --- a/klein-core/src/main/java/com/ofcoder/klein/core/cache/LruCacheContainer.java +++ b/klein-core/src/main/java/com/ofcoder/klein/core/cache/LruCacheContainer.java @@ -86,7 +86,7 @@ public Object get(final String key) { } @Override - public synchronized Object _put(final String key, final Object data, final Long expire) { + public synchronized Object _put(final String key, final Object data, final long expire) { MetaData value = new MetaData(); value.setExpire(expire); value.setData(data); @@ -101,7 +101,7 @@ public synchronized Object _put(final String key, final Object data, final Long } @Override - public synchronized Object _putIfAbsent(final String key, final Object data, final Long expire) { + public synchronized Object _putIfAbsent(final String key, final Object data, final long expire) { MetaData value = new MetaData(); value.setExpire(expire); value.setData(data); diff --git a/klein-core/src/main/java/com/ofcoder/klein/core/cache/MemoryCacheContainer.java b/klein-core/src/main/java/com/ofcoder/klein/core/cache/MemoryCacheContainer.java index a9c008a1..614c121a 100644 --- a/klein-core/src/main/java/com/ofcoder/klein/core/cache/MemoryCacheContainer.java +++ b/klein-core/src/main/java/com/ofcoder/klein/core/cache/MemoryCacheContainer.java @@ -47,7 +47,7 @@ public Object get(final String key) { } @Override - public Object _put(final String key, final Object data, final Long expire) { + public Object _put(final String key, final Object data, final long expire) { MetaData value = new MetaData(); value.setExpire(expire); value.setData(data); @@ -60,7 +60,7 @@ public Object _put(final String key, final Object data, final Long expire) { } @Override - public Object _putIfAbsent(final String key, final Object data, final Long expire) { + public Object _putIfAbsent(final String key, final Object data, final long expire) { MetaData value = new MetaData(); value.setExpire(expire); value.setData(data); diff --git a/klein-core/src/test/java/com/ofcoder/klein/KleinPropTest.java b/klein-core/src/test/java/com/ofcoder/klein/KleinPropTest.java new file mode 100644 index 00000000..d0859542 --- /dev/null +++ b/klein-core/src/test/java/com/ofcoder/klein/KleinPropTest.java @@ -0,0 +1,15 @@ +package com.ofcoder.klein; + +import org.junit.Assert; +import org.junit.Test; + +public class KleinPropTest { + + @Test + public void testGetStorage() { + KleinProp prop = new KleinProp(); + Assert.assertEquals("file", prop.getStorage()); + prop.setStorage("leveldb"); + Assert.assertEquals("leveldb", prop.getStorage()); + } +} diff --git a/klein-core/src/test/java/com/ofcoder/klein/core/cache/CacheSMTest.java b/klein-core/src/test/java/com/ofcoder/klein/core/cache/CacheSMTest.java new file mode 100644 index 00000000..dc147167 --- /dev/null +++ b/klein-core/src/test/java/com/ofcoder/klein/core/cache/CacheSMTest.java @@ -0,0 +1,117 @@ +package com.ofcoder.klein.core.cache; + +import java.lang.reflect.Field; + +import org.junit.Before; +import org.junit.Test; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNull; +import static org.mockito.Mockito.any; +import static org.mockito.Mockito.anyLong; +import static org.mockito.Mockito.eq; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.never; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +public class CacheSMTest { + + CacheSM cacheSM; + + @Mock + private CacheContainer mockContainer; + + @Before + public void setUp() throws NoSuchFieldException, IllegalAccessException { + MockitoAnnotations.initMocks(this); + cacheSM = new CacheSM(new CacheProp()) { + @Override + public Object makeImage() { + return mockContainer; + } + }; + + Field containerField = CacheSM.class.getDeclaredField("container"); + containerField.setAccessible(true); + containerField.set(cacheSM, mockContainer); + } + + @Test + public void testApplyWithPutOperation() { + CacheMessage message = new CacheMessage(); + message.setOp(CacheMessage.PUT); + message.setKey("key"); + message.setData("data"); + message.setExpire(1000L); + + cacheSM.apply(message); + verify(mockContainer).put(eq("key"), eq("data"), eq(1000L)); + } + + @Test + public void testApplyWithGetOperation() { + CacheMessage message = new CacheMessage(); + message.setOp(CacheMessage.GET); + message.setKey("key"); + + when(mockContainer.get("key")).thenReturn("data"); + + assertEquals("data", cacheSM.apply(message)); + } + + @Test + public void testApplyWithInvalidateOperation() { + CacheMessage message = new CacheMessage(); + message.setOp(CacheMessage.INVALIDATE); + message.setKey("key"); + + cacheSM.apply(message); + verify(mockContainer).remove("key"); + } + + @Test + public void testApplyWithInvalidateAllOperation() { + CacheMessage message = new CacheMessage(); + message.setOp(CacheMessage.INVALIDATEALL); + + cacheSM.apply(message); + verify(mockContainer).clear(); + } + + @Test + public void testApplyWithPutIfPresentOperation() { + CacheMessage message = new CacheMessage(); + message.setOp(CacheMessage.PUTIFPRESENT); + message.setKey("key"); + message.setData("data"); + message.setExpire(1000L); + + when(mockContainer.putIfAbsent("key", "data", 1000L)).thenReturn(true); + + assertEquals(true, cacheSM.apply(message)); + } + + @Test + public void testApplyWithExistOperation() { + CacheMessage message = new CacheMessage(); + message.setOp(CacheMessage.EXIST); + message.setKey("key"); + + when(mockContainer.containsKey("key")).thenReturn(true); + + assertEquals(true, cacheSM.apply(message)); + } + + + @Test + public void testApplyWithUnknownMessage() { + assertNull(cacheSM.apply(new Object())); + verify(mockContainer, never()).put(any(), any(), anyLong()); + verify(mockContainer, never()).get(any()); + verify(mockContainer, never()).remove(any()); + verify(mockContainer, never()).clear(); + } +} diff --git a/klein-core/src/test/java/com/ofcoder/klein/core/cache/CacheSnapTest.java b/klein-core/src/test/java/com/ofcoder/klein/core/cache/CacheSnapTest.java new file mode 100644 index 00000000..8a039c67 --- /dev/null +++ b/klein-core/src/test/java/com/ofcoder/klein/core/cache/CacheSnapTest.java @@ -0,0 +1,25 @@ +package com.ofcoder.klein.core.cache; + +import static org.junit.Assert.assertEquals; +import static org.mockito.Mockito.mock; + +import org.junit.Before; +import org.junit.Test; + +public class CacheSnapTest { + + CacheSnap cacheSnap; + + Object cache; + + @Before + public void setUp() { + cache = mock(Object.class); + cacheSnap = new CacheSnap(cache, null); + } + + @Test + public void testGetCache() { + assertEquals(cache, cacheSnap.getCache()); + } +} diff --git a/klein-core/src/test/java/com/ofcoder/klein/core/cache/MemoryCacheContainerTest.java b/klein-core/src/test/java/com/ofcoder/klein/core/cache/MemoryCacheContainerTest.java index 110815f7..53b77d26 100644 --- a/klein-core/src/test/java/com/ofcoder/klein/core/cache/MemoryCacheContainerTest.java +++ b/klein-core/src/test/java/com/ofcoder/klein/core/cache/MemoryCacheContainerTest.java @@ -1,11 +1,15 @@ package com.ofcoder.klein.core.cache; import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; import junit.framework.TestCase; public class MemoryCacheContainerTest extends TestCase { + MemoryCacheContainer cache; + public void test_MemoryMap_NoUse() { int initialCapacity = 3; LruCacheContainer.MemoryMap cache = new LruCacheContainer.MemoryMap(initialCapacity); @@ -33,4 +37,61 @@ public void test_MemoryMap_Used() { Assert.assertTrue(cache.containsKey("2")); } -} \ No newline at end of file + @Before + public void setUp() { + cache = new MemoryCacheContainer(); + } + + @Test + public void testContainsKey_ExistingKey_Expired() { + // Setup + String key = "key"; + Long expire = 0L; // Expired + Object data = new Object(); + cache._put(key, data, expire); + + // Execute + boolean result = cache.containsKey(key); + + // Verify + assertFalse(result); + } + + @Test + public void testContainsKey_NonExistingKey() { + // Setup + String key = "key"; + + // Execute + boolean result = cache.containsKey(key); + + // Verify + assertFalse(result); + } + + @Test + public void testContainsKey_NullValue() { + // Setup + String key = "key"; + cache._put(key, null, 1000L); + + // Execute + boolean result = cache.containsKey(key); + + // Verify + assertFalse(result); + } + + @Test + public void testContainsKey_ExpiredAndNullValue() { + // Setup + String key = "key"; + cache._put(key, null, 0L); + + // Execute + boolean result = cache.containsKey(key); + + // Verify + assertFalse(result); + } +} diff --git a/klein-spi/src/test/java/com/ofcoder/klein/spi/ExtensionLoaderTest.java b/klein-spi/src/test/java/com/ofcoder/klein/spi/ExtensionLoaderTest.java index 55718429..4a911135 100644 --- a/klein-spi/src/test/java/com/ofcoder/klein/spi/ExtensionLoaderTest.java +++ b/klein-spi/src/test/java/com/ofcoder/klein/spi/ExtensionLoaderTest.java @@ -1,9 +1,13 @@ package com.ofcoder.klein.spi; +import com.ofcoder.klein.spi.ext.DBConnection; + import org.junit.Assert; import org.junit.Test; +import org.mockito.Mockito; -import com.ofcoder.klein.spi.ext.DBConnection; +import java.net.URL; +import java.net.URLClassLoader; /** * @author 释慧利 @@ -12,9 +16,12 @@ public class ExtensionLoaderTest { @Test public void testSameJoin() { - DBConnection zero = ExtensionLoader.getExtensionLoader(DBConnection.class).register("mysql"); - DBConnection first = ExtensionLoader.getExtensionLoader(DBConnection.class).getJoin("mysql"); - DBConnection second = ExtensionLoader.getExtensionLoader(DBConnection.class).getJoin("mysql"); + DBConnection zero = + ExtensionLoader.getExtensionLoader(DBConnection.class).register("mysql"); + DBConnection first = + ExtensionLoader.getExtensionLoader(DBConnection.class).getJoin("mysql"); + DBConnection second = + ExtensionLoader.getExtensionLoader(DBConnection.class).getJoin("mysql"); Assert.assertEquals(first, zero); Assert.assertEquals(first, second); } diff --git a/klein-storage/klein-storage-facade/src/test/java/com/ofcoder/klein/storage/facade/InstanceTest.java b/klein-storage/klein-storage-facade/src/test/java/com/ofcoder/klein/storage/facade/InstanceTest.java new file mode 100644 index 00000000..50329eff --- /dev/null +++ b/klein-storage/klein-storage-facade/src/test/java/com/ofcoder/klein/storage/facade/InstanceTest.java @@ -0,0 +1,32 @@ +package com.ofcoder.klein.storage.facade; + +import static org.junit.Assert.assertEquals; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +import org.junit.Before; +import org.junit.Test; + +public class InstanceTest { + + Instance instance; + + long testInstanceId = 100L; + + @Before + public void setUp() { + instance = mock(Instance.class); + } + + @Test + public void testGetInstanceId() { + when(instance.getInstanceId()).thenReturn(testInstanceId); + + long result = instance.getInstanceId(); + + assertEquals( + "getInstanceId should return the instanceId set in the instance object", + testInstanceId, + result); + } +} diff --git a/klein-storage/klein-storage-facade/src/test/java/com/ofcoder/klein/storage/facade/SnapTest.java b/klein-storage/klein-storage-facade/src/test/java/com/ofcoder/klein/storage/facade/SnapTest.java new file mode 100644 index 00000000..428c766a --- /dev/null +++ b/klein-storage/klein-storage-facade/src/test/java/com/ofcoder/klein/storage/facade/SnapTest.java @@ -0,0 +1,15 @@ +package com.ofcoder.klein.storage.facade; + +import static org.junit.Assert.assertEquals; + +import org.junit.Test; + +public class SnapTest { + + @Test + public void testGetCheckpoint() { + Snap snap = new Snap(); + snap.setCheckpoint(100L); + assertEquals(100L, snap.getCheckpoint()); + } +} diff --git a/klein-storage/klein-storage-facade/src/test/java/com/ofcoder/klein/storage/facade/trace/TracerTest.java b/klein-storage/klein-storage-facade/src/test/java/com/ofcoder/klein/storage/facade/trace/TracerTest.java new file mode 100644 index 00000000..2672c042 --- /dev/null +++ b/klein-storage/klein-storage-facade/src/test/java/com/ofcoder/klein/storage/facade/trace/TracerTest.java @@ -0,0 +1,43 @@ +//package com.ofcoder.klein.storage.facade.trace; +// +//import org.junit.Before; +//import org.junit.Test; +//import org.mockito.Mock; +//import org.mockito.MockedStatic; +// +//import com.ofcoder.klein.spi.ExtensionLoader; +//import com.ofcoder.klein.storage.facade.TraceManager; +//import com.ofcoder.klein.storage.facade.config.StorageProp; +// +//import static org.mockito.Mockito.mockStatic; +//import static org.mockito.Mockito.times; +//import static org.mockito.Mockito.verify; +//import static org.mockito.Mockito.when; +// +//public class TracerTest { +// @Mock +// TraceManager mockManager; +// @Mock +// ExtensionLoader traceManagerExtensionLoader; +// +// @Before +// public void setUp() { +// try (MockedStatic mocked = mockStatic(ExtensionLoader.class)) { +// mocked.when(ExtensionLoader::getExtensionLoader).thenReturn(traceManagerExtensionLoader); +// when(traceManagerExtensionLoader.getJoin("test")).thenReturn(mockManager); +// } +// } +// +// @Test +// public void testTrace() { +// final StorageProp mockProp = new StorageProp(); +// +// final Tracer tracer = new Tracer("test", mockProp); +// +// for (int i = 0; i < 100; i++) { +// tracer.trace("data"); +// } +// +// verify(mockManager, times(100)); +// } +//} diff --git a/pom.xml b/pom.xml index 830daa48..c29aa020 100644 --- a/pom.xml +++ b/pom.xml @@ -73,7 +73,7 @@ 4.13.1 4.11 1.3 - 1.9.5 + 1.10.19 3.21.7 1.50.0