1 /*
2  * Copyright 2016-17, 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.Duration;
23 import io.opencensus.stats.Aggregation.Mean;
24 import io.opencensus.stats.View.AggregationWindow.Cumulative;
25 import io.opencensus.stats.View.AggregationWindow.Interval;
26 import io.opencensus.tags.TagKey;
27 import java.util.Arrays;
28 import java.util.Collections;
29 import java.util.List;
30 import org.junit.Rule;
31 import org.junit.Test;
32 import org.junit.rules.ExpectedException;
33 import org.junit.runner.RunWith;
34 import org.junit.runners.JUnit4;
35 
36 /** Tests for {@link View}. */
37 @RunWith(JUnit4.class)
38 public final class ViewTest {
39 
40   @Rule public final ExpectedException thrown = ExpectedException.none();
41 
42   @Test
testConstants()43   public void testConstants() {
44     assertThat(View.NAME_MAX_LENGTH).isEqualTo(255);
45   }
46 
47   @Test
sortTagKeys()48   public void sortTagKeys() {
49     final View view =
50         View.create(
51             NAME,
52             DESCRIPTION,
53             MEASURE,
54             MEAN,
55             Arrays.asList(
56                 TagKey.create("ab"), TagKey.create("a"), TagKey.create("A"), TagKey.create("b")));
57     assertThat(view.getColumns())
58         .containsExactly(
59             TagKey.create("A"), TagKey.create("a"), TagKey.create("ab"), TagKey.create("b"))
60         .inOrder();
61   }
62 
63   @Test
testDistributionView()64   public void testDistributionView() {
65     final View view = View.create(NAME, DESCRIPTION, MEASURE, MEAN, KEYS);
66     assertThat(view.getName()).isEqualTo(NAME);
67     assertThat(view.getDescription()).isEqualTo(DESCRIPTION);
68     assertThat(view.getMeasure().getName()).isEqualTo(MEASURE.getName());
69     assertThat(view.getAggregation()).isEqualTo(MEAN);
70     assertThat(view.getColumns()).containsExactly(BAR, FOO).inOrder();
71     assertThat(view.getWindow()).isEqualTo(Cumulative.create());
72   }
73 
74   @Test
testIntervalView()75   public void testIntervalView() {
76     final View view = View.create(NAME, DESCRIPTION, MEASURE, MEAN, KEYS, Interval.create(MINUTE));
77     assertThat(view.getName()).isEqualTo(NAME);
78     assertThat(view.getDescription()).isEqualTo(DESCRIPTION);
79     assertThat(view.getMeasure().getName()).isEqualTo(MEASURE.getName());
80     assertThat(view.getAggregation()).isEqualTo(MEAN);
81     assertThat(view.getColumns()).containsExactly(BAR, FOO).inOrder();
82     assertThat(view.getWindow()).isEqualTo(Interval.create(MINUTE));
83   }
84 
85   @Test
testViewEquals()86   public void testViewEquals() {
87     new EqualsTester()
88         .addEqualityGroup(
89             View.create(NAME, DESCRIPTION, MEASURE, MEAN, KEYS),
90             View.create(NAME, DESCRIPTION, MEASURE, MEAN, KEYS, Cumulative.create()))
91         .addEqualityGroup(
92             View.create(NAME, DESCRIPTION + 2, MEASURE, MEAN, KEYS, Cumulative.create()))
93         .addEqualityGroup(
94             View.create(NAME, DESCRIPTION, MEASURE, MEAN, KEYS, Interval.create(MINUTE)),
95             View.create(NAME, DESCRIPTION, MEASURE, MEAN, KEYS, Interval.create(MINUTE)))
96         .addEqualityGroup(
97             View.create(NAME, DESCRIPTION, MEASURE, MEAN, KEYS, Interval.create(TWO_MINUTES)))
98         .testEquals();
99   }
100 
101   @Test
preventDuplicateColumns()102   public void preventDuplicateColumns() {
103     TagKey key1 = TagKey.create("duplicate");
104     TagKey key2 = TagKey.create("duplicate");
105     thrown.expect(IllegalArgumentException.class);
106     thrown.expectMessage("Columns have duplicate.");
107     View.create(NAME, DESCRIPTION, MEASURE, MEAN, Arrays.asList(key1, key2));
108   }
109 
110   @Test(expected = NullPointerException.class)
preventNullViewName()111   public void preventNullViewName() {
112     View.create(null, DESCRIPTION, MEASURE, MEAN, KEYS);
113   }
114 
115   @Test
preventTooLongViewName()116   public void preventTooLongViewName() {
117     char[] chars = new char[View.NAME_MAX_LENGTH + 1];
118     Arrays.fill(chars, 'a');
119     String longName = String.valueOf(chars);
120     thrown.expect(IllegalArgumentException.class);
121     View.Name.create(longName);
122   }
123 
124   @Test
preventNonPrintableViewName()125   public void preventNonPrintableViewName() {
126     thrown.expect(IllegalArgumentException.class);
127     View.Name.create("\2");
128   }
129 
130   @Test
testViewName()131   public void testViewName() {
132     assertThat(View.Name.create("my name").asString()).isEqualTo("my name");
133   }
134 
135   @Test(expected = NullPointerException.class)
preventNullNameString()136   public void preventNullNameString() {
137     View.Name.create(null);
138   }
139 
140   @Test(expected = IllegalArgumentException.class)
preventNegativeIntervalDuration()141   public void preventNegativeIntervalDuration() {
142     Interval.create(NEG_TEN_SECONDS);
143   }
144 
145   @Test
testViewNameEquals()146   public void testViewNameEquals() {
147     new EqualsTester()
148         .addEqualityGroup(View.Name.create("view-1"), View.Name.create("view-1"))
149         .addEqualityGroup(View.Name.create("view-2"))
150         .testEquals();
151   }
152 
153   private static final View.Name NAME = View.Name.create("test-view-name");
154   private static final String DESCRIPTION = "test-view-name description";
155   private static final Measure MEASURE =
156       Measure.MeasureDouble.create("measure", "measure description", "1");
157   private static final TagKey FOO = TagKey.create("foo");
158   private static final TagKey BAR = TagKey.create("bar");
159   private static final List<TagKey> KEYS = Collections.unmodifiableList(Arrays.asList(FOO, BAR));
160   private static final Mean MEAN = Mean.create();
161   private static final Duration MINUTE = Duration.create(60, 0);
162   private static final Duration TWO_MINUTES = Duration.create(120, 0);
163   private static final Duration NEG_TEN_SECONDS = Duration.create(-10, 0);
164 }
165