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