module Lowdown::Mock

Provides a collection of test helpers.

This file is not loaded by default.

Public Class Methods

certificate(app_bundle_id) click to toggle source

Generates a Certificate configured with a self-signed Universal Certificate.

@param (see Mock.ssl_certificate_and_key)

@return [Certificate]

a Certificate configured with a self-signed certificate/key pair.
# File lib/lowdown/mock.rb, line 51
def self.certificate(app_bundle_id)
  Certificate.new(*ssl_certificate_and_key(app_bundle_id))
end
client(uri: nil, app_bundle_id: "com.example.MockApp", keep_alive: false) click to toggle source

Generates a Client with a mock {Connection} and a self-signed Universal Certificate.

@param [URI, String] uri

the details to connect to the APN service.

@param [String] app_bundle_id

the App ID / app Bundle ID to encode into the certificate.

@return [Client]

a Client configured with the `uri` and a self-signed certificate that has the `app_bundle_id` encoded.
# File lib/lowdown/mock.rb, line 66
def self.client(uri: nil, app_bundle_id: "com.example.MockApp", keep_alive: false)
  certificate = certificate(app_bundle_id)
  connection = Connection.new(uri, certificate.ssl_context, keep_alive)
  connection.connect if keep_alive
  Client.client_with_connection(connection, certificate: certificate)
end
ssl_certificate_and_key(app_bundle_id) click to toggle source

Generates a self-signed Universal Certificate.

@param [String] app_bundle_id

the App ID / app Bundle ID to encode into the certificate.

@return [Array<OpenSSL::X509::Certificate, OpenSSL::PKey::RSA>]

the self-signed certificate and private key.
# File lib/lowdown/mock.rb, line 21
def self.ssl_certificate_and_key(app_bundle_id)
  key = OpenSSL::PKey::RSA.new(1024)
  name = OpenSSL::X509::Name.parse("/UID=#{app_bundle_id}/CN=Stubbed APNS Certificate: #{app_bundle_id}")
  cert = OpenSSL::X509::Certificate.new
  cert.subject    = name
  cert.not_before = Time.now
  cert.not_after  = cert.not_before + 3600
  cert.public_key = key.public_key
  cert.sign(key, OpenSSL::Digest::SHA1.new)

  # Make it a Universal Certificate
  ext_name = Lowdown::Certificate::UNIVERSAL_CERTIFICATE_EXTENSION
  ext_value = OpenSSL::ASN1::Sequence.new(
    [
      OpenSSL::ASN1::UTF8String.new(app_bundle_id),
      OpenSSL::ASN1::Sequence.new([OpenSSL::ASN1::UTF8String.new("app")]),
    ]
  ).to_der
  cert.extensions = [OpenSSL::X509::Extension.new(ext_name, ext_value)]

  [cert, key]
end