You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@kylin.apache.org by sh...@apache.org on 2020/05/22 14:30:40 UTC

[kylin] 01/02: KYLIN-4508 Add more unit tests for core-metrics module

This is an automated email from the ASF dual-hosted git repository.

shaofengshi pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/kylin.git

commit 2d718c83db2abd91d053b77a44ed4a98648adcdc
Author: Zhong, Yanghong <nj...@apache.org>
AuthorDate: Wed May 20 18:21:19 2020 +0800

    KYLIN-4508 Add more unit tests for core-metrics module
    
    Signed-off-by: shaofengshi <sh...@apache.org>
---
 core-metrics/pom.xml                               |  17 +++
 .../kylin/metrics/lib/impl/BlockingReservoir.java  |  21 +++-
 .../apache/kylin/metrics/lib/impl/RecordEvent.java |   6 +-
 .../kylin/metrics/lib/impl/TimePropertyEnum.java   |   2 +-
 .../metrics/lib/impl/BlockingReservoirTest.java    |  76 ++++++++++++
 .../metrics/lib/impl/InstantReservoirTest.java     |  64 ++++++++++
 .../kylin/metrics/lib/impl/MetricsSystemTest.java  |  67 +++++++++++
 .../kylin/metrics/lib/impl/RecordEventTest.java    |  82 +++++++++++++
 .../metrics/property/MetricsPropertyEnumTest.java  | 132 +++++++++++++++++++++
 9 files changed, 463 insertions(+), 4 deletions(-)

diff --git a/core-metrics/pom.xml b/core-metrics/pom.xml
index b9bc566..eca9e5e 100644
--- a/core-metrics/pom.xml
+++ b/core-metrics/pom.xml
@@ -45,5 +45,22 @@
             <artifactId>metrics-core</artifactId>
         </dependency>
 
+        <dependency>
+            <groupId>com.google.guava</groupId>
+            <artifactId>guava</artifactId>
+        </dependency>
+
+        <!-- Env & Test -->
+        <dependency>
+            <groupId>org.apache.kylin</groupId>
+            <artifactId>kylin-core-common</artifactId>
+            <type>test-jar</type>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>junit</groupId>
+            <artifactId>junit</artifactId>
+            <scope>test</scope>
+        </dependency>
     </dependencies>
 </project>
\ No newline at end of file
diff --git a/core-metrics/src/main/java/org/apache/kylin/metrics/lib/impl/BlockingReservoir.java b/core-metrics/src/main/java/org/apache/kylin/metrics/lib/impl/BlockingReservoir.java
index 6158096..4798e52 100644
--- a/core-metrics/src/main/java/org/apache/kylin/metrics/lib/impl/BlockingReservoir.java
+++ b/core-metrics/src/main/java/org/apache/kylin/metrics/lib/impl/BlockingReservoir.java
@@ -22,6 +22,8 @@ import java.util.List;
 import java.util.concurrent.BlockingQueue;
 import java.util.concurrent.LinkedBlockingQueue;
 
+import com.google.common.annotations.VisibleForTesting;
+import com.google.common.base.Preconditions;
 import org.apache.kylin.metrics.lib.ActiveReservoirListener;
 import org.apache.kylin.metrics.lib.Record;
 import org.slf4j.Logger;
@@ -58,6 +60,10 @@ public class BlockingReservoir extends AbstractActiveReservoir {
     }
 
     public BlockingReservoir(int minReportSize, int maxReportSize, int maxReportTime) {
+        Preconditions.checkArgument(minReportSize > 0, "minReportSize should be larger than 0");
+        Preconditions.checkArgument(maxReportSize >= minReportSize,
+                "maxReportSize should not be less than minBatchSize");
+        Preconditions.checkArgument(maxReportTime > 0, "maxReportTime should be larger than 0");
         this.minReportSize = minReportSize;
         this.maxReportSize = maxReportSize;
         this.maxReportTime = maxReportTime * 60 * 1000L;
@@ -95,9 +101,11 @@ public class BlockingReservoir extends AbstractActiveReservoir {
         if (ifAll) {
             records = Lists.newArrayList();
             recordsQueue.drainTo(records);
+            logger.info("Will report {} metrics records", records.size());
         } else {
             records.clear();
             recordsQueue.drainTo(records, maxReportSize);
+            logger.info("Will report {} metrics records, remaining {} records", records.size(), size());
         }
 
         boolean ifSucceed = true;
@@ -127,9 +135,18 @@ public class BlockingReservoir extends AbstractActiveReservoir {
         return true;
     }
 
-    @Override
-    public void start() {
+    @VisibleForTesting
+    void notifyUpdate() {
+        onRecordUpdate(false);
+    }
+
+    @VisibleForTesting
+    void setReady() {
         super.start();
+    }
+
+    public void start() {
+        setReady();
         scheduledReporter.start();
     }
 
diff --git a/core-metrics/src/main/java/org/apache/kylin/metrics/lib/impl/RecordEvent.java b/core-metrics/src/main/java/org/apache/kylin/metrics/lib/impl/RecordEvent.java
index bc4faf0..59aa7e3 100644
--- a/core-metrics/src/main/java/org/apache/kylin/metrics/lib/impl/RecordEvent.java
+++ b/core-metrics/src/main/java/org/apache/kylin/metrics/lib/impl/RecordEvent.java
@@ -66,6 +66,10 @@ public class RecordEvent implements Record, Map<String, Object>, Serializable {
         this(eventType, LOCAL_HOSTNAME);
     }
 
+    public RecordEvent(String eventType, long time) {
+        this(eventType, LOCAL_HOSTNAME, time);
+    }
+    
     public RecordEvent(String eventType, String host) {
         this(eventType, host, System.currentTimeMillis());
     }
@@ -268,7 +272,7 @@ public class RecordEvent implements Record, Map<String, Object>, Serializable {
             return reserveKey;
         }
 
-        public RecordReserveKeyEnum getByKey(String key) {
+        public static RecordReserveKeyEnum getByKey(String key) {
             for (RecordReserveKeyEnum reserveKey : RecordReserveKeyEnum.values()) {
                 if (reserveKey.reserveKey.equalsIgnoreCase(key)) {
                     return reserveKey;
diff --git a/core-metrics/src/main/java/org/apache/kylin/metrics/lib/impl/TimePropertyEnum.java b/core-metrics/src/main/java/org/apache/kylin/metrics/lib/impl/TimePropertyEnum.java
index 03f188b..01eefa1 100644
--- a/core-metrics/src/main/java/org/apache/kylin/metrics/lib/impl/TimePropertyEnum.java
+++ b/core-metrics/src/main/java/org/apache/kylin/metrics/lib/impl/TimePropertyEnum.java
@@ -38,7 +38,7 @@ public enum TimePropertyEnum {
         this.propertyName = propertyName;
     }
 
-    public static TimePropertyEnum getByPropertyName(String propertyName) {
+    public static TimePropertyEnum getByKey(String propertyName) {
         if (Strings.isNullOrEmpty(propertyName)) {
             return null;
         }
diff --git a/core-metrics/src/test/java/org/apache/kylin/metrics/lib/impl/BlockingReservoirTest.java b/core-metrics/src/test/java/org/apache/kylin/metrics/lib/impl/BlockingReservoirTest.java
new file mode 100644
index 0000000..47c9f46
--- /dev/null
+++ b/core-metrics/src/test/java/org/apache/kylin/metrics/lib/impl/BlockingReservoirTest.java
@@ -0,0 +1,76 @@
+/*
+ * 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.kylin.metrics.lib.impl;
+
+import static org.junit.Assert.assertEquals;
+
+import org.apache.kylin.common.util.LocalFileMetadataTestCase;
+import org.apache.kylin.metrics.lib.Record;
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+public class BlockingReservoirTest extends LocalFileMetadataTestCase {
+
+    @Before
+    public void setUp() throws Exception {
+        this.createTestMetadata();
+    }
+
+    @After
+    public void after() throws Exception {
+        this.cleanupTestMetadata();
+    }
+
+    @Test
+    public void testUpdate() {
+        BlockingReservoir reservoir = new BlockingReservoir();
+
+        Record record = new RecordEvent("TEST");
+        reservoir.update(record);
+        assertEquals(0, reservoir.size());
+
+        reservoir.start();
+        reservoir.update(record);
+        assertEquals(1, reservoir.size());
+
+        reservoir.stop();
+        assertEquals(0, reservoir.size());
+    }
+
+    @Test
+    public void testBatchSize() {
+        BlockingReservoir reservoir = new BlockingReservoir(5, 12);
+        reservoir.setReady();
+
+        for (int i = 0; i < 30; i++) {
+            Record record = new RecordEvent("TEST" + i);
+            reservoir.update(record);
+        }
+        reservoir.notifyUpdate();
+        Assert.assertEquals(18, reservoir.size());
+
+        reservoir.notifyUpdate();
+        Assert.assertEquals(6, reservoir.size());
+
+        reservoir.notifyUpdate();
+        Assert.assertEquals(0, reservoir.size());
+    }
+}
diff --git a/core-metrics/src/test/java/org/apache/kylin/metrics/lib/impl/InstantReservoirTest.java b/core-metrics/src/test/java/org/apache/kylin/metrics/lib/impl/InstantReservoirTest.java
new file mode 100644
index 0000000..982978e
--- /dev/null
+++ b/core-metrics/src/test/java/org/apache/kylin/metrics/lib/impl/InstantReservoirTest.java
@@ -0,0 +1,64 @@
+/*
+ * 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.kylin.metrics.lib.impl;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+import org.apache.kylin.common.util.LocalFileMetadataTestCase;
+import org.apache.kylin.metrics.lib.ActiveReservoirListener;
+import org.apache.kylin.metrics.lib.Record;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+import com.google.common.collect.Lists;
+
+public class InstantReservoirTest extends LocalFileMetadataTestCase {
+
+    @Before
+    public void setUp() throws Exception {
+        this.createTestMetadata();
+    }
+
+    @After
+    public void after() throws Exception {
+        this.cleanupTestMetadata();
+    }
+
+    @Test
+    public void testUpdate() {
+        InstantReservoir reservoir = new InstantReservoir();
+        ActiveReservoirListener listener = new StubReservoirReporter().listener;
+        reservoir.addListener(listener);
+
+        Record record = new RecordEvent("TEST");
+        assertTrue(listener.onRecordUpdate(Lists.newArrayList(record)));
+
+        reservoir.update(record);
+        assertEquals(0, reservoir.size());
+
+        reservoir.start();
+        reservoir.update(record);
+        assertEquals(0, reservoir.size());
+
+        reservoir.stop();
+        assertEquals(0, reservoir.size());
+    }
+}
diff --git a/core-metrics/src/test/java/org/apache/kylin/metrics/lib/impl/MetricsSystemTest.java b/core-metrics/src/test/java/org/apache/kylin/metrics/lib/impl/MetricsSystemTest.java
new file mode 100644
index 0000000..12caf14
--- /dev/null
+++ b/core-metrics/src/test/java/org/apache/kylin/metrics/lib/impl/MetricsSystemTest.java
@@ -0,0 +1,67 @@
+/*
+ * 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.kylin.metrics.lib.impl;
+
+import static org.apache.kylin.metrics.lib.impl.MetricsSystem.Metrics;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+import org.apache.kylin.metrics.lib.ActiveReservoir;
+import org.apache.kylin.metrics.lib.ActiveReservoirRecordFilter;
+import org.junit.Test;
+
+public class MetricsSystemTest {
+
+    @Test(expected = IllegalArgumentException.class)
+    public void testDuplicateRegister() {
+        String name = "test1";
+        Metrics.register(name, new StubReservoir());
+        Metrics.register(name, new StubReservoir());
+    }
+
+    @Test(expected = IllegalArgumentException.class)
+    public void testNullRegister1() {
+        Metrics.register(null, new StubReservoir());
+    }
+
+    @Test
+    public void testActiveReservoir() {
+        //Remove all ActiveReservoirs
+        Metrics.removeActiveReservoirMatching(ActiveReservoirRecordFilter.ALL);
+        assertEquals(0, Metrics.getActiveReservoirs().size());
+
+        //Get all the ActiveReservoirs
+        int n = 10;
+        for (int i = 0; i < n; i++) {
+            Metrics.register("ActiveReservoir-" + i, new StubReservoir());
+        }
+        assertEquals(n, Metrics.getActiveReservoirs().size());
+
+        String name = "test2";
+        ActiveReservoir activeReservoir = new StubReservoir();
+        Metrics.register(name, activeReservoir);
+
+        //Get ActiveReservoir by name
+        assertEquals(activeReservoir, Metrics.activeReservoir(name));
+        //Remove ActiveReservoir by name
+        assertTrue(Metrics.removeActiveReservoir(name));
+        assertFalse(Metrics.removeActiveReservoir(name));
+    }
+}
diff --git a/core-metrics/src/test/java/org/apache/kylin/metrics/lib/impl/RecordEventTest.java b/core-metrics/src/test/java/org/apache/kylin/metrics/lib/impl/RecordEventTest.java
new file mode 100644
index 0000000..0c53d56
--- /dev/null
+++ b/core-metrics/src/test/java/org/apache/kylin/metrics/lib/impl/RecordEventTest.java
@@ -0,0 +1,82 @@
+/*
+ * 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.kylin.metrics.lib.impl;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
+
+import java.io.IOException;
+import java.net.InetAddress;
+import java.net.UnknownHostException;
+import java.util.Map;
+
+import org.apache.kylin.common.util.JsonUtil;
+import org.junit.Test;
+
+import com.google.common.collect.Maps;
+
+public class RecordEventTest {
+
+    @Test(expected = IllegalArgumentException.class)
+    public void testSetEventType() {
+        new RecordEvent(null, System.currentTimeMillis());
+    }
+
+    @Test
+    public void testBasic() throws IOException {
+        String type = "TEST";
+        String localHostname;
+        try {
+            InetAddress addr = InetAddress.getLocalHost();
+            localHostname = addr.getHostName() + ":" + addr.getHostAddress();
+        } catch (UnknownHostException e) {
+            localHostname = "Unknown";
+        }
+        long time = System.currentTimeMillis();
+        RecordEvent event = new RecordEvent(type, localHostname, time);
+
+        assertEquals(type, event.getEventType());
+        assertEquals(localHostname, event.getHost());
+        assertTrue(time == event.getTime());
+
+        String key = "PROJECT";
+        String value = "test";
+        event.put(key, value);
+        assertEquals(value, event.remove(key));
+
+        int len1 = event.size();
+        Map<String, Object> entryMap = Maps.newHashMap();
+        for (int i = 0; i < 5; i++) {
+            entryMap.put(key + "-" + i, value + "-" + i);
+        }
+        event.putAll(entryMap);
+        assertEquals(entryMap.size(), event.size() - len1);
+
+        assertTrue(event.clone().equals(event));
+
+        Map<String, Object> rawValue = JsonUtil.readValue(event.getValue(), Map.class);
+        assertEquals(event.size() - 1, rawValue.size());
+
+        assertNull(rawValue.get(RecordEvent.RecordReserveKeyEnum.EVENT_SUBJECT.toString()));
+
+        event.clear();
+        assertTrue(event.isEmpty());
+    }
+}
diff --git a/core-metrics/src/test/java/org/apache/kylin/metrics/property/MetricsPropertyEnumTest.java b/core-metrics/src/test/java/org/apache/kylin/metrics/property/MetricsPropertyEnumTest.java
new file mode 100644
index 0000000..81471fe
--- /dev/null
+++ b/core-metrics/src/test/java/org/apache/kylin/metrics/property/MetricsPropertyEnumTest.java
@@ -0,0 +1,132 @@
+/*
+ * 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.kylin.metrics.property;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
+
+import org.apache.kylin.metrics.lib.impl.RecordEvent;
+import org.apache.kylin.metrics.lib.impl.TimePropertyEnum;
+import org.junit.Test;
+
+public class MetricsPropertyEnumTest {
+
+    @Test
+    public void testJobPropertyEnum() {
+        assertEquals(JobPropertyEnum.ID_CODE, JobPropertyEnum.getByName("JOB_ID"));
+        assertEquals(JobPropertyEnum.USER, JobPropertyEnum.getByName("KUSER"));
+        assertEquals(JobPropertyEnum.PROJECT, JobPropertyEnum.getByName("PROJECT"));
+        assertEquals(JobPropertyEnum.CUBE, JobPropertyEnum.getByName("CUBE_NAME"));
+        assertEquals(JobPropertyEnum.TYPE, JobPropertyEnum.getByName("JOB_TYPE"));
+        assertEquals(JobPropertyEnum.ALGORITHM, JobPropertyEnum.getByName("CUBING_TYPE"));
+        assertEquals(JobPropertyEnum.STATUS, JobPropertyEnum.getByName("JOB_STATUS"));
+        assertEquals(JobPropertyEnum.EXCEPTION, JobPropertyEnum.getByName("EXCEPTION"));
+        assertEquals(JobPropertyEnum.SOURCE_SIZE, JobPropertyEnum.getByName("TABLE_SIZE"));
+        assertEquals(JobPropertyEnum.CUBE_SIZE, JobPropertyEnum.getByName("CUBE_SIZE"));
+        assertEquals(JobPropertyEnum.BUILD_DURATION, JobPropertyEnum.getByName("DURATION"));
+        assertEquals(JobPropertyEnum.WAIT_RESOURCE_TIME, JobPropertyEnum.getByName("WAIT_RESOURCE_TIME"));
+        assertEquals(JobPropertyEnum.PER_BYTES_TIME_COST, JobPropertyEnum.getByName("PER_BYTES_TIME_COST"));
+        assertEquals(JobPropertyEnum.STEP_DURATION_DISTINCT_COLUMNS,
+                JobPropertyEnum.getByName("STEP_DURATION_DISTINCT_COLUMNS"));
+        assertEquals(JobPropertyEnum.STEP_DURATION_DICTIONARY, JobPropertyEnum.getByName("STEP_DURATION_DICTIONARY"));
+        assertEquals(JobPropertyEnum.STEP_DURATION_INMEM_CUBING,
+                JobPropertyEnum.getByName("STEP_DURATION_INMEM_CUBING"));
+        assertEquals(JobPropertyEnum.STEP_DURATION_HFILE_CONVERT,
+                JobPropertyEnum.getByName("STEP_DURATION_HFILE_CONVERT"));
+        assertNull(RecordEvent.RecordReserveKeyEnum.getByKey(null));
+    }
+
+    @Test
+    public void testQueryPropertyEnum() {
+        assertEquals(QueryPropertyEnum.ID_CODE, QueryPropertyEnum.getByName("QUERY_HASH_CODE"));
+        assertEquals(QueryPropertyEnum.TYPE, QueryPropertyEnum.getByName("QUERY_TYPE"));
+        assertEquals(QueryPropertyEnum.USER, QueryPropertyEnum.getByName("KUSER"));
+        assertEquals(QueryPropertyEnum.PROJECT, QueryPropertyEnum.getByName("PROJECT"));
+        assertEquals(QueryPropertyEnum.REALIZATION, QueryPropertyEnum.getByName("REALIZATION"));
+        assertEquals(QueryPropertyEnum.REALIZATION_TYPE, QueryPropertyEnum.getByName("REALIZATION_TYPE"));
+        assertEquals(QueryPropertyEnum.EXCEPTION, QueryPropertyEnum.getByName("EXCEPTION"));
+        assertEquals(QueryPropertyEnum.TIME_COST, QueryPropertyEnum.getByName("QUERY_TIME_COST"));
+        assertEquals(QueryPropertyEnum.CALCITE_RETURN_COUNT, QueryPropertyEnum.getByName("CALCITE_COUNT_RETURN"));
+        assertEquals(QueryPropertyEnum.STORAGE_RETURN_COUNT, QueryPropertyEnum.getByName("STORAGE_COUNT_RETURN"));
+        assertEquals(QueryPropertyEnum.AGGR_FILTER_COUNT,
+                QueryPropertyEnum.getByName("CALCITE_COUNT_AGGREGATE_FILTER"));
+        assertNull(RecordEvent.RecordReserveKeyEnum.getByKey(null));
+    }
+
+    @Test
+    public void testQueryCubePropertyEnum() {
+        assertEquals(QueryCubePropertyEnum.PROJECT, QueryCubePropertyEnum.getByName("PROJECT"));
+        assertEquals(QueryCubePropertyEnum.CUBE, QueryCubePropertyEnum.getByName("CUBE_NAME"));
+        assertEquals(QueryCubePropertyEnum.SEGMENT, QueryCubePropertyEnum.getByName("SEGMENT_NAME"));
+        assertEquals(QueryCubePropertyEnum.CUBOID_SOURCE, QueryCubePropertyEnum.getByName("CUBOID_SOURCE"));
+        assertEquals(QueryCubePropertyEnum.CUBOID_TARGET, QueryCubePropertyEnum.getByName("CUBOID_TARGET"));
+        assertEquals(QueryCubePropertyEnum.IF_MATCH, QueryCubePropertyEnum.getByName("IF_MATCH"));
+        assertEquals(QueryCubePropertyEnum.FILTER_MASK, QueryCubePropertyEnum.getByName("FILTER_MASK"));
+        assertEquals(QueryCubePropertyEnum.IF_SUCCESS, QueryCubePropertyEnum.getByName("IF_SUCCESS"));
+        assertEquals(QueryCubePropertyEnum.TIME_SUM, QueryCubePropertyEnum.getByName("STORAGE_CALL_TIME_SUM"));
+        assertEquals(QueryCubePropertyEnum.TIME_MAX, QueryCubePropertyEnum.getByName("STORAGE_CALL_TIME_MAX"));
+        assertEquals(QueryCubePropertyEnum.WEIGHT_PER_HIT, QueryCubePropertyEnum.getByName("WEIGHT_PER_HIT"));
+        assertEquals(QueryCubePropertyEnum.CALL_COUNT, QueryCubePropertyEnum.getByName("STORAGE_CALL_COUNT"));
+        assertEquals(QueryCubePropertyEnum.SKIP_COUNT, QueryCubePropertyEnum.getByName("STORAGE_COUNT_SKIP"));
+        assertEquals(QueryCubePropertyEnum.SCAN_COUNT, QueryCubePropertyEnum.getByName("STORAGE_COUNT_SCAN"));
+        assertEquals(QueryCubePropertyEnum.RETURN_COUNT, QueryCubePropertyEnum.getByName("STORAGE_COUNT_RETURN"));
+        assertEquals(QueryCubePropertyEnum.AGGR_FILTER_COUNT,
+                QueryCubePropertyEnum.getByName("STORAGE_COUNT_AGGREGATE_FILTER"));
+        assertEquals(QueryCubePropertyEnum.AGGR_COUNT, QueryCubePropertyEnum.getByName("STORAGE_COUNT_AGGREGATE"));
+        assertNull(RecordEvent.RecordReserveKeyEnum.getByKey(null));
+    }
+
+    @Test
+    public void testQueryRPCPropertyEnum() {
+        assertEquals(QueryRPCPropertyEnum.PROJECT, QueryRPCPropertyEnum.getByName("PROJECT"));
+        assertEquals(QueryRPCPropertyEnum.REALIZATION, QueryRPCPropertyEnum.getByName("REALIZATION"));
+        assertEquals(QueryRPCPropertyEnum.RPC_SERVER, QueryRPCPropertyEnum.getByName("RPC_SERVER"));
+        assertEquals(QueryRPCPropertyEnum.EXCEPTION, QueryRPCPropertyEnum.getByName("EXCEPTION"));
+        assertEquals(QueryRPCPropertyEnum.CALL_TIME, QueryRPCPropertyEnum.getByName("CALL_TIME"));
+        assertEquals(QueryRPCPropertyEnum.SKIP_COUNT, QueryRPCPropertyEnum.getByName("COUNT_SKIP"));
+        assertEquals(QueryRPCPropertyEnum.SCAN_COUNT, QueryRPCPropertyEnum.getByName("COUNT_SCAN"));
+        assertEquals(QueryRPCPropertyEnum.RETURN_COUNT, QueryRPCPropertyEnum.getByName("COUNT_RETURN"));
+        assertEquals(QueryRPCPropertyEnum.AGGR_FILTER_COUNT, QueryRPCPropertyEnum.getByName("COUNT_AGGREGATE_FILTER"));
+        assertEquals(QueryRPCPropertyEnum.AGGR_COUNT, QueryRPCPropertyEnum.getByName("COUNT_AGGREGATE"));
+        assertNull(RecordEvent.RecordReserveKeyEnum.getByKey(null));
+    }
+
+    @Test
+    public void testTimePropertyEnum() {
+        assertEquals(TimePropertyEnum.YEAR, TimePropertyEnum.getByKey("KYEAR_BEGIN_DATE"));
+        assertEquals(TimePropertyEnum.MONTH, TimePropertyEnum.getByKey("KMONTH_BEGIN_DATE"));
+        assertEquals(TimePropertyEnum.WEEK_BEGIN_DATE, TimePropertyEnum.getByKey("KWEEK_BEGIN_DATE"));
+        assertEquals(TimePropertyEnum.DAY_DATE, TimePropertyEnum.getByKey("KDAY_DATE"));
+        assertEquals(TimePropertyEnum.DAY_TIME, TimePropertyEnum.getByKey("KDAY_TIME"));
+        assertEquals(TimePropertyEnum.TIME_HOUR, TimePropertyEnum.getByKey("KTIME_HOUR"));
+        assertEquals(TimePropertyEnum.TIME_MINUTE, TimePropertyEnum.getByKey("KTIME_MINUTE"));
+        assertEquals(TimePropertyEnum.TIME_SECOND, TimePropertyEnum.getByKey("KTIME_SECOND"));
+        assertNull(RecordEvent.RecordReserveKeyEnum.getByKey(null));
+    }
+
+    @Test
+    public void testRecordReserveKeyEnum() {
+        assertEquals(RecordEvent.RecordReserveKeyEnum.EVENT_SUBJECT,
+                RecordEvent.RecordReserveKeyEnum.getByKey("EVENT_TYPE"));
+        assertEquals(RecordEvent.RecordReserveKeyEnum.ID, RecordEvent.RecordReserveKeyEnum.getByKey("EVENT_ID"));
+        assertEquals(RecordEvent.RecordReserveKeyEnum.HOST, RecordEvent.RecordReserveKeyEnum.getByKey("HOST"));
+        assertEquals(RecordEvent.RecordReserveKeyEnum.TIME, RecordEvent.RecordReserveKeyEnum.getByKey("KTIMESTAMP"));
+        assertNull(RecordEvent.RecordReserveKeyEnum.getByKey(null));
+    }
+}
\ No newline at end of file