Refactor storage test to use new package
diff --git a/acceptance/openstack/compute/test.go b/acceptance/openstack/compute/test.go
deleted file mode 100644
index f03c0f9..0000000
--- a/acceptance/openstack/compute/test.go
+++ /dev/null
@@ -1,368 +0,0 @@
-// +build acceptance
-
-package openstack
-
-import (
-	"fmt"
-	"github.com/rackspace/gophercloud/openstack/compute/flavors"
-	"github.com/rackspace/gophercloud/openstack/compute/images"
-	"github.com/rackspace/gophercloud/openstack/compute/servers"
-	"os"
-	"testing"
-)
-
-var service = "compute"
-
-func TestListServers(t *testing.T) {
-	ts, err := setupForList(service)
-	if err != nil {
-		t.Error(err)
-		return
-	}
-
-	fmt.Fprintln(ts.w, "ID\tRegion\tName\tStatus\tIPv4\tIPv6\t")
-
-	region := os.Getenv("OS_REGION_NAME")
-	n := 0
-	for _, ep := range ts.eps {
-		if (region != "") && (region != ep.Region) {
-			continue
-		}
-
-		client := servers.NewClient(ep.PublicURL, ts.a, ts.o)
-
-		listResults, err := servers.List(client)
-		if err != nil {
-			t.Error(err)
-			return
-		}
-
-		svrs, err := servers.GetServers(listResults)
-		if err != nil {
-			t.Error(err)
-			return
-		}
-
-		n = n + len(svrs)
-
-		for _, s := range svrs {
-			fmt.Fprintf(ts.w, "%s\t%s\t%s\t%s\t%s\t%s\t\n", s.Id, s.Name, ep.Region, s.Status, s.AccessIPv4, s.AccessIPv6)
-		}
-	}
-	ts.w.Flush()
-	fmt.Printf("--------\n%d servers listed.\n", n)
-}
-
-func TestListImages(t *testing.T) {
-	ts, err := setupForList(service)
-	if err != nil {
-		t.Error(err)
-		return
-	}
-
-	fmt.Fprintln(ts.w, "ID\tRegion\tName\tStatus\tCreated\t")
-
-	region := os.Getenv("OS_REGION_NAME")
-	n := 0
-	for _, ep := range ts.eps {
-		if (region != "") && (region != ep.Region) {
-			continue
-		}
-
-		client := images.NewClient(ep.PublicURL, ts.a, ts.o)
-
-		listResults, err := images.List(client)
-		if err != nil {
-			t.Error(err)
-			return
-		}
-
-		imgs, err := images.GetImages(listResults)
-		if err != nil {
-			t.Error(err)
-			return
-		}
-
-		n = n + len(imgs)
-
-		for _, i := range imgs {
-			fmt.Fprintf(ts.w, "%s\t%s\t%s\t%s\t%s\t\n", i.Id, ep.Region, i.Name, i.Status, i.Created)
-		}
-	}
-	ts.w.Flush()
-	fmt.Printf("--------\n%d images listed.\n", n)
-}
-
-func TestListFlavors(t *testing.T) {
-	ts, err := setupForList(service)
-	if err != nil {
-		t.Error(err)
-		return
-	}
-
-	fmt.Fprintln(ts.w, "ID\tRegion\tName\tRAM\tDisk\tVCPUs\t")
-
-	region := os.Getenv("OS_REGION_NAME")
-	n := 0
-	for _, ep := range ts.eps {
-		if (region != "") && (region != ep.Region) {
-			continue
-		}
-
-		client := flavors.NewClient(ep.PublicURL, ts.a, ts.o)
-
-		listResults, err := flavors.List(client, flavors.ListFilterOptions{})
-		if err != nil {
-			t.Error(err)
-			return
-		}
-
-		flavs, err := flavors.GetFlavors(listResults)
-		if err != nil {
-			t.Error(err)
-			return
-		}
-
-		n = n + len(flavs)
-
-		for _, f := range flavs {
-			fmt.Fprintf(ts.w, "%s\t%s\t%s\t%d\t%d\t%d\t\n", f.Id, ep.Region, f.Name, f.Ram, f.Disk, f.VCpus)
-		}
-	}
-	ts.w.Flush()
-	fmt.Printf("--------\n%d flavors listed.\n", n)
-}
-
-func TestGetFlavor(t *testing.T) {
-	ts, err := setupForCRUD()
-	if err != nil {
-		t.Fatal(err)
-	}
-
-	region := os.Getenv("OS_REGION_NAME")
-	for _, ep := range ts.eps {
-		if (region != "") && (region != ep.Region) {
-			continue
-		}
-		client := flavors.NewClient(ep.PublicURL, ts.a, ts.o)
-
-		getResults, err := flavors.Get(client, ts.flavorId)
-		if err != nil {
-			t.Fatal(err)
-		}
-		flav, err := flavors.GetFlavor(getResults)
-		if err != nil {
-			t.Fatal(err)
-		}
-		fmt.Printf("%#v\n", flav)
-	}
-}
-
-func TestCreateDestroyServer(t *testing.T) {
-	ts, err := setupForCRUD()
-	if err != nil {
-		t.Error(err)
-		return
-	}
-
-	err = createServer(ts)
-	if err != nil {
-		t.Error(err)
-		return
-	}
-
-	// We put this in a defer so that it gets executed even in the face of errors or panics.
-	defer func() {
-		servers.Delete(ts.client, ts.createdServer.Id)
-	}()
-
-	err = waitForStatus(ts, "ACTIVE")
-	if err != nil {
-		t.Error(err)
-	}
-}
-
-func TestUpdateServer(t *testing.T) {
-	ts, err := setupForCRUD()
-	if err != nil {
-		t.Error(err)
-		return
-	}
-
-	err = createServer(ts)
-	if err != nil {
-		t.Error(err)
-		return
-	}
-
-	defer func() {
-		servers.Delete(ts.client, ts.createdServer.Id)
-	}()
-
-	err = waitForStatus(ts, "ACTIVE")
-	if err != nil {
-		t.Error(err)
-		return
-	}
-
-	err = changeServerName(ts)
-	if err != nil {
-		t.Error(err)
-		return
-	}
-}
-
-func TestActionChangeAdminPassword(t *testing.T) {
-	t.Parallel()
-
-	ts, err := setupForCRUD()
-	if err != nil {
-		t.Fatal(err)
-	}
-
-	err = createServer(ts)
-	if err != nil {
-		t.Fatal(err)
-	}
-
-	defer func(){
-		servers.Delete(ts.client, ts.createdServer.Id)
-	}()
-
-	err = waitForStatus(ts, "ACTIVE")
-	if err != nil {
-		t.Fatal(err)
-	}
-
-	err = changeAdminPassword(ts)
-	if err != nil {
-		t.Fatal(err)
-	}
-}
-
-func TestActionReboot(t *testing.T) {
-	t.Parallel()
-
-	ts, err := setupForCRUD()
-	if err != nil {
-		t.Fatal(err)
-	}
-
-	err = createServer(ts)
-	if err != nil {
-		t.Fatal(err)
-	}
-
-	defer func(){
-		servers.Delete(ts.client, ts.createdServer.Id)
-	}()
-
-	err = waitForStatus(ts, "ACTIVE")
-	if err != nil {
-		t.Fatal(err)
-	}
-
-	err = servers.Reboot(ts.client, ts.createdServer.Id, "aldhjflaskhjf")
-	if err == nil {
-		t.Fatal("Expected the SDK to provide an ArgumentError here")
-	}
-
-	err = rebootServer(ts)
-	if err != nil {
-		t.Fatal(err)
-	}
-}
-
-func TestActionRebuild(t *testing.T) {
-	t.Parallel()
-
-	ts, err := setupForCRUD()
-	if err != nil {
-		t.Fatal(err)
-	}
-
-	err = createServer(ts)
-	if err != nil {
-		t.Fatal(err)
-	}
-
-	defer func(){
-		servers.Delete(ts.client, ts.createdServer.Id)
-	}()
-
-	err = waitForStatus(ts, "ACTIVE")
-	if err != nil {
-		t.Fatal(err)
-	}
-
-	err = rebuildServer(ts)
-	if err != nil {
-		t.Fatal(err)
-	}
-}
-
-func TestActionResizeConfirm(t *testing.T) {
-	t.Parallel()
-	
-	ts, err := setupForCRUD()
-	if err != nil {
-		t.Fatal(err)
-	}
-	
-	err = createServer(ts)
-	if err != nil {
-		t.Fatal(err)
-	}
-	
-	defer func(){
-		servers.Delete(ts.client, ts.createdServer.Id)
-	}()
-	
-	err = waitForStatus(ts, "ACTIVE")
-	if err != nil {
-		t.Fatal(err)
-	}
-	
-	err = resizeServer(ts)
-	if err != nil {
-		t.Fatal(err)
-	}
-	
-	err = confirmResize(ts)
-	if err != nil {
-		t.Fatal(err)
-	}
-}
-
-func TestActionResizeRevert(t *testing.T) {
-	t.Parallel()
-	
-	ts, err := setupForCRUD()
-	if err != nil {
-		t.Fatal(err)
-	}
-	
-	err = createServer(ts)
-	if err != nil {
-		t.Fatal(err)
-	}
-	
-	defer func(){
-		servers.Delete(ts.client, ts.createdServer.Id)
-	}()
-	
-	err = waitForStatus(ts, "ACTIVE")
-	if err != nil {
-		t.Fatal(err)
-	}
-	
-	err = resizeServer(ts)
-	if err != nil {
-		t.Fatal(err)
-	}
-	
-	err = revertResize(ts)
-	if err != nil {
-		t.Fatal(err)
-	}
-}
diff --git a/acceptance/openstack/storage_test.go b/acceptance/openstack/storage_test.go
index d194936..9792335 100644
--- a/acceptance/openstack/storage_test.go
+++ b/acceptance/openstack/storage_test.go
@@ -11,6 +11,7 @@
 	"os"
 	"strings"
 	"testing"
+	"github.com/rackspace/gophercloud/acceptance/tools"
 )
 
 var objectStorage = "object-store"
@@ -19,19 +20,19 @@
 var numObjects = 2
 
 func TestAccount(t *testing.T) {
-	ts, err := setupForList(objectStorage)
+	ts, err := tools.SetupForList(objectStorage)
 	if err != nil {
 		t.Error(err)
 		return
 	}
 
 	region := os.Getenv("OS_REGION_NAME")
-	for _, ep := range ts.eps {
+	for _, ep := range ts.EPs {
 		if (region != "") && (region != ep.Region) {
 			continue
 		}
 
-		client := storage.NewClient(ep.PublicURL, ts.a, ts.o)
+		client := storage.NewClient(ep.PublicURL, ts.A, ts.O)
 
 		err := accounts.Update(client, accounts.UpdateOpts{
 			Metadata: metadata,
@@ -70,23 +71,23 @@
 }
 
 func TestContainers(t *testing.T) {
-	ts, err := setupForList(objectStorage)
+	ts, err := tools.SetupForList(objectStorage)
 	if err != nil {
 		t.Error(err)
 		return
 	}
 
 	region := os.Getenv("OS_REGION_NAME")
-	for _, ep := range ts.eps {
+	for _, ep := range ts.EPs {
 		if (region != "") && (region != ep.Region) {
 			continue
 		}
 
-		client := storage.NewClient(ep.PublicURL, ts.a, ts.o)
+		client := storage.NewClient(ep.PublicURL, ts.A, ts.O)
 
 		cNames := make([]string, numContainers)
 		for i := 0; i < numContainers; i++ {
-			cNames[i] = randomString("test-container-", 8)
+			cNames[i] = tools.RandomString("test-container-", 8)
 		}
 
 		for i := 0; i < len(cNames); i++ {
@@ -183,7 +184,7 @@
 }
 
 func TestObjects(t *testing.T) {
-	ts, err := setupForList(objectStorage)
+	ts, err := tools.SetupForList(objectStorage)
 	if err != nil {
 		t.Error(err)
 		return
@@ -191,19 +192,19 @@
 
 	region := os.Getenv("OS_REGION_NAME")
 
-	for _, ep := range ts.eps {
+	for _, ep := range ts.EPs {
 		if (region != "") && (region != ep.Region) {
 			continue
 		}
 
-		client := storage.NewClient(ep.PublicURL, ts.a, ts.o)
+		client := storage.NewClient(ep.PublicURL, ts.A, ts.O)
 
 		oNames := make([]string, numObjects)
 		for i := 0; i < len(oNames); i++ {
-			oNames[i] = randomString("test-object-", 8)
+			oNames[i] = tools.RandomString("test-object-", 8)
 		}
 
-		cName := randomString("test-container-", 8)
+		cName := tools.RandomString("test-container-", 8)
 		_, err := containers.Create(client, containers.CreateOpts{
 			Name: cName,
 		})
@@ -223,7 +224,7 @@
 
 		oContents := make([]*bytes.Buffer, numObjects)
 		for i := 0; i < numObjects; i++ {
-			oContents[i] = bytes.NewBuffer([]byte(randomString("", 10)))
+			oContents[i] = bytes.NewBuffer([]byte(tools.RandomString("", 10)))
 			err = objects.Create(client, objects.CreateOpts{
 				Container: cName,
 				Name:      oNames[i],
diff --git a/acceptance/openstack/tools_test.go b/acceptance/openstack/tools_test.go
deleted file mode 100644
index 042ab34..0000000
--- a/acceptance/openstack/tools_test.go
+++ /dev/null
@@ -1,364 +0,0 @@
-// +build acceptance
-
-package openstack
-
-import (
-	"crypto/rand"
-	"fmt"
-	"github.com/rackspace/gophercloud/openstack/compute/servers"
-	"github.com/rackspace/gophercloud/openstack/identity"
-	"github.com/rackspace/gophercloud/openstack/utils"
-	"os"
-	"text/tabwriter"
-	"time"
-)
-
-var errTimeout = fmt.Errorf("Timeout.")
-
-type testState struct {
-	o             identity.AuthOptions
-	a             identity.AuthResults
-	sc            *identity.ServiceCatalog
-	eps           []identity.Endpoint
-	w             *tabwriter.Writer
-	imageId       string
-	flavorId      string
-	region        string
-	ep            string
-	client        *servers.Client
-	createdServer *servers.Server
-	gottenServer  *servers.Server
-	updatedServer *servers.Server
-	serverName    string
-	alternateName string
-	flavorIdResize string
-}
-
-func setupForList(service string) (*testState, error) {
-	var err error
-
-	ts := new(testState)
-
-	ts.o, err = utils.AuthOptions()
-	if err != nil {
-		return ts, err
-	}
-
-	ts.a, err = identity.Authenticate(ts.o)
-	if err != nil {
-		return ts, err
-	}
-
-	ts.sc, err = identity.GetServiceCatalog(ts.a)
-	if err != nil {
-		return ts, err
-	}
-
-	ts.eps, err = findAllEndpoints(ts.sc, service)
-	if err != nil {
-		return ts, err
-	}
-
-	ts.w = new(tabwriter.Writer)
-	ts.w.Init(os.Stdout, 2, 8, 2, ' ', 0)
-
-	return ts, nil
-}
-
-func setupForCRUD() (*testState, error) {
-	ts, err := setupForList("compute")
-	if err != nil {
-		return ts, err
-	}
-
-	ts.imageId = os.Getenv("OS_IMAGE_ID")
-	if ts.imageId == "" {
-		return ts, fmt.Errorf("Expected OS_IMAGE_ID environment variable to be set")
-	}
-
-	ts.flavorId = os.Getenv("OS_FLAVOR_ID")
-	if ts.flavorId == "" {
-		return ts, fmt.Errorf("Expected OS_FLAVOR_ID environment variable to be set")
-	}
-
-	ts.flavorIdResize = os.Getenv("OS_FLAVOR_ID_RESIZE")
-	if ts.flavorIdResize == "" {
-		return ts, fmt.Errorf("Expected OS_FLAVOR_ID_RESIZE environment variable to be set")
-	}
-
-	if ts.flavorIdResize == ts.flavorId {
-		return ts, fmt.Errorf("OS_FLAVOR_ID and OS_FLAVOR_ID_RESIZE cannot be the same")
-	}
-
-	ts.region = os.Getenv("OS_REGION_NAME")
-	if ts.region == "" {
-		ts.region = ts.eps[0].Region
-	}
-
-	ts.ep, err = findEndpointForRegion(ts.eps, ts.region)
-	if err != nil {
-		return ts, err
-	}
-
-	return ts, err
-}
-
-func findAllEndpoints(sc *identity.ServiceCatalog, service string) ([]identity.Endpoint, error) {
-	ces, err := sc.CatalogEntries()
-	if err != nil {
-		return nil, err
-	}
-
-	for _, ce := range ces {
-		if ce.Type == service {
-			return ce.Endpoints, nil
-		}
-	}
-
-	return nil, fmt.Errorf(service + " endpoint not found.")
-}
-
-func findEndpointForRegion(eps []identity.Endpoint, r string) (string, error) {
-	for _, ep := range eps {
-		if ep.Region == r {
-			return ep.PublicURL, nil
-		}
-	}
-	return "", fmt.Errorf("Unknown region %s", r)
-}
-
-func countDown(ts *testState, timeout int) (bool, int, error) {
-	if timeout < 1 {
-		return false, 0, errTimeout
-	}
-	time.Sleep(1 * time.Second)
-	timeout--
-
-	gr, err := servers.GetDetail(ts.client, ts.createdServer.Id)
-	if err != nil {
-		return false, timeout, err
-	}
-
-	ts.gottenServer, err = servers.GetServer(gr)
-	if err != nil {
-		return false, timeout, err
-	}
-
-	return true, timeout, nil
-}
-
-func createServer(ts *testState) error {
-	ts.serverName = randomString("ACPTTEST", 16)
-	fmt.Printf("Attempting to create server: %s\n", ts.serverName)
-
-	ts.client = servers.NewClient(ts.ep, ts.a, ts.o)
-
-	cr, err := servers.Create(ts.client, map[string]interface{}{
-		"flavorRef": ts.flavorId,
-		"imageRef":  ts.imageId,
-		"name":      ts.serverName,
-	})
-	if err != nil {
-		return err
-	}
-
-	ts.createdServer, err = servers.GetServer(cr)
-	return err
-}
-
-func waitForStatus(ts *testState, s string) error {
-	var (
-		inProgress bool
-		timeout    int
-		err        error
-	)
-
-	for inProgress, timeout, err = countDown(ts, 300); inProgress; inProgress, timeout, err = countDown(ts, timeout) {
-		if ts.gottenServer.Id != ts.createdServer.Id {
-			return fmt.Errorf("created server id (%s) != gotten server id (%s)", ts.createdServer.Id, ts.gottenServer.Id)
-		}
-
-		if ts.gottenServer.Status == s {
-			fmt.Printf("Server reached state %s after %d seconds (approximately)\n", s, 300-timeout)
-			break
-		}
-	}
-
-	if err == errTimeout {
-		fmt.Printf("Time out -- I'm not waiting around.\n")
-		err = nil
-	}
-
-	return err
-}
-
-func changeServerName(ts *testState) error {
-	var (
-		inProgress bool
-		timeout    int
-	)
-
-	ts.alternateName = randomString("ACPTTEST", 16)
-	for ts.alternateName == ts.serverName {
-		ts.alternateName = randomString("ACPTTEST", 16)
-	}
-	fmt.Println("Attempting to change server name")
-
-	ur, err := servers.Update(ts.client, ts.createdServer.Id, map[string]interface{}{
-		"name": ts.alternateName,
-	})
-	if err != nil {
-		return err
-	}
-
-	ts.updatedServer, err = servers.GetServer(ur)
-	if err != nil {
-		return err
-	}
-
-	if ts.updatedServer.Id != ts.createdServer.Id {
-		return fmt.Errorf("Expected updated and created server to share the same ID")
-	}
-
-	for inProgress, timeout, err = countDown(ts, 300); inProgress; inProgress, timeout, err = countDown(ts, timeout) {
-		if ts.gottenServer.Id != ts.updatedServer.Id {
-			return fmt.Errorf("Updated server ID (%s) != gotten server ID (%s)", ts.updatedServer.Id, ts.gottenServer.Id)
-		}
-
-		if ts.gottenServer.Name == ts.alternateName {
-			fmt.Printf("Server updated after %d seconds (approximately)\n", 300-timeout)
-			break
-		}
-	}
-
-	if err == errTimeout {
-		fmt.Printf("I'm not waiting around.\n")
-		err = nil
-	}
-
-	return err
-}
-
-func makeNewPassword(oldPass string) string {
-	fmt.Println("Current password: "+oldPass)
-	randomPassword := randomString("", 16)
-	for randomPassword == oldPass {
-		randomPassword = randomString("", 16)
-	}
-	fmt.Println("    New password: "+randomPassword)
-	return randomPassword
-}
-
-func changeAdminPassword(ts *testState) error {
-	randomPassword := makeNewPassword(ts.createdServer.AdminPass)
-	
-	err := servers.ChangeAdminPassword(ts.client, ts.createdServer.Id, randomPassword)
-	if err != nil {
-		return err
-	}
-	
-	err = waitForStatus(ts, "PASSWORD")
-	if err != nil {
-		return err
-	}
-	
-	return waitForStatus(ts, "ACTIVE")
-}
-
-func rebootServer(ts *testState) error {
-	fmt.Println("Attempting reboot of server "+ts.createdServer.Id)
-	err := servers.Reboot(ts.client, ts.createdServer.Id, servers.OSReboot)
-	if err != nil {
-		return err
-	}
-	
-	err = waitForStatus(ts, "REBOOT")
-	if err != nil {
-		return err
-	}
-	
-	return waitForStatus(ts, "ACTIVE")
-}
-
-func rebuildServer(ts *testState) error {
-	fmt.Println("Attempting to rebuild server "+ts.createdServer.Id)
-
-	newPassword := makeNewPassword(ts.createdServer.AdminPass)
-	newName := randomString("ACPTTEST", 16)
-	sr, err := servers.Rebuild(ts.client, ts.createdServer.Id, newName, newPassword, ts.imageId, nil)
-	if err != nil {
-		return err
-	}
-	
-	s, err := servers.GetServer(sr)
-	if err != nil {
-		return err
-	}
-	if s.Id != ts.createdServer.Id {
-		return fmt.Errorf("Expected rebuilt server ID of %s; got %s", ts.createdServer.Id, s.Id)
-	}
-
-	err = waitForStatus(ts, "REBUILD")
-	if err != nil {
-		return err
-	}
-	
-	return waitForStatus(ts, "ACTIVE")
-}
-
-func resizeServer(ts *testState) error {
-	fmt.Println("Attempting to resize server "+ts.createdServer.Id)
-
-	err := servers.Resize(ts.client, ts.createdServer.Id, ts.flavorIdResize)
-	if err != nil {
-		return err
-	}
-
-	err = waitForStatus(ts, "RESIZE")
-	if err != nil {
-		return err
-	}
-
-	return waitForStatus(ts, "VERIFY_RESIZE")
-}
-
-func confirmResize(ts *testState) error {
-	fmt.Println("Attempting to confirm resize for server "+ts.createdServer.Id)
-	
-	err := servers.ConfirmResize(ts.client, ts.createdServer.Id)
-	if err != nil {
-		return err
-	}
-	
-	return waitForStatus(ts, "ACTIVE")
-}
-
-func revertResize(ts *testState) error {
-	fmt.Println("Attempting to revert resize for server "+ts.createdServer.Id)
-	
-	err := servers.RevertResize(ts.client, ts.createdServer.Id)
-	if err != nil {
-		return err
-	}
-
-	err = waitForStatus(ts, "REVERT_RESIZE")
-	if err != nil {
-		return err
-	}
-
-	return waitForStatus(ts, "ACTIVE")
-}
-
-// randomString generates a string of given length, but random content.
-// All content will be within the ASCII graphic character set.
-// (Implementation from Even Shaw's contribution on
-// http://stackoverflow.com/questions/12771930/what-is-the-fastest-way-to-generate-a-long-random-string-in-go).
-func randomString(prefix string, n int) string {
-	const alphanum = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
-	var bytes = make([]byte, n)
-	rand.Read(bytes)
-	for i, b := range bytes {
-		bytes[i] = alphanum[b%byte(len(alphanum))]
-	}
-	return prefix + string(bytes)
-}