diff --git a/skywalking-api/pom.xml b/skywalking-api/pom.xml
index c0a71cb9609475f8f6e30325c6ffd2c2f48f6c6c..5cced7e8e82c34d6ce44344c4f7ed89706a47741 100644
--- a/skywalking-api/pom.xml
+++ b/skywalking-api/pom.xml
@@ -46,9 +46,9 @@
- junit
- junit
- 4.12
+ com.ai.cloud
+ skywalking-test-api
+ 1.0-Final
test
diff --git a/skywalking-api/src/main/java/com/ai/cloud/skywalking/buffer/BufferGroup.java b/skywalking-api/src/main/java/com/ai/cloud/skywalking/buffer/BufferGroup.java
index f012b66a9304bfb17eef47f4ccd861dad19402be..0a532149840fd6982be26d3744a0b73c3065101b 100644
--- a/skywalking-api/src/main/java/com/ai/cloud/skywalking/buffer/BufferGroup.java
+++ b/skywalking-api/src/main/java/com/ai/cloud/skywalking/buffer/BufferGroup.java
@@ -16,6 +16,7 @@ import static com.ai.cloud.skywalking.conf.Config.Consumer.*;
public class BufferGroup {
private static Logger logger = LogManager.getLogger(BufferGroup.class);
private String groupName;
+ //注意: 修改这个变量名,需要修改test-api工程的Config类中的SPAN_ARRAY_FIELD_NAME变量
private Span[] dataBuffer = new Span[BUFFER_MAX_SIZE];
AtomicRangeInteger index = new AtomicRangeInteger(0, BUFFER_MAX_SIZE);
diff --git a/skywalking-api/src/main/java/com/ai/cloud/skywalking/buffer/ContextBuffer.java b/skywalking-api/src/main/java/com/ai/cloud/skywalking/buffer/ContextBuffer.java
index a45317af2ac7ecf50f144729735980468a386b71..8409c17ed20ce410453a3fc109c50adbfda0bdca 100644
--- a/skywalking-api/src/main/java/com/ai/cloud/skywalking/buffer/ContextBuffer.java
+++ b/skywalking-api/src/main/java/com/ai/cloud/skywalking/buffer/ContextBuffer.java
@@ -28,6 +28,7 @@ public class ContextBuffer {
static class BufferPool {
+ // 注意: 这个变量名如果改变需要改变test-api工程中的Config变量
private static BufferGroup[] bufferGroups = new BufferGroup[POOL_SIZE];
static {
for (int i = 0; i < POOL_SIZE; i++) {
diff --git a/skywalking-api/src/test/java/test/ai/cloud/assertspandata/TraceTreeAssertTest.java b/skywalking-api/src/test/java/test/ai/cloud/assertspandata/TraceTreeAssertTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..24d8661c957283f01ca0ce9431077b888754ae9e
--- /dev/null
+++ b/skywalking-api/src/test/java/test/ai/cloud/assertspandata/TraceTreeAssertTest.java
@@ -0,0 +1,25 @@
+package test.ai.cloud.assertspandata;
+
+import com.ai.cloud.skywalking.buffer.ContextBuffer;
+import com.ai.cloud.skywalking.conf.Config;
+import com.ai.cloud.skywalking.protocol.Span;
+import org.junit.Test;
+import test.com.ai.skywalking.test.api.TraceTreeAssert;
+
+/**
+ * Created by xin on 16-6-6.
+ */
+public class TraceTreeAssertTest {
+
+ @Test
+ public void traceTreeAssertTest() {
+ Config.Consumer.MAX_CONSUMER = 0;
+ Span testSpan = new Span("1.0b.1465224457414.7e57f54.22905.61.2691", "", 0, "test-application", "5");
+ testSpan.setViewPointId("http://hire.asiainfo.com/Aisse-Mobile-Web/aisseWorkPage/submitReimbursement");
+ ContextBuffer.save(testSpan);
+ TraceTreeAssert.assertEquals(new String[][]{
+ {null, "0", "http://hire.asiainfo.com/Aisse-Mobile-Web/aisseWorkPage/submitReimbursement", null}
+ });
+
+ }
+}
diff --git a/skywalking-api/src/test/resources/sky-walking.auth b/skywalking-api/src/test/resources/sky-walking.auth
index 5ff5360490afa9027008aa2e6329e9791ed8bf13..5b8bfafcf27fa4b4d617d18751fc37b2aaa85a7d 100644
--- a/skywalking-api/src/test/resources/sky-walking.auth
+++ b/skywalking-api/src/test/resources/sky-walking.auth
@@ -31,7 +31,7 @@ sender.is_off=false
#最大消费线程数
-consumer.max_consumer=2
+consumer.max_consumer=0
#消费者最大等待时间
consumer.max_wait_time=5
#发送失败等待时间
diff --git a/test/skywalking-agent-test/redis-test/pom.xml b/test/skywalking-agent-test/redis-test/pom.xml
index d26241bbebb6c78d6d4fd1cdf2fc4e98114afa6a..4c8e3b0c538d4986f4fc6b218d45cef37f5ac943 100644
--- a/test/skywalking-agent-test/redis-test/pom.xml
+++ b/test/skywalking-agent-test/redis-test/pom.xml
@@ -1,38 +1,43 @@
-
- com.ai.cloud
- skywalking-agent-test
- 1.0-Final
-
- 4.0.0
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+
+ com.ai.cloud
+ skywalking-agent-test
+ 1.0-Final
+
+ 4.0.0
- redis-test
- jar
+ redis-test
+ jar
- redis-test
- http://maven.apache.org
+ redis-test
+ http://maven.apache.org
-
- UTF-8
-
+
+ UTF-8
+
-
-
- junit
- junit
- 4.12
- test
-
-
- org.apache.logging.log4j
- log4j-core
- 2.4.1
-
-
- redis.clients
- jedis
- 2.8.1
-
-
+
+
+ junit
+ junit
+ 4.12
+ test
+
+
+ org.apache.logging.log4j
+ log4j-core
+ 2.4.1
+
+
+ com.ai.cloud
+ skywalking-test-api
+ 1.0-Final
+
+
+ redis.clients
+ jedis
+ 2.8.1
+
+
diff --git a/test/skywalking-agent-test/redis-test/src/main/java/com/ai/cloud/skywalking/agent/test/RedisPluginTest.java b/test/skywalking-agent-test/redis-test/src/main/java/com/ai/cloud/skywalking/agent/test/RedisPluginTest.java
index 5f0c9ae3968dcd756a28b08e4335bd146b280968..6d3aea175e6dac31b56a344a835a78ecc1c0f515 100644
--- a/test/skywalking-agent-test/redis-test/src/main/java/com/ai/cloud/skywalking/agent/test/RedisPluginTest.java
+++ b/test/skywalking-agent-test/redis-test/src/main/java/com/ai/cloud/skywalking/agent/test/RedisPluginTest.java
@@ -1,7 +1,12 @@
package com.ai.cloud.skywalking.agent.test;
+import test.com.ai.skywalking.reflect.api.TraceTreeAssert;
+
public class RedisPluginTest {
public static void main(String[] args) {
RedisOperator.setData("key1", "value1");
+ TraceTreeAssert.assertEquals(new String[][]{
+ {null, "0", "127.0.0.1:6379 set", "key=key1"},
+ });
}
}
diff --git a/test/skywalking-agent-test/redis-test/src/main/resources/sky-walking.auth b/test/skywalking-agent-test/redis-test/src/main/resources/sky-walking.auth
index 5e4c0b8dc719f8ac63be01991abef515036c317b..dd58a4968de2dd10f11f663948e55862d3dc3e6c 100644
--- a/test/skywalking-agent-test/redis-test/src/main/resources/sky-walking.auth
+++ b/test/skywalking-agent-test/redis-test/src/main/resources/sky-walking.auth
@@ -4,9 +4,9 @@ buriedpoint.businesskey_max_length=300
sender.retry_get_sender_wait_interval=2000
buffer.pool_size=5
senderchecker.check_polling_time=200
-sender.is_off=true
+sender.is_off=false
sender.max_send_length=20000
-consumer.max_consumer=2
+consumer.max_consumer=0
consumer.max_wait_time=5
sender.max_copy_num=2
skywalking.application_code=redis-plugin-test
diff --git a/test/skywalking-test-api/pom.xml b/test/skywalking-test-api/pom.xml
index 012f97b66005e3504a28f25ada297593d27b223e..0e7ccd75d7ad0298e38afda5209763f6b08a1764 100644
--- a/test/skywalking-test-api/pom.xml
+++ b/test/skywalking-test-api/pom.xml
@@ -22,7 +22,7 @@
com.ai.cloud
- skywalking-api
+ skywalking-protocol
${parent.version}
diff --git a/test/skywalking-test-api/src/main/java/test/com/ai/skywalking/api/TraceTreeAssert.java b/test/skywalking-test-api/src/main/java/test/com/ai/skywalking/api/TraceTreeAssert.java
deleted file mode 100644
index 969bde189619a4a3a2f8a6dd8bc70ffd153ae773..0000000000000000000000000000000000000000
--- a/test/skywalking-test-api/src/main/java/test/com/ai/skywalking/api/TraceTreeAssert.java
+++ /dev/null
@@ -1,32 +0,0 @@
-package test.com.ai.skywalking.api;
-
-import com.ai.cloud.skywalking.protocol.Span;
-
-import java.util.List;
-
-public class TraceTreeAssert {
-
- public static void assertEquals(String[][] assertTraceTree) {
- List bufferTraceSpanList = TraceTreeDataAcquirer.acquireCurrentTraceSpanData();
- validateTraceId(bufferTraceSpanList);
- validateTraceSpanSize(bufferTraceSpanList.size(), assertTraceTree.length);
- validateSpanData(bufferTraceSpanList, assertTraceTree);
- }
-
- private static void validateTraceSpanSize(int actualSpanSize, int expectedSpanSize) {
- if (actualSpanSize != expectedSpanSize) {
- throw new RuntimeException("expected span size : " + expectedSpanSize + "\n actual span size : " + actualSpanSize);
- }
- }
-
- private static void validateSpanData(List traceSpanList, String[][] traceTree) {
-
- }
-
- private static void validateTraceId(List traceSpanList) {
- String traceId = null;
- for (Span span : traceSpanList) {
-
- }
- }
-}
diff --git a/test/skywalking-test-api/src/main/java/test/com/ai/skywalking/api/TraceTreeDataAcquirer.java b/test/skywalking-test-api/src/main/java/test/com/ai/skywalking/api/TraceTreeDataAcquirer.java
deleted file mode 100644
index 99d7b058b16aa028aae89bb7e1570eafa3652427..0000000000000000000000000000000000000000
--- a/test/skywalking-test-api/src/main/java/test/com/ai/skywalking/api/TraceTreeDataAcquirer.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package test.com.ai.skywalking.api;
-
-import com.ai.cloud.skywalking.protocol.Span;
-
-import java.util.List;
-
-public class TraceTreeDataAcquirer {
- public static List acquireCurrentTraceSpanData() {
-
- return null;
- }
-}
diff --git a/test/skywalking-test-api/src/main/java/test/com/ai/skywalking/test/api/TraceTreeAssert.java b/test/skywalking-test-api/src/main/java/test/com/ai/skywalking/test/api/TraceTreeAssert.java
new file mode 100644
index 0000000000000000000000000000000000000000..399d7d85a202ad410326a3aaa9791b54c48ff7de
--- /dev/null
+++ b/test/skywalking-test-api/src/main/java/test/com/ai/skywalking/test/api/TraceTreeAssert.java
@@ -0,0 +1,102 @@
+package test.com.ai.skywalking.test.api;
+
+import com.ai.cloud.skywalking.protocol.Span;
+
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+public class TraceTreeAssert {
+
+ public static void assertEquals(String[][] expectedTraceTree) {
+ List spanDataInBuffer = TraceTreeDataAcquirer.acquireCurrentTraceSpanData();
+
+ validateTraceId(spanDataInBuffer);
+
+ Set assertSpanData = distinctAndConvertSpanData(spanDataInBuffer);
+ Set expectedSpanData = distinctAndConvertSpanData(expectedTraceTree);
+
+ validateTraceSpanSize(expectedSpanData.size(), assertSpanData.size());
+ validateSpanData(expectedSpanData, assertSpanData);
+ }
+
+ private static Set distinctAndConvertSpanData(List assertSpanData) {
+ Set resultSpanData = new HashSet<>();
+ for (Span span : assertSpanData) {
+ StringBuffer tmpSpanDataStr = new StringBuffer(jointTraceLevelId(span.getParentLevel(), span.getLevelId() + " "));
+ tmpSpanDataStr.append(span.getViewPointId().trim() + " ")
+ .append(span.getBusinessKey().trim() + " ");
+
+ resultSpanData.add(tmpSpanDataStr.toString());
+ }
+ return resultSpanData;
+ }
+
+ private static String jointTraceLevelId(String parentLevelId, String levelId) {
+ String traceLevelId = "";
+ if (parentLevelId != null && parentLevelId.length() > 0) {
+ traceLevelId = parentLevelId + ".";
+ }
+ traceLevelId += levelId;
+ return traceLevelId;
+ }
+
+ private static Set distinctAndConvertSpanData(String[][] assertTraceTree) {
+ Set resultSpanData = new HashSet();
+ for (String[] spanDataArray : assertTraceTree) {
+ if (spanDataArray.length != 4) {
+ throw new IllegalArgumentException("assert trace tree is illegal, " +
+ "Format :\tParentLevelId\t|\tlevelId\t|\tviewPoint\t|\tbusinesskey");
+ }
+
+ StringBuffer tmpSpanDataStr = new StringBuffer(jointTraceLevelId(spanDataArray[0], spanDataArray[1]) + " ");
+ tmpSpanDataStr.append(spanDataArray[2] == null ? " " : spanDataArray[2].trim() + " ")
+ .append(spanDataArray[3] == null ? " " : spanDataArray[3].trim() + " ");
+
+ resultSpanData.add(tmpSpanDataStr.toString());
+ }
+
+ return resultSpanData;
+ }
+
+
+ private static void validateTraceSpanSize(int actualSpanSize, int expectedSpanSize) {
+ if (actualSpanSize != expectedSpanSize) {
+ throw new RuntimeException("expected span size : " + expectedSpanSize +
+ "\n actual span size : " + actualSpanSize);
+ }
+ }
+
+ private static void validateSpanData(Set expectedSpanData, Set assertTraceTree) {
+ for (String assertSpanDataStr : assertTraceTree) {
+ if (expectedSpanData.contains(assertSpanDataStr)) {
+ expectedSpanData.remove(assertSpanDataStr);
+ }
+ }
+
+ if (expectedSpanData.size() != 0) {
+ StringBuffer stringBuffer = new StringBuffer();
+ for (String expectedSpan : expectedSpanData) {
+ stringBuffer.append(expectedSpan + "\n");
+ }
+
+ throw new RuntimeException("actual trace tree is not contain those span as follow:\n" + stringBuffer);
+ }
+
+ }
+
+ private static void validateTraceId(List traceSpanList) {
+ String traceId = null;
+ for (Span span : traceSpanList) {
+ if (traceId == null) {
+ traceId = span.getTraceId();
+ }
+
+ if (!traceId.equals(span.getTraceId())) {
+ throw new RuntimeException("trace id is not all the same.trace id :" +
+ traceId + ",Error trace id :" + span.getTraceId());
+ }
+
+ }
+ }
+}
diff --git a/test/skywalking-test-api/src/main/java/test/com/ai/skywalking/test/api/TraceTreeDataAcquirer.java b/test/skywalking-test-api/src/main/java/test/com/ai/skywalking/test/api/TraceTreeDataAcquirer.java
new file mode 100644
index 0000000000000000000000000000000000000000..f1d33b94c51ba80932c36ff07c9f870e54ce7ed7
--- /dev/null
+++ b/test/skywalking-test-api/src/main/java/test/com/ai/skywalking/test/api/TraceTreeDataAcquirer.java
@@ -0,0 +1,60 @@
+package test.com.ai.skywalking.test.api;
+
+import com.ai.cloud.skywalking.protocol.Span;
+import test.com.ai.skywalking.test.api.config.Config;
+
+import java.lang.reflect.Field;
+import java.util.ArrayList;
+import java.util.List;
+
+public class TraceTreeDataAcquirer {
+ public static List acquireCurrentTraceSpanData() {
+ List resultSpan = new ArrayList();
+ Object[] bufferGroupObjectArray = acquireBufferGroupObjectArrayByClassLoader();
+
+ for (Object bufferGroup : bufferGroupObjectArray) {
+ Span[] spanList = acquireSpanData(bufferGroup);
+ for (Span span : spanList) {
+ if (span != null) {
+ resultSpan.add(span);
+ }
+ }
+ }
+
+ return resultSpan;
+ }
+
+ private static Span[] acquireSpanData(Object bufferGroup) {
+ try {
+ Class bufferGroupClass = Thread.currentThread().getContextClassLoader()
+ .loadClass(Config.BUFFER_GROUP_CLASS_NAME);
+ Field spanArrayField = bufferGroupClass.getDeclaredField(Config.SPAN_ARRAY_FIELD_NAME);
+ spanArrayField.setAccessible(true);
+ return (Span[]) spanArrayField.get(bufferGroup);
+ } catch (Exception e) {
+ throw new RuntimeException("Failed to acquire span array",e);
+ }
+ }
+
+
+ private static Object[] acquireBufferGroupObjectArrayByClassLoader() {
+ try {
+ Class bufferPoolClass = fetchBufferPoolClass();
+ Field field = fetchBufferPoolObject(bufferPoolClass);
+ return (Object[]) field.get(bufferPoolClass);
+ } catch (Exception e) {
+ throw new RuntimeException("Failed to acquire buffer group object array",e);
+ }
+ }
+
+ private static Field fetchBufferPoolObject(Class bufferPoolClass) throws NoSuchFieldException {
+ Field field = bufferPoolClass.getDeclaredField(Config.BUFFER_GROUP_FIELD_NAME);
+ field.setAccessible(true);
+ return field;
+ }
+
+ private static Class fetchBufferPoolClass() throws ClassNotFoundException {
+ ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
+ return classLoader.loadClass(Config.BUFFER_POOL_CLASS_NAME);
+ }
+}
diff --git a/test/skywalking-test-api/src/main/java/test/com/ai/skywalking/test/api/config/Config.java b/test/skywalking-test-api/src/main/java/test/com/ai/skywalking/test/api/config/Config.java
new file mode 100644
index 0000000000000000000000000000000000000000..eb4e98ab3eb08235fc7f0a74b11f121a2b9e9f42
--- /dev/null
+++ b/test/skywalking-test-api/src/main/java/test/com/ai/skywalking/test/api/config/Config.java
@@ -0,0 +1,12 @@
+package test.com.ai.skywalking.test.api.config;
+
+public class Config {
+
+ public static String BUFFER_POOL_CLASS_NAME = "com.ai.cloud.skywalking.buffer.ContextBuffer$BufferPool";
+
+ public static String BUFFER_GROUP_FIELD_NAME = "bufferGroups";
+
+ public static String BUFFER_GROUP_CLASS_NAME = "com.ai.cloud.skywalking.buffer.BufferGroup";
+
+ public static String SPAN_ARRAY_FIELD_NAME = "dataBuffer";
+}
diff --git a/test/skywalking-test-api/src/test/java/test/com/ai/skywalking/reflect/SubClassReflect.java b/test/skywalking-test-api/src/test/java/test/com/ai/skywalking/reflect/SubClassReflect.java
new file mode 100644
index 0000000000000000000000000000000000000000..c1bfd7ca1cba278aab84dc18c37736d23924fb7f
--- /dev/null
+++ b/test/skywalking-test-api/src/test/java/test/com/ai/skywalking/reflect/SubClassReflect.java
@@ -0,0 +1,25 @@
+package test.com.ai.skywalking.reflect;
+
+import org.junit.Test;
+
+import java.lang.reflect.Field;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+
+/**
+ * Created by xin on 16-6-6.
+ */
+public class SubClassReflect {
+
+ @Test
+ public void fetchSubClassField() throws ClassNotFoundException, NoSuchFieldException, IllegalAccessException {
+ ClassLoader loader = Thread.currentThread().getContextClassLoader();
+ Class testSubClass = loader.loadClass("test.com.ai.skywalking.reflect.TestClass$TestSubClass");
+ Field field = testSubClass.getDeclaredField("testStringArray");
+ assertNotNull(field);
+ field.setAccessible(true);
+ Object[] objects = (Object[]) field.get(testSubClass);
+ assertEquals(5, objects.length);
+ }
+}
diff --git a/test/skywalking-test-api/src/test/java/test/com/ai/skywalking/reflect/TestClass.java b/test/skywalking-test-api/src/test/java/test/com/ai/skywalking/reflect/TestClass.java
new file mode 100644
index 0000000000000000000000000000000000000000..2f3a73f6057d327c404ca40367d53ddcf7949916
--- /dev/null
+++ b/test/skywalking-test-api/src/test/java/test/com/ai/skywalking/reflect/TestClass.java
@@ -0,0 +1,10 @@
+package test.com.ai.skywalking.reflect;
+
+public class TestClass {
+
+ private static TestSubClass testSubClass = new TestSubClass();
+
+ static class TestSubClass {
+ private static String[] testStringArray = new String[5];
+ }
+}