blob: 569350c9417a4ad2e5b4b1c59b2b82b179afaf3b [file] [log] [blame]
// Copyright 2013 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#import "chrome/browser/ui/cocoa/media_picker/desktop_media_picker_controller.h"
#include "base/bind.h"
#include "base/strings/utf_string_conversions.h"
#include "base/run_loop.h"
#include "chrome/browser/media/desktop_media_list_observer.h"
#include "chrome/browser/media/fake_desktop_media_list.h"
#import "chrome/browser/ui/cocoa/cocoa_test_helper.h"
#include "content/public/test/test_browser_thread_bundle.h"
#include "testing/gtest_mac.h"
@interface DesktopMediaPickerController (ExposedForTesting)
- (IKImageBrowserView*)sourceBrowser;
- (NSButton*)shareButton;
- (NSArray*)items;
@end
@implementation DesktopMediaPickerController (ExposedForTesting)
- (IKImageBrowserView*)sourceBrowser {
return sourceBrowser_;
}
- (NSButton*)shareButton {
return shareButton_;
}
- (NSButton*)cancelButton {
return cancelButton_;
}
- (NSArray*)items {
return items_;
}
@end
class DesktopMediaPickerControllerTest : public CocoaTest {
public:
DesktopMediaPickerControllerTest()
: callback_called_(false), media_list_(NULL) {
}
virtual void SetUp() override {
CocoaTest::SetUp();
media_list_ = new FakeDesktopMediaList();
DesktopMediaPicker::DoneCallback callback =
base::Bind(&DesktopMediaPickerControllerTest::OnResult,
base::Unretained(this));
controller_.reset(
[[DesktopMediaPickerController alloc]
initWithMediaList:scoped_ptr<DesktopMediaList>(media_list_)
parent:nil
callback:callback
appName:base::ASCIIToUTF16("Screenshare Test")
targetName:base::ASCIIToUTF16("https://foo.com")]);
}
virtual void TearDown() override {
controller_.reset();
CocoaTest::TearDown();
}
bool WaitForCallback() {
if (!callback_called_) {
base::RunLoop().RunUntilIdle();
}
return callback_called_;
}
protected:
void OnResult(content::DesktopMediaID source) {
EXPECT_FALSE(callback_called_);
callback_called_ = true;
source_reported_ = source;
}
content::TestBrowserThreadBundle thread_bundle_;
bool callback_called_;
content::DesktopMediaID source_reported_;
FakeDesktopMediaList* media_list_;
base::scoped_nsobject<DesktopMediaPickerController> controller_;
};
TEST_F(DesktopMediaPickerControllerTest, ShowAndDismiss) {
[controller_ showWindow:nil];
media_list_->AddSource(0);
media_list_->AddSource(1);
media_list_->SetSourceThumbnail(1);
NSArray* items = [controller_ items];
EXPECT_EQ(2U, [items count]);
EXPECT_NSEQ(@"0", [[items objectAtIndex:0] imageTitle]);
EXPECT_EQ(nil, [[items objectAtIndex:0] imageRepresentation]);
EXPECT_NSEQ(@"1", [[items objectAtIndex:1] imageTitle]);
EXPECT_TRUE([[items objectAtIndex:1] imageRepresentation] != nil);
}
TEST_F(DesktopMediaPickerControllerTest, ClickShare) {
[controller_ showWindow:nil];
media_list_->AddSource(0);
media_list_->SetSourceThumbnail(0);
media_list_->AddSource(1);
media_list_->SetSourceThumbnail(1);
EXPECT_EQ(2U, [[controller_ items] count]);
EXPECT_FALSE([[controller_ shareButton] isEnabled]);
NSIndexSet* indexSet = [NSIndexSet indexSetWithIndex:1];
[[controller_ sourceBrowser] setSelectionIndexes:indexSet
byExtendingSelection:NO];
EXPECT_TRUE([[controller_ shareButton] isEnabled]);
[[controller_ shareButton] performClick:nil];
EXPECT_TRUE(WaitForCallback());
EXPECT_EQ(media_list_->GetSource(1).id, source_reported_);
}
TEST_F(DesktopMediaPickerControllerTest, ClickCancel) {
[controller_ showWindow:nil];
media_list_->AddSource(0);
media_list_->SetSourceThumbnail(0);
media_list_->AddSource(1);
media_list_->SetSourceThumbnail(1);
[[controller_ cancelButton] performClick:nil];
EXPECT_TRUE(WaitForCallback());
EXPECT_EQ(content::DesktopMediaID(), source_reported_);
}
TEST_F(DesktopMediaPickerControllerTest, CloseWindow) {
[controller_ showWindow:nil];
media_list_->AddSource(0);
media_list_->SetSourceThumbnail(0);
media_list_->AddSource(1);
media_list_->SetSourceThumbnail(1);
[controller_ close];
EXPECT_TRUE(WaitForCallback());
EXPECT_EQ(content::DesktopMediaID(), source_reported_);
}
TEST_F(DesktopMediaPickerControllerTest, UpdateThumbnail) {
[controller_ showWindow:nil];
media_list_->AddSource(0);
media_list_->SetSourceThumbnail(0);
media_list_->AddSource(1);
media_list_->SetSourceThumbnail(1);
NSArray* items = [controller_ items];
EXPECT_EQ(2U, [items count]);
NSUInteger version = [[items objectAtIndex:0] imageVersion];
media_list_->SetSourceThumbnail(0);
EXPECT_NE(version, [[items objectAtIndex:0] imageVersion]);
}
TEST_F(DesktopMediaPickerControllerTest, UpdateName) {
[controller_ showWindow:nil];
media_list_->AddSource(0);
media_list_->SetSourceThumbnail(0);
media_list_->AddSource(1);
media_list_->SetSourceThumbnail(1);
NSArray* items = [controller_ items];
EXPECT_EQ(2U, [items count]);
NSUInteger version = [[items objectAtIndex:0] imageVersion];
media_list_->SetSourceThumbnail(0);
EXPECT_NE(version, [[items objectAtIndex:0] imageVersion]);
}
TEST_F(DesktopMediaPickerControllerTest, RemoveSource) {
[controller_ showWindow:nil];
media_list_->AddSource(0);
media_list_->AddSource(1);
media_list_->AddSource(2);
media_list_->SetSourceName(1, base::ASCIIToUTF16("foo"));
NSArray* items = [controller_ items];
EXPECT_EQ(3U, [items count]);
EXPECT_NSEQ(@"foo", [[items objectAtIndex:1] imageTitle]);
}
TEST_F(DesktopMediaPickerControllerTest, MoveSource) {
[controller_ showWindow:nil];
media_list_->AddSource(0);
media_list_->AddSource(1);
media_list_->SetSourceName(1, base::ASCIIToUTF16("foo"));
NSArray* items = [controller_ items];
EXPECT_NSEQ(@"foo", [[items objectAtIndex:1] imageTitle]);
media_list_->MoveSource(1, 0);
EXPECT_NSEQ(@"foo", [[items objectAtIndex:0] imageTitle]);
media_list_->MoveSource(0, 1);
EXPECT_NSEQ(@"foo", [[items objectAtIndex:1] imageTitle]);
}