15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A test application for the MachineDealCode class.
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// These tests should not be executed on the build server:
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - They assert for the failed cases.
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - They modify machine state (registry).
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// These tests require write access to HKLM and HKCU, unless
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// rlz_lib::CreateMachineState() has been successfully called.
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gmock/include/gmock/gmock.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "rlz/test/rlz_test_helpers.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "rlz/win/lib/machine_deal.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MachineDealCodeHelper : public rlz_lib::MachineDealCode {
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static bool Clear() { return rlz_lib::MachineDealCode::Clear(); }
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MachineDealCodeHelper() {}
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ~MachineDealCodeHelper() {}
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MachineDealCodeTest : public RlzLibTestBase {
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(MachineDealCodeTest, CreateMachineState) {
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(rlz_lib::CreateMachineState());
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(MachineDealCodeTest, Set) {
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MachineDealCodeHelper::Clear();
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  char dcc_50[50];
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dcc_50[0] = 0;
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(rlz_lib::MachineDealCode::Set("dcc_value"));
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(rlz_lib::MachineDealCode::Get(dcc_50, 50));
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_STREQ("dcc_value", dcc_50);
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(rlz_lib::MachineDealCode::Set("dcc_value_2"));
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(rlz_lib::MachineDealCode::Get(dcc_50, 50));
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_STREQ("dcc_value_2", dcc_50);
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(MachineDealCodeTest, Get) {
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MachineDealCodeHelper::Clear();
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  char dcc_50[50], dcc_2[2];
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dcc_50[0] = 0;
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dcc_2[0] = 0;
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(rlz_lib::MachineDealCode::Get(dcc_50, 50));
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(rlz_lib::MachineDealCode::Set("dcc_value"));
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(rlz_lib::MachineDealCode::Get(dcc_50, 50));
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_STREQ("dcc_value", dcc_50);
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(rlz_lib::MachineDealCode::Get(dcc_2, 2));
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(MachineDealCodeTest, SetFromPingResponse) {
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  rlz_lib::MachineDealCode::Set("MyDCCode");
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  char dcc_50[50];
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Bad responses
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const char kBadDccResponse[] =
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "dcc: NotMyDCCode \r\n"
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "set_dcc: NewDCCode\r\n"
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "crc32: 1B4D6BB3";
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(rlz_lib::MachineDealCode::SetFromPingResponse(
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      kBadDccResponse));
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(rlz_lib::MachineDealCode::Get(dcc_50, 50));
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_STREQ("MyDCCode", dcc_50);
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const char kBadCrcResponse[] =
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "dcc: MyDCCode \r\n"
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "set_dcc: NewDCCode\r\n"
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "crc32: 90707106";
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(rlz_lib::MachineDealCode::SetFromPingResponse(
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      kBadCrcResponse));
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(rlz_lib::MachineDealCode::Get(dcc_50, 50));
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_STREQ("MyDCCode", dcc_50);
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Good responses
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const char kMissingSetResponse[] =
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "dcc: MyDCCode \r\n"
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "crc32: 35F2E717";
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(rlz_lib::MachineDealCode::SetFromPingResponse(
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      kMissingSetResponse));
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(rlz_lib::MachineDealCode::Get(dcc_50, 50));
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_STREQ("MyDCCode", dcc_50);
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const char kGoodResponse[] =
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "dcc: MyDCCode \r\n"
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "set_dcc: NewDCCode\r\n"
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "crc32: C8540E02";
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(rlz_lib::MachineDealCode::SetFromPingResponse(
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      kGoodResponse));
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(rlz_lib::MachineDealCode::Get(dcc_50, 50));
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_STREQ("NewDCCode", dcc_50);
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const char kGoodResponse2[] =
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "set_dcc: NewDCCode2  \r\n"
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "dcc:   NewDCCode \r\n"
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "crc32: 60B6409A";
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(rlz_lib::MachineDealCode::SetFromPingResponse(
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      kGoodResponse2));
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(rlz_lib::MachineDealCode::Get(dcc_50, 50));
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_STREQ("NewDCCode2", dcc_50);
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MachineDealCodeHelper::Clear();
1221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const char kGoodResponse3[] =
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "set_dcc: NewDCCode  \r\n"
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "crc32: 374C1C47";
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(rlz_lib::MachineDealCode::SetFromPingResponse(
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      kGoodResponse3));
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(rlz_lib::MachineDealCode::Get(dcc_50, 50));
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_STREQ("NewDCCode", dcc_50);
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MachineDealCodeHelper::Clear();
1311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const char kGoodResponse4[] =
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "dcc:   \r\n"
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "set_dcc: NewDCCode  \r\n"
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "crc32: 0AB1FB39";
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(rlz_lib::MachineDealCode::SetFromPingResponse(
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      kGoodResponse4));
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(rlz_lib::MachineDealCode::Get(dcc_50, 50));
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_STREQ("NewDCCode", dcc_50);
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(MachineDealCodeTest, GetAsCgi) {
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MachineDealCodeHelper::Clear();
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  char cgi_50[50], cgi_2[2];
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cgi_50[0] = 0;
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cgi_2[0] = 0;
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(rlz_lib::MachineDealCode::GetAsCgi(cgi_50, 50));
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_STREQ("", cgi_50);
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(rlz_lib::MachineDealCode::Set("dcc_value"));
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(rlz_lib::MachineDealCode::GetAsCgi(cgi_50, 50));
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_STREQ("dcc=dcc_value", cgi_50);
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(rlz_lib::MachineDealCode::GetAsCgi(cgi_2, 2));
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
157