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