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