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 "base/environment.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/platform_test.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef PlatformTest EnvironmentTest;
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)namespace base {
1358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(EnvironmentTest, GetVar) {
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Every setup should have non-empty PATH...
1658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  scoped_ptr<Environment> env(Environment::Create());
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string env_value;
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(env->GetVar("PATH", &env_value));
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_NE(env_value, "");
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(EnvironmentTest, GetVarReverse) {
2358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  scoped_ptr<Environment> env(Environment::Create());
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const char* kFooUpper = "FOO";
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const char* kFooLower = "foo";
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set a variable in UPPER case.
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(env->SetVar(kFooUpper, kFooLower));
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // And then try to get this variable passing the lower case.
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string env_value;
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(env->GetVar(kFooLower, &env_value));
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_STREQ(env_value.c_str(), kFooLower);
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(env->UnSetVar(kFooUpper));
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const char* kBar = "bar";
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Now do the opposite, set the variable in the lower case.
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(env->SetVar(kFooLower, kBar));
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // And then try to get this variable passing the UPPER case.
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(env->GetVar(kFooUpper, &env_value));
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_STREQ(env_value.c_str(), kBar);
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(env->UnSetVar(kFooLower));
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(EnvironmentTest, HasVar) {
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Every setup should have PATH...
5258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  scoped_ptr<Environment> env(Environment::Create());
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(env->HasVar("PATH"));
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(EnvironmentTest, SetVar) {
5758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  scoped_ptr<Environment> env(Environment::Create());
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const char* kFooUpper = "FOO";
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const char* kFooLower = "foo";
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(env->SetVar(kFooUpper, kFooLower));
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Now verify that the environment has the new variable.
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(env->HasVar(kFooUpper));
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string var_value;
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(env->GetVar(kFooUpper, &var_value));
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(var_value, kFooLower);
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(EnvironmentTest, UnSetVar) {
7258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  scoped_ptr<Environment> env(Environment::Create());
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const char* kFooUpper = "FOO";
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const char* kFooLower = "foo";
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // First set some environment variable.
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(env->SetVar(kFooUpper, kFooLower));
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Now verify that the environment has the new variable.
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(env->HasVar(kFooUpper));
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Finally verify that the environment variable was erased.
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(env->UnSetVar(kFooUpper));
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // And check that the variable has been unset.
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(env->HasVar(kFooUpper));
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
8958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#if defined(OS_WIN)
9058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
9158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)TEST_F(EnvironmentTest, AlterEnvironment) {
9258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  const wchar_t empty[] = L"\0";
9358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  const wchar_t a2[] = L"A=2\0";
9458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  EnvironmentMap changes;
9558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  string16 e;
9658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
9758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  e = AlterEnvironment(empty, changes);
9858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  EXPECT_TRUE(e[0] == 0);
9958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
10058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  changes[L"A"] = L"1";
10158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  e = AlterEnvironment(empty, changes);
10258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  EXPECT_EQ(string16(L"A=1\0\0", 5), e);
10358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
10458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  changes.clear();
10558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  changes[L"A"] = string16();
10658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  e = AlterEnvironment(empty, changes);
10758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  EXPECT_EQ(string16(L"\0\0", 2), e);
10858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
10958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  changes.clear();
11058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  e = AlterEnvironment(a2, changes);
11158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  EXPECT_EQ(string16(L"A=2\0\0", 5), e);
11258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
11358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  changes.clear();
11458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  changes[L"A"] = L"1";
11558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  e = AlterEnvironment(a2, changes);
11658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  EXPECT_EQ(string16(L"A=1\0\0", 5), e);
11758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
11858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  changes.clear();
11958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  changes[L"A"] = string16();
12058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  e = AlterEnvironment(a2, changes);
12158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  EXPECT_EQ(string16(L"\0\0", 2), e);
12258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
12358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
12458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#else
12558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
12658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)TEST_F(EnvironmentTest, AlterEnvironment) {
12758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  const char* const empty[] = { NULL };
12858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  const char* const a2[] = { "A=2", NULL };
12958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  EnvironmentMap changes;
13058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  scoped_ptr<char*[]> e;
13158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
13258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  e = AlterEnvironment(empty, changes).Pass();
13358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  EXPECT_TRUE(e[0] == NULL);
13458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
13558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  changes["A"] = "1";
13658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  e = AlterEnvironment(empty, changes);
13758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  EXPECT_EQ(std::string("A=1"), e[0]);
13858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  EXPECT_TRUE(e[1] == NULL);
13958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
14058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  changes.clear();
14158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  changes["A"] = std::string();
14258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  e = AlterEnvironment(empty, changes);
14358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  EXPECT_TRUE(e[0] == NULL);
14458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
14558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  changes.clear();
14658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  e = AlterEnvironment(a2, changes);
14758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  EXPECT_EQ(std::string("A=2"), e[0]);
14858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  EXPECT_TRUE(e[1] == NULL);
14958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
15058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  changes.clear();
15158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  changes["A"] = "1";
15258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  e = AlterEnvironment(a2, changes);
15358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  EXPECT_EQ(std::string("A=1"), e[0]);
15458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  EXPECT_TRUE(e[1] == NULL);
15558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
15658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  changes.clear();
15758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  changes["A"] = std::string();
15858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  e = AlterEnvironment(a2, changes);
15958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  EXPECT_TRUE(e[0] == NULL);
16058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
16158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
16258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#endif
16358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
16458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}  // namespace base
165