1 /* 2 * Copyright 2017, OpenCensus Authors 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package io.opencensus.stats; 18 19 import static com.google.common.truth.Truth.assertThat; 20 21 import com.google.common.testing.EqualsTester; 22 import io.opencensus.common.Function; 23 import io.opencensus.common.Functions; 24 import io.opencensus.common.Timestamp; 25 import io.opencensus.metrics.data.AttachmentValue; 26 import io.opencensus.metrics.data.AttachmentValue.AttachmentValueString; 27 import io.opencensus.metrics.data.Exemplar; 28 import io.opencensus.stats.AggregationData.CountData; 29 import io.opencensus.stats.AggregationData.DistributionData; 30 import io.opencensus.stats.AggregationData.LastValueDataDouble; 31 import io.opencensus.stats.AggregationData.LastValueDataLong; 32 import io.opencensus.stats.AggregationData.MeanData; 33 import io.opencensus.stats.AggregationData.SumDataDouble; 34 import io.opencensus.stats.AggregationData.SumDataLong; 35 import java.util.ArrayList; 36 import java.util.Arrays; 37 import java.util.Collections; 38 import java.util.List; 39 import java.util.Map; 40 import org.junit.Rule; 41 import org.junit.Test; 42 import org.junit.rules.ExpectedException; 43 import org.junit.runner.RunWith; 44 import org.junit.runners.JUnit4; 45 46 /** Unit tests for {@link io.opencensus.stats.AggregationData}. */ 47 @RunWith(JUnit4.class) 48 public class AggregationDataTest { 49 50 private static final double TOLERANCE = 1e-6; 51 private static final Timestamp TIMESTAMP_1 = Timestamp.create(1, 0); 52 private static final Timestamp TIMESTAMP_2 = Timestamp.create(2, 0); 53 private static final AttachmentValue ATTACHMENT_VALUE = AttachmentValueString.create("value"); 54 private static final Map<String, AttachmentValue> ATTACHMENTS = 55 Collections.singletonMap("key", ATTACHMENT_VALUE); 56 57 @Rule public ExpectedException thrown = ExpectedException.none(); 58 59 @Test testCreateDistributionData()60 public void testCreateDistributionData() { 61 DistributionData distributionData = 62 DistributionData.create(7.7, 10, 32.2, Arrays.asList(4L, 1L, 5L)); 63 assertThat(distributionData.getMean()).isWithin(TOLERANCE).of(7.7); 64 assertThat(distributionData.getCount()).isEqualTo(10); 65 assertThat(distributionData.getSumOfSquaredDeviations()).isWithin(TOLERANCE).of(32.2); 66 assertThat(distributionData.getBucketCounts()).containsExactly(4L, 1L, 5L).inOrder(); 67 } 68 69 @Test testCreateDistributionDataWithExemplar()70 public void testCreateDistributionDataWithExemplar() { 71 Exemplar exemplar1 = Exemplar.create(4, TIMESTAMP_2, ATTACHMENTS); 72 Exemplar exemplar2 = Exemplar.create(1, TIMESTAMP_1, ATTACHMENTS); 73 DistributionData distributionData = 74 DistributionData.create( 75 7.7, 10, 32.2, Arrays.asList(4L, 1L), Arrays.asList(exemplar1, exemplar2)); 76 assertThat(distributionData.getExemplars()).containsExactly(exemplar1, exemplar2).inOrder(); 77 } 78 79 @Test preventNullBucketCountList()80 public void preventNullBucketCountList() { 81 thrown.expect(NullPointerException.class); 82 thrown.expectMessage("bucketCounts"); 83 DistributionData.create(1, 1, 0, null); 84 } 85 86 @Test preventNullBucket()87 public void preventNullBucket() { 88 thrown.expect(NullPointerException.class); 89 thrown.expectMessage("bucketCount"); 90 DistributionData.create(1, 1, 0, Arrays.asList(0L, 1L, null)); 91 } 92 93 @Test preventNullExemplarList()94 public void preventNullExemplarList() { 95 thrown.expect(NullPointerException.class); 96 thrown.expectMessage("exemplars"); 97 DistributionData.create(1, 1, 0, Arrays.asList(0L, 1L, 1L), null); 98 } 99 100 @Test preventNullExemplar()101 public void preventNullExemplar() { 102 thrown.expect(NullPointerException.class); 103 thrown.expectMessage("exemplar"); 104 DistributionData.create( 105 1, 1, 0, Arrays.asList(0L, 1L, 1L), Collections.<Exemplar>singletonList(null)); 106 } 107 108 @Test testEquals()109 public void testEquals() { 110 new EqualsTester() 111 .addEqualityGroup(SumDataDouble.create(10.0), SumDataDouble.create(10.0)) 112 .addEqualityGroup(SumDataDouble.create(20.0), SumDataDouble.create(20.0)) 113 .addEqualityGroup(SumDataLong.create(20), SumDataLong.create(20)) 114 .addEqualityGroup(CountData.create(40), CountData.create(40)) 115 .addEqualityGroup(CountData.create(80), CountData.create(80)) 116 .addEqualityGroup( 117 DistributionData.create(10, 10, 0, Arrays.asList(0L, 10L, 0L)), 118 DistributionData.create(10, 10, 0, Arrays.asList(0L, 10L, 0L))) 119 .addEqualityGroup(DistributionData.create(10, 10, 0, Arrays.asList(0L, 10L, 100L))) 120 .addEqualityGroup(DistributionData.create(110, 10, 0, Arrays.asList(0L, 10L, 0L))) 121 .addEqualityGroup(DistributionData.create(10, 110, 0, Arrays.asList(0L, 10L, 0L))) 122 .addEqualityGroup(DistributionData.create(10, 10, 10, Arrays.asList(0L, 10L, 0L))) 123 .addEqualityGroup(DistributionData.create(10, 10, 0, Arrays.asList(0L, 110L, 0L))) 124 .addEqualityGroup(MeanData.create(5.0, 1), MeanData.create(5.0, 1)) 125 .addEqualityGroup(MeanData.create(-5.0, 1), MeanData.create(-5.0, 1)) 126 .addEqualityGroup(LastValueDataDouble.create(20.0), LastValueDataDouble.create(20.0)) 127 .addEqualityGroup(LastValueDataLong.create(20), LastValueDataLong.create(20)) 128 .testEquals(); 129 } 130 131 @Test testMatchAndGet()132 public void testMatchAndGet() { 133 List<AggregationData> aggregations = 134 Arrays.asList( 135 SumDataDouble.create(10.0), 136 SumDataLong.create(100000000), 137 CountData.create(40), 138 DistributionData.create(1, 1, 0, Arrays.asList(0L, 10L, 0L)), 139 LastValueDataDouble.create(20.0), 140 LastValueDataLong.create(200000000L)); 141 142 final List<Object> actual = new ArrayList<Object>(); 143 for (AggregationData aggregation : aggregations) { 144 aggregation.match( 145 new Function<SumDataDouble, Void>() { 146 @Override 147 public Void apply(SumDataDouble arg) { 148 actual.add(arg.getSum()); 149 return null; 150 } 151 }, 152 new Function<SumDataLong, Void>() { 153 @Override 154 public Void apply(SumDataLong arg) { 155 actual.add(arg.getSum()); 156 return null; 157 } 158 }, 159 new Function<CountData, Void>() { 160 @Override 161 public Void apply(CountData arg) { 162 actual.add(arg.getCount()); 163 return null; 164 } 165 }, 166 new Function<DistributionData, Void>() { 167 @Override 168 public Void apply(DistributionData arg) { 169 actual.add(arg.getBucketCounts()); 170 return null; 171 } 172 }, 173 new Function<LastValueDataDouble, Void>() { 174 @Override 175 public Void apply(LastValueDataDouble arg) { 176 actual.add(arg.getLastValue()); 177 return null; 178 } 179 }, 180 new Function<LastValueDataLong, Void>() { 181 @Override 182 public Void apply(LastValueDataLong arg) { 183 actual.add(arg.getLastValue()); 184 return null; 185 } 186 }, 187 Functions.<Void>throwIllegalArgumentException()); 188 } 189 190 assertThat(actual) 191 .containsExactly(10.0, 100000000L, 40L, Arrays.asList(0L, 10L, 0L), 20.0, 200000000L) 192 .inOrder(); 193 } 194 } 195