gcapi_omaha_experiment_test.cc revision a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7
1// Copyright 2013 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "chrome/installer/gcapi/gcapi_omaha_experiment.h"
6
7#include "base/strings/utf_string_conversions.h"
8#include "chrome/installer/gcapi/gcapi.h"
9#include "chrome/installer/gcapi/gcapi_test_registry_overrider.h"
10#include "chrome/installer/util/google_update_constants.h"
11#include "chrome/installer/util/google_update_experiment_util.h"
12#include "chrome/installer/util/google_update_settings.h"
13#include "testing/gtest/include/gtest/gtest.h"
14
15namespace {
16
17const wchar_t kBrand[] = L"ABCD";
18const uint16 kUserLevel = GCAPI_INVOKED_STANDARD_SHELL;
19
20const wchar_t kSomeExperiments[] = L"myexp=1|Aug 2;yourexp=2|Sep 5";
21const wchar_t kSomeOtherExperiments[] = L"anotherexp=joe|Jun 7 2008";
22const wchar_t kSomeMoreExperiments[] = L"moreexp=foo|Jul 31 1999";
23
24class GCAPIOmahaExperimentTest : public ::testing::Test {
25 protected:
26  GCAPIOmahaExperimentTest()
27      : brand_(kBrand),
28        reactivation_label_(gcapi_internals::GetGCAPIExperimentLabel(
29            kBrand, gcapi_internals::kReactivationLabel)),
30        relaunch_label_(gcapi_internals::GetGCAPIExperimentLabel(
31            kBrand, gcapi_internals::kRelaunchLabel)) {
32  }
33
34  void VerifyExperimentLabels(const string16& expected_labels) {
35    string16 actual_labels;
36    EXPECT_TRUE(GoogleUpdateSettings::ReadExperimentLabels(false,
37                                                           &actual_labels));
38    EXPECT_EQ(expected_labels, actual_labels);
39  }
40
41  string16 brand_;
42  string16 reactivation_label_;
43  string16 relaunch_label_;
44
45  const GCAPITestRegistryOverrider gcapi_test_registry_overrider_;
46};
47
48TEST_F(GCAPIOmahaExperimentTest, SetReactivationLabelFromEmptyExperiments) {
49  ASSERT_TRUE(SetReactivationExperimentLabels(kBrand, kUserLevel));
50  VerifyExperimentLabels(reactivation_label_);
51}
52
53// Test the relaunch label once; all other tests go more in depth, but since
54// both labels use the same logic underneath there is no need to test both in
55// depth.
56TEST_F(GCAPIOmahaExperimentTest, SetRelaunchLabelFromEmptyExperiments) {
57  ASSERT_TRUE(SetRelaunchExperimentLabels(kBrand, kUserLevel));
58  VerifyExperimentLabels(relaunch_label_);
59}
60
61TEST_F(GCAPIOmahaExperimentTest, SetReactivationLabelWithExistingExperiments) {
62  GoogleUpdateSettings::SetExperimentLabels(false, kSomeExperiments);
63
64  ASSERT_TRUE(SetReactivationExperimentLabels(kBrand, kUserLevel));
65
66  string16 expected_labels(kSomeExperiments);
67  expected_labels.append(ASCIIToUTF16(google_update::kExperimentLabelSep));
68  expected_labels.append(reactivation_label_);
69  VerifyExperimentLabels(expected_labels);
70}
71
72TEST_F(GCAPIOmahaExperimentTest,
73       SetReactivationLabelWithExistingIdenticalExperiment) {
74  string16 previous_labels(kSomeExperiments);
75  previous_labels.append(ASCIIToUTF16(google_update::kExperimentLabelSep));
76  previous_labels.append(reactivation_label_);
77  previous_labels.append(ASCIIToUTF16(google_update::kExperimentLabelSep));
78  previous_labels.append(kSomeOtherExperiments);
79  GoogleUpdateSettings::SetExperimentLabels(false, previous_labels);
80
81  ASSERT_TRUE(SetReactivationExperimentLabels(kBrand, kUserLevel));
82
83  string16 expected_labels(kSomeExperiments);
84  expected_labels.append(ASCIIToUTF16(google_update::kExperimentLabelSep));
85  expected_labels.append(kSomeOtherExperiments);
86  expected_labels.append(ASCIIToUTF16(google_update::kExperimentLabelSep));
87  expected_labels.append(reactivation_label_);
88  VerifyExperimentLabels(expected_labels);
89}
90
91TEST_F(GCAPIOmahaExperimentTest,
92       SetReactivationLabelWithExistingIdenticalAtBeginning) {
93  string16 previous_labels(reactivation_label_);
94  previous_labels.append(ASCIIToUTF16(google_update::kExperimentLabelSep));
95  previous_labels.append(kSomeExperiments);
96  GoogleUpdateSettings::SetExperimentLabels(false, previous_labels);
97
98  ASSERT_TRUE(SetReactivationExperimentLabels(kBrand, kUserLevel));
99
100  string16 expected_labels(kSomeExperiments);
101  expected_labels.append(ASCIIToUTF16(google_update::kExperimentLabelSep));
102  expected_labels.append(reactivation_label_);
103  VerifyExperimentLabels(expected_labels);
104}
105
106TEST_F(GCAPIOmahaExperimentTest,
107       SetReactivationLabelWithFakeMatchInAnExperiment) {
108  string16 previous_labels(kSomeExperiments);
109  previous_labels.append(ASCIIToUTF16(google_update::kExperimentLabelSep));
110  previous_labels.append(L"blah_");
111  // Shouldn't match deletion criteria.
112  previous_labels.append(reactivation_label_);
113  previous_labels.append(ASCIIToUTF16(google_update::kExperimentLabelSep));
114  previous_labels.append(kSomeOtherExperiments);
115  previous_labels.append(ASCIIToUTF16(google_update::kExperimentLabelSep));
116  // Should match the deletion criteria.
117  previous_labels.append(reactivation_label_);
118  previous_labels.append(ASCIIToUTF16(google_update::kExperimentLabelSep));
119  previous_labels.append(kSomeMoreExperiments);
120  GoogleUpdateSettings::SetExperimentLabels(false, previous_labels);
121
122  ASSERT_TRUE(SetReactivationExperimentLabels(kBrand, kUserLevel));
123
124  string16 expected_labels(kSomeExperiments);
125  expected_labels.append(ASCIIToUTF16(google_update::kExperimentLabelSep));
126  expected_labels.append(L"blah_");
127  expected_labels.append(reactivation_label_);
128  expected_labels.append(ASCIIToUTF16(google_update::kExperimentLabelSep));
129  expected_labels.append(kSomeOtherExperiments);
130  expected_labels.append(ASCIIToUTF16(google_update::kExperimentLabelSep));
131  expected_labels.append(kSomeMoreExperiments);
132  expected_labels.append(ASCIIToUTF16(google_update::kExperimentLabelSep));
133  expected_labels.append(reactivation_label_);
134  VerifyExperimentLabels(expected_labels);
135}
136
137TEST_F(GCAPIOmahaExperimentTest,
138       SetReactivationLabelWithFakeMatchInAnExperimentAndNoRealMatch) {
139  string16 previous_labels(kSomeExperiments);
140  previous_labels.append(ASCIIToUTF16(google_update::kExperimentLabelSep));
141  previous_labels.append(L"blah_");
142  // Shouldn't match deletion criteria.
143  previous_labels.append(reactivation_label_);
144  previous_labels.append(ASCIIToUTF16(google_update::kExperimentLabelSep));
145  previous_labels.append(kSomeOtherExperiments);
146  GoogleUpdateSettings::SetExperimentLabels(false, previous_labels);
147
148  ASSERT_TRUE(SetReactivationExperimentLabels(kBrand, kUserLevel));
149
150  string16 expected_labels(kSomeExperiments);
151  expected_labels.append(ASCIIToUTF16(google_update::kExperimentLabelSep));
152  expected_labels.append(L"blah_");
153  expected_labels.append(reactivation_label_);
154  expected_labels.append(ASCIIToUTF16(google_update::kExperimentLabelSep));
155  expected_labels.append(kSomeOtherExperiments);
156  expected_labels.append(ASCIIToUTF16(google_update::kExperimentLabelSep));
157  expected_labels.append(reactivation_label_);
158  VerifyExperimentLabels(expected_labels);
159}
160
161TEST_F(GCAPIOmahaExperimentTest,
162       SetReactivationLabelWithExistingEntryWithLabelAsPrefix) {
163  string16 previous_labels(kSomeExperiments);
164  previous_labels.append(ASCIIToUTF16(google_update::kExperimentLabelSep));
165  // Append prefix matching the label, but not followed by '='.
166  previous_labels.append(gcapi_internals::kReactivationLabel);
167  // Shouldn't match deletion criteria.
168  previous_labels.append(kSomeOtherExperiments);
169  GoogleUpdateSettings::SetExperimentLabels(false, previous_labels);
170
171  ASSERT_TRUE(SetReactivationExperimentLabels(kBrand, kUserLevel));
172
173  string16 expected_labels(kSomeExperiments);
174  expected_labels.append(ASCIIToUTF16(google_update::kExperimentLabelSep));
175  expected_labels.append(gcapi_internals::kReactivationLabel);
176  expected_labels.append(kSomeOtherExperiments);
177  expected_labels.append(ASCIIToUTF16(google_update::kExperimentLabelSep));
178  expected_labels.append(reactivation_label_);
179  VerifyExperimentLabels(expected_labels);
180}
181
182}  // namespace
183