platform_handle_dispatcher_unittest.cc revision cedac228d2dd51db4b79ea1e72c7f249408ee061
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