Change histogram meter validate function (#26)

* Change histogram meter validate function

* Change exception reason

Co-authored-by: Mrproliu <mrproliu@lagou.com>
diff --git a/mock-collector/src/main/java/org/apache/skywalking/plugin/test/mockcollector/entity/Meter.java b/mock-collector/src/main/java/org/apache/skywalking/plugin/test/mockcollector/entity/Meter.java
index ee9e467..cbf247f 100644
--- a/mock-collector/src/main/java/org/apache/skywalking/plugin/test/mockcollector/entity/Meter.java
+++ b/mock-collector/src/main/java/org/apache/skywalking/plugin/test/mockcollector/entity/Meter.java
@@ -31,25 +31,8 @@
 public class Meter {
     private MeterId meterId;
     private Double singleValue;
-    private List<BucketAndValue> histogram;
-
-    public static class BucketAndValue {
-        private double bucket;
-        private long count;
-
-        public BucketAndValue(double bucket, long count) {
-            this.bucket = bucket;
-            this.count = count;
-        }
-
-        public double getBucket() {
-            return bucket;
-        }
-
-        public long getCount() {
-            return count;
-        }
-    }
+    private List<Double> histogramBuckets;
+    private List<Long> histogramValues;
 
     public MeterId getMeterId() {
         return meterId;
@@ -59,7 +42,11 @@
         return singleValue;
     }
 
-    public List<BucketAndValue> getHistogram() {
-        return histogram;
+    public List<Double> getHistogramBuckets() {
+        return histogramBuckets;
+    }
+
+    public List<Long> getHistogramValues() {
+        return histogramValues;
     }
 }
diff --git a/mock-collector/src/main/java/org/apache/skywalking/plugin/test/mockcollector/util/MeterHandler.java b/mock-collector/src/main/java/org/apache/skywalking/plugin/test/mockcollector/util/MeterHandler.java
index a99389a..b78ad9f 100644
--- a/mock-collector/src/main/java/org/apache/skywalking/plugin/test/mockcollector/util/MeterHandler.java
+++ b/mock-collector/src/main/java/org/apache/skywalking/plugin/test/mockcollector/util/MeterHandler.java
@@ -18,6 +18,7 @@
 package org.apache.skywalking.plugin.test.mockcollector.util;
 
 import org.apache.skywalking.apm.network.language.agent.v3.Label;
+import org.apache.skywalking.apm.network.language.agent.v3.MeterBucketValue;
 import org.apache.skywalking.apm.network.language.agent.v3.MeterData;
 import org.apache.skywalking.apm.network.language.agent.v3.MeterHistogram;
 import org.apache.skywalking.apm.network.language.agent.v3.MeterSingleValue;
@@ -55,8 +56,10 @@
                         .name(histogram.getName())
                         .tags(parseTags(histogram.getLabelsList()))
                         .build());
-                    builder.histogram(histogram.getValuesList().stream()
-                        .map(b -> new Meter.BucketAndValue(b.getBucket(), b.getCount())).collect(Collectors.toList()));
+                    builder.histogramBuckets(histogram.getValuesList().stream()
+                        .map(MeterBucketValue::getBucket).collect(Collectors.toList()));
+                    builder.histogramValues(histogram.getValuesList().stream()
+                        .map(MeterBucketValue::getCount).collect(Collectors.toList()));
                     break;
                 case METRIC_NOT_SET:
                     return;
diff --git a/validator/src/main/java/org/apache/skywalking/plugin/test/agent/tool/validator/assertor/MeterAssert.java b/validator/src/main/java/org/apache/skywalking/plugin/test/agent/tool/validator/assertor/MeterAssert.java
index d510905..280599e 100644
--- a/validator/src/main/java/org/apache/skywalking/plugin/test/agent/tool/validator/assertor/MeterAssert.java
+++ b/validator/src/main/java/org/apache/skywalking/plugin/test/agent/tool/validator/assertor/MeterAssert.java
@@ -19,8 +19,9 @@
 
 import org.apache.skywalking.plugin.test.agent.tool.validator.assertor.exception.HistogramSizeNotEqualsException;
 import org.apache.skywalking.plugin.test.agent.tool.validator.assertor.exception.MeterAssertFailedException;
+import org.apache.skywalking.plugin.test.agent.tool.validator.assertor.exception.MeterHistogramValueInvalidException;
 import org.apache.skywalking.plugin.test.agent.tool.validator.assertor.exception.MeterNotFoundException;
-import org.apache.skywalking.plugin.test.agent.tool.validator.entity.BucketAndValue;
+import org.apache.skywalking.plugin.test.agent.tool.validator.assertor.exception.ValueAssertFailedException;
 import org.apache.skywalking.plugin.test.agent.tool.validator.entity.Meter;
 import org.apache.skywalking.plugin.test.agent.tool.validator.entity.MeterItem;
 import org.apache.skywalking.plugin.test.agent.tool.validator.exception.AssertFailedException;
@@ -60,17 +61,30 @@
         } else {
             // histogram
             // check size
-            if (excepted.getHistogram().size() != actual.getHistogram().size()) {
-                throw new HistogramSizeNotEqualsException(excepted, actual.getHistogram().size());
+            if (excepted.getHistogramBuckets().size() != actual.getHistogramBuckets().size()) {
+                throw new HistogramSizeNotEqualsException(excepted, actual.getHistogramBuckets().size());
             }
 
             // check buckets
-            for (int bucketIndex = 0; bucketIndex < excepted.getHistogram().size(); bucketIndex++) {
-                final BucketAndValue exceptedBucket = excepted.getHistogram().get(bucketIndex);
-                final BucketAndValue actualBucket = actual.getHistogram().get(bucketIndex);
+            for (int bucketIndex = 0; bucketIndex < excepted.getHistogramBuckets().size(); bucketIndex++) {
+                final String exceptedBucket = excepted.getHistogramBuckets().get(bucketIndex);
+                final String actualBucket = actual.getHistogramBuckets().get(bucketIndex);
 
-                ExpressParser.parse(exceptedBucket.getBucket()).assertValue("histogram bucket", actualBucket.getBucket());
-                ExpressParser.parse(exceptedBucket.getCount()).assertValue("histogram count[" + actualBucket.getBucket() + "]", actualBucket.getCount());
+                if (!Objects.equals(exceptedBucket, actualBucket)) {
+                    throw new ValueAssertFailedException("histogram bucket", exceptedBucket, actualBucket);
+                }
+            }
+
+            // check values
+            boolean valueContainValid = false;
+            for (String histogramValue : actual.getHistogramValues()) {
+                if (Long.parseLong(histogramValue) > 0) {
+                    valueContainValid = true;
+                    break;
+                }
+            }
+            if (!valueContainValid) {
+                throw new MeterHistogramValueInvalidException(actual.getMeterId());
             }
         }
     }
diff --git a/validator/src/main/java/org/apache/skywalking/plugin/test/agent/tool/validator/assertor/exception/HistogramSizeNotEqualsException.java b/validator/src/main/java/org/apache/skywalking/plugin/test/agent/tool/validator/assertor/exception/HistogramSizeNotEqualsException.java
index 55ad439..b234e03 100644
--- a/validator/src/main/java/org/apache/skywalking/plugin/test/agent/tool/validator/assertor/exception/HistogramSizeNotEqualsException.java
+++ b/validator/src/main/java/org/apache/skywalking/plugin/test/agent/tool/validator/assertor/exception/HistogramSizeNotEqualsException.java
@@ -33,7 +33,7 @@
     public String getCauseMessage() {
         return String.format("HistogramSizeNotEqualsException:\nmeter id:%s\nexpected:%s\nactual:%s\n",
             exceptedMeter.getMeterId(),
-            exceptedMeter.getHistogram().size(),
+            exceptedMeter.getHistogramBuckets().size(),
             actualSize);
     }
 }
diff --git a/validator/src/main/java/org/apache/skywalking/plugin/test/agent/tool/validator/assertor/exception/MeterHistogramValueInvalidException.java b/validator/src/main/java/org/apache/skywalking/plugin/test/agent/tool/validator/assertor/exception/MeterHistogramValueInvalidException.java
new file mode 100644
index 0000000..7bc76aa
--- /dev/null
+++ b/validator/src/main/java/org/apache/skywalking/plugin/test/agent/tool/validator/assertor/exception/MeterHistogramValueInvalidException.java
@@ -0,0 +1,36 @@
+/*
+ * 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.skywalking.plugin.test.agent.tool.validator.assertor.exception;
+
+import org.apache.skywalking.plugin.test.agent.tool.validator.entity.MeterId;
+import org.apache.skywalking.plugin.test.agent.tool.validator.exception.AssertFailedException;
+
+public class MeterHistogramValueInvalidException extends AssertFailedException {
+    private final MeterId meterId;
+
+    public MeterHistogramValueInvalidException(MeterId meterId) {
+        this.meterId = meterId;
+    }
+
+    @Override
+    public String getCauseMessage() {
+        return String.format("MeterHistogramValueInvalidException:\nmeter id:%s\nreason:%s\n",
+            meterId,
+            "One of the histogram bucket value must bigger than 0");
+    }
+}
diff --git a/validator/src/main/java/org/apache/skywalking/plugin/test/agent/tool/validator/entity/Meter.java b/validator/src/main/java/org/apache/skywalking/plugin/test/agent/tool/validator/entity/Meter.java
index 63c97f3..78840e2 100644
--- a/validator/src/main/java/org/apache/skywalking/plugin/test/agent/tool/validator/entity/Meter.java
+++ b/validator/src/main/java/org/apache/skywalking/plugin/test/agent/tool/validator/entity/Meter.java
@@ -22,7 +22,8 @@
 public class Meter {
     private MeterId meterId;
     private String singleValue;
-    private List<BucketAndValue> histogram;
+    private List<String> histogramBuckets;
+    private List<String> histogramValues;
 
     public MeterId getMeterId() {
         return meterId;
@@ -40,11 +41,19 @@
         this.singleValue = singleValue;
     }
 
-    public List<BucketAndValue> getHistogram() {
-        return histogram;
+    public List<String> getHistogramBuckets() {
+        return histogramBuckets;
     }
 
-    public void setHistogram(List<BucketAndValue> histogram) {
-        this.histogram = histogram;
+    public void setHistogramBuckets(List<String> histogramBuckets) {
+        this.histogramBuckets = histogramBuckets;
+    }
+
+    public List<String> getHistogramValues() {
+        return histogramValues;
+    }
+
+    public void setHistogramValues(List<String> histogramValues) {
+        this.histogramValues = histogramValues;
     }
 }