native_messaging_writer_unittest.cc revision 46d4c2bc3267f3f028f39e7e311b0f89aba2e4fd
1c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved. 2c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 3c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// found in the LICENSE file. 4c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 5c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "remoting/host/native_messaging/native_messaging_writer.h" 6c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 7c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/basictypes.h" 8c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/json/json_reader.h" 9c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/memory/scoped_ptr.h" 10c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/stl_util.h" 11c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/values.h" 12c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "remoting/host/setup/test_util.h" 13c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 14a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 15c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace remoting { 16c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 17c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class NativeMessagingWriterTest : public testing::Test { 18c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 19c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) NativeMessagingWriterTest(); 20c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual ~NativeMessagingWriterTest(); 21c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 22c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void SetUp() OVERRIDE; 23c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 24c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) protected: 25c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<NativeMessagingWriter> writer_; 26c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::File read_file_; 27c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::File write_file_; 28c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}; 29c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 30c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)NativeMessagingWriterTest::NativeMessagingWriterTest() {} 31c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 32c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)NativeMessagingWriterTest::~NativeMessagingWriterTest() {} 33c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 34c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void NativeMessagingWriterTest::SetUp() { 35c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(MakePipe(&read_file_, &write_file_)); 36c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) writer_.reset(new NativeMessagingWriter(write_file_.Pass())); 37c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 38c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 39c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(NativeMessagingWriterTest, GoodMessage) { 40c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::DictionaryValue message; 41c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) message.SetInteger("foo", 42); 42c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(writer_->WriteMessage(message)); 43c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 44c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Read from the pipe and verify the content. 45c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) uint32 length; 46c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int read = read_file_.ReadAtCurrentPos(reinterpret_cast<char*>(&length), 4); 47c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(4, read); 48c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::string content(length, '\0'); 49c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) read = read_file_.ReadAtCurrentPos(string_as_array(&content), length); 50c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(static_cast<int>(length), read); 51c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 52c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // |content| should now contain serialized |message|. 53a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) scoped_ptr<base::Value> written_message(base::JSONReader::Read(content)); 54c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(message.Equals(written_message.get())); 55c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 56c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Nothing more should have been written. Close the write-end of the pipe, 57c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // and verify the read end immediately hits EOF. 58c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) writer_.reset(NULL); 59c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) char unused; 60c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) read = read_file_.ReadAtCurrentPos(&unused, 1); 61c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_LE(read, 0); 62c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 63c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 64TEST_F(NativeMessagingWriterTest, SecondMessage) { 65 base::DictionaryValue message1; 66 base::DictionaryValue message2; 67 message2.SetInteger("foo", 42); 68 EXPECT_TRUE(writer_->WriteMessage(message1)); 69 EXPECT_TRUE(writer_->WriteMessage(message2)); 70 writer_.reset(NULL); 71 72 // Read two messages. 73 uint32 length; 74 int read; 75 std::string content; 76 for (int i = 0; i < 2; i++) { 77 read = read_file_.ReadAtCurrentPos(reinterpret_cast<char*>(&length), 4); 78 EXPECT_EQ(4, read) << "i = " << i; 79 content.resize(length); 80 read = read_file_.ReadAtCurrentPos(string_as_array(&content), length); 81 EXPECT_EQ(static_cast<int>(length), read) << "i = " << i; 82 } 83 84 // |content| should now contain serialized |message2|. 85 scoped_ptr<base::Value> written_message2(base::JSONReader::Read(content)); 86 EXPECT_TRUE(message2.Equals(written_message2.get())); 87} 88 89TEST_F(NativeMessagingWriterTest, FailedWrite) { 90 // Close the read end so that writing fails immediately. 91 read_file_.Close(); 92 93 base::DictionaryValue message; 94 EXPECT_FALSE(writer_->WriteMessage(message)); 95} 96 97} // namespace remoting 98