|
- 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)
- }
|