// Copyright 2018 The Chromium OS 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 USB_BOUNCER_ENTRY_MANAGER_TEST_UTIL_H_
#define USB_BOUNCER_ENTRY_MANAGER_TEST_UTIL_H_

#include <memory>
#include <string>

#include <base/files/file_path.h>
#include <base/files/scoped_temp_dir.h>

#include "usb_bouncer/entry_manager.h"

namespace usb_bouncer {

constexpr char kDefaultRule[] =
    "allow id 046d:c31c serial \"\" name \"USB Keyboard\" hash "
    "\"eqf7n/3rlMr5be7CI8RRr3PAT41/67nSG7TO4oyXBKQ=\" with-interface "
    "{ 03:01:01 03:00:00 }";

constexpr char kDefaultDevpath[] = "/devices/pci0000:00/0000:00:00.0/usb1/1-0";

constexpr char kUserdbDir[] =
    "run/daemon-store/usb_bouncer/0000000000000000000000000000000000000000/";

class EntryManagerTestUtil {
 public:
  EntryManagerTestUtil();

  EntryManager* Get();

  void RefreshDB(bool include_user_db, bool new_db);

  void ReplaceDB(const RuleDB& replacement);

  void SetUserDBReadOnly(bool user_db_read_only);

  void ExpireEntry(bool expect_user,
                   const std::string& devpath,
                   const std::string& rule);

  size_t GarbageCollectInternal(bool global_only);

  bool GlobalDBContainsEntry(const std::string& devpath,
                             const std::string& rule);

  bool GlobalTrashContainsEntry(const std::string& devpath,
                                const std::string& rule);

  bool UserDBContainsEntry(const std::string& rule);

 private:
  base::FilePath CreateTestDir(const std::string& dir, bool force_empty);
  void RecreateEntryManager(const base::FilePath& userdb_dir);

  std::unique_ptr<EntryManager> entry_manager_;
  base::ScopedTempDir scoped_temp_dir_;
  base::FilePath temp_dir_;
};

}  // namespace usb_bouncer

#endif  // USB_BOUNCER_ENTRY_MANAGER_TEST_UTIL_H_
