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 <string>
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/command_line.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/environment.h"
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/files/file_path.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
11a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch#include "base/process/launch.h"
12868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string_util.h"
13868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/stringprintf.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/test/python_utils.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(PythonUtils, Append) {
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const base::FilePath::CharType kAppendDir1[] =
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      FILE_PATH_LITERAL("test/path_append1");
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const base::FilePath::CharType kAppendDir2[] =
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      FILE_PATH_LITERAL("test/path_append2");
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<base::Environment> env(base::Environment::Create());
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string python_path;
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath append_path1(kAppendDir1);
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath append_path2(kAppendDir2);
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Get a clean start
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  env->UnSetVar(kPythonPathEnv);
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Append the path
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AppendToPythonPath(append_path1);
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  env->GetVar(kPythonPathEnv, &python_path);
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(python_path, "test/path_append1");
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Append the safe path again, nothing changes
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AppendToPythonPath(append_path2);
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  env->GetVar(kPythonPathEnv, &python_path);
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(std::string("test/path_append1;test/path_append2"), python_path);
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#elif defined(OS_POSIX)
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(std::string("test/path_append1:test/path_append2"), python_path);
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(PythonUtils, PythonRunTime) {
4846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  base::CommandLine cmd_line(base::CommandLine::NO_PROGRAM);
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(GetPythonCommand(&cmd_line));
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Run a python command to print a string and make sure the output is what
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // we want.
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cmd_line.AppendArg("-c");
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string input("PythonUtilsTest");
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::string python_cmd = base::StringPrintf("print '%s';", input.c_str());
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cmd_line.AppendArg(python_cmd);
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string output;
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(base::GetAppOutput(cmd_line, &output));
59a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  base::TrimWhitespace(output, base::TRIM_TRAILING, &output);
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(input, output);
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
62