google_service_auth_error_unittest.cc revision 5821806d5e7f356e8fa4b058a389a808ea183019
15f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// found in the LICENSE file.
45f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
55f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "google_apis/gaia/google_service_auth_error.h"
65f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
75f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include <string>
85f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
95f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "base/memory/scoped_ptr.h"
105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "base/test/values_test_util.h"
111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/values.h"
125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "net/base/net_errors.h"
135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)namespace {
161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)using base::ExpectDictStringValue;
185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)class GoogleServiceAuthErrorTest : public testing::Test {};
205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void TestSimpleState(GoogleServiceAuthError::State state) {
225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  GoogleServiceAuthError error(state);
235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  scoped_ptr<DictionaryValue> value(error.ToValue());
245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_EQ(1u, value->size());
255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  std::string state_str;
265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_TRUE(value->GetString("state", &state_str));
275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_FALSE(state_str.empty());
285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_NE("CONNECTION_FAILED", state_str);
295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_NE("CAPTCHA_REQUIRED", state_str);
305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)TEST_F(GoogleServiceAuthErrorTest, SimpleToValue) {
335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  for (int i = GoogleServiceAuthError::NONE;
345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)       i <= GoogleServiceAuthError::USER_NOT_SIGNED_UP; ++i) {
355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    TestSimpleState(static_cast<GoogleServiceAuthError::State>(i));
365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  }
375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)TEST_F(GoogleServiceAuthErrorTest, None) {
405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  GoogleServiceAuthError error(GoogleServiceAuthError::None());
411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  scoped_ptr<DictionaryValue> value(error.ToValue());
421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(1u, value->size());
435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ExpectDictStringValue("NONE", *value, "state");
446e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)}
455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)TEST_F(GoogleServiceAuthErrorTest, ConnectionFailed) {
475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  GoogleServiceAuthError error(
485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      GoogleServiceAuthError::FromConnectionError(net::OK));
495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  scoped_ptr<DictionaryValue> value(error.ToValue());
505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_EQ(2u, value->size());
515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ExpectDictStringValue("CONNECTION_FAILED", *value, "state");
525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ExpectDictStringValue("net::OK", *value, "networkError");
535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
545f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
555f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)TEST_F(GoogleServiceAuthErrorTest, CaptchaChallenge) {
565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  GoogleServiceAuthError error(
575f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      GoogleServiceAuthError::FromClientLoginCaptchaChallenge(
585f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)          "captcha_token", GURL("http://www.google.com"),
595f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)          GURL("http://www.bing.com")));
605f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  scoped_ptr<DictionaryValue> value(error.ToValue());
615f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_EQ(2u, value->size());
625f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ExpectDictStringValue("CAPTCHA_REQUIRED", *value, "state");
635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  DictionaryValue* captcha_value = NULL;
645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_TRUE(value->GetDictionary("captcha", &captcha_value));
655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ASSERT_TRUE(captcha_value);
665f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ExpectDictStringValue("captcha_token", *captcha_value, "token");
675f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ExpectDictStringValue("", *captcha_value, "audioUrl");
685f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ExpectDictStringValue("http://www.google.com/", *captcha_value, "imageUrl");
695f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ExpectDictStringValue("http://www.bing.com/", *captcha_value, "unlockUrl");
705f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ExpectDictIntegerValue(0, *captcha_value, "imageWidth");
715f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ExpectDictIntegerValue(0, *captcha_value, "imageHeight");
725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
735f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)TEST_F(GoogleServiceAuthErrorTest, CaptchaChallenge2) {
755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  GoogleServiceAuthError error(
765f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      GoogleServiceAuthError::FromCaptchaChallenge(
775f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)          "captcha_token", GURL("http://www.audio.com"),
785f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)          GURL("http://www.image.com"), 320, 200));
795f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  scoped_ptr<DictionaryValue> value(error.ToValue());
805f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_EQ(2u, value->size());
815f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ExpectDictStringValue("CAPTCHA_REQUIRED", *value, "state");
825f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  DictionaryValue* captcha_value = NULL;
835f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_TRUE(value->GetDictionary("captcha", &captcha_value));
845f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ASSERT_TRUE(captcha_value);
855f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ExpectDictStringValue("captcha_token", *captcha_value, "token");
865f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ExpectDictStringValue("http://www.audio.com/", *captcha_value, "audioUrl");
875f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ExpectDictStringValue("http://www.image.com/", *captcha_value, "imageUrl");
885f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ExpectDictIntegerValue(320, *captcha_value, "imageWidth");
895f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ExpectDictIntegerValue(200, *captcha_value, "imageHeight");
905f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
915f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
925f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)TEST_F(GoogleServiceAuthErrorTest, TwoFactorChallenge) {
935f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  GoogleServiceAuthError error(
945f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      GoogleServiceAuthError::FromSecondFactorChallenge(
955f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)          "two_factor_token", "prompt_text", "alternate_text", 10));
965f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  scoped_ptr<DictionaryValue> value(error.ToValue());
975f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_EQ(2u, value->size());
985f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ExpectDictStringValue("TWO_FACTOR", *value, "state");
995f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  DictionaryValue* two_factor_value = NULL;
1005f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_TRUE(value->GetDictionary("two_factor", &two_factor_value));
1015f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ASSERT_TRUE(two_factor_value);
1025f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ExpectDictStringValue("two_factor_token", *two_factor_value, "token");
1035f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ExpectDictStringValue("prompt_text", *two_factor_value, "promptText");
1045f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ExpectDictStringValue("alternate_text", *two_factor_value, "alternateText");
1055f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ExpectDictIntegerValue(10, *two_factor_value, "fieldLength");
1065f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
1075f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1085f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)TEST_F(GoogleServiceAuthErrorTest, ClientOAuthError) {
1095f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // Test that a malformed/incomplete ClientOAuth response generates
1105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // a connection problem error.
1115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  GoogleServiceAuthError error1(
1125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      GoogleServiceAuthError::FromClientOAuthError("{}"));
1135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_EQ(GoogleServiceAuthError::CONNECTION_FAILED, error1.state());
1145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // Test that a well formed ClientOAuth response generates an invalid
1165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // credentials error with the given error message.
1175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  GoogleServiceAuthError error2(
1185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      GoogleServiceAuthError::FromClientOAuthError(
1195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)          "{\"cause\":\"foo\",\"explanation\":\"error_message\"}"));
1205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_EQ(GoogleServiceAuthError::INVALID_GAIA_CREDENTIALS, error2.state());
121  EXPECT_EQ("error_message", error2.error_message());
122}
123
124}  // namespace
125