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/file_util.h" 10cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "base/files/file_path.h" 11cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "base/files/scoped_file.h" 12cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "base/memory/ref_counted.h" 13cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "mojo/common/test/test_utils.h" 14cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 15cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 16cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)namespace mojo { 17cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)namespace system { 18cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)namespace { 19cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 20cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)TEST(PlatformHandleDispatcherTest, Basic) { 21cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) static const char kHelloWorld[] = "hello world"; 22cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 23cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) base::FilePath unused; 24cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) base::ScopedFILE fp(CreateAndOpenTemporaryFile(&unused)); 25cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ASSERT_TRUE(fp); 26cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(sizeof(kHelloWorld), 27cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) fwrite(kHelloWorld, 1, sizeof(kHelloWorld), fp.get())); 28cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 29cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) embedder::ScopedPlatformHandle 30cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) h(mojo::test::PlatformHandleFromFILE(fp.Pass())); 31cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_FALSE(fp); 32cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ASSERT_TRUE(h.is_valid()); 33cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 34cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) scoped_refptr<PlatformHandleDispatcher> dispatcher( 35cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) new PlatformHandleDispatcher(h.Pass())); 36cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_FALSE(h.is_valid()); 37cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(Dispatcher::kTypePlatformHandle, dispatcher->GetType()); 38cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 39cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) h = dispatcher->PassPlatformHandle().Pass(); 40cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_TRUE(h.is_valid()); 41cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 42cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) fp = mojo::test::FILEFromPlatformHandle(h.Pass(), "rb").Pass(); 43cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_FALSE(h.is_valid()); 44cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_TRUE(fp); 45cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 46cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) rewind(fp.get()); 47cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) char read_buffer[1000] = {}; 48cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(sizeof(kHelloWorld), 49cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) fread(read_buffer, 1, sizeof(read_buffer), fp.get())); 50cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_STREQ(kHelloWorld, read_buffer); 51cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 52cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Try getting the handle again. (It should fail cleanly.) 53cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) h = dispatcher->PassPlatformHandle().Pass(); 54cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_FALSE(h.is_valid()); 55cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 56cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(MOJO_RESULT_OK, dispatcher->Close()); 57cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 58cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 59cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)TEST(PlatformHandleDispatcherTest, CreateEquivalentDispatcherAndClose) { 60cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) static const char kFooBar[] = "foo bar"; 61cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 62cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) base::FilePath unused; 63cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) base::ScopedFILE fp(CreateAndOpenTemporaryFile(&unused)); 64cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(sizeof(kFooBar), fwrite(kFooBar, 1, sizeof(kFooBar), fp.get())); 65cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 66cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) scoped_refptr<PlatformHandleDispatcher> dispatcher( 67cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) new PlatformHandleDispatcher( 68cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) mojo::test::PlatformHandleFromFILE(fp.Pass()))); 69cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 70cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) DispatcherTransport transport( 71cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) test::DispatcherTryStartTransport(dispatcher.get())); 72cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_TRUE(transport.is_valid()); 73cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(Dispatcher::kTypePlatformHandle, transport.GetType()); 74cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_FALSE(transport.IsBusy()); 75cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 76cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) scoped_refptr<Dispatcher> generic_dispatcher = 77cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) transport.CreateEquivalentDispatcherAndClose(); 78cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ASSERT_TRUE(generic_dispatcher); 79cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 80cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) transport.End(); 81cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_TRUE(dispatcher->HasOneRef()); 82cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) dispatcher = NULL; 83cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 84cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ASSERT_EQ(Dispatcher::kTypePlatformHandle, generic_dispatcher->GetType()); 85cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) dispatcher = static_cast<PlatformHandleDispatcher*>(generic_dispatcher.get()); 86cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 87cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) fp = mojo::test::FILEFromPlatformHandle(dispatcher->PassPlatformHandle(), 88cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) "rb").Pass(); 89cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_TRUE(fp); 90cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 91cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) rewind(fp.get()); 92cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) char read_buffer[1000] = {}; 93cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(sizeof(kFooBar), 94cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) fread(read_buffer, 1, sizeof(read_buffer), fp.get())); 95cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_STREQ(kFooBar, read_buffer); 96cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 97cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(MOJO_RESULT_OK, dispatcher->Close()); 98cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 99cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 100cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} // namespace 101cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} // namespace system 102cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} // namespace mojo 103