1cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved. 2cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 3cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// found in the LICENSE file. 4cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 5cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "mojo/system/platform_handle_dispatcher.h" 6cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 7cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include <stdio.h> 8cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 9cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "base/files/file_path.h" 101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/files/file_util.h" 11cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "base/files/scoped_file.h" 12116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "base/files/scoped_temp_dir.h" 13cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "base/memory/ref_counted.h" 14cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "mojo/common/test/test_utils.h" 15cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 16cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 17cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)namespace mojo { 18cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)namespace system { 19cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)namespace { 20cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 21cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)TEST(PlatformHandleDispatcherTest, Basic) { 22116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch base::ScopedTempDir temp_dir; 23116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ASSERT_TRUE(temp_dir.CreateUniqueTempDir()); 24116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 25cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) static const char kHelloWorld[] = "hello world"; 26cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 27cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) base::FilePath unused; 285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) base::ScopedFILE fp( 295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) CreateAndOpenTemporaryFileInDir(temp_dir.path(), &unused)); 30cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ASSERT_TRUE(fp); 31cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(sizeof(kHelloWorld), 32cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) fwrite(kHelloWorld, 1, sizeof(kHelloWorld), fp.get())); 33cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) embedder::ScopedPlatformHandle h( 355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) mojo::test::PlatformHandleFromFILE(fp.Pass())); 36cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_FALSE(fp); 37cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ASSERT_TRUE(h.is_valid()); 38cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 39cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) scoped_refptr<PlatformHandleDispatcher> dispatcher( 40cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) new PlatformHandleDispatcher(h.Pass())); 41cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_FALSE(h.is_valid()); 42cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(Dispatcher::kTypePlatformHandle, dispatcher->GetType()); 43cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 44cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) h = dispatcher->PassPlatformHandle().Pass(); 45cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_TRUE(h.is_valid()); 46cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 47cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) fp = mojo::test::FILEFromPlatformHandle(h.Pass(), "rb").Pass(); 48cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_FALSE(h.is_valid()); 49cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_TRUE(fp); 50cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 51cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) rewind(fp.get()); 52cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) char read_buffer[1000] = {}; 53cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(sizeof(kHelloWorld), 54cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) fread(read_buffer, 1, sizeof(read_buffer), fp.get())); 55cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_STREQ(kHelloWorld, read_buffer); 56cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 57cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Try getting the handle again. (It should fail cleanly.) 58cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) h = dispatcher->PassPlatformHandle().Pass(); 59cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_FALSE(h.is_valid()); 60cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 61cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(MOJO_RESULT_OK, dispatcher->Close()); 62cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 63cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 64cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)TEST(PlatformHandleDispatcherTest, CreateEquivalentDispatcherAndClose) { 65116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch base::ScopedTempDir temp_dir; 66116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ASSERT_TRUE(temp_dir.CreateUniqueTempDir()); 67116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 68cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) static const char kFooBar[] = "foo bar"; 69cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 70cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) base::FilePath unused; 715f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) base::ScopedFILE fp( 725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) CreateAndOpenTemporaryFileInDir(temp_dir.path(), &unused)); 73cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(sizeof(kFooBar), fwrite(kFooBar, 1, sizeof(kFooBar), fp.get())); 74cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 75cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) scoped_refptr<PlatformHandleDispatcher> dispatcher( 76cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) new PlatformHandleDispatcher( 77cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) mojo::test::PlatformHandleFromFILE(fp.Pass()))); 78cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 79cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) DispatcherTransport transport( 80cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) test::DispatcherTryStartTransport(dispatcher.get())); 81cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_TRUE(transport.is_valid()); 82cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(Dispatcher::kTypePlatformHandle, transport.GetType()); 83cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_FALSE(transport.IsBusy()); 84cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 85cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) scoped_refptr<Dispatcher> generic_dispatcher = 86cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) transport.CreateEquivalentDispatcherAndClose(); 871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ASSERT_TRUE(generic_dispatcher.get()); 88cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 89cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) transport.End(); 90cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_TRUE(dispatcher->HasOneRef()); 911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci dispatcher = nullptr; 92cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 93cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ASSERT_EQ(Dispatcher::kTypePlatformHandle, generic_dispatcher->GetType()); 94cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) dispatcher = static_cast<PlatformHandleDispatcher*>(generic_dispatcher.get()); 95cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 96cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) fp = mojo::test::FILEFromPlatformHandle(dispatcher->PassPlatformHandle(), 97cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) "rb").Pass(); 98cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_TRUE(fp); 99cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 100cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) rewind(fp.get()); 101cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) char read_buffer[1000] = {}; 102cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(sizeof(kFooBar), 103cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) fread(read_buffer, 1, sizeof(read_buffer), fp.get())); 104cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_STREQ(kFooBar, read_buffer); 105cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 106cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(MOJO_RESULT_OK, dispatcher->Close()); 107cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 108cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 109cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} // namespace 110cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} // namespace system 111cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} // namespace mojo 112