17745b32edeb9ec1c2763030bb42a8fc0c3e6d8c4David 'Digit' Turner// Copyright 2014 The Android Open Source Project 27745b32edeb9ec1c2763030bb42a8fc0c3e6d8c4David 'Digit' Turner// 37745b32edeb9ec1c2763030bb42a8fc0c3e6d8c4David 'Digit' Turner// This software is licensed under the terms of the GNU General Public 47745b32edeb9ec1c2763030bb42a8fc0c3e6d8c4David 'Digit' Turner// License version 2, as published by the Free Software Foundation, and 57745b32edeb9ec1c2763030bb42a8fc0c3e6d8c4David 'Digit' Turner// may be copied, distributed, and modified under those terms. 67745b32edeb9ec1c2763030bb42a8fc0c3e6d8c4David 'Digit' Turner// 77745b32edeb9ec1c2763030bb42a8fc0c3e6d8c4David 'Digit' Turner// This program is distributed in the hope that it will be useful, 87745b32edeb9ec1c2763030bb42a8fc0c3e6d8c4David 'Digit' Turner// but WITHOUT ANY WARRANTY; without even the implied warranty of 97745b32edeb9ec1c2763030bb42a8fc0c3e6d8c4David 'Digit' Turner// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 107745b32edeb9ec1c2763030bb42a8fc0c3e6d8c4David 'Digit' Turner// GNU General Public License for more details. 117745b32edeb9ec1c2763030bb42a8fc0c3e6d8c4David 'Digit' Turner 127745b32edeb9ec1c2763030bb42a8fc0c3e6d8c4David 'Digit' Turner#include "android/utils/win32_cmdline_quote.h" 137745b32edeb9ec1c2763030bb42a8fc0c3e6d8c4David 'Digit' Turner 147745b32edeb9ec1c2763030bb42a8fc0c3e6d8c4David 'Digit' Turner#include <gtest/gtest.h> 157745b32edeb9ec1c2763030bb42a8fc0c3e6d8c4David 'Digit' Turner 167745b32edeb9ec1c2763030bb42a8fc0c3e6d8c4David 'Digit' Turner#include "android/utils/system.h" 177745b32edeb9ec1c2763030bb42a8fc0c3e6d8c4David 'Digit' Turner 187745b32edeb9ec1c2763030bb42a8fc0c3e6d8c4David 'Digit' Turner// Helper class to hold a scoped heap-allocated string pointer that gets 197745b32edeb9ec1c2763030bb42a8fc0c3e6d8c4David 'Digit' Turner// deleted on scope exit. 207745b32edeb9ec1c2763030bb42a8fc0c3e6d8c4David 'Digit' Turnerclass ScopedCString { 217745b32edeb9ec1c2763030bb42a8fc0c3e6d8c4David 'Digit' Turnerpublic: 227745b32edeb9ec1c2763030bb42a8fc0c3e6d8c4David 'Digit' Turner ScopedCString(const char* str) : str_(str) {} 237745b32edeb9ec1c2763030bb42a8fc0c3e6d8c4David 'Digit' Turner const char* str() const { return str_; } 247745b32edeb9ec1c2763030bb42a8fc0c3e6d8c4David 'Digit' Turner ~ScopedCString() { AFREE((void*)str_); } 257745b32edeb9ec1c2763030bb42a8fc0c3e6d8c4David 'Digit' Turnerprivate: 267745b32edeb9ec1c2763030bb42a8fc0c3e6d8c4David 'Digit' Turner const char* str_; 277745b32edeb9ec1c2763030bb42a8fc0c3e6d8c4David 'Digit' Turner}; 287745b32edeb9ec1c2763030bb42a8fc0c3e6d8c4David 'Digit' Turner 297745b32edeb9ec1c2763030bb42a8fc0c3e6d8c4David 'Digit' Turner#define ARRAY_SIZE(x) (sizeof(x)/sizeof(x[0])) 307745b32edeb9ec1c2763030bb42a8fc0c3e6d8c4David 'Digit' Turner 317745b32edeb9ec1c2763030bb42a8fc0c3e6d8c4David 'Digit' TurnerTEST(win32_cmdline_quote,Test) { 327745b32edeb9ec1c2763030bb42a8fc0c3e6d8c4David 'Digit' Turner static const struct { 337745b32edeb9ec1c2763030bb42a8fc0c3e6d8c4David 'Digit' Turner const char* input; 347745b32edeb9ec1c2763030bb42a8fc0c3e6d8c4David 'Digit' Turner const char* expected; 357745b32edeb9ec1c2763030bb42a8fc0c3e6d8c4David 'Digit' Turner } kData[] = { 367745b32edeb9ec1c2763030bb42a8fc0c3e6d8c4David 'Digit' Turner { "foo", "foo" }, 377745b32edeb9ec1c2763030bb42a8fc0c3e6d8c4David 'Digit' Turner { "foo bar", "\"foo bar\"" }, 387745b32edeb9ec1c2763030bb42a8fc0c3e6d8c4David 'Digit' Turner { "foo\\bar", "foo\\bar" }, 397745b32edeb9ec1c2763030bb42a8fc0c3e6d8c4David 'Digit' Turner { "foo\\\\bar", "foo\\\\bar" }, 407745b32edeb9ec1c2763030bb42a8fc0c3e6d8c4David 'Digit' Turner { "foo\"bar", "\"foo\\\"bar\"" }, 417745b32edeb9ec1c2763030bb42a8fc0c3e6d8c4David 'Digit' Turner { "foo\\\"bar", "\"foo\\\\\\\"bar\"" }, 427745b32edeb9ec1c2763030bb42a8fc0c3e6d8c4David 'Digit' Turner { "foo\\bar zoo", "\"foo\\bar zoo\"" }, 437745b32edeb9ec1c2763030bb42a8fc0c3e6d8c4David 'Digit' Turner }; 447745b32edeb9ec1c2763030bb42a8fc0c3e6d8c4David 'Digit' Turner for (size_t n = 0; n < ARRAY_SIZE(kData); ++n) { 457745b32edeb9ec1c2763030bb42a8fc0c3e6d8c4David 'Digit' Turner const char* input = kData[n].input; 467745b32edeb9ec1c2763030bb42a8fc0c3e6d8c4David 'Digit' Turner const char* expected = kData[n].expected; 477745b32edeb9ec1c2763030bb42a8fc0c3e6d8c4David 'Digit' Turner 487745b32edeb9ec1c2763030bb42a8fc0c3e6d8c4David 'Digit' Turner ScopedCString out(win32_cmdline_quote(input)); 497745b32edeb9ec1c2763030bb42a8fc0c3e6d8c4David 'Digit' Turner EXPECT_STREQ(expected, out.str()) << "Quoting '" << input << "'"; 507745b32edeb9ec1c2763030bb42a8fc0c3e6d8c4David 'Digit' Turner } 517745b32edeb9ec1c2763030bb42a8fc0c3e6d8c4David 'Digit' Turner} 52