12fefd83dd2c65ee585a2aa05e4856eb4d0e93f0brouslan@chromium.org// Copyright (C) 2013 Google Inc.
22fefd83dd2c65ee585a2aa05e4856eb4d0e93f0brouslan@chromium.org//
32fefd83dd2c65ee585a2aa05e4856eb4d0e93f0brouslan@chromium.org// Licensed under the Apache License, Version 2.0 (the "License");
42fefd83dd2c65ee585a2aa05e4856eb4d0e93f0brouslan@chromium.org// you may not use this file except in compliance with the License.
52fefd83dd2c65ee585a2aa05e4856eb4d0e93f0brouslan@chromium.org// You may obtain a copy of the License at
62fefd83dd2c65ee585a2aa05e4856eb4d0e93f0brouslan@chromium.org//
72fefd83dd2c65ee585a2aa05e4856eb4d0e93f0brouslan@chromium.org// http://www.apache.org/licenses/LICENSE-2.0
82fefd83dd2c65ee585a2aa05e4856eb4d0e93f0brouslan@chromium.org//
92fefd83dd2c65ee585a2aa05e4856eb4d0e93f0brouslan@chromium.org// Unless required by applicable law or agreed to in writing, software
102fefd83dd2c65ee585a2aa05e4856eb4d0e93f0brouslan@chromium.org// distributed under the License is distributed on an "AS IS" BASIS,
112fefd83dd2c65ee585a2aa05e4856eb4d0e93f0brouslan@chromium.org// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
122fefd83dd2c65ee585a2aa05e4856eb4d0e93f0brouslan@chromium.org// See the License for the specific language governing permissions and
132fefd83dd2c65ee585a2aa05e4856eb4d0e93f0brouslan@chromium.org// limitations under the License.
142fefd83dd2c65ee585a2aa05e4856eb4d0e93f0brouslan@chromium.org
152fefd83dd2c65ee585a2aa05e4856eb4d0e93f0brouslan@chromium.org#include "validating_util.h"
162fefd83dd2c65ee585a2aa05e4856eb4d0e93f0brouslan@chromium.org
172fefd83dd2c65ee585a2aa05e4856eb4d0e93f0brouslan@chromium.org#include <string>
182fefd83dd2c65ee585a2aa05e4856eb4d0e93f0brouslan@chromium.org
192fefd83dd2c65ee585a2aa05e4856eb4d0e93f0brouslan@chromium.org#include <gtest/gtest.h>
202fefd83dd2c65ee585a2aa05e4856eb4d0e93f0brouslan@chromium.org
212fefd83dd2c65ee585a2aa05e4856eb4d0e93f0brouslan@chromium.org#define ITOA_HELPER(i) #i
222fefd83dd2c65ee585a2aa05e4856eb4d0e93f0brouslan@chromium.org#define ITOA(i) ITOA_HELPER(i)
232fefd83dd2c65ee585a2aa05e4856eb4d0e93f0brouslan@chromium.org
242fefd83dd2c65ee585a2aa05e4856eb4d0e93f0brouslan@chromium.org#define DATA "{'foo': 'bar'}"
252fefd83dd2c65ee585a2aa05e4856eb4d0e93f0brouslan@chromium.org#define TIMESTAMP 1388001600
262fefd83dd2c65ee585a2aa05e4856eb4d0e93f0brouslan@chromium.org#define TIMESTAMP_HALF_MONTH_AGO 1386705600
272fefd83dd2c65ee585a2aa05e4856eb4d0e93f0brouslan@chromium.org#define TIMESTAMP_TWO_MONTHS_AGO 1382817600
282fefd83dd2c65ee585a2aa05e4856eb4d0e93f0brouslan@chromium.org#define CHECKSUM "dd63dafcbd4d5b28badfcaf86fb6fcdb"
292fefd83dd2c65ee585a2aa05e4856eb4d0e93f0brouslan@chromium.org
302fefd83dd2c65ee585a2aa05e4856eb4d0e93f0brouslan@chromium.orgnamespace {
312fefd83dd2c65ee585a2aa05e4856eb4d0e93f0brouslan@chromium.org
322fefd83dd2c65ee585a2aa05e4856eb4d0e93f0brouslan@chromium.orgusing i18n::addressinput::ValidatingUtil;
332fefd83dd2c65ee585a2aa05e4856eb4d0e93f0brouslan@chromium.org
342fefd83dd2c65ee585a2aa05e4856eb4d0e93f0brouslan@chromium.org// The data being wrapped.
352fefd83dd2c65ee585a2aa05e4856eb4d0e93f0brouslan@chromium.orgconst char kUnwrappedData[] = DATA;
362fefd83dd2c65ee585a2aa05e4856eb4d0e93f0brouslan@chromium.org
372fefd83dd2c65ee585a2aa05e4856eb4d0e93f0brouslan@chromium.org// The timestamp for the wrapped data.
382fefd83dd2c65ee585a2aa05e4856eb4d0e93f0brouslan@chromium.orgconst time_t kTimestamp = TIMESTAMP;
392fefd83dd2c65ee585a2aa05e4856eb4d0e93f0brouslan@chromium.org
402fefd83dd2c65ee585a2aa05e4856eb4d0e93f0brouslan@chromium.org// The checksum and data together.
412fefd83dd2c65ee585a2aa05e4856eb4d0e93f0brouslan@chromium.orgconst char kChecksummedData[] = "checksum=" CHECKSUM "\n"
422fefd83dd2c65ee585a2aa05e4856eb4d0e93f0brouslan@chromium.org                                DATA;
432fefd83dd2c65ee585a2aa05e4856eb4d0e93f0brouslan@chromium.org
442fefd83dd2c65ee585a2aa05e4856eb4d0e93f0brouslan@chromium.org// "Randomly" corrupted checksummed data. The "m" in "checksum" is capitalized.
452fefd83dd2c65ee585a2aa05e4856eb4d0e93f0brouslan@chromium.orgconst char kCorruptedChecksummedData[] = "checksuM=" CHECKSUM "\n"
462fefd83dd2c65ee585a2aa05e4856eb4d0e93f0brouslan@chromium.org                                         DATA;
472fefd83dd2c65ee585a2aa05e4856eb4d0e93f0brouslan@chromium.org
482fefd83dd2c65ee585a2aa05e4856eb4d0e93f0brouslan@chromium.org// The checksum in the middle of data.
492fefd83dd2c65ee585a2aa05e4856eb4d0e93f0brouslan@chromium.orgconst char kChecksumInMiddle[] = DATA "\n"
502fefd83dd2c65ee585a2aa05e4856eb4d0e93f0brouslan@chromium.org                                 "checksum=" CHECKSUM "\n"
512fefd83dd2c65ee585a2aa05e4856eb4d0e93f0brouslan@chromium.org                                 DATA;
522fefd83dd2c65ee585a2aa05e4856eb4d0e93f0brouslan@chromium.org
532fefd83dd2c65ee585a2aa05e4856eb4d0e93f0brouslan@chromium.org// The file as it is stored on disk.
542fefd83dd2c65ee585a2aa05e4856eb4d0e93f0brouslan@chromium.orgconst char kWrappedData[] = "timestamp=" ITOA(TIMESTAMP) "\n"
552fefd83dd2c65ee585a2aa05e4856eb4d0e93f0brouslan@chromium.org                            "checksum=" CHECKSUM "\n"
562fefd83dd2c65ee585a2aa05e4856eb4d0e93f0brouslan@chromium.org                            DATA;
572fefd83dd2c65ee585a2aa05e4856eb4d0e93f0brouslan@chromium.org
582fefd83dd2c65ee585a2aa05e4856eb4d0e93f0brouslan@chromium.org// "Randomly" corrupted file. The "p" in "timestamp" is capitalized.
592fefd83dd2c65ee585a2aa05e4856eb4d0e93f0brouslan@chromium.orgconst char kCorruptedWrappedData[] = "timestamP=" ITOA(TIMESTAMP) "\n"
602fefd83dd2c65ee585a2aa05e4856eb4d0e93f0brouslan@chromium.org                                     "checksum=" CHECKSUM "\n"
612fefd83dd2c65ee585a2aa05e4856eb4d0e93f0brouslan@chromium.org                                     DATA;
622fefd83dd2c65ee585a2aa05e4856eb4d0e93f0brouslan@chromium.org
632fefd83dd2c65ee585a2aa05e4856eb4d0e93f0brouslan@chromium.org// The timestamp in the middle of data.
642fefd83dd2c65ee585a2aa05e4856eb4d0e93f0brouslan@chromium.orgconst char kTimestampInMiddle[] = DATA "\n"
652fefd83dd2c65ee585a2aa05e4856eb4d0e93f0brouslan@chromium.org                                  "timestamp=" ITOA(TIMESTAMP) "\n"
662fefd83dd2c65ee585a2aa05e4856eb4d0e93f0brouslan@chromium.org                                  DATA;
672fefd83dd2c65ee585a2aa05e4856eb4d0e93f0brouslan@chromium.org
682fefd83dd2c65ee585a2aa05e4856eb4d0e93f0brouslan@chromium.org// A recent timestamp and data together.
692fefd83dd2c65ee585a2aa05e4856eb4d0e93f0brouslan@chromium.orgconst char kTimestampHalfMonthAgo[] =
702fefd83dd2c65ee585a2aa05e4856eb4d0e93f0brouslan@chromium.org    "timestamp=" ITOA(TIMESTAMP_HALF_MONTH_AGO) "\n"
712fefd83dd2c65ee585a2aa05e4856eb4d0e93f0brouslan@chromium.org    DATA;
722fefd83dd2c65ee585a2aa05e4856eb4d0e93f0brouslan@chromium.org
732fefd83dd2c65ee585a2aa05e4856eb4d0e93f0brouslan@chromium.org// A stale timestamp and data together.
742fefd83dd2c65ee585a2aa05e4856eb4d0e93f0brouslan@chromium.orgconst char kTimestampTwoMonthsAgo[] =
752fefd83dd2c65ee585a2aa05e4856eb4d0e93f0brouslan@chromium.org    "timestamp=" ITOA(TIMESTAMP_TWO_MONTHS_AGO) "\n"
762fefd83dd2c65ee585a2aa05e4856eb4d0e93f0brouslan@chromium.org    DATA;
772fefd83dd2c65ee585a2aa05e4856eb4d0e93f0brouslan@chromium.org
782fefd83dd2c65ee585a2aa05e4856eb4d0e93f0brouslan@chromium.orgTEST(ValidatingUtilTest, UnwrapChecksum_CorruptedData) {
792fefd83dd2c65ee585a2aa05e4856eb4d0e93f0brouslan@chromium.org  std::string data(kCorruptedChecksummedData);
802fefd83dd2c65ee585a2aa05e4856eb4d0e93f0brouslan@chromium.org  EXPECT_FALSE(ValidatingUtil::UnwrapChecksum(&data));
812fefd83dd2c65ee585a2aa05e4856eb4d0e93f0brouslan@chromium.org}
822fefd83dd2c65ee585a2aa05e4856eb4d0e93f0brouslan@chromium.org
832fefd83dd2c65ee585a2aa05e4856eb4d0e93f0brouslan@chromium.orgTEST(ValidatingUtilTest, UnwrapChecksum_EmptyString) {
842fefd83dd2c65ee585a2aa05e4856eb4d0e93f0brouslan@chromium.org  std::string data;
852fefd83dd2c65ee585a2aa05e4856eb4d0e93f0brouslan@chromium.org  EXPECT_FALSE(ValidatingUtil::UnwrapChecksum(&data));
862fefd83dd2c65ee585a2aa05e4856eb4d0e93f0brouslan@chromium.org}
872fefd83dd2c65ee585a2aa05e4856eb4d0e93f0brouslan@chromium.org
882fefd83dd2c65ee585a2aa05e4856eb4d0e93f0brouslan@chromium.orgTEST(ValidatingUtilTest, UnwrapChecksum_GarbageData) {
892fefd83dd2c65ee585a2aa05e4856eb4d0e93f0brouslan@chromium.org  std::string data("garbage");
902fefd83dd2c65ee585a2aa05e4856eb4d0e93f0brouslan@chromium.org  EXPECT_FALSE(ValidatingUtil::UnwrapChecksum(&data));
912fefd83dd2c65ee585a2aa05e4856eb4d0e93f0brouslan@chromium.org}
922fefd83dd2c65ee585a2aa05e4856eb4d0e93f0brouslan@chromium.org
932fefd83dd2c65ee585a2aa05e4856eb4d0e93f0brouslan@chromium.orgTEST(ValidatingUtilTest, UnwrapChecksum_InMiddle) {
942fefd83dd2c65ee585a2aa05e4856eb4d0e93f0brouslan@chromium.org  std::string data(kChecksumInMiddle);
952fefd83dd2c65ee585a2aa05e4856eb4d0e93f0brouslan@chromium.org  EXPECT_FALSE(ValidatingUtil::UnwrapChecksum(&data));
962fefd83dd2c65ee585a2aa05e4856eb4d0e93f0brouslan@chromium.org}
972fefd83dd2c65ee585a2aa05e4856eb4d0e93f0brouslan@chromium.org
982fefd83dd2c65ee585a2aa05e4856eb4d0e93f0brouslan@chromium.orgTEST(ValidatingUtilTest, UnwrapChecksum) {
992fefd83dd2c65ee585a2aa05e4856eb4d0e93f0brouslan@chromium.org  std::string data(kChecksummedData);
1002fefd83dd2c65ee585a2aa05e4856eb4d0e93f0brouslan@chromium.org  EXPECT_TRUE(ValidatingUtil::UnwrapChecksum(&data));
1012fefd83dd2c65ee585a2aa05e4856eb4d0e93f0brouslan@chromium.org  EXPECT_EQ(kUnwrappedData, data);
1022fefd83dd2c65ee585a2aa05e4856eb4d0e93f0brouslan@chromium.org}
1032fefd83dd2c65ee585a2aa05e4856eb4d0e93f0brouslan@chromium.org
1042fefd83dd2c65ee585a2aa05e4856eb4d0e93f0brouslan@chromium.orgTEST(ValidatingUtilTest, UnwrapTimestamp_CorruptedData) {
1052fefd83dd2c65ee585a2aa05e4856eb4d0e93f0brouslan@chromium.org  std::string data(kCorruptedWrappedData);
1062fefd83dd2c65ee585a2aa05e4856eb4d0e93f0brouslan@chromium.org  EXPECT_FALSE(ValidatingUtil::UnwrapTimestamp(&data, kTimestamp));
1072fefd83dd2c65ee585a2aa05e4856eb4d0e93f0brouslan@chromium.org}
1082fefd83dd2c65ee585a2aa05e4856eb4d0e93f0brouslan@chromium.org
1092fefd83dd2c65ee585a2aa05e4856eb4d0e93f0brouslan@chromium.orgTEST(ValidatingUtilTest, UnwrapTimestamp_EmptyString) {
1102fefd83dd2c65ee585a2aa05e4856eb4d0e93f0brouslan@chromium.org  std::string data;
1112fefd83dd2c65ee585a2aa05e4856eb4d0e93f0brouslan@chromium.org  EXPECT_FALSE(ValidatingUtil::UnwrapTimestamp(&data, kTimestamp));
1122fefd83dd2c65ee585a2aa05e4856eb4d0e93f0brouslan@chromium.org}
1132fefd83dd2c65ee585a2aa05e4856eb4d0e93f0brouslan@chromium.org
1142fefd83dd2c65ee585a2aa05e4856eb4d0e93f0brouslan@chromium.orgTEST(ValidatingUtilTest, UnwrapTimestamp_GarbageData) {
1152fefd83dd2c65ee585a2aa05e4856eb4d0e93f0brouslan@chromium.org  std::string data("garbage");
1162fefd83dd2c65ee585a2aa05e4856eb4d0e93f0brouslan@chromium.org  EXPECT_FALSE(ValidatingUtil::UnwrapTimestamp(&data, kTimestamp));
1172fefd83dd2c65ee585a2aa05e4856eb4d0e93f0brouslan@chromium.org}
1182fefd83dd2c65ee585a2aa05e4856eb4d0e93f0brouslan@chromium.org
1192fefd83dd2c65ee585a2aa05e4856eb4d0e93f0brouslan@chromium.orgTEST(ValidatingUtilTest, UnwrapTimestamp_InMiddle) {
1202fefd83dd2c65ee585a2aa05e4856eb4d0e93f0brouslan@chromium.org  std::string data(kTimestampInMiddle);
1212fefd83dd2c65ee585a2aa05e4856eb4d0e93f0brouslan@chromium.org  EXPECT_FALSE(ValidatingUtil::UnwrapTimestamp(&data, kTimestamp));
1222fefd83dd2c65ee585a2aa05e4856eb4d0e93f0brouslan@chromium.org}
1232fefd83dd2c65ee585a2aa05e4856eb4d0e93f0brouslan@chromium.org
1242fefd83dd2c65ee585a2aa05e4856eb4d0e93f0brouslan@chromium.orgTEST(ValidatingUtilTest, UnwrapTimestamp_Recent) {
1252fefd83dd2c65ee585a2aa05e4856eb4d0e93f0brouslan@chromium.org  std::string data(kTimestampHalfMonthAgo);
1262fefd83dd2c65ee585a2aa05e4856eb4d0e93f0brouslan@chromium.org  EXPECT_TRUE(ValidatingUtil::UnwrapTimestamp(&data, kTimestamp));
1272fefd83dd2c65ee585a2aa05e4856eb4d0e93f0brouslan@chromium.org  EXPECT_EQ(kUnwrappedData, data);
1282fefd83dd2c65ee585a2aa05e4856eb4d0e93f0brouslan@chromium.org}
1292fefd83dd2c65ee585a2aa05e4856eb4d0e93f0brouslan@chromium.org
1302fefd83dd2c65ee585a2aa05e4856eb4d0e93f0brouslan@chromium.orgTEST(ValidatingUtilTest, UnwrapTimestamp_Stale) {
1312fefd83dd2c65ee585a2aa05e4856eb4d0e93f0brouslan@chromium.org  std::string data(kTimestampTwoMonthsAgo);
1322fefd83dd2c65ee585a2aa05e4856eb4d0e93f0brouslan@chromium.org  EXPECT_FALSE(ValidatingUtil::UnwrapTimestamp(&data, kTimestamp));
1332fefd83dd2c65ee585a2aa05e4856eb4d0e93f0brouslan@chromium.org}
1342fefd83dd2c65ee585a2aa05e4856eb4d0e93f0brouslan@chromium.org
1352fefd83dd2c65ee585a2aa05e4856eb4d0e93f0brouslan@chromium.orgTEST(ValidatingUtilTest, UnwrapTimestamp) {
1362fefd83dd2c65ee585a2aa05e4856eb4d0e93f0brouslan@chromium.org  std::string data(kWrappedData);
1372fefd83dd2c65ee585a2aa05e4856eb4d0e93f0brouslan@chromium.org  EXPECT_TRUE(ValidatingUtil::UnwrapTimestamp(&data, kTimestamp));
1382fefd83dd2c65ee585a2aa05e4856eb4d0e93f0brouslan@chromium.org  EXPECT_EQ(kChecksummedData, data);
1392fefd83dd2c65ee585a2aa05e4856eb4d0e93f0brouslan@chromium.org}
1402fefd83dd2c65ee585a2aa05e4856eb4d0e93f0brouslan@chromium.org
1412fefd83dd2c65ee585a2aa05e4856eb4d0e93f0brouslan@chromium.orgTEST(ValidatingUtilTest, Wrap) {
142128ae075bbf50996c1068740746f27430f89136droubert@google.com  std::string data = kUnwrappedData;
143128ae075bbf50996c1068740746f27430f89136droubert@google.com  ValidatingUtil::Wrap(kTimestamp, &data);
144128ae075bbf50996c1068740746f27430f89136droubert@google.com  EXPECT_EQ(kWrappedData, data);
1452fefd83dd2c65ee585a2aa05e4856eb4d0e93f0brouslan@chromium.org}
1462fefd83dd2c65ee585a2aa05e4856eb4d0e93f0brouslan@chromium.org
1472fefd83dd2c65ee585a2aa05e4856eb4d0e93f0brouslan@chromium.orgTEST(ValidatingUtilTest, WrapUnwrapIt) {
148128ae075bbf50996c1068740746f27430f89136droubert@google.com  std::string data = kUnwrappedData;
149128ae075bbf50996c1068740746f27430f89136droubert@google.com  ValidatingUtil::Wrap(kTimestamp, &data);
1502fefd83dd2c65ee585a2aa05e4856eb4d0e93f0brouslan@chromium.org  EXPECT_TRUE(ValidatingUtil::UnwrapTimestamp(&data, kTimestamp));
1512fefd83dd2c65ee585a2aa05e4856eb4d0e93f0brouslan@chromium.org  EXPECT_EQ(kChecksummedData, data);
1522fefd83dd2c65ee585a2aa05e4856eb4d0e93f0brouslan@chromium.org  EXPECT_TRUE(ValidatingUtil::UnwrapChecksum(&data));
1532fefd83dd2c65ee585a2aa05e4856eb4d0e93f0brouslan@chromium.org  EXPECT_EQ(kUnwrappedData, data);
1542fefd83dd2c65ee585a2aa05e4856eb4d0e93f0brouslan@chromium.org}
1552fefd83dd2c65ee585a2aa05e4856eb4d0e93f0brouslan@chromium.org
1562fefd83dd2c65ee585a2aa05e4856eb4d0e93f0brouslan@chromium.org}  // namespace
157