diff options
Diffstat (limited to 'mojo/tools')
23 files changed, 0 insertions, 1558 deletions
diff --git a/mojo/tools/BUILD.gn b/mojo/tools/BUILD.gn deleted file mode 100644 index de38e6c..0000000 --- a/mojo/tools/BUILD.gn +++ /dev/null @@ -1,23 +0,0 @@ -# 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. - -# GYP version: mojo/mojo_base.gyp:mojo_message_generator -executable("message_generator") { - testonly = true - output_name = "mojo_message_generator" - - sources = [ - "message_generator.cc", - ] - - deps = [ - "//base", - "//mojo/common", - "//mojo/edk/system", - "//mojo/environment:chromium", - "//mojo/public/cpp/bindings", - "//testing/gtest", - ] -} - diff --git a/mojo/tools/check_mojom_golden_files.py b/mojo/tools/check_mojom_golden_files.py deleted file mode 100755 index 9af7a86..0000000 --- a/mojo/tools/check_mojom_golden_files.py +++ /dev/null @@ -1,103 +0,0 @@ -#!/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 os.path -import sys -from filecmp import dircmp -from shutil import rmtree -from tempfile import mkdtemp - -_script_dir = os.path.dirname(os.path.abspath(__file__)) -_mojo_dir = os.path.join(_script_dir, os.pardir) -_chromium_src_dir = os.path.join(_mojo_dir, os.pardir) -sys.path.insert(0, os.path.join(_mojo_dir, "public", "tools", "bindings", - "pylib")) -from mojom_tests.support.find_files import FindFiles -from mojom_tests.support.run_bindings_generator import RunBindingsGenerator - - -def _ProcessDircmpResults(results, verbose=False): - """Prints results of directory comparison and returns true if they are - identical (note: the "left" directory should be the golden directory).""" - rv = not (bool(results.left_only) or bool(results.right_only) or \ - bool(results.common_funny) or bool(results.funny_files) or \ - bool(results.diff_files)) - if verbose: - for f in results.left_only: - print "%s exists in golden directory but not in current output" % f - for f in results.right_only: - print "%s exists in current output but not in golden directory" % f - for f in results.common_funny + results.funny_files: - print "Unable to compare %s between golden directory and current output" \ - % f - for f in results.diff_files: - print "%s differs between golden directory and current output" % f - for r in results.subdirs.values(): - # If we're being verbose, check subdirectories even if we know that there - # are differences. Note that it's "... and rv" to avoid the short-circuit. - if rv or verbose: - rv = _ProcessDircmpResults(r, verbose=verbose) and rv - return rv - - -def main(): - parser = argparse.ArgumentParser() - parser.add_argument("--generate_golden_files", action="store_true", - help=("generate golden files (does not obliterate " - "directory")) - parser.add_argument("--keep_temp_dir", action="store_true", - help="don't delete the temporary directory") - parser.add_argument("--verbose", action="store_true", - help="spew excess verbiage") - parser.add_argument("golden_dir", metavar="GOLDEN_DIR", - help="directory with the golden files") - args = parser.parse_args() - - if args.generate_golden_files: - if os.path.exists(args.golden_dir): - print "WARNING: golden directory %s already exists" % args.golden_dir - out_dir = args.golden_dir - else: - if not os.path.exists(args.golden_dir): - print "ERROR: golden directory %s does not exist" % args.golden_dir - return 1 - out_dir = mkdtemp() - if args.verbose: - print "Generating files to %s ..." % out_dir - - mojom_files = FindFiles(_mojo_dir, "*.mojom") - for mojom_file in mojom_files: - if args.verbose: - print " Processing %s ..." % os.path.relpath(mojom_file, _mojo_dir) - # TODO(vtl): This may wrong, since the path can be overridden in the .gyp - # file. - RunBindingsGenerator(out_dir, _mojo_dir, mojom_file, - ["-I", os.path.abspath(_chromium_src_dir)]) - - if args.generate_golden_files: - return 0 - - identical = _ProcessDircmpResults(dircmp(args.golden_dir, out_dir, ignore=[]), - verbose=args.verbose) - - if args.keep_temp_dir: - if args.verbose: - print "Not removing %s ..." % out_dir - else: - if args.verbose: - print "Removing %s ..." % out_dir - rmtree(out_dir) - - if not identical: - print "FAILURE: current output differs from golden files" - return 1 - - print "SUCCESS: current output identical to golden files" - return 0 - - -if __name__ == '__main__': - sys.exit(main()) diff --git a/mojo/tools/data/unittests b/mojo/tools/data/unittests deleted file mode 100644 index ede2115..0000000 --- a/mojo/tools/data/unittests +++ /dev/null @@ -1,28 +0,0 @@ -# This file contains a list of Mojo gtest unit tests. -# Prepend * to indicate that results shouldn't be cached (e.g., if the test has -# other data dependencies). -# TODO(vtl): Add a way of specifying data dependencies instead. - -# System tests: -mojo_system_unittests - -# Public tests: -*mojo_public_bindings_unittests -mojo_public_environment_unittests -mojo_public_system_unittests -mojo_public_utility_unittests - -# Non-system, non-public tests: -mojo_application_manager_unittests -mojo_common_unittests -mojo_view_manager_lib_unittests -# These tests currently crash. We should re-enable them when they pass. -#mojo_view_manager_unittests -mojo_surfaces_lib_unittests - -# JavaScript tests: -*mojo_apps_js_unittests -*mojo_js_unittests - -# Shell integration tests: -*mojo_shell_tests diff --git a/mojo/tools/generate_java_callback_interfaces.py b/mojo/tools/generate_java_callback_interfaces.py deleted file mode 100644 index 257a540..0000000 --- a/mojo/tools/generate_java_callback_interfaces.py +++ /dev/null @@ -1,69 +0,0 @@ -"""Generate the org.chromium.mojo.bindings.Callbacks interface""" - -import argparse -import sys - -CALLBACK_TEMPLATE = (""" - /** - * A generic %d-argument callback. - * - * %s - */ - interface Callback%d<%s> { - /** - * Call the callback. - */ - public void call(%s); - } -""") - -INTERFACE_TEMPLATE = ( -"""// 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. - -// This file was generated using -// mojo/tools/generate_java_callback_interfaces.py - -package org.chromium.mojo.bindings; - -/** - * Contains a generic interface for callbacks. - */ -public interface Callbacks { - - /** - * A generic callback. - */ - interface Callback0 { - /** - * Call the callback. - */ - public void call(); - } -%s -}""") - -def GenerateCallback(nb_args): - params = '\n * '.join( - ['@param <T%d> the type of argument %d.' % (i+1, i+1) - for i in xrange(nb_args)]) - template_parameters = ', '.join(['T%d' % (i+1) for i in xrange(nb_args)]) - callback_parameters = ', '.join(['T%d arg%d' % ((i+1), (i+1)) - for i in xrange(nb_args)]) - return CALLBACK_TEMPLATE % (nb_args, params, nb_args, template_parameters, - callback_parameters) - -def main(): - parser = argparse.ArgumentParser( - description="Generate org.chromium.mojo.bindings.Callbacks") - parser.add_argument("max_args", nargs=1, type=int, - help="maximal number of arguments to generate callbacks for") - args = parser.parse_args() - max_args = args.max_args[0] - print INTERFACE_TEMPLATE % ''.join([GenerateCallback(i+1) - for i in xrange(max_args)]) - return 0 - -if __name__ == "__main__": - sys.exit(main()) diff --git a/mojo/tools/message_generator.cc b/mojo/tools/message_generator.cc deleted file mode 100644 index 08b7dcc..0000000 --- a/mojo/tools/message_generator.cc +++ /dev/null @@ -1,63 +0,0 @@ -// 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. - -#include "base/files/file_path.h" -#include "base/files/file_util.h" -#include "base/strings/string_util.h" -#include "base/strings/stringprintf.h" -#include "mojo/public/cpp/bindings/lib/message_builder.h" -#include "mojo/public/cpp/bindings/lib/message_internal.h" -#include "mojo/public/cpp/bindings/message.h" - -// This file is used to generate various files corresponding to mojo -// messages. The various binding implementations can parse these to verify they -// correctly decode messages. -// -// The output consists of each byte of the message encoded in a hex string with -// a newline after it. -namespace mojo { -namespace { - -std::string BinaryToHex(const base::StringPiece& piece) { - std::string result("// File generated by mojo_message_generator.\n");; - result.reserve(result.size() + (piece.size() * 5)); - for (size_t i = 0; i < piece.size(); ++i) - base::StringAppendF(&result, "0X%.2X\n", static_cast<int>(piece.data()[i])); - return result; -} - -void WriteMessageToFile(const Message& message, const base::FilePath& path) { - const std::string hex_message(BinaryToHex( - base::StringPiece(reinterpret_cast<const char*>(message.data()), - message.data_num_bytes()))); - CHECK_EQ(static_cast<int>(hex_message.size()), - base::WriteFile(path, hex_message.data(), - static_cast<int>(hex_message.size()))); -} - -// Generates a message of type MessageData. The message uses the name 21, -// with 4 bytes of payload: 0x9, 0x8, 0x7, 0x6. -void GenerateMessageDataMessage() { - internal::MessageBuilder builder(static_cast<uint32_t>(21), - static_cast<size_t>(4)); - char* data = static_cast<char*>(builder.buffer()->Allocate(4)); - DCHECK(data); - data[0] = 9; - data[1] = 8; - data[2] = 7; - data[3] = 6; - - Message message; - builder.Finish(&message); - WriteMessageToFile(message, - base::FilePath(FILE_PATH_LITERAL("message_data"))); -} - -} // namespace -} // namespace mojo - -int main(int argc, char** argv) { - mojo::GenerateMessageDataMessage(); - return 0; -} diff --git a/mojo/tools/mojob.sh b/mojo/tools/mojob.sh deleted file mode 100755 index eddefe2..0000000 --- a/mojo/tools/mojob.sh +++ /dev/null @@ -1,205 +0,0 @@ -#!/bin/bash -# Copyright 2013 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. - -# This a simple script to make building/testing Mojo components easier (on -# Linux). - -# TODO(vtl): Maybe make the test runner smart and not run unchanged test -# binaries. -# TODO(vtl) Maybe also provide a way to pass command-line arguments to the test -# binaries. - -do_help() { - cat << EOF -Usage: $(basename "$0") [command|option ...] - -command should be one of: - build - Build. - test - Run unit tests (does not build). - perftest - Run perf tests (does not build). - pytest - Run Python unit tests (does not build). - gn - Run gn for mojo (does not sync). - sync - Sync using gclient (does not run gn). - show-bash-alias - Outputs an appropriate bash alias for mojob. In bash do: - \$ eval \`mojo/tools/mojob.sh show-bash-alias\` - -option (which will only apply to commands which follow) should be one of: - General options (specify before everything): - --debug / --release / --debug-and-release - Debug (default) build / - Release build / Debug and Release builds. - gn options (specify before gn): - --clang / --gcc - Use clang (default) / gcc. - --use-goma / --no-use-goma - Use goma (if \$GOMA_DIR is set or \$HOME/goma - exists; default) / don't use goma. - -Note: It will abort on the first failure (if any). -EOF -} - -get_gn_arg_value() { - grep -m 1 "^[[:space:]]*\<$2\>" "$1/args.gn" | \ - sed -n 's/.* = "\?\([^"]*\)"\?$/\1/p' -} - -do_build() { - echo "Building in out/$1 ..." - if [ "$(get_gn_arg_value "out/$1" use_goma)" = "true" ]; then - # Use the configured goma directory. - local goma_dir="$(get_gn_arg_value "out/$1" goma_dir)" - echo "Ensuring goma (in ${goma_dir}) started ..." - "${goma_dir}/goma_ctl.py" ensure_start - - ninja -j 1000 -l 100 -C "out/$1" mojo || exit 1 - else - ninja -C "out/$1" mojo || exit 1 - fi -} - -do_unittests() { - echo "Running unit tests in out/$1 ..." - mojo/tools/test_runner.py mojo/tools/data/unittests "out/$1" \ - mojob_test_successes || exit 1 -} - -do_perftests() { - echo "Running perf tests in out/$1 ..." - "out/$1/mojo_public_system_perftests" || exit 1 -} - -do_gn() { - local gn_args="$(make_gn_args $1)" - echo "Running gn with --args=\"${gn_args}\" ..." - gn gen --args="${gn_args}" "out/$1" -} - -do_sync() { - # Note: sync only (with hooks, but no gyp-ing). - GYP_CHROMIUM_NO_ACTION=1 gclient sync || exit 1 -} - -# Valid values: Debug, Release, or Debug_and_Release. -BUILD_TYPE=Debug_and_Release -should_do_Debug() { - test "$BUILD_TYPE" = Debug -o "$BUILD_TYPE" = Debug_and_Release -} -should_do_Release() { - test "$BUILD_TYPE" = Release -o "$BUILD_TYPE" = Debug_and_Release -} - -# Valid values: clang or gcc. -COMPILER=clang -# Valid values: auto or disabled. -GOMA=auto -make_gn_args() { - local args=() - # TODO(vtl): It's a bit of a hack to infer the build type from the output - # directory name, but it's what we have right now (since we support "debug and - # release" mode). - case "$1" in - Debug) - # (Default.) - ;; - Release) - args+=("is_debug=false") - ;; - esac - case "$COMPILER" in - clang) - # (Default.) - ;; - gcc) - args+=("is_clang=false") - ;; - esac - case "$GOMA" in - auto) - if [ -v GOMA_DIR ]; then - args+=("use_goma=true" "goma_dir=\"${GOMA_DIR}\"") - elif [ -d "${HOME}/goma" ]; then - args+=("use_goma=true" "goma_dir=\"${HOME}/goma\"") - else - : # (Default.) - fi - ;; - disabled) - # (Default.) - ;; - esac - echo "${args[*]}" -} - -# We're in src/mojo/tools. We want to get to src. -cd "$(realpath "$(dirname "$0")")/../.." - -if [ $# -eq 0 ]; then - do_help - exit 0 -fi - -for arg in "$@"; do - case "$arg" in - # Commands ----------------------------------------------------------------- - help|--help) - do_help - exit 0 - ;; - build) - should_do_Debug && do_build Debug - should_do_Release && do_build Release - ;; - test) - should_do_Debug && do_unittests Debug - should_do_Release && do_unittests Release - ;; - perftest) - should_do_Debug && do_perftests Debug - should_do_Release && do_perftests Release - ;; - gn) - should_do_Debug && do_gn Debug - should_do_Release && do_gn Release - ;; - sync) - do_sync - ;; - show-bash-alias) - # You want to type something like: - # alias mojob=\ - # '"$(pwd | sed '"'"'s/\(.*\/src\).*/\1/'"'"')/mojo/tools/mojob.sh"' - # This is quoting hell, so we simply escape every non-alphanumeric - # character. - echo alias\ mojob\=\'\"\$\(pwd\ \|\ sed\ \'\"\'\"\'s\/\\\(\.\*\\\/src\\\)\ -\.\*\/\\1\/\'\"\'\"\'\)\/mojo\/tools\/mojob\.sh\"\' - ;; - # Options ------------------------------------------------------------------ - --debug) - BUILD_TYPE=Debug - ;; - --release) - BUILD_TYPE=Release - ;; - --debug-and-release) - BUILD_TYPE=Debug_and_Release - ;; - --clang) - COMPILER=clang - ;; - --gcc) - COMPILER=gcc - ;; - --use-goma) - GOMA=auto - ;; - --no-use-goma) - GOMA=disabled - ;; - *) - echo "Unknown command \"${arg}\". Try \"$(basename "$0") help\"." - exit 1 - ;; - esac -done - -exit 0 diff --git a/mojo/tools/mojosh.sh b/mojo/tools/mojosh.sh deleted file mode 100755 index ee2ba63..0000000 --- a/mojo/tools/mojosh.sh +++ /dev/null @@ -1,71 +0,0 @@ -#!/bin/bash -# 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. - -# This a simple script to make running Mojo shell easier (on Linux). - -DIRECTORY="$(dirname "$0")"/../../out/Debug -PORT=$(($RANDOM % 8192 + 2000)) - -do_help() { - cat << EOF -Usage: $(basename "$0") [-d DIRECTORY] [-|--] <mojo_shell arguments ...> - -DIRECTORY defaults to $DIRECTORY. - -Example: - $(basename "$0") mojo:sample_app -EOF -} - -kill_http_server() { - echo "Killing SimpleHTTPServer ..." - kill $HTTP_SERVER_PID - wait $HTTP_SERVER_PID -} - -while [ $# -gt 0 ]; do - case "$1" in - -h|--help) - do_help - exit 0 - ;; - -d) - shift - if [ $# -eq 0 ]; then - do_help - exit 1 - fi - DIRECTORY="$1" - ;; - --show-bash-alias) - echo alias\ mojosh\=\'\"\$\(pwd\ \|\ sed\ \'\"\'\"\'s\/\\\(\.\*\\\/src\\\ -\)\.\*\/\\1\/\'\"\'\"\'\)\/mojo\/tools\/mojosh\.sh\"\' - exit 0 - ;; - # Separate arguments to mojo_shell (e.g., in case you want to pass it -d). - -|--) - shift - break - ;; - *) - break - ;; - esac - shift -done - -echo "Base directory: $DIRECTORY" - -echo "Running SimpleHTTPServer in directory $DIRECTORY/lib on port $PORT" -cd $DIRECTORY/lib || exit 1 -python -m SimpleHTTPServer $PORT & -# Kill the HTTP server on exit (even if the user kills everything using ^C). -HTTP_SERVER_PID=$! -trap kill_http_server EXIT -cd .. - -echo "Running:" -echo "./mojo_shell --origin=http://127.0.0.1:$PORT --disable-cache $*" -./mojo_shell --origin=http://127.0.0.1:$PORT --disable-cache $* diff --git a/mojo/tools/package_manager/BUILD.gn b/mojo/tools/package_manager/BUILD.gn deleted file mode 100644 index 76b5771..0000000 --- a/mojo/tools/package_manager/BUILD.gn +++ /dev/null @@ -1,29 +0,0 @@ -# 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. - -shared_library("package_manager") { - output_name = "mojo_package_manager" - - sources = [ - "manifest.cc", - "manifest.h", - "package_fetcher.cc", - "package_fetcher.h", - "package_manager.cc", - "package_manager_application.cc", - "package_manager_application.h", - "unpacker.cc", - "unpacker.h", - ] - - deps = [ - "//base", - "//mojo/application", - "//mojo/public/c/system:for_shared_library", - "//mojo/public/cpp/utility", - "//mojo/services/public/interfaces/network", - "//third_party/zlib:zip", - "//url", - ] -} diff --git a/mojo/tools/package_manager/DEPS b/mojo/tools/package_manager/DEPS deleted file mode 100644 index 784b7fb..0000000 --- a/mojo/tools/package_manager/DEPS +++ /dev/null @@ -1,3 +0,0 @@ -include_rules = [ - '+third_party/zlib', -] diff --git a/mojo/tools/package_manager/manifest.cc b/mojo/tools/package_manager/manifest.cc deleted file mode 100644 index 5a0e346..0000000 --- a/mojo/tools/package_manager/manifest.cc +++ /dev/null @@ -1,83 +0,0 @@ -// 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. - -#include "mojo/tools/package_manager/manifest.h" - -#include "base/files/file_util.h" -#include "base/json/json_reader.h" -#include "base/values.h" -#include "url/gurl.h" - -namespace mojo { - -Manifest::Manifest() { -} - -Manifest::~Manifest() { -} - -bool Manifest::Parse(const std::string& str, std::string* err_msg) { - int err_code = base::JSONReader::JSON_NO_ERROR; - scoped_ptr<base::Value> root(base::JSONReader::ReadAndReturnError( - str, - base::JSON_ALLOW_TRAILING_COMMAS, - &err_code, err_msg)); - if (err_code != base::JSONReader::JSON_NO_ERROR) - return false; - - const base::DictionaryValue* root_dict; - if (!root->GetAsDictionary(&root_dict)) { - *err_msg = "Manifest is not a dictionary."; - return false; - } - - if (!PopulateDeps(root_dict, err_msg)) - return false; - - return true; -} - -bool Manifest::ParseFromFile(const base::FilePath& file_name, - std::string* err_msg) { - std::string data; - if (!base::ReadFileToString(file_name, &data)) { - *err_msg = "Couldn't read manifest file " + file_name.AsUTF8Unsafe(); - return false; - } - return Parse(data, err_msg); -} - -bool Manifest::PopulateDeps(const base::DictionaryValue* root, - std::string* err_msg) { - const base::Value* deps_value; - if (!root->Get("deps", &deps_value)) - return true; // No deps, that's OK. - - const base::ListValue* deps; - if (!deps_value->GetAsList(&deps)) { - *err_msg = "Deps is not a list. Should be \"deps\": [ \"...\", \"...\" ]"; - return false; - } - - deps_.reserve(deps->GetSize()); - for (size_t i = 0; i < deps->GetSize(); i++) { - std::string cur_dep; - if (!deps->GetString(i, &cur_dep)) { - *err_msg = "Dependency list item wasn't a string."; - return false; - } - - GURL cur_url(cur_dep); - if (!cur_url.is_valid()) { - *err_msg = "Dependency entry isn't a valid URL: " + cur_dep; - return false; - } - - deps_.push_back(cur_url); - } - - return true; -} - -} // namespace mojo diff --git a/mojo/tools/package_manager/manifest.h b/mojo/tools/package_manager/manifest.h deleted file mode 100644 index f87040d..0000000 --- a/mojo/tools/package_manager/manifest.h +++ /dev/null @@ -1,46 +0,0 @@ -// 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. - -#ifndef MOJO_TOOLS_PACKAGE_MANAGER_MANIFEST_H_ -#define MOJO_TOOLS_PACKAGE_MANAGER_MANIFEST_H_ - -#include <string> -#include <vector> - -#include "mojo/public/cpp/system/macros.h" - -class GURL; - -namespace base { -class DictionaryValue; -class FilePath; -} - -namespace mojo { - -class Manifest { - public: - Manifest(); - ~Manifest(); - - // Parses the manifest from raw data. Returns true on success. On failure, - // populates the "err_msg" string with an error. - bool Parse(const std::string& str, std::string* err_msg); - - // Like Parse but reads the data from a file. - bool ParseFromFile(const base::FilePath& file_name, std::string* err_msg); - - const std::vector<GURL>& deps() const { return deps_; } - - private: - bool PopulateDeps(const base::DictionaryValue* root, std::string* err_msg); - - std::vector<GURL> deps_; - - MOJO_DISALLOW_COPY_AND_ASSIGN(Manifest); -}; - -} // namespace mojo - -#endif // MOJO_TOOLS_PACKAGE_MANAGER_MANIFEST_H_ diff --git a/mojo/tools/package_manager/package_fetcher.cc b/mojo/tools/package_manager/package_fetcher.cc deleted file mode 100644 index dee24c0..0000000 --- a/mojo/tools/package_manager/package_fetcher.cc +++ /dev/null @@ -1,96 +0,0 @@ -// 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. - -#include "mojo/tools/package_manager/package_fetcher.h" - -#include "base/bind.h" -#include "base/files/file_path.h" -#include "base/files/file_util.h" -#include "mojo/services/public/interfaces/network/url_loader.mojom.h" - -namespace mojo { - -PackageFetcher::PackageFetcher(NetworkService* network_service, - PackageFetcherDelegate* delegate, - const GURL& url) - : delegate_(delegate), - url_(url) { - network_service->CreateURLLoader(GetProxy(&loader_)); - - URLRequestPtr request(URLRequest::New()); - request->url = url.spec(); - request->auto_follow_redirects = true; - - loader_->Start(request.Pass(), - base::Bind(&PackageFetcher::OnReceivedResponse, - base::Unretained(this))); -} - -PackageFetcher::~PackageFetcher() { -} - -void PackageFetcher::OnReceivedResponse(URLResponsePtr response) { - if (response->error) { - printf("Got error %d (%s) for %s\n", - response->error->code, - response->error->description.get().c_str(), - url_.spec().c_str()); - delegate_->FetchFailed(url_); - return; - } - - if (!base::CreateTemporaryFile(&output_file_name_)) { - delegate_->FetchFailed(url_); - return; - } - output_file_.Initialize(output_file_name_, - base::File::FLAG_CREATE_ALWAYS | base::File::FLAG_WRITE); - if (!output_file_.IsValid()) { - base::DeleteFile(output_file_name_, false); - delegate_->FetchFailed(url_); - // Danger: may be deleted now. - return; - } - - body_ = response->body.Pass(); - ReadData(MOJO_RESULT_OK); - // Danger: may be deleted now. -} - -void PackageFetcher::ReadData(MojoResult) { - char buf[4096]; - uint32_t num_bytes = sizeof(buf); - MojoResult result = ReadDataRaw(body_.get(), buf, &num_bytes, - MOJO_READ_DATA_FLAG_NONE); - if (result == MOJO_RESULT_SHOULD_WAIT) { - WaitToReadMore(); - } else if (result == MOJO_RESULT_OK) { - if (output_file_.WriteAtCurrentPos(buf, num_bytes) != - static_cast<int>(num_bytes)) { - // Clean up the output file. - output_file_.Close(); - base::DeleteFile(output_file_name_, false); - - delegate_->FetchFailed(url_); - // Danger: may be deleted now. - return; - } - WaitToReadMore(); - } else if (result == MOJO_RESULT_FAILED_PRECONDITION) { - // Done. - output_file_.Close(); - delegate_->FetchSucceeded(url_, output_file_name_); - // Danger: may be deleted now. - } -} - -void PackageFetcher::WaitToReadMore() { - handle_watcher_.Start( - body_.get(), - MOJO_HANDLE_SIGNAL_READABLE, - MOJO_DEADLINE_INDEFINITE, - base::Bind(&PackageFetcher::ReadData, base::Unretained(this))); -} - -} // namespace mojo diff --git a/mojo/tools/package_manager/package_fetcher.h b/mojo/tools/package_manager/package_fetcher.h deleted file mode 100644 index 3cbd7a7..0000000 --- a/mojo/tools/package_manager/package_fetcher.h +++ /dev/null @@ -1,63 +0,0 @@ -// 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. - -#ifndef MOJO_TOOLS_PACKAGE_MANAGER_FETCHER_H_ -#define MOJO_TOOLS_PACKAGE_MANAGER_FETCHER_H_ - -#include "base/files/file.h" -#include "base/files/file_path.h" -#include "mojo/common/handle_watcher.h" -#include "mojo/public/cpp/system/macros.h" -#include "mojo/services/public/interfaces/network/network_service.mojom.h" -#include "mojo/services/public/interfaces/network/url_loader.mojom.h" -#include "url/gurl.h" - -namespace base { -class FilePath; -} // namespace base - -namespace mojo { - -class PackageFetcherDelegate; - -class PackageFetcher { - public: - PackageFetcher(NetworkService* network_service, - PackageFetcherDelegate* delegate, - const GURL& url); - virtual ~PackageFetcher(); - - private: - void OnReceivedResponse(URLResponsePtr response); - - void ReadData(MojoResult); - void WaitToReadMore(); - - PackageFetcherDelegate* delegate_; - - // URL of the package. - GURL url_; - - URLLoaderPtr loader_; - - // Valid once file has started streaming. - ScopedDataPipeConsumerHandle body_; - common::HandleWatcher handle_watcher_; - - base::FilePath output_file_name_; - base::File output_file_; - - MOJO_DISALLOW_COPY_AND_ASSIGN(PackageFetcher); -}; - -class PackageFetcherDelegate { - public: - virtual void FetchSucceeded(const GURL& url, const base::FilePath& name) = 0; - - virtual void FetchFailed(const GURL& url) = 0; -}; - -} // namespace mojo - -#endif // MOJO_TOOLS_PACKAGE_MANAGER_FETCHER_H_ diff --git a/mojo/tools/package_manager/package_manager.cc b/mojo/tools/package_manager/package_manager.cc deleted file mode 100644 index b091f6d..0000000 --- a/mojo/tools/package_manager/package_manager.cc +++ /dev/null @@ -1,12 +0,0 @@ -// 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. - -#include "mojo/application/application_runner_chromium.h" -#include "mojo/public/c/system/main.h" -#include "mojo/tools/package_manager/package_manager_application.h" - -MojoResult MojoMain(MojoHandle shell_handle) { - mojo::ApplicationRunnerChromium runner(new mojo::PackageManagerApplication); - return runner.Run(shell_handle); -} diff --git a/mojo/tools/package_manager/package_manager_application.cc b/mojo/tools/package_manager/package_manager_application.cc deleted file mode 100644 index 4c08de9..0000000 --- a/mojo/tools/package_manager/package_manager_application.cc +++ /dev/null @@ -1,113 +0,0 @@ -// 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. - -#include "mojo/tools/package_manager/package_manager_application.h" - -#include "base/files/file_util.h" -#include "mojo/tools/package_manager/manifest.h" -#include "mojo/tools/package_manager/unpacker.h" -#include "base/message_loop/message_loop.h" -#include "base/stl_util.h" -#include "mojo/public/cpp/application/application_impl.h" - -namespace mojo { - -namespace { - -const base::FilePath::CharType kManifestFileName[] = - FILE_PATH_LITERAL("manifest.json"); - -} // namespace - -PackageManagerApplication::PendingLoad::PendingLoad() { -} - -PackageManagerApplication::PendingLoad::~PendingLoad() { -} - -PackageManagerApplication::PackageManagerApplication() { -} - -PackageManagerApplication::~PackageManagerApplication() { - STLDeleteContainerPairSecondPointers(pending_.begin(), pending_.end()); -} - -void PackageManagerApplication::Initialize(ApplicationImpl* app) { - app->ConnectToService("mojo:network_service", &network_service_); - - printf("Enter URL> "); - char buf[1024]; - if (scanf("%1023s", buf) != 1) { - printf("No input, exiting\n"); - base::MessageLoop::current()->Quit(); - return; - } - GURL url(buf); - if (!url.is_valid()) { - printf("Invalid URL\n"); - base::MessageLoop::current()->Quit(); - return; - } - - StartLoad(url); -} - -void PackageManagerApplication::StartLoad(const GURL& url) { - if (completed_.find(url) != completed_.end() || - pending_.find(url) != pending_.end()) - return; // Already loaded or are loading this one. - - PendingLoad* load = new PendingLoad; - load->fetcher.reset(new mojo::PackageFetcher( - network_service_.get(), this, url)); - pending_[url] = load; -} - -void PackageManagerApplication::LoadDeps(const Manifest& manifest) { - for (size_t i = 0; i < manifest.deps().size(); i++) - StartLoad(manifest.deps()[i]); -} - -void PackageManagerApplication::PendingLoadComplete(const GURL& url) { - pending_.erase(pending_.find(url)); - completed_.insert(url); - if (pending_.empty()) - base::MessageLoop::current()->Quit(); -} - -void PackageManagerApplication::FetchSucceeded( - const GURL& url, - const base::FilePath& name) { - Unpacker unpacker; - if (!unpacker.Unpack(name)) { - base::DeleteFile(name, false); - printf("Failed to unpack\n"); - PendingLoadComplete(url); - return; - } - // The downloaded .zip file is no longer necessary. - base::DeleteFile(name, false); - - // Load the manifest. - base::FilePath manifest_path = unpacker.dir().Append(kManifestFileName); - Manifest manifest; - std::string err_msg; - if (!manifest.ParseFromFile(manifest_path, &err_msg)) { - printf("%s\n", err_msg.c_str()); - PendingLoadComplete(url); - return; - } - - // Enqueue loads for any deps. - LoadDeps(manifest); - - printf("Loaded %s\n", url.spec().c_str()); - PendingLoadComplete(url); -} - -void PackageManagerApplication::FetchFailed(const GURL& url) { - PendingLoadComplete(url); -} - -} // namespace mojo diff --git a/mojo/tools/package_manager/package_manager_application.h b/mojo/tools/package_manager/package_manager_application.h deleted file mode 100644 index 87d4fcd..0000000 --- a/mojo/tools/package_manager/package_manager_application.h +++ /dev/null @@ -1,63 +0,0 @@ -// 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. - -#ifndef MOJO_PACKAGE_MANAGER_PACKAGE_MANAGER_APPLICATION_H_ -#define MOJO_PACKAGE_MANAGER_PACKAGE_MANAGER_APPLICATION_H_ - -#include <map> -#include <set> - -#include "mojo/public/cpp/application/application_delegate.h" -#include "mojo/public/cpp/application/interface_factory.h" -#include "mojo/public/cpp/system/macros.h" -#include "mojo/services/public/interfaces/network/network_service.mojom.h" -#include "mojo/tools/package_manager/package_fetcher.h" - -namespace mojo { - -class Manifest; - -class PackageManagerApplication - : public ApplicationDelegate, - public PackageFetcherDelegate { - public: - PackageManagerApplication(); - virtual ~PackageManagerApplication(); - - private: - struct PendingLoad { - PendingLoad(); - ~PendingLoad(); - - scoped_ptr<PackageFetcher> fetcher; - }; - typedef std::map<GURL, PendingLoad*> PendingLoadMap; - - void StartLoad(const GURL& url); - - void LoadDeps(const Manifest& manifest); - - // Deletes the pending load entry for the given URL and possibly exits the - // message loop if all loads are done. - void PendingLoadComplete(const GURL& url); - - // ApplicationDelegate implementation. - virtual void Initialize(ApplicationImpl* app) override; - - // PackageFetcher. - virtual void FetchSucceeded(const GURL& url, - const base::FilePath& name) override; - virtual void FetchFailed(const GURL& url) override; - - mojo::NetworkServicePtr network_service_; - - PendingLoadMap pending_; // Owning pointers. - std::set<GURL> completed_; - - MOJO_DISALLOW_COPY_AND_ASSIGN(PackageManagerApplication); -}; - -} // namespace mojo - -#endif // MOJO_PACKAGE_MANAGER_PACKAGE_MANAGER_APPLICATION_H diff --git a/mojo/tools/package_manager/unpacker.cc b/mojo/tools/package_manager/unpacker.cc deleted file mode 100644 index 8ed34d5..0000000 --- a/mojo/tools/package_manager/unpacker.cc +++ /dev/null @@ -1,35 +0,0 @@ -// 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. - -#include "mojo/tools/package_manager/unpacker.h" - -#include "base/files/file_util.h" -#include "base/logging.h" -#include "third_party/zlib/google/zip.h" - -namespace mojo { - -Unpacker::Unpacker() { -} - -Unpacker::~Unpacker() { - if (!dir_.empty()) - DeleteFile(dir_, true); -} - -bool Unpacker::Unpack(const base::FilePath& zip_file) { - DCHECK(zip_file_.empty()); - zip_file_ = zip_file; - - DCHECK(dir_.empty()); - if (!CreateNewTempDirectory(base::FilePath::StringType(), &dir_)) - return false; - if (!zip::Unzip(zip_file, dir_)) { - dir_ = base::FilePath(); - return false; - } - return true; -} - -} // namespace mojo diff --git a/mojo/tools/package_manager/unpacker.h b/mojo/tools/package_manager/unpacker.h deleted file mode 100644 index 2f7acc5..0000000 --- a/mojo/tools/package_manager/unpacker.h +++ /dev/null @@ -1,40 +0,0 @@ -// 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. - -#ifndef MOJO_TOOLS_PACKAGE_MANAGER_UNPACKER_H_ -#define MOJO_TOOLS_PACKAGE_MANAGER_UNPACKER_H_ - -#include "base/files/file_path.h" -#include "base/memory/ref_counted.h" -#include "mojo/public/cpp/system/macros.h" - -namespace mojo { - -// Unzips a package into a temporary folder. The temporary folder will be -// deleted when the object is destroyed. -// -// In the future, this class would probably manage doing the unzip operation on -// a background thread. -class Unpacker { - public: - Unpacker(); - ~Unpacker(); - - // Actually does the unpacking, returns true on success. - bool Unpack(const base::FilePath& zip_file); - - // The root directory where the package has been unpacked. - const base::FilePath& dir() const { return dir_; } - - private: - base::FilePath zip_file_; - - base::FilePath dir_; - - MOJO_DISALLOW_COPY_AND_ASSIGN(Unpacker); -}; - -} // namespace mojo - -#endif // MOJO_TOOLS_PACKAGE_MANAGER_UNPACKER_H_ diff --git a/mojo/tools/pylib/mojo_python_tests_runner.py b/mojo/tools/pylib/mojo_python_tests_runner.py deleted file mode 100644 index e63a2a4..0000000 --- a/mojo/tools/pylib/mojo_python_tests_runner.py +++ /dev/null @@ -1,147 +0,0 @@ -# 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 json -import os -import sys -import time -import unittest - - -class MojoPythonTestRunner(object): - """Helper class to run python tests on the bots.""" - - def __init__(self, test_dir): - self._test_dir = test_dir - - def run(self): - parser = argparse.ArgumentParser() - parser.usage = 'run_mojo_python_tests.py [options] [tests...]' - parser.add_argument('-v', '--verbose', action='count', default=0) - parser.add_argument('--metadata', action='append', default=[], - help=('optional key=value metadata that will be stored ' - 'in the results files (can be used for revision ' - 'numbers, etc.)')) - parser.add_argument('--write-full-results-to', metavar='FILENAME', - action='store', - help='path to write the list of full results to.') - parser.add_argument('tests', nargs='*') - - self.add_custom_commandline_options(parser) - args = parser.parse_args() - self.apply_customization(args) - - bad_metadata = False - for val in args.metadata: - if '=' not in val: - print >> sys.stderr, ('Error: malformed metadata "%s"' % val) - bad_metadata = True - if bad_metadata: - print >> sys.stderr - parser.print_help() - return 2 - - chromium_src_dir = os.path.join(os.path.dirname(__file__), - os.pardir, - os.pardir, - os.pardir) - - loader = unittest.loader.TestLoader() - print "Running Python unit tests under %s..." % self._test_dir - - pylib_dir = os.path.abspath(os.path.join(chromium_src_dir, self._test_dir)) - if args.tests: - if pylib_dir not in sys.path: - sys.path.append(pylib_dir) - suite = unittest.TestSuite() - for test_name in args.tests: - suite.addTests(loader.loadTestsFromName(test_name)) - else: - suite = loader.discover(pylib_dir, pattern='*_unittest.py') - - runner = unittest.runner.TextTestRunner(verbosity=(args.verbose + 1)) - result = runner.run(suite) - - full_results = _FullResults(suite, result, args.metadata) - if args.write_full_results_to: - with open(args.write_full_results_to, 'w') as fp: - json.dump(full_results, fp, indent=2) - fp.write("\n") - - return 0 if result.wasSuccessful() else 1 - - def add_custom_commandline_options(self, parser): - """Allow to add custom option to the runner script.""" - pass - - def apply_customization(self, args): - """Allow to apply any customization to the runner.""" - pass - - -TEST_SEPARATOR = '.' - - -def _FullResults(suite, result, metadata): - """Convert the unittest results to the Chromium JSON test result format. - - This matches run-webkit-tests (the layout tests) and the flakiness dashboard. - """ - - full_results = {} - full_results['interrupted'] = False - full_results['path_delimiter'] = TEST_SEPARATOR - full_results['version'] = 3 - full_results['seconds_since_epoch'] = time.time() - for md in metadata: - key, val = md.split('=', 1) - full_results[key] = val - - all_test_names = _AllTestNames(suite) - failed_test_names = _FailedTestNames(result) - - full_results['num_failures_by_type'] = { - 'FAIL': len(failed_test_names), - 'PASS': len(all_test_names) - len(failed_test_names), - } - - full_results['tests'] = {} - - for test_name in all_test_names: - value = {} - value['expected'] = 'PASS' - if test_name in failed_test_names: - value['actual'] = 'FAIL' - value['is_unexpected'] = True - else: - value['actual'] = 'PASS' - _AddPathToTrie(full_results['tests'], test_name, value) - - return full_results - - -def _AllTestNames(suite): - test_names = [] - # _tests is protected pylint: disable=W0212 - for test in suite._tests: - if isinstance(test, unittest.suite.TestSuite): - test_names.extend(_AllTestNames(test)) - else: - test_names.append(test.id()) - return test_names - - -def _FailedTestNames(result): - return set(test.id() for test, _ in result.failures + result.errors) - - -def _AddPathToTrie(trie, path, value): - if TEST_SEPARATOR not in path: - trie[path] = value - return - directory, rest = path.split(TEST_SEPARATOR, 1) - if directory not in trie: - trie[directory] = {} - _AddPathToTrie(trie[directory], rest, value) diff --git a/mojo/tools/pylib/transitive_hash.py b/mojo/tools/pylib/transitive_hash.py deleted file mode 100644 index 93e8dc4..0000000 --- a/mojo/tools/pylib/transitive_hash.py +++ /dev/null @@ -1,89 +0,0 @@ -# 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 logging -import subprocess -import sys - -from hashlib import sha256 -from os.path import basename, realpath - -_logging = logging.getLogger() - -# Based on/taken from -# http://code.activestate.com/recipes/578231-probably-the-fastest-memoization-decorator-in-the-/ -# (with cosmetic changes). -def _memoize(f): - """Memoization decorator for a function taking a single argument.""" - class Memoize(dict): - def __missing__(self, key): - rv = self[key] = f(key) - return rv - return Memoize().__getitem__ - -@_memoize -def _file_hash(filename): - """Returns a string representing the hash of the given file.""" - _logging.debug("Hashing %s ...", filename) - rv = subprocess.check_output(['sha256sum', '-b', filename]).split(None, 1)[0] - _logging.debug(" => %s", rv) - return rv - -@_memoize -def _get_dependencies(filename): - """Returns a list of filenames for files that the given file depends on.""" - _logging.debug("Getting dependencies for %s ...", filename) - lines = subprocess.check_output(['ldd', filename]).splitlines() - rv = [] - for line in lines: - i = line.find('/') - if i < 0: - _logging.debug(" => no file found in line: %s", line) - continue - rv.append(line[i:].split(None, 1)[0]) - _logging.debug(" => %s", rv) - return rv - -def transitive_hash(filename): - """Returns a string that represents the "transitive" hash of the given - file. The transitive hash is a hash of the file and all the shared libraries - on which it depends (done in an order-independent way).""" - hashes = set() - to_hash = [filename] - while to_hash: - current_filename = realpath(to_hash.pop()) - current_hash = _file_hash(current_filename) - if current_hash in hashes: - _logging.debug("Already seen %s (%s) ...", current_filename, current_hash) - continue - _logging.debug("Haven't seen %s (%s) ...", current_filename, current_hash) - hashes.add(current_hash) - to_hash.extend(_get_dependencies(current_filename)) - return sha256('|'.join(sorted(hashes))).hexdigest() - -def main(argv): - logging.basicConfig() - # Uncomment to debug: - # _logging.setLevel(logging.DEBUG) - - if len(argv) < 2: - print """\ -Usage: %s [file] ... - -Prints the \"transitive\" hash of each (executable) file. The transitive -hash is a hash of the file and all the shared libraries on which it -depends (done in an order-independent way).""" % basename(argv[0]) - return 0 - - rv = 0 - for filename in argv[1:]: - try: - print transitive_hash(filename), filename - except: - print "ERROR", filename - rv = 1 - return rv - -if __name__ == '__main__': - sys.exit(main(sys.argv)) diff --git a/mojo/tools/run_mojo_python_bindings_tests.py b/mojo/tools/run_mojo_python_bindings_tests.py deleted file mode 100755 index 916c68d..0000000 --- a/mojo/tools/run_mojo_python_bindings_tests.py +++ /dev/null @@ -1,39 +0,0 @@ -#!/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 os -import sys - -_script_dir = os.path.dirname(os.path.abspath(__file__)) -sys.path.insert(0, os.path.join(_script_dir, "pylib")) - -from mojo_python_tests_runner import MojoPythonTestRunner - - -class PythonBindingsTestRunner(MojoPythonTestRunner): - - def add_custom_commandline_options(self, parser): - parser.add_argument('--build-dir', action='store', - help='path to the build output directory') - - def apply_customization(self, args): - if args.build_dir: - python_build_dir = os.path.join(args.build_dir, 'python') - if python_build_dir not in sys.path: - sys.path.append(python_build_dir) - python_gen_dir = os.path.join( - args.build_dir, - 'gen', 'mojo', 'public', 'interfaces', 'bindings', 'tests') - if python_gen_dir not in sys.path: - sys.path.append(python_gen_dir) - - -def main(): - runner = PythonBindingsTestRunner(os.path.join('mojo', 'python', 'tests')) - sys.exit(runner.run()) - - -if __name__ == '__main__': - sys.exit(main()) diff --git a/mojo/tools/run_mojo_python_tests.py b/mojo/tools/run_mojo_python_tests.py deleted file mode 100755 index d83ca54..0000000 --- a/mojo/tools/run_mojo_python_tests.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/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 os -import sys - -_script_dir = os.path.dirname(os.path.abspath(__file__)) -sys.path.insert(0, os.path.join(_script_dir, "pylib")) - -from mojo_python_tests_runner import MojoPythonTestRunner - - -def main(): - runner = MojoPythonTestRunner(os.path.join('mojo', 'public', 'tools', - 'bindings', 'pylib')) - sys.exit(runner.run()) - - -if __name__ == '__main__': - sys.exit(main()) diff --git a/mojo/tools/test_runner.py b/mojo/tools/test_runner.py deleted file mode 100755 index b0bb4d9..0000000 --- a/mojo/tools/test_runner.py +++ /dev/null @@ -1,116 +0,0 @@ -#!/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. - -"""A "smart" test runner for gtest unit tests (that caches successes).""" - -import logging -import os -import subprocess -import sys - -_logging = logging.getLogger() - -_script_dir = os.path.dirname(os.path.abspath(__file__)) -sys.path.insert(0, os.path.join(_script_dir, "pylib")) - -from transitive_hash import transitive_hash - -def main(argv): - logging.basicConfig() - # Uncomment to debug: - # _logging.setLevel(logging.DEBUG) - - if len(argv) < 3 or len(argv) > 4: - print "Usage: %s gtest_list_file root_dir [successes_cache_file]" % \ - os.path.basename(argv[0]) - return 0 if len(argv) < 2 else 1 - - _logging.debug("Test list file: %s", argv[1]) - with open(argv[1], 'rb') as f: - gtest_list = [y for y in [x.strip() for x in f.readlines()] \ - if y and y[0] != '#'] - _logging.debug("Test list: %s" % gtest_list) - - print "Running tests in directory: %s" % argv[2] - os.chdir(argv[2]) - - if len(argv) == 4 and argv[3]: - successes_cache_filename = argv[3] - print "Successes cache file: %s" % successes_cache_filename - else: - successes_cache_filename = None - print "No successes cache file (will run all tests unconditionally)" - - if successes_cache_filename: - # This file simply contains a list of transitive hashes of tests that - # succeeded. - try: - _logging.debug("Trying to read successes cache file: %s", - successes_cache_filename) - with open(argv[3], 'rb') as f: - successes = set([x.strip() for x in f.readlines()]) - _logging.debug("Successes: %s", successes) - except: - # Just assume that it didn't exist, or whatever. - print "Failed to read successes cache file %s (will create)" % argv[3] - successes = set() - - # Run gtests with color if we're on a TTY (and we're not being told explicitly - # what to do). - if sys.stdout.isatty() and 'GTEST_COLOR' not in os.environ: - _logging.debug("Setting GTEST_COLOR=yes") - os.environ['GTEST_COLOR'] = 'yes' - - # TODO(vtl): We may not close this file on failure. - successes_cache_file = open(successes_cache_filename, 'ab') \ - if successes_cache_filename else None - for gtest in gtest_list: - if gtest[0] == '*': - gtest = gtest[1:] - _logging.debug("%s is marked as non-cacheable" % gtest) - cacheable = False - else: - cacheable = True - - if successes_cache_file and cacheable: - _logging.debug("Getting transitive hash for %s ... " % gtest) - try: - gtest_hash = transitive_hash(gtest) - except: - print "Failed to get transitive hash for %s" % gtest - return 1 - _logging.debug(" Transitive hash: %s" % gtest_hash) - - if gtest_hash in successes: - print "Skipping %s (previously succeeded)" % gtest - continue - - print "Running %s...." % gtest, - sys.stdout.flush() - try: - subprocess.check_output(["./" + gtest], stderr=subprocess.STDOUT) - print "Succeeded" - # Record success. - if successes_cache_filename and cacheable: - successes.add(gtest_hash) - successes_cache_file.write(gtest_hash + '\n') - successes_cache_file.flush() - except subprocess.CalledProcessError as e: - print "Failed with exit code %d and output:" % e.returncode - print 72 * '-' - print e.output - print 72 * '-' - return 1 - except OSError as e: - print " Failed to start test" - return 1 - print "All tests succeeded" - if successes_cache_file: - successes_cache_file.close() - - return 0 - -if __name__ == '__main__': - sys.exit(main(sys.argv)) |