text: // Copyright 2013 The Flutter 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 FLUTTER_SHELL_PLATFORM_COMMON_CPP_CLIENT_WRAPPER_TESTING_STUB_FLUTTER_API_H_
  #define FLUTTER_SHELL_PLATFORM_COMMON_CPP_CLIENT_WRAPPER_TESTING_STUB_FLUTTER_API_H_
  
  #include <memory>
  
  #include "flutter/shell/platform/common/public/flutter_messenger.h"
  #include "flutter/shell/platform/common/public/flutter_plugin_registrar.h"
  
  namespace flutter {
  namespace testing {
  
  // Base class for a object that provides test implementations of the APIs in
  // the headers in platform/common/public/.
  
  // Linking this class into a test binary will provide dummy forwarding
  // implementantions of that C API, so that the wrapper can be tested separately
  // from the actual library.
  class StubFlutterApi {
   public:
    // Used by the callers to simulate a result from the engine when sending a
    // message.
    bool message_engine_result = true;
  
    // Sets |stub| as the instance to which calls to the Flutter library C APIs
    // will be forwarded.
    static void SetTestStub(StubFlutterApi* stub);
  
    // Returns the current stub, as last set by SetTestFluttterStub.
    static StubFlutterApi* GetTestStub();
  
    virtual ~StubFlutterApi() {}
  
    // Called for FlutterDesktopPluginRegistrarSetDestructionHandler.
    virtual void PluginRegistrarSetDestructionHandler(
        FlutterDesktopOnPluginRegistrarDestroyed callback) {}
  
    // Called for FlutterDesktopMessengerSend.
    virtual bool MessengerSend(const char* channel,
                               const uint8_t* message,
                               const size_t message_size) {
      return message_engine_result;
    }
  
    // Called for FlutterDesktopMessengerSendWithReply.
    virtual bool MessengerSendWithReply(const char* channel,
                                        const uint8_t* message,
                                        const size_t message_size,
                                        const FlutterDesktopBinaryReply reply,
                                        void* user_data) {
      return message_engine_result;
    }
  
    // Called for FlutterDesktopMessengerSendResponse.
    virtual void MessengerSendResponse(
        const FlutterDesktopMessageResponseHandle* handle,
        const uint8_t* data,
        size_t data_length) {}
  
    // Called for FlutterDesktopMessengerSetCallback.
    virtual void MessengerSetCallback(const char* channel,
                                      FlutterDesktopMessageCallback callback,
                                      void* user_data) {}
  
    // Called for FlutterDesktopRegisterExternalTexture.
    virtual int64_t TextureRegistrarRegisterExternalTexture(
        const FlutterDesktopTextureInfo* info) {
      return -1;
    }
  
    // Called for FlutterDesktopUnregisterExternalTexture.
    virtual bool TextureRegistrarUnregisterExternalTexture(int64_t texture_id) {
      return false;
    }
  
    // Called for FlutterDesktopMarkExternalTextureFrameAvailable.
    virtual bool TextureRegistrarMarkTextureFrameAvailable(int64_t texture_id) {
      return false;
    }
  };
  
  // A test helper that owns a stub implementation, making it the test stub for
  // the lifetime of the object, then restoring the previous value.
  class ScopedStubFlutterApi {
   public:
    // Calls SetTestFlutterStub with |stub|.
    ScopedStubFlutterApi(std::unique_ptr<StubFlutterApi> stub);
  
    // Restores the previous test stub.
    ~ScopedStubFlutterApi();
  
    StubFlutterApi* stub() { return stub_.get(); }
  
   private:
    std::unique_ptr<StubFlutterApi> stub_;
    // The previous stub.
    StubFlutterApi* previous_stub_;
  };
  
  }  // namespace testing
  }  // namespace flutter
  
  #endif  // FLUTTER_SHELL_PLATFORM_COMMON_CPP_CLIENT_WRAPPER_TESTING_STUB_FLUTTER_API_H_
  