12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file.
42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/test/chromedriver/chrome/status.h"
62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/stringprintf.h"
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace {
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Returns the string equivalent of the given |ErrorCode|.
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const char* DefaultMessageForStatusCode(StatusCode code) {
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  switch (code) {
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case kOk:
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return "ok";
16c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    case kNoSuchSession:
17c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      return "no such session";
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case kNoSuchElement:
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return "no such element";
20c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    case kNoSuchFrame:
21c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      return "no such frame";
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case kUnknownCommand:
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return "unknown command";
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case kStaleElementReference:
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return "stale element reference";
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case kElementNotVisible:
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return "element not visible";
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case kInvalidElementState:
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return "invalid element state";
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case kUnknownError:
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return "unknown error";
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case kJavaScriptError:
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return "javascript error";
342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case kXPathLookupError:
352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return "xpath lookup error";
36868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    case kTimeout:
37868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      return "timeout";
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case kNoSuchWindow:
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return "no such window";
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case kInvalidCookieDomain:
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return "invalid cookie domain";
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case kUnexpectedAlertOpen:
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return "unexpected alert open";
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case kNoAlertOpen:
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return "no alert open";
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case kScriptTimeout:
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return "asynchronous script timeout";
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case kInvalidSelector:
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return "invalid selector";
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case kSessionNotCreatedException:
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return "session not created exception";
52c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    case kNoSuchExecutionContext:
53c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      return "no such execution context";
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case kChromeNotReachable:
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return "chrome not reachable";
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case kDisconnected:
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return "disconnected";
5858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    case kForbidden:
5958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      return "forbidden";
6068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    case kTabCrashed:
6168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      return "tab crashed";
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    default:
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return "<unknown>";
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)Status::Status(StatusCode code)
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : code_(code), msg_(DefaultMessageForStatusCode(code)) {}
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)Status::Status(StatusCode code, const std::string& details)
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : code_(code),
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      msg_(DefaultMessageForStatusCode(code) + std::string(": ") + details) {
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)Status::Status(StatusCode code, const Status& cause)
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : code_(code),
792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      msg_(DefaultMessageForStatusCode(code) + std::string("\nfrom ") +
802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)           cause.message()) {}
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)Status::Status(StatusCode code,
832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)               const std::string& details,
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)               const Status& cause)
852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : code_(code),
862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      msg_(DefaultMessageForStatusCode(code) + std::string(": ") + details +
872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)           "\nfrom " + cause.message()) {
882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)Status::~Status() {}
912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void Status::AddDetails(const std::string& details) {
932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  msg_ += base::StringPrintf("\n  (%s)", details.c_str());
942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool Status::IsOk() const {
972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return code_ == kOk;
982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool Status::IsError() const {
1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return code_ != kOk;
1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)StatusCode Status::code() const {
1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return code_;
1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const std::string& Status::message() const {
1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return msg_;
1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
111