1// Copyright (c) 2012 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include <string>
6
7#include "base/memory/scoped_ptr.h"
8#include "chrome/test/chromedriver/chrome/status.h"
9#include "chrome/test/chromedriver/chrome/stub_chrome.h"
10#include "chrome/test/chromedriver/chrome/stub_web_view.h"
11#include "chrome/test/chromedriver/session.h"
12#include "testing/gtest/include/gtest/gtest.h"
13
14namespace {
15
16class MockChrome : public StubChrome {
17 public:
18  MockChrome() : web_view_("1") {}
19  virtual ~MockChrome() {}
20
21  virtual Status GetWebViewById(const std::string& id,
22                                WebView** web_view) OVERRIDE {
23    if (id == web_view_.GetId()) {
24      *web_view = &web_view_;
25      return Status(kOk);
26    }
27    return Status(kUnknownError);
28  }
29
30 private:
31  StubWebView web_view_;
32};
33
34}  // namespace
35
36TEST(Session, GetTargetWindowNoChrome) {
37  Session session("1");
38  WebView* web_view;
39  ASSERT_EQ(kNoSuchWindow, session.GetTargetWindow(&web_view).code());
40}
41
42TEST(Session, GetTargetWindowTargetWindowClosed) {
43  scoped_ptr<Chrome> chrome(new MockChrome());
44  Session session("1", chrome.Pass());
45  session.window = "2";
46  WebView* web_view;
47  ASSERT_EQ(kNoSuchWindow, session.GetTargetWindow(&web_view).code());
48}
49
50TEST(Session, GetTargetWindowTargetWindowStillOpen) {
51  scoped_ptr<Chrome> chrome(new MockChrome());
52  Session session("1", chrome.Pass());
53  session.window = "1";
54  WebView* web_view = NULL;
55  ASSERT_EQ(kOk, session.GetTargetWindow(&web_view).code());
56  ASSERT_TRUE(web_view);
57}
58
59TEST(Session, SwitchToParentFrame) {
60  scoped_ptr<Chrome> chrome(new MockChrome());
61  Session session("1", chrome.Pass());
62
63  // Initial frame should be top frame.
64  ASSERT_EQ(std::string(), session.GetCurrentFrameId());
65
66  // Switching to parent frame should be a no-op.
67  session.SwitchToParentFrame();
68  ASSERT_EQ(std::string(), session.GetCurrentFrameId());
69
70  session.SwitchToSubFrame("1.1", std::string());
71  ASSERT_EQ("1.1", session.GetCurrentFrameId());
72  session.SwitchToParentFrame();
73  ASSERT_EQ(std::string(), session.GetCurrentFrameId());
74
75  session.SwitchToSubFrame("2.1", std::string());
76  ASSERT_EQ("2.1", session.GetCurrentFrameId());
77  session.SwitchToSubFrame("2.2", std::string());
78  ASSERT_EQ("2.2", session.GetCurrentFrameId());
79  session.SwitchToParentFrame();
80  ASSERT_EQ("2.1", session.GetCurrentFrameId());
81  session.SwitchToParentFrame();
82  ASSERT_EQ(std::string(), session.GetCurrentFrameId());
83}
84
85TEST(Session, SwitchToTopFrame) {
86  scoped_ptr<Chrome> chrome(new MockChrome());
87  Session session("1", chrome.Pass());
88
89  // Initial frame should be top frame.
90  ASSERT_EQ(std::string(), session.GetCurrentFrameId());
91
92  // Switching to top frame should be a no-op.
93  session.SwitchToTopFrame();
94  ASSERT_EQ(std::string(), session.GetCurrentFrameId());
95
96  session.SwitchToSubFrame("3.1", std::string());
97  ASSERT_EQ("3.1", session.GetCurrentFrameId());
98  session.SwitchToSubFrame("3.2", std::string());
99  ASSERT_EQ("3.2", session.GetCurrentFrameId());
100  session.SwitchToTopFrame();
101  ASSERT_EQ(std::string(), session.GetCurrentFrameId());
102}
103