Azure SDK for PHPのUnit Testを通すまでにやったこと


# これは何？

[Azure SDK for PHP](https://github.com/Azure/azure-sdk-for-php/)を含むAzure関連のSDKはOSSとして公開されています。
forkしてPull requestを出す前にテストを通しておきたいところですが、テストを通すためにやっておかないといけないことは割と複雑です。

ざっと挙げるとこんな感じ。

- 古いライブラリへの依存の解決
- 必要な環境変数の定義(Azure Portal/Azure CLIのASMモードでごにょごにょする)


これをやっときゃ、現状ある1700ケース弱のテストケースがほとんど通って気持ちいいです。

自分用メモの意味合いが強いので、お見苦しい文章ですがあしからず。


# 0. phpunitでテストケースを流す

```bash
git clone https://github.com/Azure/azure-sdk-for-php
cd azure-sdk-for-php;pwd
cp -i phpunit.dist.xml phpunit.xml
composer install
phpunit
```

この時点でテスト結果はRやFやEまみれになるはず。

テスト結果の"R":RISKEYを無視するなら、phpunit.xmlのstrictをfalseにします。

残りのFやEのほとんどは以降の設定を行えば解消されるはず。


# 1. 古いライブラリへの依存の解決

Azure SDK for PHPのUnit testは古いバージョンのvfsStreamに依存しています。
[Packagist](https://packagist.org/packages/mikey179/vfsstream)に登録されていないくらい古いバージョンです。

なので、最新版に対応するようテストコードを修正し、Pull requestを出しました。
修正版ではcomposer installするだけでOKです。

[adopt vfsStream latest version](https://github.com/Azure/azure-sdk-for-php/pull/751)

上記がマージされるまでの間は、Pull requestのbranchからテストコードを取得するか、ローカルブランチにマージしてご利用ください。

2015/09時点でupstreamの更新は止まっているので、特に問題にならないかと思います。


# 2. 必要な環境変数の定義(Azure Portal/Azure CLIのASMモードでごにょごにょする)

[Testing on Windows Guide](https://github.com/Azure/azure-sdk-for-php/wiki/Testing-on-Windows-Guide)

と、Unit test実行時のFatalエラーを参考に環境変数を定義していきました。

## for Azure Storage　のテストケース

テストに使用するストレージアカウントはPortalから作ってもCLIから作ってもOK

### AZURE_STORAGE_CONNECTION_STRING の定義

```bash
export AZURE_STORAGE_CONNECTION_STRING=DefaultEndpointsProtocol=https;AccountName=[ストレージアカウント名];AccountKey=[プライマリorセカンダリアクセスキー]
```

必要なパラメータを確認出来る場所はこちら。
　　Azure Portal -> ストレージ -> (テストに使用するストレージを選択した状態で)アクセスキーの管理
を押下すると表示されます。

## for Azure Media Services

テストに使用するメディアサービスアカウントはPortalから作ってもCLIから作ってもOK

### AZURE_MEDIA_SERVICES_ACCOUNT_NAME / AZURE_MEDIA_SERVICES_ACCESS_KEY の定義

```bash
export AZURE_MEDIA_SERVICES_ACCOUNT_NAME=[メディア サービス アカウント名]
export AZURE_MEDIA_SERVICES_ACCESS_KEY=[プライマリorセカンダリメディア サービス アクセス キー]
```

必要なパラメータを確認出来る場所はこちら。
　　Azure Portal -> メディアサービス -> (テストに使用するメディアサービスを選択した状態で)キーの管理
を押下すると表示されます。


## for Azure Service Bus　のテストケース

これが少し曲者で、2015/09/05時点ではテストケースはACS認証のService Busにしか対応していません。

詳細は[Service Bus の認証と承認](https://msdn.microsoft.com/ja-jp/library/azure/Dn170478.aspx)を読んでいただくとして、Azure Service Busは、2種類の認証方式を提供しています。

- SAS認証(Shared Access Signature Authentication)
- ACS認証(Access Control Service Authentication)

です。
2014/08以降、SAS認証が標準となっており、ACS認証方式のAzure Service BusはAzure CLIからしか作成できなくなりました。

### ACS認証のAzure Service Busを作成する

Azure CLIのASMモード(Azure Service Management Mode)でのみ作成できます。
ARMモード(Azure Resource Management Mode)では作成できないので注意。

```bash
# 事前にASMモードorARMモードでサブスクリプションにloginしておく。
## わからなかったらtwitterで聞いてくれてもOKです。

# ASMモードへの切り替え
azure config mode asm

# ACS認証なAzure Service Busの作成
azure sb namespace create '[Service Bus名]' '[Region]'
## azure sb namespace create 'hogeBus' 'Japan West'

```


### AZURE_SERVICE_BUS_CONNECTION_STRING の定義

```bash
export AZURE_SERVICE_BUS_CONNECTION_STRING=[接続文字列]

```

必要なパラメータを確認出来る場所はこちら。
　　Azure Portal -> SERVICE BUS -> (テストに使用するservice bus(=ACS認証で作成したもの)を選択した状態で)接続情報
を押下すると表示されます。


## for Azure Service Management API のテストケース

Azure Service Management APIを使用したテストを実施するためには、テストに使用するサブスクリプションに共同管理者を設定する必要があります。

### 共同管理者の作成

　　Azure Portal -> ACTIVE DIRECTORY -> Default Directory -> ユーザー -> ユーザーの追加

からユーザーを作成します。

次に、

　　Azure Portal -> 設定 -> 管理者 -> 追加 

で先ほど作成したユーザーを"サブスクリプションの共同管理者"に指定します。

### 管理証明書の作成＆アップロード

共同管理者がAzure Service Management APIを叩く際に使用する管理証明書を作成します。


証明書は公開鍵認証方式です。証明書の作成方法は下記を参考にしてください。
本当は公式ドキュメントのURLを提示したいのですが、URLを失念してしまいました。。。

[AzureのManagement Certificates（管理証明書）をopensslコマンドで作る](http://qiita.com/Marcy/items/7712a7b00a3df4499dad)

```引用
openssl req -x509 -nodes -newkey rsa:2048 -keyout ~/.ssh/azure.pem -out ~/.ssh/azure.pem
openssl x509 -inform pem -in ~/.ssh/azure.pem -outform der -out ~/.ssh/azure.cer
```


作成したcerファイルを

　　Azure Portal -> 設定 -> 管理証明書 -> アップロード

からAzureにアップロードします。


### AZURE_SERVICE_MANAGEMENT_CONNECTION_STRING の定義

```bash
export AZURE_SERVICE_MANAGEMENT_CONNECTION_STRING=SubscriptionID=[サブスクリプションID];CertificatePath=[Path to pem]
```

[サブスクリプションID]を確認出来る場所はこちら。

　　Azure Portal -> 設定 -> サブスクリプション 

に表示されるサブスクリプションID

[Path to pem]は"管理証明書の作成＆アップロード"で作成したpemファイルへのPathです。


## for クラウドサービス　のテストケース

cscfgとcspkgファイルを作成し、Azure Storageにアップロードし、それを下記環境変数に定義するのですが、手元のMac環境ではcscfg/cspkgを作るのは大変なので、準備出来しだい追記します！

```
SERVICE_MANAGEMENT_COMPLEX_PACKAGE_CONFIGURATION
SERVICE_MANAGEMENT_COMPLEX_PACKAGE_URL
SERVICE_MANAGEMENT_SIMPLE_PACKAGE_CONFIGURATION
SERVICE_MANAGEMENT_SIMPLE_PACKAGE_URL
```