desktop_media_picker_controller_unittest.mm revision a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7
1// Copyright 2013 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#import "chrome/browser/ui/cocoa/media_picker/desktop_media_picker_controller.h"
6
7#include "base/bind.h"
8#include "base/strings/utf_string_conversions.h"
9#include "base/run_loop.h"
10#include "chrome/browser/media/desktop_media_list_observer.h"
11#include "chrome/browser/media/fake_desktop_media_list.h"
12#import "chrome/browser/ui/cocoa/cocoa_test_helper.h"
13#include "content/public/test/test_browser_thread_bundle.h"
14#include "testing/gtest_mac.h"
15
16@interface DesktopMediaPickerController (ExposedForTesting)
17- (IKImageBrowserView*)sourceBrowser;
18- (NSButton*)okButton;
19- (NSArray*)items;
20@end
21
22@implementation DesktopMediaPickerController (ExposedForTesting)
23- (IKImageBrowserView*)sourceBrowser {
24  return sourceBrowser_;
25}
26
27- (NSButton*)okButton {
28  return okButton_;
29}
30
31- (NSButton*)cancelButton {
32  return cancelButton_;
33}
34
35- (NSArray*)items {
36  return items_;
37}
38@end
39
40class DesktopMediaPickerControllerTest : public CocoaTest {
41 public:
42  DesktopMediaPickerControllerTest()
43      : callback_called_(false), media_list_(NULL) {
44  }
45
46  virtual void SetUp() OVERRIDE {
47    CocoaTest::SetUp();
48
49    media_list_ = new FakeDesktopMediaList();
50
51    DesktopMediaPicker::DoneCallback callback =
52        base::Bind(&DesktopMediaPickerControllerTest::OnResult,
53                   base::Unretained(this));
54
55    controller_.reset(
56        [[DesktopMediaPickerController alloc]
57            initWithMediaList:scoped_ptr<DesktopMediaList>(media_list_)
58                     callback:callback
59                      appName:ASCIIToUTF16("Screenshare Test")]);
60  }
61
62  virtual void TearDown() OVERRIDE {
63    controller_.reset();
64    CocoaTest::TearDown();
65  }
66
67  bool WaitForCallback() {
68    if (!callback_called_) {
69      base::RunLoop().RunUntilIdle();
70    }
71    return callback_called_;
72  }
73
74 protected:
75  void OnResult(content::DesktopMediaID source) {
76    EXPECT_FALSE(callback_called_);
77    callback_called_ = true;
78    source_reported_ = source;
79  }
80
81  content::TestBrowserThreadBundle thread_bundle_;
82  bool callback_called_;
83  content::DesktopMediaID source_reported_;
84  FakeDesktopMediaList* media_list_;
85  base::scoped_nsobject<DesktopMediaPickerController> controller_;
86};
87
88TEST_F(DesktopMediaPickerControllerTest, ShowAndDismiss) {
89  [controller_ showWindow:nil];
90
91  media_list_->AddSource(0);
92  media_list_->AddSource(1);
93  media_list_->SetSourceThumbnail(1);
94
95  NSArray* items = [controller_ items];
96  EXPECT_EQ(2U, [items count]);
97  EXPECT_NSEQ(@"0", [[items objectAtIndex:0] imageTitle]);
98  EXPECT_EQ(nil, [[items objectAtIndex:0] imageRepresentation]);
99  EXPECT_NSEQ(@"1", [[items objectAtIndex:1] imageTitle]);
100  EXPECT_TRUE([[items objectAtIndex:1] imageRepresentation] != nil);
101}
102
103TEST_F(DesktopMediaPickerControllerTest, ClickOK) {
104  [controller_ showWindow:nil];
105
106  media_list_->AddSource(0);
107  media_list_->SetSourceThumbnail(0);
108  media_list_->AddSource(1);
109  media_list_->SetSourceThumbnail(1);
110
111  EXPECT_EQ(2U, [[controller_ items] count]);
112  EXPECT_FALSE([[controller_ okButton] isEnabled]);
113
114  NSIndexSet* indexSet = [NSIndexSet indexSetWithIndex:1];
115  [[controller_ sourceBrowser] setSelectionIndexes:indexSet
116                              byExtendingSelection:NO];
117  EXPECT_TRUE([[controller_ okButton] isEnabled]);
118
119  [[controller_ okButton] performClick:nil];
120  EXPECT_TRUE(WaitForCallback());
121  EXPECT_EQ(media_list_->GetSource(1).id, source_reported_);
122}
123
124TEST_F(DesktopMediaPickerControllerTest, ClickCancel) {
125  [controller_ showWindow:nil];
126
127  media_list_->AddSource(0);
128  media_list_->SetSourceThumbnail(0);
129  media_list_->AddSource(1);
130  media_list_->SetSourceThumbnail(1);
131
132  [[controller_ cancelButton] performClick:nil];
133  EXPECT_TRUE(WaitForCallback());
134  EXPECT_EQ(content::DesktopMediaID(), source_reported_);
135}
136
137TEST_F(DesktopMediaPickerControllerTest, CloseWindow) {
138  [controller_ showWindow:nil];
139
140  media_list_->AddSource(0);
141  media_list_->SetSourceThumbnail(0);
142  media_list_->AddSource(1);
143  media_list_->SetSourceThumbnail(1);
144
145  [controller_ close];
146  EXPECT_TRUE(WaitForCallback());
147  EXPECT_EQ(content::DesktopMediaID(), source_reported_);
148}
149
150TEST_F(DesktopMediaPickerControllerTest, UpdateThumbnail) {
151  [controller_ showWindow:nil];
152
153  media_list_->AddSource(0);
154  media_list_->SetSourceThumbnail(0);
155  media_list_->AddSource(1);
156  media_list_->SetSourceThumbnail(1);
157
158  NSArray* items = [controller_ items];
159  EXPECT_EQ(2U, [items count]);
160  NSUInteger version = [[items objectAtIndex:0] imageVersion];
161
162  media_list_->SetSourceThumbnail(0);
163  EXPECT_NE(version, [[items objectAtIndex:0] imageVersion]);
164}
165
166TEST_F(DesktopMediaPickerControllerTest, UpdateName) {
167  [controller_ showWindow:nil];
168
169  media_list_->AddSource(0);
170  media_list_->SetSourceThumbnail(0);
171  media_list_->AddSource(1);
172  media_list_->SetSourceThumbnail(1);
173
174  NSArray* items = [controller_ items];
175  EXPECT_EQ(2U, [items count]);
176  NSUInteger version = [[items objectAtIndex:0] imageVersion];
177
178  media_list_->SetSourceThumbnail(0);
179  EXPECT_NE(version, [[items objectAtIndex:0] imageVersion]);
180}
181
182TEST_F(DesktopMediaPickerControllerTest, RemoveSource) {
183  [controller_ showWindow:nil];
184
185  media_list_->AddSource(0);
186  media_list_->AddSource(1);
187  media_list_->AddSource(2);
188  media_list_->SetSourceName(1, ASCIIToUTF16("foo"));
189
190  NSArray* items = [controller_ items];
191  EXPECT_EQ(3U, [items count]);
192  EXPECT_NSEQ(@"foo", [[items objectAtIndex:1] imageTitle]);
193}
194