Skip to content

Commit

Permalink
tests: template google_compute_addresses
Browse files Browse the repository at this point in the history
  • Loading branch information
xabufr committed Oct 5, 2022
1 parent 06a378f commit e0101eb
Showing 1 changed file with 76 additions and 103 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@ package google

import (
"fmt"
"strings"
"testing"

"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
Expand Down Expand Up @@ -38,111 +37,17 @@ func TestAccDataSourceComputeAddresses(t *testing.T) {

func testAccDataSourceComputeAddressesAllRegionsCheck(t *testing.T, address_name string, data_source_name string, expected_region string, expected_region_bis string) resource.TestCheckFunc {
return func(s *terraform.State) error {
ds, ok := s.RootModule().Resources[data_source_name]
if !ok {
return fmt.Errorf("root module has no resource called %s", data_source_name)
}

ds_attr := ds.Primary.Attributes
expected_addresses := buildAddressesList(3, address_name, expected_region)
expected_addresses = append(expected_addresses, buildAddressesList(3, address_name, expected_region_bis)...)

if ds_attr["addresses.#"] != "6" {
return fmt.Errorf("addresses.# is not equal to 6")
}

var expected_addresses []expectedAddress
for i := 0; i < 3; i++ {
expected_addresses = append(expected_addresses, expectedAddress{
name: fmt.Sprintf("%s-%s-%d", address_name, expected_region, i),
region: expected_region,
})
}
for i := 0; i < 3; i++ {
expected_addresses = append(expected_addresses, expectedAddress{
name: fmt.Sprintf("%s-%s-%d", address_name, expected_region_bis, i),
region: expected_region_bis,
})
}

for address_index := 0; address_index < 6; address_index++ {
has_match := false
for j := 0; j < len(expected_addresses); j++ {
match, err := expected_addresses[j].checkAddressMatch(address_index, ds_attr)
if err != nil {
return err
} else {
if match {
has_match = true
expected_addresses = removeExpectedAddress(expected_addresses, j)
break
}
}
}
if !has_match {
return fmt.Errorf("unexpected address at index %d", address_index) // TODO improve
}
}

if len(expected_addresses) != 0 {
return fmt.Errorf("Addresses not found: %+v", expected_addresses)
}

return nil
return testDataSourceAdressContains(s, data_source_name, expected_addresses)
}
}

func removeExpectedAddress(s []expectedAddress, i int) []expectedAddress {
s[i] = s[len(s)-1]
return s[:len(s)-1]
}

func testAccDataSourceComputeAddressesRegionSpecificCheck(t *testing.T, address_name string, data_source_name string, expected_region string) resource.TestCheckFunc {
return func(s *terraform.State) error {
ds, ok := s.RootModule().Resources[data_source_name]
if !ok {
return fmt.Errorf("root module has no resource called %s", data_source_name)
}

ds_attr := ds.Primary.Attributes

if ds_attr["addresses.#"] != "3" {
return fmt.Errorf("addresses.# is not equal to 3")
}

for n := 0; n < 3; n++ {
map_key := fmt.Sprintf("addresses.%d.name", n)
address_prefix := fmt.Sprintf("%s-%s", address_name, expected_region)

if !strings.HasPrefix(ds_attr[map_key], address_prefix) {
return fmt.Errorf("%s dont start with %s, got %s", map_key, address_name, ds_attr[map_key])
}
}

for n := 0; n < 3; n++ {
address_name := ds_attr[fmt.Sprintf("addresses.%d.name", n)]
map_key := fmt.Sprintf("addresses.%d.labels.mykey", n)

v, found := ds_attr[map_key]
if !found {
return fmt.Errorf("label with key 'mykey' not found for %s", address_name)
}

if v != "myvalue" {
return fmt.Errorf("label value of 'mykey' not equal to 'myvalue' for %s, got %s", address_name, v)
}
}

for n := 0; n < 3; n++ {
map_key := fmt.Sprintf("addresses.%d.region", n)
region, found := ds_attr[map_key]
if !found {
return fmt.Errorf("%s doesn't exists", map_key)
}
if region != expected_region {
return fmt.Errorf("Unexpected region: got %s expected %s", region, expected_region)
}
}

return nil
expected_addresses := buildAddressesList(3, address_name, expected_region)
return testDataSourceAdressContains(s, data_source_name, expected_addresses)
}
}

Expand Down Expand Up @@ -179,6 +84,7 @@ data "google_compute_addresses" "regional_addresses" {
depends_on = [google_compute_address.address]
region = local.region
}

data "google_compute_addresses" "all_addresses" {
filter = "name:${local.address_name}-*"
depends_on = [google_compute_address.address, google_compute_address.address_region_bis]
Expand All @@ -193,19 +99,86 @@ type expectedAddress struct {

func (r expectedAddress) checkAddressMatch(index int, attrs map[string]string) (bool, error) {
map_name := fmt.Sprintf("addresses.%d.name", index)
address_name := attrs[map_name]

if !strings.HasPrefix(attrs[map_name], r.name) {
if address_name != r.name {
return false, nil
}

map_region := fmt.Sprintf("addresses.%d.region", index)
region, found := attrs[map_region]
if !found {
return true, fmt.Errorf("%s doesn't exists", map_region)
return false, fmt.Errorf("%s doesn't exists", map_region)
}
if region != r.region {
return true, fmt.Errorf("Unexpected region: got %s expected %s", region, r.region)
return false, fmt.Errorf("Unexpected region: got %s expected %s", region, r.region)
}

<% unless version == 'ga' -%>
map_label := fmt.Sprintf("addresses.%d.labels.mykey", index)
label_value, found := attrs[map_label]
if !found {
return false, fmt.Errorf("label with key 'mykey' not found for %s", address_name)
}
if label_value != "myvalue" {
return false, fmt.Errorf("label value of 'mykey' not equal to 'myvalue' for %s, got %s", address_name, label_value)
}
<% end -%>

return true, nil
}

func testDataSourceAdressContains(state *terraform.State, data_source_name string, addresses []expectedAddress) error {
ds, ok := state.RootModule().Resources[data_source_name]
if !ok {
return fmt.Errorf("root module has no resource called %s", data_source_name)
}

ds_attr := ds.Primary.Attributes

addresses_length := len(addresses)

if ds_attr["addresses.#"] != fmt.Sprintf("%d", addresses_length) {
return fmt.Errorf("addresses.# is not equal to %d", addresses_length)
}

for address_index := 0; address_index < addresses_length; address_index++ {
has_match := false
for j := 0; j < len(addresses); j++ {
match, err := addresses[j].checkAddressMatch(address_index, ds_attr)
if err != nil {
return err
} else {
if match {
has_match = true
addresses = removeExpectedAddress(addresses, j)
break
}
}
}
if !has_match {
return fmt.Errorf("unexpected address at index %d", address_index) // TODO improve
}
}

if len(addresses) != 0 {
return fmt.Errorf("%+v not found in data source", addresses)
}
return nil
}

func buildAddressesList(numberofAddresses int, addressName string, region string) []expectedAddress {
var addresses []expectedAddress
for i := 0; i < numberofAddresses; i++ {
addresses = append(addresses, expectedAddress{
name: fmt.Sprintf("%s-%s-%d", addressName, region, i),
region: region,
})
}
return addresses
}

func removeExpectedAddress(s []expectedAddress, i int) []expectedAddress {
s[i] = s[len(s)-1]
return s[:len(s)-1]
}

0 comments on commit e0101eb

Please sign in to comment.