summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorjamesr <jamesr@chromium.org>2014-11-04 17:18:44 -0800
committerCommit bot <commit-bot@chromium.org>2014-11-05 01:19:40 +0000
commit181466fe957d966cb13ab8c1ee3fb99742d05ee9 (patch)
treef72e642db5ab623677584ca831fab88609e74fec
parentf1dc7cd8b00ee69c5a2b3b5c14435ca1f96464de (diff)
downloadchromium_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.cc9
-rw-r--r--mojo/services/network/udp_socket_unittest.cc115
-rwxr-xr-xmojo/services/network/upload_network_service.py73
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())