1aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo// 2aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo// Copyright (C) 2013 The Android Open Source Project 3aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo// 4aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo// Licensed under the Apache License, Version 2.0 (the "License"); 5aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo// you may not use this file except in compliance with the License. 6aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo// You may obtain a copy of the License at 7aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo// 8aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo// http://www.apache.org/licenses/LICENSE-2.0 9aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo// 10aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo// Unless required by applicable law or agreed to in writing, software 11aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo// distributed under the License is distributed on an "AS IS" BASIS, 12aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo// See the License for the specific language governing permissions and 14aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo// limitations under the License. 15aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo// 1627a48bc3f2531166370c214f7a21e17fb1fc7af1David Zeuthen 17cf175a098081f3f0e9ca52d997a7ce1585c14c2dGilad Arnold#ifndef UPDATE_ENGINE_FAKE_P2P_MANAGER_CONFIGURATION_H_ 18cf175a098081f3f0e9ca52d997a7ce1585c14c2dGilad Arnold#define UPDATE_ENGINE_FAKE_P2P_MANAGER_CONFIGURATION_H_ 1927a48bc3f2531166370c214f7a21e17fb1fc7af1David Zeuthen 2039910dcd1d68987ccee7c3031dc269233a8490bbAlex Deymo#include "update_engine/common/test_utils.h" 2139910dcd1d68987ccee7c3031dc269233a8490bbAlex Deymo#include "update_engine/common/utils.h" 2227a48bc3f2531166370c214f7a21e17fb1fc7af1David Zeuthen#include "update_engine/p2p_manager.h" 2327a48bc3f2531166370c214f7a21e17fb1fc7af1David Zeuthen 24d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko#include <string> 25d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko#include <vector> 26d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko 27110e030ba1a37787635e229bd36b42e33b9a9208Alex Deymo#include <base/files/file_util.h> 2839910dcd1d68987ccee7c3031dc269233a8490bbAlex Deymo#include <base/logging.h> 29b339155941fe27d52c022d01ff5e3faefaa63fa2Alex Deymo#include <base/strings/string_number_conversions.h> 3039910dcd1d68987ccee7c3031dc269233a8490bbAlex Deymo#include <base/strings/string_util.h> 3127a48bc3f2531166370c214f7a21e17fb1fc7af1David Zeuthen 3227a48bc3f2531166370c214f7a21e17fb1fc7af1David Zeuthennamespace chromeos_update_engine { 3327a48bc3f2531166370c214f7a21e17fb1fc7af1David Zeuthen 3427a48bc3f2531166370c214f7a21e17fb1fc7af1David Zeuthen// Configuration for P2PManager for use in unit tests. Instead of 3527a48bc3f2531166370c214f7a21e17fb1fc7af1David Zeuthen// /var/cache/p2p, a temporary directory is used. 3627a48bc3f2531166370c214f7a21e17fb1fc7af1David Zeuthenclass FakeP2PManagerConfiguration : public P2PManager::Configuration { 37d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko public: 38b339155941fe27d52c022d01ff5e3faefaa63fa2Alex Deymo FakeP2PManagerConfiguration() { 395aa1c54312fdaf541c70932900fb3c80145592e1Alex Deymo EXPECT_TRUE(utils::MakeTempDirectory("p2p-tc.XXXXXX", &p2p_dir_)); 4027a48bc3f2531166370c214f7a21e17fb1fc7af1David Zeuthen } 4127a48bc3f2531166370c214f7a21e17fb1fc7af1David Zeuthen 4227a48bc3f2531166370c214f7a21e17fb1fc7af1David Zeuthen ~FakeP2PManagerConfiguration() { 43110e030ba1a37787635e229bd36b42e33b9a9208Alex Deymo if (p2p_dir_.size() > 0 && 44110e030ba1a37787635e229bd36b42e33b9a9208Alex Deymo !base::DeleteFile(base::FilePath(p2p_dir_), true)) { 4527a48bc3f2531166370c214f7a21e17fb1fc7af1David Zeuthen PLOG(ERROR) << "Unable to unlink files and directory in " << p2p_dir_; 4627a48bc3f2531166370c214f7a21e17fb1fc7af1David Zeuthen } 4727a48bc3f2531166370c214f7a21e17fb1fc7af1David Zeuthen } 4827a48bc3f2531166370c214f7a21e17fb1fc7af1David Zeuthen 4927a48bc3f2531166370c214f7a21e17fb1fc7af1David Zeuthen // P2PManager::Configuration override 50610277efc6f7e5239158dfa4bb3b1021804326e0Alex Deymo base::FilePath GetP2PDir() override { 5175039d7397f03dff77bdf4e26398049ff88edc4cAlex Vakulenko return base::FilePath(p2p_dir_); 52d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko } 5327a48bc3f2531166370c214f7a21e17fb1fc7af1David Zeuthen 5427a48bc3f2531166370c214f7a21e17fb1fc7af1David Zeuthen // P2PManager::Configuration override 55610277efc6f7e5239158dfa4bb3b1021804326e0Alex Deymo std::vector<std::string> GetInitctlArgs(bool is_start) override { 5627a48bc3f2531166370c214f7a21e17fb1fc7af1David Zeuthen return is_start ? initctl_start_args_ : initctl_stop_args_; 5727a48bc3f2531166370c214f7a21e17fb1fc7af1David Zeuthen } 5827a48bc3f2531166370c214f7a21e17fb1fc7af1David Zeuthen 5927a48bc3f2531166370c214f7a21e17fb1fc7af1David Zeuthen // P2PManager::Configuration override 60610277efc6f7e5239158dfa4bb3b1021804326e0Alex Deymo std::vector<std::string> GetP2PClientArgs(const std::string &file_id, 61610277efc6f7e5239158dfa4bb3b1021804326e0Alex Deymo size_t minimum_size) override { 62b339155941fe27d52c022d01ff5e3faefaa63fa2Alex Deymo std::vector<std::string> formatted_command = p2p_client_cmd_format_; 638ad6da98cdf5670ac999482d6579fbd49997809aAlex Deymo // Replace {variable} on the passed string. 64c00c98a1dad941e5cc04ce0b0e766d40b3b384e1Alex Deymo std::string str_minimum_size = std::to_string(minimum_size); 65b339155941fe27d52c022d01ff5e3faefaa63fa2Alex Deymo for (std::string& arg : formatted_command) { 660057daa5dd6adc2db3b5524cfb3e66011c69c152Alex Vakulenko base::ReplaceSubstringsAfterOffset(&arg, 0, "{file_id}", file_id); 670057daa5dd6adc2db3b5524cfb3e66011c69c152Alex Vakulenko base::ReplaceSubstringsAfterOffset(&arg, 0, "{minsize}", 680057daa5dd6adc2db3b5524cfb3e66011c69c152Alex Vakulenko str_minimum_size); 69b339155941fe27d52c022d01ff5e3faefaa63fa2Alex Deymo } 70b339155941fe27d52c022d01ff5e3faefaa63fa2Alex Deymo return formatted_command; 7127a48bc3f2531166370c214f7a21e17fb1fc7af1David Zeuthen } 7227a48bc3f2531166370c214f7a21e17fb1fc7af1David Zeuthen 7327a48bc3f2531166370c214f7a21e17fb1fc7af1David Zeuthen // Use |command_line| instead of "initctl start p2p" when attempting 7427a48bc3f2531166370c214f7a21e17fb1fc7af1David Zeuthen // to start the p2p service. 75b339155941fe27d52c022d01ff5e3faefaa63fa2Alex Deymo void SetInitctlStartCommand(const std::vector<std::string>& command) { 76b339155941fe27d52c022d01ff5e3faefaa63fa2Alex Deymo initctl_start_args_ = command; 7727a48bc3f2531166370c214f7a21e17fb1fc7af1David Zeuthen } 7827a48bc3f2531166370c214f7a21e17fb1fc7af1David Zeuthen 7927a48bc3f2531166370c214f7a21e17fb1fc7af1David Zeuthen // Use |command_line| instead of "initctl stop p2p" when attempting 8027a48bc3f2531166370c214f7a21e17fb1fc7af1David Zeuthen // to stop the p2p service. 81b339155941fe27d52c022d01ff5e3faefaa63fa2Alex Deymo void SetInitctlStopCommand(const std::vector<std::string>& command) { 82b339155941fe27d52c022d01ff5e3faefaa63fa2Alex Deymo initctl_stop_args_ = command; 8327a48bc3f2531166370c214f7a21e17fb1fc7af1David Zeuthen } 8427a48bc3f2531166370c214f7a21e17fb1fc7af1David Zeuthen 85b339155941fe27d52c022d01ff5e3faefaa63fa2Alex Deymo // Use |command_format| instead of "p2p-client --get-url={file_id} 868ad6da98cdf5670ac999482d6579fbd49997809aAlex Deymo // --minimum-size={minsize}" when attempting to look up a file using 8727a48bc3f2531166370c214f7a21e17fb1fc7af1David Zeuthen // p2p-client(1). 8827a48bc3f2531166370c214f7a21e17fb1fc7af1David Zeuthen // 89b339155941fe27d52c022d01ff5e3faefaa63fa2Alex Deymo // The passed |command_format| argument can have "{file_id}" and "{minsize}" 90b339155941fe27d52c022d01ff5e3faefaa63fa2Alex Deymo // as substrings of any of its elements, that will be replaced by the 91b339155941fe27d52c022d01ff5e3faefaa63fa2Alex Deymo // corresponding values passed to GetP2PClientArgs(). 92b339155941fe27d52c022d01ff5e3faefaa63fa2Alex Deymo void SetP2PClientCommand(const std::vector<std::string>& command_format) { 93b339155941fe27d52c022d01ff5e3faefaa63fa2Alex Deymo p2p_client_cmd_format_ = command_format; 9427a48bc3f2531166370c214f7a21e17fb1fc7af1David Zeuthen } 9527a48bc3f2531166370c214f7a21e17fb1fc7af1David Zeuthen 96d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko private: 9727a48bc3f2531166370c214f7a21e17fb1fc7af1David Zeuthen // The temporary directory used for p2p. 9827a48bc3f2531166370c214f7a21e17fb1fc7af1David Zeuthen std::string p2p_dir_; 9927a48bc3f2531166370c214f7a21e17fb1fc7af1David Zeuthen 10027a48bc3f2531166370c214f7a21e17fb1fc7af1David Zeuthen // Argument vector for starting p2p. 101b339155941fe27d52c022d01ff5e3faefaa63fa2Alex Deymo std::vector<std::string> initctl_start_args_{"initctl", "start", "p2p"}; 10227a48bc3f2531166370c214f7a21e17fb1fc7af1David Zeuthen 10327a48bc3f2531166370c214f7a21e17fb1fc7af1David Zeuthen // Argument vector for stopping p2p. 104b339155941fe27d52c022d01ff5e3faefaa63fa2Alex Deymo std::vector<std::string> initctl_stop_args_{"initctl", "stop", "p2p"}; 10527a48bc3f2531166370c214f7a21e17fb1fc7af1David Zeuthen 1068ad6da98cdf5670ac999482d6579fbd49997809aAlex Deymo // A string for generating the p2p-client command. See the 1078ad6da98cdf5670ac999482d6579fbd49997809aAlex Deymo // SetP2PClientCommandLine() for details. 108b339155941fe27d52c022d01ff5e3faefaa63fa2Alex Deymo std::vector<std::string> p2p_client_cmd_format_{ 109b339155941fe27d52c022d01ff5e3faefaa63fa2Alex Deymo "p2p-client", "--get-url={file_id}", "--minimum-size={minsize}"}; 11027a48bc3f2531166370c214f7a21e17fb1fc7af1David Zeuthen 11127a48bc3f2531166370c214f7a21e17fb1fc7af1David Zeuthen DISALLOW_COPY_AND_ASSIGN(FakeP2PManagerConfiguration); 11227a48bc3f2531166370c214f7a21e17fb1fc7af1David Zeuthen}; 11327a48bc3f2531166370c214f7a21e17fb1fc7af1David Zeuthen 11427a48bc3f2531166370c214f7a21e17fb1fc7af1David Zeuthen} // namespace chromeos_update_engine 11527a48bc3f2531166370c214f7a21e17fb1fc7af1David Zeuthen 116cf175a098081f3f0e9ca52d997a7ce1585c14c2dGilad Arnold#endif // UPDATE_ENGINE_FAKE_P2P_MANAGER_CONFIGURATION_H_ 117