| Index: common/experiment_labels_unittest.cc
|
| diff --git a/common/experiment_labels_unittest.cc b/common/experiment_labels_unittest.cc
|
| deleted file mode 100644
|
| index 1cc0e50f4ab75ecbbc17c205c79fe9df50f1a365..0000000000000000000000000000000000000000
|
| --- a/common/experiment_labels_unittest.cc
|
| +++ /dev/null
|
| @@ -1,729 +0,0 @@
|
| -// Copyright 2011 Google Inc.
|
| -//
|
| -// Licensed under the Apache License, Version 2.0 (the "License");
|
| -// you may not use this file except in compliance with the License.
|
| -// You may obtain a copy of the License at
|
| -//
|
| -// http://www.apache.org/licenses/LICENSE-2.0
|
| -//
|
| -// Unless required by applicable law or agreed to in writing, software
|
| -// distributed under the License is distributed on an "AS IS" BASIS,
|
| -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
| -// See the License for the specific language governing permissions and
|
| -// limitations under the License.
|
| -// ========================================================================
|
| -
|
| -#include "omaha/common/experiment_labels.h"
|
| -#include "omaha/testing/resource.h"
|
| -#include "omaha/testing/unit_test.h"
|
| -
|
| -namespace omaha {
|
| -
|
| -namespace {
|
| -
|
| -#define LABEL_DELIMITER_KV _T("=")
|
| -#define LABEL_DELIMITER_EX _T("|")
|
| -#define LABEL_DELIMITER_LA _T(";")
|
| -
|
| -#define LABELONE_KEY _T("test_key_1")
|
| -#define LABELONE_VALUE _T("test_value_1")
|
| -#define LABELONE_EXP_STR _T("Fri, 14 Aug 2015 16:13:03 GMT")
|
| -#define LABELONE_EXP_INT 130840423830000000uI64
|
| -#define LABELONE_COMBINED LABELONE_KEY \
|
| - LABEL_DELIMITER_KV \
|
| - LABELONE_VALUE \
|
| - LABEL_DELIMITER_EX \
|
| - LABELONE_EXP_STR
|
| -
|
| -#define LABELTWO_KEY _T("test_key_2")
|
| -#define LABELTWO_VALUE _T("test_value_2")
|
| -#define LABELTWO_EXP_STR _T("Thu, 27 Nov 2014 23:59:59 GMT")
|
| -#define LABELTWO_EXP_INT 130616063990000000uI64
|
| -#define LABELTWO_COMBINED LABELTWO_KEY \
|
| - LABEL_DELIMITER_KV \
|
| - LABELTWO_VALUE \
|
| - LABEL_DELIMITER_EX \
|
| - LABELTWO_EXP_STR
|
| -
|
| -#define LABELOLD_KEY _T("test_key_old")
|
| -#define LABELOLD_VALUE _T("test_value_old")
|
| -#define LABELOLD_EXP_STR _T("Mon, 04 Jan 2010 08:00:00 GMT")
|
| -#define LABELOLD_EXP_INT 129070656000000000uI64
|
| -#define LABELOLD_COMBINED LABELOLD_KEY \
|
| - LABEL_DELIMITER_KV \
|
| - LABELOLD_VALUE \
|
| - LABEL_DELIMITER_EX \
|
| - LABELOLD_EXP_STR
|
| -
|
| -
|
| -const TCHAR* const kLabelOneKey = LABELONE_KEY;
|
| -const TCHAR* const kLabelOneValue = LABELONE_VALUE;
|
| -const TCHAR* const kLabelOneExpStr = LABELONE_EXP_STR;
|
| -const time64 kLabelOneExpInt = LABELONE_EXP_INT;
|
| -const TCHAR* const kLabelOneCombined = LABELONE_COMBINED;
|
| -
|
| -const TCHAR* const kLabelTwoKey = LABELTWO_KEY;
|
| -const TCHAR* const kLabelTwoValue = LABELTWO_VALUE;
|
| -const TCHAR* const kLabelTwoExpStr = LABELTWO_EXP_STR;
|
| -const time64 kLabelTwoExpInt = LABELTWO_EXP_INT;
|
| -const TCHAR* const kLabelTwoCombined = LABELTWO_COMBINED;
|
| -
|
| -const TCHAR* const kLabelOldKey = LABELOLD_KEY;
|
| -const TCHAR* const kLabelOldValue = LABELOLD_VALUE;
|
| -const TCHAR* const kLabelOldExpStr = LABELOLD_EXP_STR;
|
| -const time64 kLabelOldExpInt = LABELOLD_EXP_INT;
|
| -const TCHAR* const kLabelOldCombined = LABELOLD_COMBINED;
|
| -
|
| -const TCHAR* const kLabelNewCombined = LABELONE_COMBINED
|
| - LABEL_DELIMITER_LA
|
| - LABELTWO_COMBINED;
|
| -
|
| -const TCHAR* const kLabelAllCombined = LABELONE_COMBINED
|
| - LABEL_DELIMITER_LA
|
| - LABELTWO_COMBINED
|
| - LABEL_DELIMITER_LA
|
| - LABELOLD_COMBINED;
|
| -
|
| -} // end namespace
|
| -
|
| -TEST(ExperimentLabelsTest, Empty) {
|
| - ExperimentLabels el;
|
| -
|
| - EXPECT_EQ(0, el.NumLabels());
|
| - EXPECT_FALSE(el.ContainsKey(kLabelOneKey));
|
| - EXPECT_FALSE(el.ContainsKey(kLabelTwoKey));
|
| - EXPECT_FALSE(el.ContainsKey(kLabelOldKey));
|
| - EXPECT_FALSE(el.FindLabelByKey(kLabelOneKey, NULL, NULL));
|
| - EXPECT_FALSE(el.FindLabelByKey(kLabelTwoKey, NULL, NULL));
|
| - EXPECT_FALSE(el.FindLabelByKey(kLabelOldKey, NULL, NULL));
|
| -}
|
| -
|
| -TEST(ExperimentLabelsTest, BasicOperations) {
|
| - ExperimentLabels el;
|
| -
|
| - EXPECT_EQ(0, el.NumLabels());
|
| - EXPECT_FALSE(el.ContainsKey(kLabelOneKey));
|
| - EXPECT_FALSE(el.ContainsKey(kLabelTwoKey));
|
| - EXPECT_FALSE(el.ContainsKey(kLabelOldKey));
|
| -
|
| - // Start by adding a single label.
|
| - EXPECT_TRUE(el.SetLabel(kLabelOneKey, kLabelOneValue, kLabelOneExpInt));
|
| - EXPECT_EQ(1, el.NumLabels());
|
| - EXPECT_TRUE(el.ContainsKey(kLabelOneKey));
|
| - EXPECT_FALSE(el.ContainsKey(kLabelTwoKey));
|
| - EXPECT_FALSE(el.ContainsKey(kLabelOldKey));
|
| -
|
| - // Add both future labels now.
|
| - EXPECT_TRUE(el.SetLabel(kLabelTwoKey, kLabelTwoValue, kLabelTwoExpInt));
|
| - EXPECT_EQ(2, el.NumLabels());
|
| - EXPECT_TRUE(el.ContainsKey(kLabelOneKey));
|
| - EXPECT_TRUE(el.ContainsKey(kLabelTwoKey));
|
| - EXPECT_FALSE(el.ContainsKey(kLabelOldKey));
|
| -
|
| - // Clear the first label; it should not appear.
|
| - EXPECT_TRUE(el.ClearLabel(kLabelOneKey));
|
| - EXPECT_EQ(1, el.NumLabels());
|
| - EXPECT_FALSE(el.ContainsKey(kLabelOneKey));
|
| - EXPECT_TRUE(el.ContainsKey(kLabelTwoKey));
|
| - EXPECT_FALSE(el.ContainsKey(kLabelOldKey));
|
| -
|
| - // ClearLabel should return false if the key isn't present.
|
| - EXPECT_FALSE(el.ClearLabel(kLabelOldKey));
|
| -
|
| - // ClearAllLabels should clear all labels.
|
| - el.ClearAllLabels();
|
| - EXPECT_EQ(0, el.NumLabels());
|
| - EXPECT_FALSE(el.ContainsKey(kLabelOneKey));
|
| - EXPECT_FALSE(el.ContainsKey(kLabelTwoKey));
|
| - EXPECT_FALSE(el.ContainsKey(kLabelOldKey));
|
| -}
|
| -
|
| -TEST(ExperimentLabelsTest, SetInvalidParameters) {
|
| - ExperimentLabels el;
|
| -
|
| - // Verify that our core test parameters are okay by adding a key, then
|
| - // clearing all.
|
| - EXPECT_TRUE(el.SetLabel(kLabelOneKey, kLabelOneValue, kLabelOneExpInt));
|
| - el.ClearAllLabels();
|
| -
|
| - // Don't allow zero length names or values, or expirations in the past.
|
| - EXPECT_FALSE(el.SetLabel(_T(""), kLabelOneValue, kLabelOneExpInt));
|
| - EXPECT_FALSE(el.SetLabel(kLabelOneKey, _T(""), kLabelOneExpInt));
|
| - EXPECT_FALSE(el.SetLabel(kLabelOneKey, kLabelOneValue, 0));
|
| -
|
| - // Explicitly validate that names and values do not contain delimiters,
|
| - // quotes, angle brackets, question marks, or ampersands, as these could
|
| - // break parsing at the label-string, extraargs, or XML levels.
|
| - EXPECT_FALSE(el.SetLabel(_T("=test"), kLabelOneValue, kLabelOneExpInt));
|
| - EXPECT_FALSE(el.SetLabel(_T("te=st"), kLabelOneValue, kLabelOneExpInt));
|
| - EXPECT_FALSE(el.SetLabel(_T("test="), kLabelOneValue, kLabelOneExpInt));
|
| - EXPECT_FALSE(el.SetLabel(_T("|test"), kLabelOneValue, kLabelOneExpInt));
|
| - EXPECT_FALSE(el.SetLabel(_T("te|st"), kLabelOneValue, kLabelOneExpInt));
|
| - EXPECT_FALSE(el.SetLabel(_T("test|"), kLabelOneValue, kLabelOneExpInt));
|
| - EXPECT_FALSE(el.SetLabel(_T("test<"), kLabelOneValue, kLabelOneExpInt));
|
| - EXPECT_FALSE(el.SetLabel(_T("test>"), kLabelOneValue, kLabelOneExpInt));
|
| - EXPECT_FALSE(el.SetLabel(_T("test&"), kLabelOneValue, kLabelOneExpInt));
|
| - EXPECT_FALSE(el.SetLabel(_T("test?"), kLabelOneValue, kLabelOneExpInt));
|
| - EXPECT_FALSE(el.SetLabel(_T("test^"), kLabelOneValue, kLabelOneExpInt));
|
| - EXPECT_FALSE(el.SetLabel(_T("test'"), kLabelOneValue, kLabelOneExpInt));
|
| - EXPECT_FALSE(el.SetLabel(_T("test\""), kLabelOneValue, kLabelOneExpInt));
|
| - EXPECT_FALSE(el.SetLabel(kLabelOneKey, _T("=test"), kLabelOneExpInt));
|
| - EXPECT_FALSE(el.SetLabel(kLabelOneKey, _T("te=st"), kLabelOneExpInt));
|
| - EXPECT_FALSE(el.SetLabel(kLabelOneKey, _T("test="), kLabelOneExpInt));
|
| - EXPECT_FALSE(el.SetLabel(kLabelOneKey, _T("|test"), kLabelOneExpInt));
|
| - EXPECT_FALSE(el.SetLabel(kLabelOneKey, _T("te|st"), kLabelOneExpInt));
|
| - EXPECT_FALSE(el.SetLabel(kLabelOneKey, _T("test|"), kLabelOneExpInt));
|
| - EXPECT_FALSE(el.SetLabel(kLabelOneKey, _T("test<"), kLabelOneExpInt));
|
| - EXPECT_FALSE(el.SetLabel(kLabelOneKey, _T("test>"), kLabelOneExpInt));
|
| - EXPECT_FALSE(el.SetLabel(kLabelOneKey, _T("test&"), kLabelOneExpInt));
|
| - EXPECT_FALSE(el.SetLabel(kLabelOneKey, _T("test?"), kLabelOneExpInt));
|
| - EXPECT_FALSE(el.SetLabel(kLabelOneKey, _T("test^"), kLabelOneExpInt));
|
| - EXPECT_FALSE(el.SetLabel(kLabelOneKey, _T("test'"), kLabelOneExpInt));
|
| - EXPECT_FALSE(el.SetLabel(kLabelOneKey, _T("test\""), kLabelOneExpInt));
|
| - EXPECT_EQ(0, el.NumLabels());
|
| -
|
| - // Allow an expiration in the past if and only if we override the default
|
| - // preserve-expired-labels setting.
|
| - el.SetPreserveExpiredLabels(true);
|
| - EXPECT_TRUE(el.SetLabel(kLabelOneKey, kLabelOneValue, kLabelOldExpInt));
|
| - EXPECT_EQ(1, el.NumLabels());
|
| -}
|
| -
|
| -TEST(ExperimentLabelsTest, SetWillOverwrite) {
|
| - ExperimentLabels el;
|
| - CString value;
|
| - time64 expiration;
|
| -
|
| - EXPECT_TRUE(el.SetLabel(kLabelOneKey, kLabelOneValue, kLabelOneExpInt));
|
| -
|
| - EXPECT_EQ(1, el.NumLabels());
|
| - EXPECT_TRUE(el.FindLabelByKey(kLabelOneKey, &value, &expiration));
|
| - EXPECT_STREQ(value, kLabelOneValue);
|
| - EXPECT_EQ(expiration, kLabelOneExpInt);
|
| -
|
| - EXPECT_TRUE(el.SetLabel(kLabelOneKey, kLabelTwoValue, kLabelTwoExpInt));
|
| -
|
| - EXPECT_EQ(1, el.NumLabels());
|
| - EXPECT_TRUE(el.FindLabelByKey(kLabelOneKey, &value, &expiration));
|
| - EXPECT_STREQ(value, kLabelTwoValue);
|
| - EXPECT_EQ(expiration, kLabelTwoExpInt);
|
| -}
|
| -
|
| -TEST(ExperimentLabelsTest, FindLabelByKey) {
|
| - ExperimentLabels el;
|
| - CString value;
|
| - time64 expiration;
|
| -
|
| - EXPECT_TRUE(el.SetLabel(kLabelOneKey, kLabelOneValue, kLabelOneExpInt));
|
| - EXPECT_TRUE(el.SetLabel(kLabelTwoKey, kLabelTwoValue, kLabelTwoExpInt));
|
| - EXPECT_EQ(2, el.NumLabels());
|
| -
|
| - // Safely return partial values if either or both out parameters are NULL.
|
| - EXPECT_TRUE(el.FindLabelByKey(kLabelOneKey, NULL, NULL));
|
| - EXPECT_TRUE(el.FindLabelByKey(kLabelOneKey, &value, NULL));
|
| - EXPECT_STREQ(value, kLabelOneValue);
|
| - EXPECT_TRUE(el.FindLabelByKey(kLabelOneKey, NULL, &expiration));
|
| - EXPECT_EQ(expiration, kLabelOneExpInt);
|
| -
|
| - // Overwrite values if they already have values.
|
| - EXPECT_TRUE(el.FindLabelByKey(kLabelTwoKey, &value, &expiration));
|
| - EXPECT_STREQ(value, kLabelTwoValue);
|
| - EXPECT_EQ(expiration, kLabelTwoExpInt);
|
| -
|
| - // If the key isn't present, return false; both out-params are unmodified.
|
| - EXPECT_FALSE(el.FindLabelByKey(kLabelOldKey, &value, &expiration));
|
| - EXPECT_STREQ(value, kLabelTwoValue);
|
| - EXPECT_EQ(expiration, kLabelTwoExpInt);
|
| -}
|
| -
|
| -TEST(ExperimentLabelsTest, Serialize_Empty) {
|
| - ExperimentLabels el;
|
| -
|
| - CString serialized = el.Serialize();
|
| - EXPECT_STREQ(serialized, _T(""));
|
| -}
|
| -
|
| -TEST(ExperimentLabelsTest, Serialize_Single_Valid) {
|
| - ExperimentLabels el;
|
| -
|
| - EXPECT_TRUE(el.SetLabel(kLabelOneKey, kLabelOneValue, kLabelOneExpInt));
|
| - EXPECT_EQ(1, el.NumLabels());
|
| -
|
| - CString serialized = el.Serialize();
|
| - EXPECT_STREQ(serialized, kLabelOneCombined);
|
| -}
|
| -
|
| -TEST(ExperimentLabelsTest, Serialize_Single_Expired) {
|
| - ExperimentLabels el;
|
| -
|
| - el.SetPreserveExpiredLabels(true);
|
| - EXPECT_TRUE(el.SetLabel(kLabelOldKey, kLabelOldValue, kLabelOldExpInt));
|
| - EXPECT_EQ(1, el.NumLabels());
|
| -
|
| - el.SetPreserveExpiredLabels(false);
|
| - CString serialized = el.Serialize();
|
| - EXPECT_STREQ(serialized, _T(""));
|
| -
|
| - el.SetPreserveExpiredLabels(true);
|
| - serialized = el.Serialize();
|
| - EXPECT_STREQ(serialized, kLabelOldCombined);
|
| -}
|
| -
|
| -TEST(ExperimentLabelsTest, Serialize_Multi_Valid) {
|
| - ExperimentLabels el;
|
| -
|
| - EXPECT_TRUE(el.SetLabel(kLabelOneKey, kLabelOneValue, kLabelOneExpInt));
|
| - EXPECT_TRUE(el.SetLabel(kLabelTwoKey, kLabelTwoValue, kLabelTwoExpInt));
|
| - EXPECT_EQ(2, el.NumLabels());
|
| -
|
| - CString serialized = el.Serialize();
|
| - EXPECT_STREQ(serialized, kLabelNewCombined);
|
| -}
|
| -
|
| -TEST(ExperimentLabelsTest, Serialize_Multi_Valid_Expired) {
|
| - ExperimentLabels el;
|
| -
|
| - el.SetPreserveExpiredLabels(true);
|
| - EXPECT_TRUE(el.SetLabel(kLabelOneKey, kLabelOneValue, kLabelOneExpInt));
|
| - EXPECT_TRUE(el.SetLabel(kLabelTwoKey, kLabelTwoValue, kLabelTwoExpInt));
|
| - EXPECT_TRUE(el.SetLabel(kLabelOldKey, kLabelOldValue, kLabelOldExpInt));
|
| - EXPECT_EQ(3, el.NumLabels());
|
| -
|
| - el.SetPreserveExpiredLabels(false);
|
| - CString serialized = el.Serialize();
|
| - EXPECT_STREQ(serialized, kLabelNewCombined);
|
| -
|
| - el.SetPreserveExpiredLabels(true);
|
| - serialized = el.Serialize();
|
| - EXPECT_STREQ(serialized, kLabelAllCombined);
|
| -}
|
| -
|
| -
|
| -TEST(ExperimentLabelsTest, Deserialize_EmptyString) {
|
| - ExperimentLabels el;
|
| -
|
| - EXPECT_TRUE(el.Deserialize(_T("")));
|
| - EXPECT_EQ(0, el.NumLabels());
|
| -}
|
| -
|
| -TEST(ExperimentLabelsTest, Deserialize_Single_Valid) {
|
| - ExperimentLabels el;
|
| -
|
| - EXPECT_TRUE(el.Deserialize(kLabelOneCombined));
|
| - EXPECT_EQ(1, el.NumLabels());
|
| -
|
| - CString key;
|
| - CString value;
|
| - time64 expiration;
|
| - el.GetLabelByIndex(0, &key, &value, &expiration);
|
| - EXPECT_STREQ(key, kLabelOneKey);
|
| - EXPECT_STREQ(value, kLabelOneValue);
|
| - EXPECT_EQ(expiration, kLabelOneExpInt);
|
| -}
|
| -
|
| -TEST(ExperimentLabelsTest, Deserialize_Multi_Valid) {
|
| - ExperimentLabels el;
|
| -
|
| - EXPECT_TRUE(el.Deserialize(kLabelNewCombined));
|
| - EXPECT_EQ(2, el.NumLabels());
|
| -
|
| - CString key;
|
| - CString value;
|
| - time64 expiration;
|
| - el.GetLabelByIndex(0, &key, &value, &expiration);
|
| - EXPECT_STREQ(key, kLabelOneKey);
|
| - EXPECT_STREQ(value, kLabelOneValue);
|
| - EXPECT_EQ(expiration, kLabelOneExpInt);
|
| - el.GetLabelByIndex(1, &key, &value, &expiration);
|
| - EXPECT_STREQ(key, kLabelTwoKey);
|
| - EXPECT_STREQ(value, kLabelTwoValue);
|
| - EXPECT_EQ(expiration, kLabelTwoExpInt);
|
| -}
|
| -
|
| -TEST(ExperimentLabelsTest, Deserialize_Single_Valid_Expired) {
|
| - ExperimentLabels el;
|
| -
|
| - EXPECT_TRUE(el.Deserialize(kLabelOldCombined));
|
| - EXPECT_EQ(0, el.NumLabels());
|
| -
|
| - el.SetPreserveExpiredLabels(true);
|
| - EXPECT_TRUE(el.Deserialize(kLabelOldCombined));
|
| - EXPECT_EQ(1, el.NumLabels());
|
| -
|
| - CString key;
|
| - CString value;
|
| - time64 expiration;
|
| - el.GetLabelByIndex(0, &key, &value, &expiration);
|
| - EXPECT_STREQ(key, kLabelOldKey);
|
| - EXPECT_STREQ(value, kLabelOldValue);
|
| - EXPECT_EQ(expiration, kLabelOldExpInt);
|
| -}
|
| -
|
| -TEST(ExperimentLabelsTest, Deserialize_Multi_Valid_Expired) {
|
| - ExperimentLabels el;
|
| -
|
| - EXPECT_TRUE(el.Deserialize(kLabelAllCombined));
|
| - EXPECT_EQ(2, el.NumLabels());
|
| - EXPECT_TRUE(el.ContainsKey(kLabelOneKey));
|
| - EXPECT_TRUE(el.ContainsKey(kLabelTwoKey));
|
| - EXPECT_FALSE(el.ContainsKey(kLabelOldKey));
|
| -
|
| - el.ClearAllLabels();
|
| -
|
| - el.SetPreserveExpiredLabels(true);
|
| - EXPECT_TRUE(el.Deserialize(kLabelAllCombined));
|
| - EXPECT_EQ(3, el.NumLabels());
|
| - EXPECT_TRUE(el.ContainsKey(kLabelOneKey));
|
| - EXPECT_TRUE(el.ContainsKey(kLabelTwoKey));
|
| - EXPECT_TRUE(el.ContainsKey(kLabelOldKey));
|
| -}
|
| -
|
| -TEST(ExperimentLabelsTest, Deserialize_Invalid_ZeroLengthKey) {
|
| - ExperimentLabels el;
|
| -
|
| - // Base case: "=valid_value|valid_exp"
|
| - const TCHAR* const invalid_segment = LABEL_DELIMITER_KV
|
| - LABELONE_VALUE
|
| - LABEL_DELIMITER_EX
|
| - LABELONE_EXP_STR;
|
| - EXPECT_FALSE(el.Deserialize(invalid_segment));
|
| - EXPECT_EQ(0, el.NumLabels());
|
| -
|
| - // Variant case 1: "=valid_value|valid_exp;valid_key=valid_value|valid_exp"
|
| - CString variant1 = invalid_segment;
|
| - variant1.Append(LABEL_DELIMITER_LA);
|
| - variant1.Append(LABELTWO_COMBINED);
|
| - EXPECT_FALSE(el.Deserialize(variant1));
|
| - EXPECT_EQ(0, el.NumLabels());
|
| -
|
| - // Variant case 2: "valid_key=valid_value|valid_exp;=valid_value|valid_exp"
|
| - CString variant2 = LABELTWO_COMBINED;
|
| - variant2.Append(LABEL_DELIMITER_LA);
|
| - variant2.Append(invalid_segment);
|
| - EXPECT_FALSE(el.Deserialize(variant2));
|
| - EXPECT_EQ(0, el.NumLabels());
|
| -}
|
| -
|
| -TEST(ExperimentLabelsTest, Deserialize_Invalid_ZeroLengthValue) {
|
| - ExperimentLabels el;
|
| -
|
| - // Base case: "valid_key=|valid_exp"
|
| - const TCHAR* const invalid_segment = LABELONE_KEY
|
| - LABEL_DELIMITER_KV
|
| - LABEL_DELIMITER_EX
|
| - LABELONE_EXP_STR;
|
| - EXPECT_FALSE(el.Deserialize(invalid_segment));
|
| - EXPECT_EQ(0, el.NumLabels());
|
| -
|
| - // Variant case 1: "valid_key=|valid_exp;valid_key=valid_value|valid_exp"
|
| - CString variant1 = invalid_segment;
|
| - variant1.Append(LABEL_DELIMITER_LA);
|
| - variant1.Append(LABELTWO_COMBINED);
|
| - EXPECT_FALSE(el.Deserialize(variant1));
|
| - EXPECT_EQ(0, el.NumLabels());
|
| -
|
| - // Variant case 2: "valid_key=valid_value|valid_exp;valid_key=|valid_exp"
|
| - el.ClearAllLabels();
|
| - CString variant2 = LABELTWO_COMBINED;
|
| - variant2.Append(LABEL_DELIMITER_LA);
|
| - variant2.Append(invalid_segment);
|
| - EXPECT_FALSE(el.Deserialize(variant2));
|
| - EXPECT_EQ(0, el.NumLabels());
|
| -}
|
| -
|
| -TEST(ExperimentLabelsTest, Deserialize_Invalid_ZeroLengthDate) {
|
| - ExperimentLabels el;
|
| -
|
| - // Base case: "valid_key=valid_value|"
|
| - const TCHAR* const invalid_segment = LABELONE_KEY
|
| - LABEL_DELIMITER_KV
|
| - LABELONE_VALUE
|
| - LABEL_DELIMITER_EX;
|
| - EXPECT_FALSE(el.Deserialize(invalid_segment));
|
| - EXPECT_EQ(0, el.NumLabels());
|
| -
|
| - // Variant case 1: "valid_key=valid_value|;valid_key=valid_value|valid_exp"
|
| - CString variant1 = invalid_segment;
|
| - variant1.Append(LABEL_DELIMITER_LA);
|
| - variant1.Append(LABELTWO_COMBINED);
|
| - EXPECT_FALSE(el.Deserialize(variant1));
|
| - EXPECT_EQ(0, el.NumLabels());
|
| -
|
| - // Variant case 2: "valid_key=valid_value|valid_exp;valid_key=valid_value|"
|
| - CString variant2 = LABELTWO_COMBINED;
|
| - variant2.Append(LABEL_DELIMITER_LA);
|
| - variant2.Append(invalid_segment);
|
| - EXPECT_FALSE(el.Deserialize(variant2));
|
| - EXPECT_EQ(0, el.NumLabels());
|
| -}
|
| -
|
| -TEST(ExperimentLabelsTest, Deserialize_Invalid_ExtraDelimiters) {
|
| - ExperimentLabels el;
|
| -
|
| - // Repeated equals: "k==v|e"
|
| - EXPECT_FALSE(el.Deserialize(LABELONE_KEY
|
| - LABEL_DELIMITER_KV
|
| - LABEL_DELIMITER_KV
|
| - LABELONE_VALUE
|
| - LABEL_DELIMITER_EX
|
| - LABELONE_EXP_STR));
|
| -
|
| - // Repeated pipe: "k=v||e"
|
| - EXPECT_FALSE(el.Deserialize(LABELONE_KEY
|
| - LABEL_DELIMITER_KV
|
| - LABELONE_VALUE
|
| - LABEL_DELIMITER_EX
|
| - LABEL_DELIMITER_EX
|
| - LABELONE_EXP_STR));
|
| -
|
| - // Degenerate: "=|;=|"
|
| - EXPECT_FALSE(el.Deserialize(LABEL_DELIMITER_KV
|
| - LABEL_DELIMITER_EX
|
| - LABEL_DELIMITER_LA
|
| - LABEL_DELIMITER_KV
|
| - LABEL_DELIMITER_EX));
|
| -
|
| - EXPECT_EQ(0, el.NumLabels());
|
| -}
|
| -
|
| -TEST(ExperimentLabelsTest, Deserialize_Valid_ExtraLabelDelimiters) {
|
| - ExperimentLabels el;
|
| -
|
| - // We support (but discourage) leading/trailing/repeated separators;
|
| - // for example, "k=v|e;;;;k=v|e" should cleanly parse (two keys), as
|
| - // should ";;;k=v|e" and "k=v|e;;;" (one key each) and ";;;;;" (no keys).
|
| -
|
| - // Repeated separator: "k=v|e;;k=v|e"
|
| - EXPECT_TRUE(el.Deserialize(LABELONE_COMBINED
|
| - LABEL_DELIMITER_LA
|
| - LABEL_DELIMITER_LA
|
| - LABELTWO_COMBINED));
|
| - EXPECT_EQ(2, el.NumLabels());
|
| - el.ClearAllLabels();
|
| -
|
| - // Leading separator: ";k=v|e"
|
| - EXPECT_TRUE(el.Deserialize(LABEL_DELIMITER_LA LABELONE_COMBINED));
|
| - EXPECT_EQ(1, el.NumLabels());
|
| - el.ClearAllLabels();
|
| -
|
| - // Trailing separator: "k=v|e;"
|
| - EXPECT_TRUE(el.Deserialize(LABELONE_COMBINED LABEL_DELIMITER_LA));
|
| - EXPECT_EQ(1, el.NumLabels());
|
| - el.ClearAllLabels();
|
| -
|
| - // Degenerate: ";;;"
|
| - EXPECT_TRUE(el.Deserialize(LABEL_DELIMITER_LA
|
| - LABEL_DELIMITER_LA
|
| - LABEL_DELIMITER_LA));
|
| - EXPECT_EQ(0, el.NumLabels());
|
| -}
|
| -
|
| -TEST(ExperimentLabelsTest, Deserialize_Invalid_MissingDelimiters) {
|
| - ExperimentLabels el;
|
| -
|
| - // Missing all delimiters, single string (kve)
|
| - EXPECT_FALSE(el.Deserialize(LABELONE_KEY
|
| - LABELONE_VALUE
|
| - LABELONE_EXP_STR));
|
| -
|
| - // Missing expiration delimiter, single string (k=ve)
|
| - EXPECT_FALSE(el.Deserialize(LABELONE_KEY
|
| - LABEL_DELIMITER_KV
|
| - LABELONE_VALUE
|
| - LABELONE_EXP_STR));
|
| -
|
| - // Missing value delimiter, single string (kv|e)
|
| - EXPECT_FALSE(el.Deserialize(LABELONE_KEY
|
| - LABELONE_VALUE
|
| - LABEL_DELIMITER_EX
|
| - LABELONE_EXP_STR));
|
| -
|
| - // Missing label delimiter, multi-label (k=v|ek=v|e)
|
| - EXPECT_FALSE(el.Deserialize(LABELONE_COMBINED LABELTWO_COMBINED));
|
| -
|
| - // Missing value+exp delimiter, multi-label, first (kve;k=v|e)
|
| - EXPECT_FALSE(el.Deserialize(LABELONE_KEY
|
| - LABELONE_VALUE
|
| - LABELONE_EXP_STR
|
| - LABEL_DELIMITER_LA
|
| - LABELTWO_COMBINED));
|
| -
|
| - // Missing value+exp delimiter, multi-label, second (k=v|e;kve)
|
| - EXPECT_FALSE(el.Deserialize(LABELONE_COMBINED
|
| - LABEL_DELIMITER_LA
|
| - LABELTWO_KEY
|
| - LABELTWO_VALUE
|
| - LABELTWO_EXP_STR));
|
| -
|
| - // Missing value delimiter, multi-label, first (kv|e;k=v|e)
|
| - EXPECT_FALSE(el.Deserialize(LABELONE_KEY
|
| - LABELONE_VALUE
|
| - LABEL_DELIMITER_EX
|
| - LABELONE_EXP_STR
|
| - LABEL_DELIMITER_LA
|
| - LABELTWO_COMBINED));
|
| -
|
| - // Missing value delimiter, multi-label, second (k=v|e;kv|e)
|
| - EXPECT_FALSE(el.Deserialize(LABELONE_COMBINED
|
| - LABEL_DELIMITER_LA
|
| - LABELTWO_KEY
|
| - LABELTWO_VALUE
|
| - LABEL_DELIMITER_EX
|
| - LABELTWO_EXP_STR));
|
| -
|
| - // Missing expiration delimiter, multi-label, first (k=ve;k=v|e)
|
| - EXPECT_FALSE(el.Deserialize(LABELONE_KEY
|
| - LABEL_DELIMITER_KV
|
| - LABELONE_VALUE
|
| - LABELONE_EXP_STR
|
| - LABEL_DELIMITER_LA
|
| - LABELTWO_COMBINED));
|
| -
|
| - // Missing expiration delimiter, multi-label, second (k=v|e;k=ve)
|
| - EXPECT_FALSE(el.Deserialize(LABELONE_COMBINED
|
| - LABEL_DELIMITER_LA
|
| - LABELTWO_KEY
|
| - LABEL_DELIMITER_KV
|
| - LABELTWO_VALUE
|
| - LABELTWO_EXP_STR));
|
| -
|
| - EXPECT_EQ(0, el.NumLabels());
|
| -}
|
| -
|
| -TEST(ExperimentLabelsTest, DeserializeAndApplyDelta_Append) {
|
| - ExperimentLabels el;
|
| -
|
| - EXPECT_TRUE(el.SetLabel(kLabelOneKey, kLabelOneValue, kLabelOneExpInt));
|
| - EXPECT_EQ(1, el.NumLabels());
|
| - EXPECT_TRUE(el.DeserializeAndApplyDelta(kLabelTwoCombined));
|
| - EXPECT_EQ(2, el.NumLabels());
|
| -
|
| - CString value;
|
| - time64 expiration;
|
| - EXPECT_TRUE(el.FindLabelByKey(kLabelOneKey, &value, &expiration));
|
| - EXPECT_STREQ(value, kLabelOneValue);
|
| - EXPECT_EQ(expiration, kLabelOneExpInt);
|
| - EXPECT_TRUE(el.FindLabelByKey(kLabelTwoKey, &value, &expiration));
|
| - EXPECT_STREQ(value, kLabelTwoValue);
|
| - EXPECT_EQ(expiration, kLabelTwoExpInt);
|
| -}
|
| -
|
| -TEST(ExperimentLabelsTest, DeserializeAndApplyDelta_Append_Expired) {
|
| - ExperimentLabels el;
|
| -
|
| - EXPECT_TRUE(el.SetLabel(kLabelOneKey, kLabelOneValue, kLabelOneExpInt));
|
| - EXPECT_EQ(1, el.NumLabels());
|
| - EXPECT_TRUE(el.ContainsKey(kLabelOneKey));
|
| - EXPECT_FALSE(el.ContainsKey(kLabelOldKey));
|
| -
|
| - EXPECT_TRUE(el.DeserializeAndApplyDelta(kLabelOldCombined));
|
| - EXPECT_EQ(1, el.NumLabels());
|
| - EXPECT_TRUE(el.ContainsKey(kLabelOneKey));
|
| - EXPECT_FALSE(el.ContainsKey(kLabelOldKey));
|
| -}
|
| -
|
| -TEST(ExperimentLabelsTest, DeserializeAndApplyDelta_Overwrite_Single) {
|
| - ExperimentLabels el;
|
| -
|
| - EXPECT_TRUE(el.SetLabel(kLabelOneKey, kLabelOldValue, kLabelOneExpInt));
|
| - EXPECT_EQ(1, el.NumLabels());
|
| - EXPECT_TRUE(el.ContainsKey(kLabelOneKey));
|
| - EXPECT_FALSE(el.ContainsKey(kLabelTwoKey));
|
| -
|
| - CString value;
|
| - time64 expiration;
|
| - EXPECT_TRUE(el.FindLabelByKey(kLabelOneKey, &value, &expiration));
|
| - EXPECT_STREQ(value, kLabelOldValue);
|
| - EXPECT_EQ(expiration, kLabelOneExpInt);
|
| -
|
| - EXPECT_TRUE(el.DeserializeAndApplyDelta(kLabelOneCombined));
|
| - EXPECT_EQ(1, el.NumLabels());
|
| - EXPECT_TRUE(el.ContainsKey(kLabelOneKey));
|
| - EXPECT_FALSE(el.ContainsKey(kLabelTwoKey));
|
| -
|
| - EXPECT_TRUE(el.FindLabelByKey(kLabelOneKey, &value, &expiration));
|
| - EXPECT_STREQ(value, kLabelOneValue);
|
| - EXPECT_EQ(expiration, kLabelOneExpInt);
|
| -}
|
| -
|
| -TEST(ExperimentLabelsTest, DeserializeAndApplyDelta_Overwrite_Multi) {
|
| - ExperimentLabels el;
|
| -
|
| - EXPECT_TRUE(el.SetLabel(kLabelOneKey, kLabelOldValue, kLabelOneExpInt));
|
| - EXPECT_EQ(1, el.NumLabels());
|
| - EXPECT_TRUE(el.ContainsKey(kLabelOneKey));
|
| - EXPECT_FALSE(el.ContainsKey(kLabelTwoKey));
|
| -
|
| - EXPECT_TRUE(el.DeserializeAndApplyDelta(kLabelNewCombined));
|
| - EXPECT_EQ(2, el.NumLabels());
|
| - EXPECT_TRUE(el.ContainsKey(kLabelOneKey));
|
| - EXPECT_TRUE(el.ContainsKey(kLabelTwoKey));
|
| -
|
| - CString value;
|
| - time64 expiration;
|
| - EXPECT_TRUE(el.FindLabelByKey(kLabelOneKey, &value, &expiration));
|
| - EXPECT_STREQ(value, kLabelOneValue);
|
| - EXPECT_EQ(expiration, kLabelOneExpInt);
|
| - EXPECT_TRUE(el.FindLabelByKey(kLabelTwoKey, &value, &expiration));
|
| - EXPECT_STREQ(value, kLabelTwoValue);
|
| - EXPECT_EQ(expiration, kLabelTwoExpInt);
|
| -}
|
| -
|
| -TEST(ExperimentLabelsTest, DeserializeAndApplyDelta_Overwrite_Single_Expired) {
|
| - ExperimentLabels el;
|
| -
|
| - EXPECT_TRUE(el.SetLabel(kLabelOldKey, kLabelOldValue, kLabelOneExpInt));
|
| - EXPECT_TRUE(el.SetLabel(kLabelTwoKey, kLabelTwoValue, kLabelTwoExpInt));
|
| - EXPECT_EQ(2, el.NumLabels());
|
| - EXPECT_TRUE(el.ContainsKey(kLabelOldKey));
|
| - EXPECT_TRUE(el.ContainsKey(kLabelTwoKey));
|
| -
|
| - EXPECT_TRUE(el.DeserializeAndApplyDelta(kLabelOldCombined));
|
| - EXPECT_EQ(1, el.NumLabels());
|
| - EXPECT_FALSE(el.ContainsKey(kLabelOldKey));
|
| - EXPECT_TRUE(el.ContainsKey(kLabelTwoKey));
|
| -}
|
| -
|
| -TEST(ExperimentLabelsTest, DeserializeAndApplyDelta_Overwrite_Multi_Expired) {
|
| - ExperimentLabels el;
|
| -
|
| - EXPECT_TRUE(el.SetLabel(kLabelOneKey, kLabelTwoValue, kLabelOneExpInt));
|
| - EXPECT_TRUE(el.SetLabel(kLabelTwoKey, kLabelOneValue, kLabelTwoExpInt));
|
| - EXPECT_TRUE(el.SetLabel(kLabelOldKey, kLabelOldValue, kLabelOneExpInt));
|
| - EXPECT_EQ(3, el.NumLabels());
|
| - EXPECT_TRUE(el.ContainsKey(kLabelOneKey));
|
| - EXPECT_TRUE(el.ContainsKey(kLabelTwoKey));
|
| - EXPECT_TRUE(el.ContainsKey(kLabelOldKey));
|
| -
|
| - EXPECT_TRUE(el.DeserializeAndApplyDelta(kLabelAllCombined));
|
| - EXPECT_EQ(2, el.NumLabels());
|
| - EXPECT_TRUE(el.ContainsKey(kLabelOneKey));
|
| - EXPECT_TRUE(el.ContainsKey(kLabelTwoKey));
|
| - EXPECT_FALSE(el.ContainsKey(kLabelOldKey));
|
| -}
|
| -
|
| -TEST(ExperimentLabelsTest, Expire) {
|
| - ExperimentLabels el;
|
| -
|
| - el.SetPreserveExpiredLabels(true);
|
| - EXPECT_TRUE(el.SetLabel(kLabelOneKey, kLabelOneValue, kLabelOneExpInt));
|
| - EXPECT_TRUE(el.SetLabel(kLabelTwoKey, kLabelTwoValue, kLabelTwoExpInt));
|
| - EXPECT_TRUE(el.SetLabel(kLabelOldKey, kLabelOldValue, kLabelOldExpInt));
|
| - EXPECT_EQ(3, el.NumLabels());
|
| -
|
| - el.ExpireLabels();
|
| - EXPECT_EQ(2, el.NumLabels());
|
| - EXPECT_TRUE(el.ContainsKey(kLabelOneKey));
|
| - EXPECT_TRUE(el.ContainsKey(kLabelTwoKey));
|
| - EXPECT_FALSE(el.ContainsKey(kLabelOldKey));
|
| -
|
| - EXPECT_TRUE(el.SetLabel(kLabelOneKey, kLabelOneValue, kLabelOldExpInt));
|
| - el.ExpireLabels();
|
| - EXPECT_EQ(1, el.NumLabels());
|
| - EXPECT_FALSE(el.ContainsKey(kLabelOneKey));
|
| - EXPECT_TRUE(el.ContainsKey(kLabelTwoKey));
|
| - EXPECT_FALSE(el.ContainsKey(kLabelOldKey));
|
| -}
|
| -
|
| -} // namespace omaha
|
| -
|
|
|