objects unit tests
diff --git a/openstack/storage/v1/objects/objects_test.go b/openstack/storage/v1/objects/objects_test.go
new file mode 100644
index 0000000..31fa837
--- /dev/null
+++ b/openstack/storage/v1/objects/objects_test.go
@@ -0,0 +1,96 @@
+package objects
+
+import (
+	"bytes"
+	"encoding/json"
+	"io/ioutil"
+	"net/http"
+	"reflect"
+	"testing"
+)
+
+func TestExtractObjectMetadata(t *testing.T) {
+	getResult := &http.Response{}
+
+	expected := map[string]string{}
+
+	actual := ExtractMetadata(getResult)
+
+	if !reflect.DeepEqual(expected, actual) {
+		t.Errorf("Expected: %+v\nActual:%+v", expected, actual)
+	}
+}
+
+func TestExtractContent(t *testing.T) {
+	responseBody := "'Twas brillig, and the slithy toves"
+	downloadResult := &http.Response{
+		Body: ioutil.NopCloser(bytes.NewBufferString(responseBody)),
+	}
+	expected := []byte("'Twas brillig, and the slithy toves")
+	actual, err := ExtractContent(downloadResult)
+	if err != nil {
+		t.Errorf("Error extracting object content: %s", err)
+	}
+	if !reflect.DeepEqual(actual, expected) {
+		t.Errorf("Expected: %+v\nActual:%+v", expected, actual)
+	}
+}
+
+func TestExtractObjectInfo(t *testing.T) {
+	responseBody := `
+		[
+		    {
+				"hash": "451e372e48e0f6b1114fa0724aa79fa1",
+		        "last_modified": "2014-01-15T16:41:49.390270",
+				"bytes": 14,
+				"name": "goodbye",
+				"content_type": "application/octet-stream"
+			},
+			{
+		        "hash": "ed076287532e86365e841e92bfc50d8c",
+			    "last_modified": "2014-01-15T16:37:43.427570",
+				"bytes": 12,
+				"name": "helloworld",
+				"content_type": "application/octet-stream"
+			}
+		]	
+	`
+
+	listResult := &http.Response{
+		Body: ioutil.NopCloser(bytes.NewBufferString(responseBody)),
+	}
+
+	var expected []Object
+	err := json.Unmarshal([]byte(responseBody), &expected)
+	if err != nil {
+		t.Errorf("Error unmarshaling JSON: %s", err)
+	}
+
+	actual, err := ExtractInfo(listResult)
+	if err != nil {
+		t.Errorf("Error extracting objects info: %s", err)
+	}
+
+	if !reflect.DeepEqual(expected, actual) {
+		t.Errorf("Expected: %+v\nActual: %+v", expected, actual)
+	}
+}
+
+func TestExtractObjectNames(t *testing.T) {
+	responseBody := "goodbye\nhelloworld\n"
+
+	listResult := &http.Response{
+		Body: ioutil.NopCloser(bytes.NewBufferString(responseBody)),
+	}
+
+	expected := []string{"goodbye", "helloworld"}
+
+	actual, err := ExtractNames(listResult)
+	if err != nil {
+		t.Errorf("Error extracting object names: %s", err)
+	}
+
+	if !reflect.DeepEqual(expected, actual) {
+		t.Errorf("Expected: %+v\nActual:%+v", expected, actual)
+	}
+}
diff --git a/openstack/storage/v1/objects/requests_test.go b/openstack/storage/v1/objects/requests_test.go
new file mode 100644
index 0000000..ca829ae
--- /dev/null
+++ b/openstack/storage/v1/objects/requests_test.go
@@ -0,0 +1,193 @@
+package objects
+
+import (
+	"bytes"
+	"net/http"
+	"testing"
+
+	"github.com/rackspace/gophercloud"
+	"github.com/rackspace/gophercloud/testhelper"
+)
+
+const ( 
+	tokenId = "abcabcabcabc"
+)
+
+var metadata = map[string]string{"gophercloud-test": "objects"}
+
+func serviceClient() *gophercloud.ServiceClient {
+	return &gophercloud.ServiceClient{
+		Provider: &gophercloud.ProviderClient{TokenID: tokenId},
+		Endpoint: testhelper.Endpoint(),
+	}
+}
+
+func TestDownloadObject(t * testing.T) {
+	testhelper.SetupHTTP()
+	defer testhelper.TeardownHTTP()
+	
+	testhelper.Mux.HandleFunc("/testContainer/testObject", func(w http.ResponseWriter, r *http.Request) {
+		testhelper.TestMethod(t, r, "GET")
+		testhelper.TestHeader(t, r, "X-Auth-Token", tokenId)
+		testhelper.TestHeader(t, r, "Accept", "application/json")
+	})
+
+	client := serviceClient()
+	_, err := Download(client, DownloadOpts{
+		Container: "testContainer",
+		Name: "testObject",
+	})
+	if err != nil {
+		t.Fatalf("Unexpected error downloading object: %v", err)
+	}
+}
+
+func TestListObjectInfo(t *testing.T) {
+	testhelper.SetupHTTP()
+	defer testhelper.TeardownHTTP()
+
+	testhelper.Mux.HandleFunc("/testContainer", func(w http.ResponseWriter, r *http.Request) {
+		testhelper.TestMethod(t, r, "GET")
+		testhelper.TestHeader(t, r, "X-Auth-Token", tokenId)
+		testhelper.TestHeader(t, r, "Accept", "application/json")
+	})
+
+	client := serviceClient()
+	_, err := List(client, ListOpts{
+		Full: true,
+		Container: "testContainer",
+	})
+	if err != nil {
+		t.Fatalf("Unexpected error listing objects info: %v", err)
+	}
+}
+
+func TestListObjectNames(t *testing.T) {
+	testhelper.SetupHTTP()
+	defer testhelper.TeardownHTTP()
+
+	testhelper.Mux.HandleFunc("/testContainer", func(w http.ResponseWriter, r *http.Request) {
+		testhelper.TestMethod(t, r, "GET")
+		testhelper.TestHeader(t, r, "X-Auth-Token", tokenId)
+		testhelper.TestHeader(t, r, "Accept", "text/plain")
+	})
+
+	client := serviceClient()
+	_, err := List(client, ListOpts{
+		Container: "testContainer",
+	})
+	if err != nil {
+		t.Fatalf("Unexpected error listing object names: %v", err)
+	}
+}
+
+func TestCreateObject(t *testing.T) {
+	testhelper.SetupHTTP()
+	defer testhelper.TeardownHTTP()
+
+	testhelper.Mux.HandleFunc("/testContainer/testObject", func(w http.ResponseWriter, r *http.Request) {
+		testhelper.TestMethod(t, r, "PUT")
+		testhelper.TestHeader(t, r, "X-Auth-Token", tokenId)
+		testhelper.TestHeader(t, r, "Accept", "application/json")
+		w.WriteHeader(http.StatusCreated)
+	})
+
+	client := serviceClient()
+	err := Create(client, CreateOpts{
+		Content: bytes.NewBufferString("Did gyre and gimble in the wabe:"),
+		Container: "testContainer",
+		Name: "testObject",
+	})
+	if err != nil {
+		t.Fatalf("Unexpected error creating object: %v", err)
+	}
+}
+
+func TestCopyObject(t *testing.T) {
+	testhelper.SetupHTTP()
+	defer testhelper.TeardownHTTP()
+
+	testhelper.Mux.HandleFunc("/testContainer/testObject", func(w http.ResponseWriter, r *http.Request) {
+		testhelper.TestMethod(t, r, "COPY")
+		testhelper.TestHeader(t, r, "X-Auth-Token", tokenId)
+		testhelper.TestHeader(t, r, "Accept", "application/json")
+		testhelper.TestHeader(t, r, "Destination", "/newTestContainer/newTestObject")
+		w.WriteHeader(http.StatusCreated)
+	})
+
+	client := serviceClient()
+	err := Copy(client, CopyOpts{
+		NewContainer: "newTestContainer",
+		NewName: "newTestObject",
+		Container: "testContainer",
+		Name: "testObject",
+	})
+	if err != nil {
+		t.Fatalf("Unexpected error copying object: %v", err)
+	}
+}
+
+func TestDeleteObject(t *testing.T) {
+	testhelper.SetupHTTP()
+	defer testhelper.TeardownHTTP()
+
+	testhelper.Mux.HandleFunc("/testContainer/testObject", func(w http.ResponseWriter, r *http.Request) {
+		testhelper.TestMethod(t, r, "DELETE")
+		testhelper.TestHeader(t, r, "X-Auth-Token", tokenId)
+		testhelper.TestHeader(t, r, "Accept", "application/json")
+		w.WriteHeader(http.StatusNoContent)
+	})
+
+	client := serviceClient()
+	err := Delete(client, DeleteOpts{
+		Container: "testContainer",
+		Name: "testObject",
+	})
+	if err != nil {
+		t.Fatalf("Unexpected error deleting object: %v", err)
+	}
+}
+
+func TestUpateObjectMetadata(t *testing.T) {
+	testhelper.SetupHTTP()
+	defer testhelper.TeardownHTTP()
+
+	testhelper.Mux.HandleFunc("/testContainer/testObject", func(w http.ResponseWriter, r *http.Request) {
+		testhelper.TestMethod(t, r, "POST")
+		testhelper.TestHeader(t, r, "X-Auth-Token", tokenId)
+		testhelper.TestHeader(t, r, "Accept", "application/json")
+		testhelper.TestHeader(t, r, "X-Object-Meta-Gophercloud-Test", "objects")
+		w.WriteHeader(http.StatusAccepted)
+	})
+
+	client := serviceClient()
+	err := Update(client, UpdateOpts{
+		Container: "testContainer",
+		Name: "testObject",
+		Metadata: metadata,
+	})
+	if err != nil {
+		t.Fatalf("Unexpected error updating object metadata: %v", err)
+	}
+}
+
+func TestGetContainer(t *testing.T) {
+	testhelper.SetupHTTP()
+	defer testhelper.TeardownHTTP()
+
+	testhelper.Mux.HandleFunc("/testContainer/testObject", func(w http.ResponseWriter, r *http.Request) {
+		testhelper.TestMethod(t, r, "HEAD")
+		testhelper.TestHeader(t, r, "X-Auth-Token", tokenId)
+		testhelper.TestHeader(t, r, "Accept", "application/json")
+		w.WriteHeader(http.StatusNoContent)
+	})
+
+	client := serviceClient()
+	_, err := Get(client, GetOpts{
+			Container: "testContainer",
+			Name: "testObject",
+	})
+	if err != nil {
+		t.Fatalf("Unexpected error getting object metadata: %v", err)
+	}
+}
diff --git a/openstack/storage/v1/objects/urls_test.go b/openstack/storage/v1/objects/urls_test.go
new file mode 100644
index 0000000..89d1cb1
--- /dev/null
+++ b/openstack/storage/v1/objects/urls_test.go
@@ -0,0 +1,28 @@
+package objects
+
+import (
+	"testing"
+	"github.com/rackspace/gophercloud"
+)
+
+func TestContainerURL(t *testing.T) {
+	client := gophercloud.ServiceClient{
+		Endpoint: "http://localhost:5000/v1/",
+	}
+	expected := "http://localhost:5000/v1/testContainer"
+	actual := containerURL(&client, "testContainer")
+	if actual != expected {
+		t.Errorf("Unexpected service URL generated: %s", actual)
+	}
+}
+
+func TestObjectURL(t *testing.T) {
+	client := gophercloud.ServiceClient{
+		Endpoint: "http://localhost:5000/v1/",
+	}
+	expected := "http://localhost:5000/v1/testContainer/testObject"
+	actual := objectURL(&client, "testContainer", "testObject")
+	if actual != expected {
+		t.Errorf("Unexpected service URL generated: %s", actual)
+	}
+}