1a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch// Copyright 2014 The Chromium Authors. All rights reserved.
2a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch// Use of this source code is governed by a BSD-style license that can be
3a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch// found in the LICENSE file.
4a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
5a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include "components/variations/study_filtering.h"
6a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
7a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include <vector>
8a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
9a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include "base/strings/string_split.h"
10a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include "components/variations/processed_study.h"
11a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include "testing/gtest/include/gtest/gtest.h"
12a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)namespace variations {
14a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
15a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochnamespace {
16a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
17a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch// Converts |time| to Study proto format.
18a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochint64 TimeToProtoTime(const base::Time& time) {
19a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  return (time - base::Time::UnixEpoch()).InSeconds();
20a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch}
21a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
22a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch// Adds an experiment to |study| with the specified |name| and |probability|.
23a02191e04bc25c4935f804f2c080ae28663d096dBen MurdochStudy_Experiment* AddExperiment(const std::string& name, int probability,
24a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                                Study* study) {
25a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  Study_Experiment* experiment = study->add_experiment();
26a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  experiment->set_name(name);
27a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  experiment->set_probability_weight(probability);
28a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  return experiment;
29a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch}
30a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
31a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch}  // namespace
32a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
33a02191e04bc25c4935f804f2c080ae28663d096dBen MurdochTEST(VariationsStudyFilteringTest, CheckStudyChannel) {
34a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  const Study_Channel channels[] = {
35a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    Study_Channel_CANARY,
36a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    Study_Channel_DEV,
37a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    Study_Channel_BETA,
38a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    Study_Channel_STABLE,
39a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  };
40a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  bool channel_added[arraysize(channels)] = { 0 };
41a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
42a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  Study_Filter filter;
43a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
44a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  // Check in the forwarded order. The loop cond is <= arraysize(channels)
45a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  // instead of < so that the result of adding the last channel gets checked.
46a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  for (size_t i = 0; i <= arraysize(channels); ++i) {
47a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    for (size_t j = 0; j < arraysize(channels); ++j) {
48a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      const bool expected = channel_added[j] || filter.channel_size() == 0;
49a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      const bool result = internal::CheckStudyChannel(filter, channels[j]);
50a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      EXPECT_EQ(expected, result) << "Case " << i << "," << j << " failed!";
51a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    }
52a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
53a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    if (i < arraysize(channels)) {
54a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      filter.add_channel(channels[i]);
55a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      channel_added[i] = true;
56a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    }
57a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  }
58a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
59a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  // Do the same check in the reverse order.
60a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  filter.clear_channel();
61a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  memset(&channel_added, 0, sizeof(channel_added));
62a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  for (size_t i = 0; i <= arraysize(channels); ++i) {
63a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    for (size_t j = 0; j < arraysize(channels); ++j) {
64a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      const bool expected = channel_added[j] || filter.channel_size() == 0;
65a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      const bool result = internal::CheckStudyChannel(filter, channels[j]);
66a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      EXPECT_EQ(expected, result) << "Case " << i << "," << j << " failed!";
67a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    }
68a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
69a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    if (i < arraysize(channels)) {
70a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      const int index = arraysize(channels) - i - 1;
71a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      filter.add_channel(channels[index]);
72a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      channel_added[index] = true;
73a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    }
74a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  }
75a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch}
76a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
77a02191e04bc25c4935f804f2c080ae28663d096dBen MurdochTEST(VariationsStudyFilteringTest, CheckStudyFormFactor) {
78a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  const Study_FormFactor form_factors[] = {
79a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    Study_FormFactor_DESKTOP,
80a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    Study_FormFactor_PHONE,
81a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    Study_FormFactor_TABLET,
82a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  };
83a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
84a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  ASSERT_EQ(Study_FormFactor_FormFactor_ARRAYSIZE,
85a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch            static_cast<int>(arraysize(form_factors)));
86a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
87a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  bool form_factor_added[arraysize(form_factors)] = { 0 };
88a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  Study_Filter filter;
89a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
90a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  for (size_t i = 0; i <= arraysize(form_factors); ++i) {
91a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    for (size_t j = 0; j < arraysize(form_factors); ++j) {
92a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      const bool expected = form_factor_added[j] ||
93a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                            filter.form_factor_size() == 0;
94a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      const bool result = internal::CheckStudyFormFactor(filter,
95a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                                                         form_factors[j]);
96a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      EXPECT_EQ(expected, result) << "Case " << i << "," << j << " failed!";
97a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    }
98a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
99a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    if (i < arraysize(form_factors)) {
100a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      filter.add_form_factor(form_factors[i]);
101a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      form_factor_added[i] = true;
102a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    }
103a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  }
104a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
105a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  // Do the same check in the reverse order.
106a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  filter.clear_form_factor();
107a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  memset(&form_factor_added, 0, sizeof(form_factor_added));
108a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  for (size_t i = 0; i <= arraysize(form_factors); ++i) {
109a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    for (size_t j = 0; j < arraysize(form_factors); ++j) {
110a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      const bool expected = form_factor_added[j] ||
111a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                            filter.form_factor_size() == 0;
112a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      const bool result = internal::CheckStudyFormFactor(filter,
113a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                                                         form_factors[j]);
114a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      EXPECT_EQ(expected, result) << "Case " << i << "," << j << " failed!";
115a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    }
116a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
117a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    if (i < arraysize(form_factors)) {
118a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      const int index = arraysize(form_factors) - i - 1;;
119a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      filter.add_form_factor(form_factors[index]);
120a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      form_factor_added[index] = true;
121a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    }
122a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  }
123a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch}
124a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
125a02191e04bc25c4935f804f2c080ae28663d096dBen MurdochTEST(VariationsStudyFilteringTest, CheckStudyLocale) {
126a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  struct {
127a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    const char* filter_locales;
128a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    bool en_us_result;
129a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    bool en_ca_result;
130a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    bool fr_result;
131a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  } test_cases[] = {
132a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    {"en-US", true, false, false},
133a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    {"en-US,en-CA,fr", true, true, true},
134a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    {"en-US,en-CA,en-GB", true, true, false},
135a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    {"en-GB,en-CA,en-US", true, true, false},
136a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    {"ja,kr,vi", false, false, false},
137a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    {"fr-CA", false, false, false},
138a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    {"", true, true, true},
139a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  };
140a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
141a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  for (size_t i = 0; i < ARRAYSIZE_UNSAFE(test_cases); ++i) {
142a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    std::vector<std::string> filter_locales;
143a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    Study_Filter filter;
144a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    base::SplitString(test_cases[i].filter_locales, ',', &filter_locales);
145a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    for (size_t j = 0; j < filter_locales.size(); ++j)
146a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      filter.add_locale(filter_locales[j]);
147a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    EXPECT_EQ(test_cases[i].en_us_result,
148a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch              internal::CheckStudyLocale(filter, "en-US"));
149a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    EXPECT_EQ(test_cases[i].en_ca_result,
150a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch              internal::CheckStudyLocale(filter, "en-CA"));
151a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    EXPECT_EQ(test_cases[i].fr_result,
152a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch              internal::CheckStudyLocale(filter, "fr"));
153a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  }
154a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch}
155a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
156a02191e04bc25c4935f804f2c080ae28663d096dBen MurdochTEST(VariationsStudyFilteringTest, CheckStudyPlatform) {
157a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  const Study_Platform platforms[] = {
158a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    Study_Platform_PLATFORM_WINDOWS,
159a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    Study_Platform_PLATFORM_MAC,
160a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    Study_Platform_PLATFORM_LINUX,
161a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    Study_Platform_PLATFORM_CHROMEOS,
162a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    Study_Platform_PLATFORM_ANDROID,
163a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    Study_Platform_PLATFORM_IOS,
164a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  };
165a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  ASSERT_EQ(Study_Platform_Platform_ARRAYSIZE,
166a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch            static_cast<int>(arraysize(platforms)));
167a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  bool platform_added[arraysize(platforms)] = { 0 };
168a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
169a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  Study_Filter filter;
170a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
171a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  // Check in the forwarded order. The loop cond is <= arraysize(platforms)
172a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  // instead of < so that the result of adding the last channel gets checked.
173a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  for (size_t i = 0; i <= arraysize(platforms); ++i) {
174a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    for (size_t j = 0; j < arraysize(platforms); ++j) {
175a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      const bool expected = platform_added[j] || filter.platform_size() == 0;
176a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      const bool result = internal::CheckStudyPlatform(filter, platforms[j]);
177a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      EXPECT_EQ(expected, result) << "Case " << i << "," << j << " failed!";
178a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    }
179a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
180a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    if (i < arraysize(platforms)) {
181a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      filter.add_platform(platforms[i]);
182a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      platform_added[i] = true;
183a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    }
184a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  }
185a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
186a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  // Do the same check in the reverse order.
187a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  filter.clear_platform();
188a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  memset(&platform_added, 0, sizeof(platform_added));
189a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  for (size_t i = 0; i <= arraysize(platforms); ++i) {
190a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    for (size_t j = 0; j < arraysize(platforms); ++j) {
191a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      const bool expected = platform_added[j] || filter.platform_size() == 0;
192a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      const bool result = internal::CheckStudyPlatform(filter, platforms[j]);
193a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      EXPECT_EQ(expected, result) << "Case " << i << "," << j << " failed!";
194a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    }
195a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
196a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    if (i < arraysize(platforms)) {
197a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      const int index = arraysize(platforms) - i - 1;
198a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      filter.add_platform(platforms[index]);
199a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      platform_added[index] = true;
200a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    }
201a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  }
202a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch}
203a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
204a02191e04bc25c4935f804f2c080ae28663d096dBen MurdochTEST(VariationsStudyFilteringTest, CheckStudyStartDate) {
205a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  const base::Time now = base::Time::Now();
206a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  const base::TimeDelta delta = base::TimeDelta::FromHours(1);
207a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  const struct {
208a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    const base::Time start_date;
209a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    bool expected_result;
210a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  } start_test_cases[] = {
211a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    { now - delta, true },
212a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    { now, true },
213a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    { now + delta, false },
214a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  };
215a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
216a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  Study_Filter filter;
217a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
218a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  // Start date not set should result in true.
219a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_TRUE(internal::CheckStudyStartDate(filter, now));
220a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
221a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  for (size_t i = 0; i < ARRAYSIZE_UNSAFE(start_test_cases); ++i) {
222a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    filter.set_start_date(TimeToProtoTime(start_test_cases[i].start_date));
223a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    const bool result = internal::CheckStudyStartDate(filter, now);
224a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    EXPECT_EQ(start_test_cases[i].expected_result, result)
225a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch        << "Case " << i << " failed!";
226a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  }
227a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch}
228a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
229a02191e04bc25c4935f804f2c080ae28663d096dBen MurdochTEST(VariationsStudyFilteringTest, CheckStudyVersion) {
230a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  const struct {
231a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    const char* min_version;
232a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    const char* version;
233a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    bool expected_result;
234a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  } min_test_cases[] = {
235a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    { "1.2.2", "1.2.3", true },
236a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    { "1.2.3", "1.2.3", true },
237a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    { "1.2.4", "1.2.3", false },
238a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    { "1.3.2", "1.2.3", false },
239a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    { "2.1.2", "1.2.3", false },
240a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    { "0.3.4", "1.2.3", true },
241a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    // Wildcards.
242a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    { "1.*", "1.2.3", true },
243a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    { "1.2.*", "1.2.3", true },
244a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    { "1.2.3.*", "1.2.3", true },
245a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    { "1.2.4.*", "1.2.3", false },
246a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    { "2.*", "1.2.3", false },
247a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    { "0.3.*", "1.2.3", true },
248a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  };
249a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
250a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  const struct {
251a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    const char* max_version;
252a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    const char* version;
253a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    bool expected_result;
254a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  } max_test_cases[] = {
255a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    { "1.2.2", "1.2.3", false },
256a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    { "1.2.3", "1.2.3", true },
257a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    { "1.2.4", "1.2.3", true },
258a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    { "2.1.1", "1.2.3", true },
259a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    { "2.1.1", "2.3.4", false },
260a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    // Wildcards
261a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    { "2.1.*", "2.3.4", false },
262a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    { "2.*", "2.3.4", true },
263a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    { "2.3.*", "2.3.4", true },
264a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    { "2.3.4.*", "2.3.4", true },
265a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    { "2.3.4.0.*", "2.3.4", true },
266a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    { "2.4.*", "2.3.4", true },
267a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    { "1.3.*", "2.3.4", false },
268a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    { "1.*", "2.3.4", false },
269a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  };
270a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
271a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  Study_Filter filter;
272a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
273a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  // Min/max version not set should result in true.
274a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_TRUE(internal::CheckStudyVersion(filter, base::Version("1.2.3")));
275a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
276a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  for (size_t i = 0; i < ARRAYSIZE_UNSAFE(min_test_cases); ++i) {
277a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    filter.set_min_version(min_test_cases[i].min_version);
278a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    const bool result =
279a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch        internal::CheckStudyVersion(filter, Version(min_test_cases[i].version));
280a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    EXPECT_EQ(min_test_cases[i].expected_result, result) <<
281a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch        "Min. version case " << i << " failed!";
282a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  }
283a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  filter.clear_min_version();
284a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
285a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  for (size_t i = 0; i < ARRAYSIZE_UNSAFE(max_test_cases); ++i) {
286a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    filter.set_max_version(max_test_cases[i].max_version);
287a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    const bool result =
288a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch        internal::CheckStudyVersion(filter, Version(max_test_cases[i].version));
289a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    EXPECT_EQ(max_test_cases[i].expected_result, result) <<
290a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch        "Max version case " << i << " failed!";
291a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  }
292a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
293a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  // Check intersection semantics.
294a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  for (size_t i = 0; i < ARRAYSIZE_UNSAFE(min_test_cases); ++i) {
295a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    for (size_t j = 0; j < ARRAYSIZE_UNSAFE(max_test_cases); ++j) {
296a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      filter.set_min_version(min_test_cases[i].min_version);
297a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      filter.set_max_version(max_test_cases[j].max_version);
298a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
299a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      if (!min_test_cases[i].expected_result) {
300a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch        const bool result =
301a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch            internal::CheckStudyVersion(
302a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                filter, Version(min_test_cases[i].version));
303a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch        EXPECT_FALSE(result) << "Case " << i << "," << j << " failed!";
304a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      }
305a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
306a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      if (!max_test_cases[j].expected_result) {
307a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch        const bool result =
308a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch            internal::CheckStudyVersion(
309a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                filter, Version(max_test_cases[j].version));
310a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch        EXPECT_FALSE(result) << "Case " << i << "," << j << " failed!";
311a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      }
312a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    }
313a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  }
314a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch}
315a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
316010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TEST(VariationsStudyFilteringTest, CheckStudyHardwareClass) {
317010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  struct {
318010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    const char* hardware_class;
319010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    const char* exclude_hardware_class;
320010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    const char* actual_hardware_class;
321010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    bool expected_result;
322010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  } test_cases[] = {
323010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    // Neither filtered nor excluded set:
324010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    // True since empty is always a match.
325010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    {"", "", "fancy INTEL pear device", true},
326010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    {"", "", "", true},
327010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
328010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    // Filtered set:
329010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    {"apple,pear,orange", "", "apple", true},
330010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    {"apple,pear,orange", "", "fancy INTEL pear device", true},
331010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    {"apple,pear,orange", "", "fancy INTEL GRAPE device", false},
332010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    // Somehow tagged as both, but still valid.
333010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    {"apple,pear,orange", "", "fancy INTEL pear GRAPE device", true},
334010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    // Substring, so still valid.
335010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    {"apple,pear,orange", "", "fancy INTEL SNapple device", true},
336010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    // No issues with doubling.
337010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    {"apple,pear,orange", "", "fancy orange orange device", true},
338010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    // Empty, which is what would happen for non ChromeOS platforms.
339010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    {"apple,pear,orange", "", "", false},
340010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
341010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    // Excluded set:
342010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    {"", "apple,pear,orange", "apple", false},
343010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    {"", "apple,pear,orange", "fancy INTEL pear device", false},
344010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    {"", "apple,pear,orange", "fancy INTEL GRAPE device", true},
345010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    // Somehow tagged as both. Very excluded!
346010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    {"", "apple,pear,orange", "fancy INTEL pear GRAPE device", false},
347010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    // Substring, so still invalid.
348010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    {"", "apple,pear,orange", "fancy INTEL SNapple device", false},
349010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    // Empty.
350010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    {"", "apple,pear,orange", "", true},
351010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
352010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    // Not testing when both are set as it should never occur and should be
353010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    // considered undefined.
354010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  };
355010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
356010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  for (size_t i = 0; i < ARRAYSIZE_UNSAFE(test_cases); ++i) {
357010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    Study_Filter filter;
358010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    std::vector<std::string> hardware_class;
359010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    base::SplitString(test_cases[i].hardware_class, ',', &hardware_class);
360010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    for (size_t j = 0; j < hardware_class.size(); ++j)
361010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      filter.add_hardware_class(hardware_class[j]);
362010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
363010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    std::vector<std::string> exclude_hardware_class;
364010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    base::SplitString(test_cases[i].exclude_hardware_class, ',',
365010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                      &exclude_hardware_class);
366010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    for (size_t j = 0; j < exclude_hardware_class.size(); ++j)
367010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      filter.add_exclude_hardware_class(exclude_hardware_class[j]);
368010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
369010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    EXPECT_EQ(test_cases[i].expected_result,
370010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)              internal::CheckStudyHardwareClass(
371010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                  filter, test_cases[i].actual_hardware_class));
372010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  }
373010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
374010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
375a02191e04bc25c4935f804f2c080ae28663d096dBen MurdochTEST(VariationsStudyFilteringTest, FilterAndValidateStudies) {
376a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  const std::string kTrial1Name = "A";
377a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  const std::string kGroup1Name = "Group1";
378a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  const std::string kTrial3Name = "B";
379a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
380a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  VariationsSeed seed;
381a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  Study* study1 = seed.add_study();
382a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  study1->set_name(kTrial1Name);
383a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  study1->set_default_experiment_name("Default");
384a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  AddExperiment(kGroup1Name, 100, study1);
385a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  AddExperiment("Default", 0, study1);
386a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
387a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  Study* study2 = seed.add_study();
388a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  *study2 = *study1;
389a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  study2->mutable_experiment(0)->set_name("Bam");
390a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  ASSERT_EQ(seed.study(0).name(), seed.study(1).name());
391a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
392a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  Study* study3 = seed.add_study();
393a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  study3->set_name(kTrial3Name);
394a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  study3->set_default_experiment_name("Default");
395a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  AddExperiment("A", 10, study3);
396a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  AddExperiment("Default", 25, study3);
397a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
398a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  std::vector<ProcessedStudy> processed_studies;
399a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  FilterAndValidateStudies(
400a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      seed, "en-CA", base::Time::Now(), base::Version("20.0.0.0"),
401010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      Study_Channel_STABLE, Study_FormFactor_DESKTOP, "", &processed_studies);
402a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
403a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  // Check that only the first kTrial1Name study was kept.
404a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  ASSERT_EQ(2U, processed_studies.size());
405a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_EQ(kTrial1Name, processed_studies[0].study()->name());
406a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_EQ(kGroup1Name, processed_studies[0].study()->experiment(0).name());
407a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_EQ(kTrial3Name, processed_studies[1].study()->name());
408a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch}
409a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
410a02191e04bc25c4935f804f2c080ae28663d096dBen MurdochTEST(VariationsStudyFilteringTest, IsStudyExpired) {
411a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  const base::Time now = base::Time::Now();
412a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  const base::TimeDelta delta = base::TimeDelta::FromHours(1);
413a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  const struct {
414a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    const base::Time expiry_date;
415a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    bool expected_result;
416a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  } expiry_test_cases[] = {
417a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    { now - delta, true },
418a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    { now, true },
419a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    { now + delta, false },
420a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  };
421a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
422a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  Study study;
423a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
424a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  // Expiry date not set should result in false.
425a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_FALSE(internal::IsStudyExpired(study, now));
426a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
427a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  for (size_t i = 0; i < ARRAYSIZE_UNSAFE(expiry_test_cases); ++i) {
428a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    study.set_expiry_date(TimeToProtoTime(expiry_test_cases[i].expiry_date));
429a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    const bool result = internal::IsStudyExpired(study, now);
430a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    EXPECT_EQ(expiry_test_cases[i].expected_result, result)
431a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch        << "Case " << i << " failed!";
432a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  }
433a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch}
434a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
435a02191e04bc25c4935f804f2c080ae28663d096dBen MurdochTEST(VariationsStudyFilteringTest, ValidateStudy) {
436a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  Study study;
437a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  study.set_default_experiment_name("def");
438a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  AddExperiment("abc", 100, &study);
439a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  Study_Experiment* default_group = AddExperiment("def", 200, &study);
440a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
441a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  ProcessedStudy processed_study;
442a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_TRUE(processed_study.Init(&study, false));
443a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_EQ(300, processed_study.total_probability());
444a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
445a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  // Min version checks.
446a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  study.mutable_filter()->set_min_version("1.2.3.*");
447a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_TRUE(processed_study.Init(&study, false));
448a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  study.mutable_filter()->set_min_version("1.*.3");
449a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_FALSE(processed_study.Init(&study, false));
450a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  study.mutable_filter()->set_min_version("1.2.3");
451a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_TRUE(processed_study.Init(&study, false));
452a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
453a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  // Max version checks.
454a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  study.mutable_filter()->set_max_version("2.3.4.*");
455a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_TRUE(processed_study.Init(&study, false));
456a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  study.mutable_filter()->set_max_version("*.3");
457a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_FALSE(processed_study.Init(&study, false));
458a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  study.mutable_filter()->set_max_version("2.3.4");
459a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_TRUE(processed_study.Init(&study, false));
460a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
461a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  study.clear_default_experiment_name();
462a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_FALSE(processed_study.Init(&study, false));
463a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
464a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  study.set_default_experiment_name("xyz");
465a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_FALSE(processed_study.Init(&study, false));
466a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
467a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  study.set_default_experiment_name("def");
468a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  default_group->clear_name();
469a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_FALSE(processed_study.Init(&study, false));
470a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
471a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  default_group->set_name("def");
472a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_TRUE(processed_study.Init(&study, false));
473a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  Study_Experiment* repeated_group = study.add_experiment();
474a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  repeated_group->set_name("abc");
475a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  repeated_group->set_probability_weight(1);
476a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_FALSE(processed_study.Init(&study, false));
477a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch}
478a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
4795f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}  // namespace variations
480