| Index: ppapi/proxy/file_chooser_resource_unittest.cc
|
| diff --git a/ppapi/proxy/file_chooser_resource_unittest.cc b/ppapi/proxy/file_chooser_resource_unittest.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..e18fc449b3c3ace7077adaea375517720b1a8275
|
| --- /dev/null
|
| +++ b/ppapi/proxy/file_chooser_resource_unittest.cc
|
| @@ -0,0 +1,140 @@
|
| +// Copyright (c) 2012 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.
|
| +
|
| +#include "base/message_loop.h"
|
| +#include "ppapi/c/dev/ppb_file_chooser_dev.h"
|
| +#include "ppapi/c/pp_errors.h"
|
| +#include "ppapi/proxy/file_chooser_resource.h"
|
| +#include "ppapi/proxy/ppapi_messages.h"
|
| +#include "ppapi/proxy/ppapi_proxy_test.h"
|
| +#include "ppapi/thunk/thunk.h"
|
| +#include "ppapi/shared_impl/scoped_pp_resource.h"
|
| +#include "ppapi/shared_impl/scoped_pp_var.h"
|
| +#include "ppapi/shared_impl/var.h"
|
| +
|
| +namespace ppapi {
|
| +namespace proxy {
|
| +
|
| +namespace {
|
| +
|
| +typedef PluginProxyTest FileChooserResourceTest;
|
| +
|
| +void* GetFileRefDataBuffer(void* user_data,
|
| + uint32_t element_count,
|
| + uint32_t element_size) {
|
| + EXPECT_TRUE(element_size == sizeof(PP_Resource));
|
| + std::vector<PP_Resource>* output =
|
| + static_cast<std::vector<PP_Resource>*>(user_data);
|
| + output->resize(element_count);
|
| + if (element_count > 0)
|
| + return &(*output)[0];
|
| + return NULL;
|
| +}
|
| +
|
| +void DoNothingCallback(void* user_data, int32_t result) {
|
| +}
|
| +
|
| +// Calls PopulateAcceptTypes and verifies that the resulting array contains
|
| +// the given values. The values may be NULL if there aren't expected to be
|
| +// that many results.
|
| +bool CheckParseAcceptType(const std::string& input,
|
| + const char* expected1,
|
| + const char* expected2) {
|
| + std::vector<std::string> output;
|
| + FileChooserResource::PopulateAcceptTypes(input, &output);
|
| +
|
| + const size_t kCount = 2;
|
| + const char* expected[kCount] = { expected1, expected2 };
|
| +
|
| + for (size_t i = 0; i < kCount; i++) {
|
| + if (!expected[i])
|
| + return i == output.size();
|
| + if (output.size() <= i)
|
| + return false;
|
| + if (output[i] != expected[i])
|
| + return false;
|
| + }
|
| +
|
| + return output.size() == kCount;
|
| +}
|
| +
|
| +} // namespace
|
| +
|
| +// Does a full test of Show() and reply functionality in the plugin side using
|
| +// the public C interfaces.
|
| +TEST_F(FileChooserResourceTest, Show) {
|
| + const PPB_FileChooser_Dev_0_6* chooser_iface =
|
| + thunk::GetPPB_FileChooser_Dev_0_6_Thunk();
|
| + ScopedPPResource res(ScopedPPResource::PassRef(),
|
| + chooser_iface->Create(pp_instance(), PP_FILECHOOSERMODE_OPEN,
|
| + PP_MakeUndefined()));
|
| +
|
| + std::vector<PP_Resource> dest;
|
| + PP_ArrayOutput output;
|
| + output.GetDataBuffer = &GetFileRefDataBuffer;
|
| + output.user_data = &dest;
|
| +
|
| + int32_t result = chooser_iface->Show(
|
| + res, output, PP_MakeCompletionCallback(&DoNothingCallback, NULL));
|
| + ASSERT_EQ(PP_OK_COMPLETIONPENDING, result);
|
| +
|
| + // Should have sent a "show" message.
|
| + ResourceMessageCallParams params;
|
| + IPC::Message msg;
|
| + ASSERT_TRUE(sink().GetFirstResourceCallMatching(
|
| + PpapiHostMsg_FileChooser_Show::ID, ¶ms, &msg));
|
| +
|
| + ResourceMessageReplyParams reply_params(params.pp_resource(),
|
| + params.sequence());
|
| + reply_params.set_result(PP_OK);
|
| +
|
| + // Synthesize a response with one file ref in it. Note that it must have a
|
| + // host resource value set or deserialization will fail. Since there isn't
|
| + // actually a host, this can be whatever we want.
|
| + std::vector<PPB_FileRef_CreateInfo> create_info_array;
|
| + PPB_FileRef_CreateInfo create_info;
|
| + create_info.resource.SetHostResource(pp_instance(), 123);
|
| + create_info.path = "foo/bar";
|
| + create_info.name = "baz";
|
| + create_info_array.push_back(create_info);
|
| + ASSERT_TRUE(plugin_dispatcher()->OnMessageReceived(
|
| + PpapiPluginMsg_ResourceReply(reply_params,
|
| + PpapiPluginMsg_FileChooser_ShowReply(create_info_array))));
|
| +
|
| + // Should have populated our vector.
|
| + ASSERT_EQ(1u, dest.size());
|
| + ScopedPPResource dest_deletor(dest[0]); // Ensure it's cleaned up.
|
| +
|
| + const PPB_FileRef_1_0* file_ref_iface = thunk::GetPPB_FileRef_1_0_Thunk();
|
| + EXPECT_EQ(PP_FILESYSTEMTYPE_EXTERNAL,
|
| + file_ref_iface->GetFileSystemType(dest[0]));
|
| +
|
| + ScopedPPVar name_var(ScopedPPVar::PassRef(),
|
| + file_ref_iface->GetName(dest[0]));
|
| + EXPECT_VAR_IS_STRING(create_info.name, name_var);
|
| +
|
| + // Path should be undefined since it's external filesystem.
|
| + ScopedPPVar path_var(ScopedPPVar::PassRef(),
|
| + file_ref_iface->GetPath(dest[0]));
|
| + EXPECT_EQ(PP_VARTYPE_UNDEFINED, path_var.get().type);
|
| +}
|
| +
|
| +TEST_F(FileChooserResourceTest, PopulateAcceptTypes) {
|
| + EXPECT_TRUE(CheckParseAcceptType(std::string(), NULL, NULL));
|
| + EXPECT_TRUE(CheckParseAcceptType("/", NULL, NULL));
|
| + EXPECT_TRUE(CheckParseAcceptType(".", NULL, NULL));
|
| + EXPECT_TRUE(CheckParseAcceptType(",, , ", NULL, NULL));
|
| +
|
| + EXPECT_TRUE(CheckParseAcceptType("app/txt", "app/txt", NULL));
|
| + EXPECT_TRUE(CheckParseAcceptType("app/txt,app/pdf", "app/txt", "app/pdf"));
|
| + EXPECT_TRUE(CheckParseAcceptType(" app/txt , app/pdf ",
|
| + "app/txt", "app/pdf"));
|
| +
|
| + // No dot or slash ones should be skipped.
|
| + EXPECT_TRUE(CheckParseAcceptType("foo", NULL, NULL));
|
| + EXPECT_TRUE(CheckParseAcceptType("foo,.txt", ".txt", NULL));
|
| +}
|
| +
|
| +} // namespace proxy
|
| +} // namespace ppapi
|
|
|