diff options
author | jamesr <jamesr@chromium.org> | 2014-11-04 17:18:44 -0800 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2014-11-05 01:19:40 +0000 |
commit | 181466fe957d966cb13ab8c1ee3fb99742d05ee9 (patch) | |
tree | f72e642db5ab623677584ca831fab88609e74fec | |
parent | f1dc7cd8b00ee69c5a2b3b5c14435ca1f96464de (diff) | |
download | chromium_src-181466fe957d966cb13ab8c1ee3fb99742d05ee9.zip chromium_src-181466fe957d966cb13ab8c1ee3fb99742d05ee9.tar.gz chromium_src-181466fe957d966cb13ab8c1ee3fb99742d05ee9.tar.bz2 |
Script to upload prebuilt network service
Also patches in https://codereview.chromium.org/668993002
R=eseidel@chromium.org
Review URL: https://codereview.chromium.org/689153007
Cr-Commit-Position: refs/heads/master@{#302729}
-rw-r--r-- | mojo/services/network/udp_socket_impl.cc | 9 | ||||
-rw-r--r-- | mojo/services/network/udp_socket_unittest.cc | 115 | ||||
-rwxr-xr-x | mojo/services/network/upload_network_service.py | 73 |
3 files changed, 174 insertions, 23 deletions
diff --git a/mojo/services/network/udp_socket_impl.cc b/mojo/services/network/udp_socket_impl.cc index e39d4a7..72d086e 100644 --- a/mojo/services/network/udp_socket_impl.cc +++ b/mojo/services/network/udp_socket_impl.cc @@ -82,6 +82,11 @@ void UDPSocketImpl::Bind( bound_ = true; callback.Run(MakeNetworkError(net::OK), bound_addr.Pass()); + + if (remaining_recv_slots_ > 0) { + DCHECK(!recvfrom_buffer_.get()); + DoRecvFrom(); + } } void UDPSocketImpl::SetSendBufferSize( @@ -138,7 +143,7 @@ void UDPSocketImpl::NegotiateMaxPendingSendRequests( } void UDPSocketImpl::ReceiveMore(uint32_t datagram_number) { - if (!bound_ || datagram_number == 0) + if (datagram_number == 0) return; if (std::numeric_limits<size_t>::max() - remaining_recv_slots_ < datagram_number) { @@ -147,7 +152,7 @@ void UDPSocketImpl::ReceiveMore(uint32_t datagram_number) { remaining_recv_slots_ += datagram_number; - if (!recvfrom_buffer_.get()) { + if (bound_ && !recvfrom_buffer_.get()) { DCHECK_EQ(datagram_number, remaining_recv_slots_); DoRecvFrom(); } diff --git a/mojo/services/network/udp_socket_unittest.cc b/mojo/services/network/udp_socket_unittest.cc index 42bf61a..3b0305e 100644 --- a/mojo/services/network/udp_socket_unittest.cc +++ b/mojo/services/network/udp_socket_unittest.cc @@ -6,6 +6,7 @@ #include "base/macros.h" #include "base/memory/scoped_ptr.h" #include "mojo/public/cpp/bindings/callback.h" +#include "mojo/services/public/cpp/network/udp_socket_wrapper.h" #include "mojo/services/public/interfaces/network/network_service.mojom.h" #include "mojo/services/public/interfaces/network/udp_socket.mojom.h" #include "mojo/shell/shell_test_helper.h" @@ -38,24 +39,6 @@ Array<uint8_t> CreateTestMessage(uint8_t initial, size_t size) { return array.Pass(); } -bool AreEqualArrays(const Array<uint8_t>& array_1, - const Array<uint8_t>& array_2) { - if (array_1.is_null() != array_2.is_null()) - return false; - else if (array_1.is_null()) - return true; - - if (array_1.size() != array_2.size()) - return false; - - for (size_t i = 0; i < array_1.size(); ++i) { - if (array_1[i] != array_2[i]) - return false; - } - - return true; -} - template <typename CallbackType> class TestCallbackBase { public: @@ -202,6 +185,42 @@ class TestCallbackWithUint32 uint32_t result_; }; +class TestReceiveCallback + : public TestCallbackBase< + Callback<void(NetworkErrorPtr, NetAddressPtr, Array<uint8_t>)>> { + public: + TestReceiveCallback() { + Initialize(new State()); + } + ~TestReceiveCallback() {} + + const NetworkErrorPtr& result() const { return result_; } + const NetAddressPtr& src_addr() const { return src_addr_; } + const Array<uint8_t>& data() const { return data_; } + + private: + struct State : public StateBase { + ~State() override {} + + void Run(NetworkErrorPtr result, + NetAddressPtr src_addr, + Array<uint8_t> data) const override { + if (test_callback_) { + TestReceiveCallback* callback = + static_cast<TestReceiveCallback*>(test_callback_); + callback->result_ = result.Pass(); + callback->src_addr_ = src_addr.Pass(); + callback->data_ = data.Pass(); + } + NotifyRun(); + } + }; + + NetworkErrorPtr result_; + NetAddressPtr src_addr_; + Array<uint8_t> data_; +}; + class UDPSocketTest : public testing::Test { public: UDPSocketTest() {} @@ -355,6 +374,8 @@ TEST_F(UDPSocketTest, TestReadWrite) { ASSERT_EQ(net::OK, callback2.result()->code); ASSERT_NE(0u, callback2.net_address()->ipv4->port); + NetAddressPtr client_addr = callback2.net_address().Clone(); + const size_t kDatagramCount = 6; const size_t kDatagramSize = 255; udp_socket_->ReceiveMore(kDatagramCount); @@ -375,9 +396,61 @@ TEST_F(UDPSocketTest, TestReadWrite) { GetReceiveResults()->pop(); EXPECT_EQ(static_cast<int>(kDatagramSize), result->result->code); - EXPECT_TRUE(AreEqualArrays( - CreateTestMessage(static_cast<uint8_t>(i), kDatagramSize), - result->data)); + EXPECT_TRUE(result->addr.Equals(client_addr)); + EXPECT_TRUE(result->data.Equals( + CreateTestMessage(static_cast<uint8_t>(i), kDatagramSize))); + } +} + +TEST_F(UDPSocketTest, TestUDPSocketWrapper) { + UDPSocketWrapper udp_socket(udp_socket_.Pass(), 4, 4); + + TestCallbackWithAddress callback1; + udp_socket.Bind(GetLocalHostWithAnyPort(), callback1.callback()); + callback1.WaitForResult(); + ASSERT_EQ(net::OK, callback1.result()->code); + ASSERT_NE(0u, callback1.net_address()->ipv4->port); + + NetAddressPtr server_addr = callback1.net_address().Clone(); + + UDPSocketPtr raw_client_socket; + network_service_->CreateUDPSocket(GetProxy(&raw_client_socket)); + UDPSocketWrapper client_socket(raw_client_socket.Pass(), 4, 4); + + TestCallbackWithAddress callback2; + client_socket.Bind(GetLocalHostWithAnyPort(), callback2.callback()); + callback2.WaitForResult(); + ASSERT_EQ(net::OK, callback2.result()->code); + ASSERT_NE(0u, callback2.net_address()->ipv4->port); + + NetAddressPtr client_addr = callback2.net_address().Clone(); + + const size_t kDatagramCount = 16; + const size_t kDatagramSize = 255; + + for (size_t i = 1; i < kDatagramCount; ++i) { + scoped_ptr<TestCallback[]> send_callbacks(new TestCallback[i]); + scoped_ptr<TestReceiveCallback[]> receive_callbacks( + new TestReceiveCallback[i]); + + for (size_t j = 0; j < i; ++j) { + client_socket.SendTo( + server_addr.Clone(), + CreateTestMessage(static_cast<uint8_t>(j), kDatagramSize), + send_callbacks[j].callback()); + + udp_socket.ReceiveFrom(receive_callbacks[j].callback()); + } + + receive_callbacks[i - 1].WaitForResult(); + + for (size_t j = 0; j < i; ++j) { + EXPECT_EQ(static_cast<int>(kDatagramSize), + receive_callbacks[j].result()->code); + EXPECT_TRUE(receive_callbacks[j].src_addr().Equals(client_addr)); + EXPECT_TRUE(receive_callbacks[j].data().Equals( + CreateTestMessage(static_cast<uint8_t>(j), kDatagramSize))); + } } } diff --git a/mojo/services/network/upload_network_service.py b/mojo/services/network/upload_network_service.py new file mode 100755 index 0000000..510494d --- /dev/null +++ b/mojo/services/network/upload_network_service.py @@ -0,0 +1,73 @@ +#!/usr/bin/env python +# Copyright 2014 The Chromium Authors. All rights reserved. +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +import argparse +import imp +import os +import subprocess +import sys +import tempfile +import time +import zipfile + +root_path = os.path.realpath( + os.path.join( + os.path.dirname( + os.path.realpath(__file__)), + os.pardir, + os.pardir, + os.pardir)) +version = subprocess.check_output(["git", "rev-parse", "HEAD"], cwd=root_path) +version = version.strip() + +if not sys.platform.startswith("linux"): + print "Only support linux for now" + sys.exit(1) + +platform = "linux-x64" # TODO: Parameterize +binary_dest = "gs://mojo/network/" + version + "/" + platform + ".zip" + +find_depot_tools_path = os.path.join(root_path, "tools", "find_depot_tools.py") +find_depot_tools = imp.load_source("find_depot_tools", find_depot_tools_path) + +depot_tools_path = find_depot_tools.add_depot_tools_to_path() +gsutil_exe = os.path.join(depot_tools_path, "third_party", "gsutil", "gsutil") + + +def gsutil_cp(source, dest, dry_run): + if dry_run: + print "gsutil cp %s %s" % (source, dest) + else: + subprocess.check_call([gsutil_exe, "cp", source, dest]) + + +def upload_binary(binary_path, dry_run): + absolute_binary_path = os.path.join(root_path, binary_path) + with tempfile.NamedTemporaryFile() as binary_zip_file: + with zipfile.ZipFile(binary_zip_file, 'w') as z: + with open(absolute_binary_path) as service_binary: + zipinfo = zipfile.ZipInfo("libnetwork_service.so") + zipinfo.external_attr = 0o777 << 16 + zipinfo.compress_type = zipfile.ZIP_DEFLATED + zipinfo.date_time = time.gmtime(os.path.getmtime(absolute_binary_path)) + z.writestr(zipinfo, service_binary.read()) + gsutil_cp(binary_zip_file.name, binary_dest, dry_run) + + +def main(): + parser = argparse.ArgumentParser( + description="Upload network service binary to Google storage") + parser.add_argument("-n", "--dry-run", action="store_true", help="Dry run") + parser.add_argument( + "binary_path", + help="Path to network service binary relative to the repo root, e.g. " + + "out/Release/libnetwork_service.so") + args = parser.parse_args() + upload_binary(args.binary_path, args.dry_run) + print "Uploaded artifacts for %s %s" % (version, "linux-x64") + return 0 + +if __name__ == '__main__': + sys.exit(main()) |