15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2011 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)#include <windows.h>
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string>
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/installer/mini_installer/mini_string.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using mini_installer::StackString;
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MiniInstallerStringTest : public testing::Test {
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetUp() {
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void TearDown() {
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests the strcat/strcpy/length support of the StackString class.
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(MiniInstallerStringTest, StackStringOverflow) {
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const wchar_t kTestString[] = L"1234567890";
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  StackString<MAX_PATH> str;
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(MAX_PATH, str.capacity());
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::wstring compare_str;
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(str.length(), compare_str.length());
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, compare_str.compare(str.get()));
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  size_t max_chars = str.capacity() - 1;
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  while ((str.length() + (arraysize(kTestString) - 1)) <= max_chars) {
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(str.append(kTestString));
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    compare_str.append(kTestString);
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(str.length(), compare_str.length());
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, compare_str.compare(str.get()));
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_GT(static_cast<size_t>(MAX_PATH), str.length());
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Now we've exhausted the space we allocated for the string,
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // so append should fail.
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(str.append(kTestString));
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // ...and remain unchanged.
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, compare_str.compare(str.get()));
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(str.length(), compare_str.length());
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Last test for fun.
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  str.clear();
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  compare_str.clear();
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, compare_str.compare(str.get()));
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(str.length(), compare_str.length());
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests the case insensitive find support of the StackString class.
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(MiniInstallerStringTest, StackStringFind) {
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const wchar_t kTestStringSource[] = L"1234ABcD567890";
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const wchar_t kTestStringFind[] = L"abcd";
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const wchar_t kTestStringNotFound[] = L"80";
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  StackString<MAX_PATH> str;
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(str.assign(kTestStringSource));
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(str.get(), str.findi(kTestStringSource));
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(static_cast<const wchar_t*>(NULL), str.findi(kTestStringNotFound));
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const wchar_t* found = str.findi(kTestStringFind);
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_NE(static_cast<const wchar_t*>(NULL), found);
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::wstring check(found, arraysize(kTestStringFind) - 1);
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, lstrcmpi(check.c_str(), kTestStringFind));
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
78