docstr: OutputCredentials - Save and Load Credentials
  
  Not only tests how save_credentials() interacts with load_credentials(), but also tests
  that cred_requirement=False properties are not saved. Also tests that default values
  are merged into the final credentials dict as appropriate.
docstr_tok: ["OutputCredentials","-","Save","and","Load","Credentials","Not","only","tests","how","save_credentials","(",")","interacts","with","load_credentials","(",")",",","but","also","tests","that","cred_requirement=False","properties","are","not","saved",".","Also","tests","that","default","values","are","merged","into","the","final","credentials","dict","as","appropriate","."]
code: def test_save_and_load_credentials(self):
      """OutputCredentials - Save and Load Credentials
  
      Not only tests how save_credentials() interacts with load_credentials(), but also tests
      that cred_requirement=False properties are not saved. Also tests that default values
      are merged into the final credentials dict as appropriate."""
  
      descriptor = "test_save_and_load_credentials"
      props = OrderedDict(
          [
              (
                  "property1",
                  OutputProperty(
                      description="This is a property and not a cred so it will not save"
                  ),
              ),
              (
                  "property2",
                  OutputProperty(description="Neither will this"),
              ),
              (
                  "credential1",
                  OutputProperty(
                      description="Hello world",
                      value="this is a super secret secret, shhhh!",
                      mask_input=True,
                      cred_requirement=True,
                  ),
              ),
              (
                  "credential2",
                  OutputProperty(
                      description="This appears too!",
                      value="where am i?",
                      mask_input=True,
                      cred_requirement=True,
                  ),
              ),
          ]
      )
  
      # Save credential
      assert_true(
          self._provider.save_credentials(descriptor, KMS_ALIAS, props)
      )
  
      # Pull it out
      creds_dict = self._provider.load_credentials(descriptor)
      expectation = {
          "property2": "abcdef",
          "credential1": "this is a super secret secret, shhhh!",
          "credential2": "where am i?",
      }
      assert_equal(creds_dict, expectation)
  
imports: import json
  import os
  from collections import OrderedDict
  from botocore.exceptions import ClientError
  from mock import patch, MagicMock
  from moto import mock_kms, mock_ssm
  from nose.tools import assert_equal, assert_false, assert_is_instance, assert_is_none, assert_is_not_none, assert_not_equal, assert_true
  from streamalert.alert_processor.outputs.output_base import OutputProperty
  from streamalert.alert_processor.outputs.credentials.provider import SSMDriver, LocalFileDriver, Credentials, OutputCredentialsProvider, EphemeralUnencryptedDriver, SpooledTempfileDriver, get_formatted_output_credentials_name
  from tests.unit.streamalert.alert_processor import PREFIX, CONFIG, KMS_ALIAS, REGION, MOCK_ENV
  from tests.unit.streamalert.alert_processor.helpers import encrypt_with_kms, setup_mock_kms
label_desc: Use image node_id 2 for calling the TestOutputCredentialsProvider obj's underlying member method code with example usage: obj.test_save_and_load_credentials() without return types