blob: 9935ddb0ba795ac221826755509d319f5cc8199a [file] [log] [blame]
// Copyright 2017 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 CHROMEOS_DBUS_BIOD_FAKE_BIOD_CLIENT_H_
#define CHROMEOS_DBUS_BIOD_FAKE_BIOD_CLIENT_H_
#include <map>
#include <memory>
#include <string>
#include "base/component_export.h"
#include "base/macros.h"
#include "base/observer_list.h"
#include "chromeos/dbus/biod/biod_client.h"
#include "dbus/object_path.h"
namespace dbus {
class Bus;
} // namespace dbus
namespace chromeos {
// A fake implementation of BiodClient. It emulates the real Biod daemon by
// providing the same API and storing fingerprints locally. A fingerprint is
// represented by a vector of strings. During enrollment, fake enrollments are
// sent as strings. If they are successful they get added to the current
// fingerprint, until a completed enroll scan is sent. An attempt scan is also
// sent with a string. If that string matches any string in the stored
// fingerprint vector, it is considered a match.
class COMPONENT_EXPORT(CHROMEOS_DBUS) FakeBiodClient : public BiodClient {
public:
FakeBiodClient();
~FakeBiodClient() override;
// Emulates the biod daemon by sending events which the daemon normally sends.
// Notifies |observers_| about various events. These will be used in tests.
// Emulates a scan that occurs during enrolling a new fingerprint.
// |fingerprint| is the fake data of the finger as a string. If |is_complete|
// is true the enroll session is finished, and the record is stored.
void SendEnrollScanDone(const std::string& fingerprint,
biod::ScanResult type_result,
bool is_complete,
int percent_complete);
// Emulates a scan that occurs during a authentication session. |fingerprint|
// is a string which represents the finger, and will be compared with all the
// stored fingerprints.
void SendAuthScanDone(const std::string& fingerprint,
biod::ScanResult type_result);
void SendSessionFailed();
// Clears all stored and current records from the fake storage.
void Reset();
// BiodClient:
void Init(dbus::Bus* bus) override;
void AddObserver(Observer* observer) override;
void RemoveObserver(Observer* observer) override;
bool HasObserver(const Observer* observer) const override;
void StartEnrollSession(const std::string& user_id,
const std::string& label,
const ObjectPathCallback& callback) override;
void GetRecordsForUser(const std::string& user_id,
UserRecordsCallback callback) override;
void DestroyAllRecords(VoidDBusMethodCallback callback) override;
void StartAuthSession(const ObjectPathCallback& callback) override;
void RequestType(BiometricTypeCallback callback) override;
void CancelEnrollSession(VoidDBusMethodCallback callback) override;
void EndAuthSession(VoidDBusMethodCallback callback) override;
void SetRecordLabel(const dbus::ObjectPath& record_path,
const std::string& label,
VoidDBusMethodCallback callback) override;
void RemoveRecord(const dbus::ObjectPath& record_path,
VoidDBusMethodCallback callback) override;
void RequestRecordLabel(const dbus::ObjectPath& record_path,
LabelCallback callback) override;
private:
struct FakeRecord;
// The current session of fingerprint storage. The session determines which
// events will be sent from user finger touches.
enum class FingerprintSession {
NONE,
ENROLL,
AUTH,
};
// The stored fingerprints.
std::map<dbus::ObjectPath, std::unique_ptr<FakeRecord>> records_;
// Current record in process of getting enrolled and its path. These are
// assigned at the start of an enroll session and freed when the enroll
// session is finished or cancelled.
dbus::ObjectPath current_record_path_;
std::unique_ptr<FakeRecord> current_record_;
// Unique indentifier that gets updated each time an enroll session is started
// to ensure each record is stored at a different path.
int next_record_unique_id_ = 1;
// The current session of the fake storage.
FingerprintSession current_session_ = FingerprintSession::NONE;
base::ObserverList<Observer>::Unchecked observers_;
DISALLOW_COPY_AND_ASSIGN(FakeBiodClient);
};
} // namespace chromeos
#endif // CHROMEOS_DBUS_BIOD_FAKE_BIOD_CLIENT_H_