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