github.com/danrjohnson/terraform@v0.7.0-rc2.0.20160627135212-d0fc1fa086ff/terraform/upgrade_state_v1_test.go (about)

     1  package terraform
     2  
     3  import (
     4  	"bytes"
     5  	"reflect"
     6  	"strings"
     7  	"testing"
     8  
     9  	"github.com/davecgh/go-spew/spew"
    10  )
    11  
    12  // TestReadUpgradeStateV1toV3 tests the state upgrade process from the V1 state
    13  // to the current version, and needs editing each time. This means it tests the
    14  // entire pipeline of upgrades (which migrate version to version).
    15  func TestReadUpgradeStateV1toV3(t *testing.T) {
    16  	// ReadState should transparently detect the old version but will upgrade
    17  	// it on Write.
    18  	actual, err := ReadState(strings.NewReader(testV1State))
    19  	if err != nil {
    20  		t.Fatalf("err: %s", err)
    21  	}
    22  
    23  	buf := new(bytes.Buffer)
    24  	if err := WriteState(actual, buf); err != nil {
    25  		t.Fatalf("err: %s", err)
    26  	}
    27  
    28  	if actual.Version != 3 {
    29  		t.Fatalf("bad: State version not incremented; is %d", actual.Version)
    30  	}
    31  
    32  	roundTripped, err := ReadState(buf)
    33  	if err != nil {
    34  		t.Fatalf("err: %s", err)
    35  	}
    36  
    37  	if !reflect.DeepEqual(actual, roundTripped) {
    38  		t.Fatalf("bad: %#v", actual)
    39  	}
    40  }
    41  
    42  func TestReadUpgradeStateV1toV3_outputs(t *testing.T) {
    43  	// ReadState should transparently detect the old version but will upgrade
    44  	// it on Write.
    45  	actual, err := ReadState(strings.NewReader(testV1StateWithOutputs))
    46  	if err != nil {
    47  		t.Fatalf("err: %s", err)
    48  	}
    49  
    50  	buf := new(bytes.Buffer)
    51  	if err := WriteState(actual, buf); err != nil {
    52  		t.Fatalf("err: %s", err)
    53  	}
    54  
    55  	if actual.Version != 3 {
    56  		t.Fatalf("bad: State version not incremented; is %d", actual.Version)
    57  	}
    58  
    59  	roundTripped, err := ReadState(buf)
    60  	if err != nil {
    61  		t.Fatalf("err: %s", err)
    62  	}
    63  
    64  	if !reflect.DeepEqual(actual, roundTripped) {
    65  		spew.Config.DisableMethods = true
    66  		t.Fatalf("bad:\n%s\n\nround tripped:\n%s\n", spew.Sdump(actual), spew.Sdump(roundTripped))
    67  		spew.Config.DisableMethods = false
    68  	}
    69  }
    70  
    71  const testV1State = `{
    72      "version": 1,
    73      "serial": 9,
    74      "remote": {
    75          "type": "http",
    76          "config": {
    77              "url": "http://my-cool-server.com/"
    78          }
    79      },
    80      "modules": [
    81          {
    82              "path": [
    83                  "root"
    84              ],
    85              "outputs": null,
    86              "resources": {
    87                  "foo": {
    88                      "type": "",
    89                      "primary": {
    90                          "id": "bar"
    91                      }
    92                  }
    93              },
    94              "depends_on": [
    95                  "aws_instance.bar"
    96              ]
    97          }
    98      ]
    99  }
   100  `
   101  
   102  const testV1StateWithOutputs = `{
   103      "version": 1,
   104      "serial": 9,
   105      "remote": {
   106          "type": "http",
   107          "config": {
   108              "url": "http://my-cool-server.com/"
   109          }
   110      },
   111      "modules": [
   112          {
   113              "path": [
   114                  "root"
   115              ],
   116              "outputs": {
   117              	"foo": "bar",
   118              	"baz": "foo"
   119              },
   120              "resources": {
   121                  "foo": {
   122                      "type": "",
   123                      "primary": {
   124                          "id": "bar"
   125                      }
   126                  }
   127              },
   128              "depends_on": [
   129                  "aws_instance.bar"
   130              ]
   131          }
   132      ]
   133  }
   134  `