diff options
Diffstat (limited to 'vendor/github.com/goamz/goamz/dynamodb/dynamodb_test.go')
-rwxr-xr-x | vendor/github.com/goamz/goamz/dynamodb/dynamodb_test.go | 166 |
1 files changed, 166 insertions, 0 deletions
diff --git a/vendor/github.com/goamz/goamz/dynamodb/dynamodb_test.go b/vendor/github.com/goamz/goamz/dynamodb/dynamodb_test.go new file mode 100755 index 000000000..63dd03da3 --- /dev/null +++ b/vendor/github.com/goamz/goamz/dynamodb/dynamodb_test.go @@ -0,0 +1,166 @@ +package dynamodb_test + +import ( + "flag" + "testing" + "time" + + "github.com/goamz/goamz/aws" + "github.com/goamz/goamz/dynamodb" + . "gopkg.in/check.v1" +) + +const TIMEOUT = 3 * time.Minute + +var amazon = flag.Bool("amazon", false, "Enable tests against dynamodb") +var local = flag.Bool("local", true, "Use DynamoDB local on 8080 instead of real server on us-east.") + +var dynamodb_region aws.Region +var dynamodb_auth aws.Auth + +type DynamoDBTest struct { + server *dynamodb.Server + aws.Region // Exports Region + TableDescriptionT dynamodb.TableDescriptionT + table *dynamodb.Table +} + +// Delete all items in the table +func (s *DynamoDBTest) TearDownTest(c *C) { + pk, err := s.TableDescriptionT.BuildPrimaryKey() + if err != nil { + c.Fatal(err) + } + + attrs, err := s.table.Scan(nil) + if err != nil { + c.Fatal(err) + } + for _, a := range attrs { + key := &dynamodb.Key{ + HashKey: a[pk.KeyAttribute.Name].Value, + } + if pk.HasRange() { + key.RangeKey = a[pk.RangeAttribute.Name].Value + } + if ok, err := s.table.DeleteItem(key); !ok { + c.Fatal(err) + } + } +} + +func (s *DynamoDBTest) TearDownSuite(c *C) { + // return immediately in the case of calling c.Skip() in SetUpSuite() + if s.server == nil { + return + } + + // check whether the table exists + if tables, err := s.server.ListTables(); err != nil { + c.Fatal(err) + } else { + if !findTableByName(tables, s.TableDescriptionT.TableName) { + return + } + } + + // Delete the table and wait + if _, err := s.server.DeleteTable(s.TableDescriptionT); err != nil { + c.Fatal(err) + } + + done := make(chan bool) + timeout := time.After(TIMEOUT) + go func() { + for { + select { + case <-done: + return + default: + tables, err := s.server.ListTables() + if err != nil { + c.Fatal(err) + } + if findTableByName(tables, s.TableDescriptionT.TableName) { + time.Sleep(5 * time.Second) + } else { + done <- true + return + } + } + } + }() + select { + case <-done: + break + case <-timeout: + c.Error("Expect the table to be deleted but timed out") + close(done) + } +} + +func (s *DynamoDBTest) WaitUntilStatus(c *C, status string) { + // We should wait until the table is in specified status because a real DynamoDB has some delay for ready + done := make(chan bool) + timeout := time.After(TIMEOUT) + go func() { + for { + select { + case <-done: + return + default: + desc, err := s.table.DescribeTable() + if err != nil { + c.Fatal(err) + } + if desc.TableStatus == status { + done <- true + return + } + time.Sleep(5 * time.Second) + } + } + }() + select { + case <-done: + break + case <-timeout: + c.Errorf("Expect a status to be %s, but timed out", status) + close(done) + } +} + +func setUpAuth(c *C) { + if !*amazon { + c.Skip("Test against amazon not enabled.") + } + if *local { + c.Log("Using local server") + dynamodb_region = aws.Region{ + DynamoDBEndpoint: "http://127.0.0.1:8000", + DynamoDBStreamsEndpoint: "http://127.0.0.1:8000", + } + dynamodb_auth = aws.Auth{AccessKey: "DUMMY_KEY", SecretKey: "DUMMY_SECRET"} + } else { + c.Log("Using REAL AMAZON SERVER") + dynamodb_region = aws.USEast + auth, err := aws.EnvAuth() + if err != nil { + c.Fatal(err) + } + dynamodb_auth = auth + } +} + +func findTableByName(tables []string, name string) bool { + for _, t := range tables { + if t == name { + return true + } + } + return false +} + +func Test(t *testing.T) { + TestingT(t) +} |