static void Main(string[] args)
        {
            if (args.Length < 4)
            {
                Console.Error.WriteLine("Usage:");
                Console.Error.WriteLine("    Gototags.Platform.Data.Test host domain username password");
                return;
            }
            string host     = args[0];
            string domain   = args[1];
            string username = args[2];
            string password = args[3];

            //  Once we have the application then we must switch to our application specific API
            Client client = new Client(host, domain, username, password);

            //  load the client application (every call to this method does a query on the server, so you should cache a copy locally)
            Application app = client.GetApplication();

            //  change user permissions and update
            app.UserPermissions.Device.Create = true;
            app.UserPermissions.Device.Read   = true;
            app.UserPermissions.Device.Write  = true;
            app.UserPermissions.Device.Delete = true;
            //  now update the Application
            app = client.UpdateApplication(app);
            if (app == null)
            {
                throw new Exception("Failed to update Application");
            }
            ApplicationUserPermissionsDevice p = app.UserPermissions.Device;

            if (!(p.Create.Value && p.Read.Value && p.Write.Value && p.Delete.Value))
            {
                throw new Exception("User Device Permissions were not all true: " + p);
            }

            Device device = client.CreateDevice(new Device()
            {
                Name = "Device One", Identity = "Q 36 space modulator"
            });

            if (device == null)
            {
                throw new Exception("Failed to create Device");
            }
            if (device.Name != "Device One")
            {
                throw new Exception("Device should have had Name = 'Device One': " + device);
            }
            if (device.ApplicationId != app.Id)
            {
                throw new Exception("Device.ApplicationId (" + device.ApplicationId + ")should have been same as Application.Id: " + app.Id);
            }
            Console.WriteLine("------------------------------------Device--------------------------------------");
            Console.WriteLine(device);

            //	test queries for the device
            QueryOptions options = new QueryOptions()
            {
                Skip = 0
            }.Sort(Device.NAME, true);
            TypedArray <Device> devices = client.GetDevices(options, new Device.Query()
            {
                Name = "Device One",
                //  not a realistic query, but it tests compound queries and should only return one result.
                CreatedDateGreaterThanOrEquals = device.CreatedDate,
                CreatedDateLessThanOrEquals    = device.CreatedDate.AddMinutes(1)
            });

            Console.WriteLine("------------------------------------Query--------------------------------------");
            Console.WriteLine(devices.ToString());
            if (devices.Count != 1 || !device.Id.Equals(devices.First.Id))
            {
                throw new Exception("Device Query should have returned the device we previously created.");
            }
            if (options.Total != 1)
            {
                throw new Exception("Options.total should have been 1 but was: " + options.Total);
            }
            Console.WriteLine(devices);

            //  try to create another device with the same identity.  This should throw a 409 Conflict WebException
            WebException error = null;

            try
            {
                client.CreateDevice(new Device()
                {
                    Identity = device.Identity
                });
            }
            catch (WebException e)
            {
                error = e;
            }
            if (error == null || error.GetStatusCode() != HttpStatusCode.Conflict)
            {
                Console.WriteLine("Error: CreatDevice should have thrown a 409 Conflict Exception: " + error);
            }

            //  now check that getting the device by id works
            device = client.GetDevice(device.Id);
            if (device == null)
            {
                throw new Exception("Failed to get Device");
            }

            //	touch the device
            HttpWebRequest request = client.Touch(device.TouchUrl, device.Uid);
            //	in this case we know the response should be JSON, so we get the value.
            //	if this Device had a URL action then we would expect the response to be a 302 Redirect.
            Object touchResponse = client.GetResponseContent(request);

            Console.WriteLine("------------------------------------Touch--------------------------------------");
            Console.WriteLine(touchResponse);

            //  finally, delete the device
            client.DeleteDevice(device.Id);

            //	now test our utility ConvertVCardToContact function
            Console.WriteLine("-----------------------------------Contact--------------------------------------");
            Contact contact = client.ConvertVCardToContact("BEGIN:VCARD\r\nVERSION:2.1\r\nFN:Mr John P Smith Sr\r\nN:Smith;John;P;Mr;Sr\r\nORG:Gototags;Engineering\r\nTITLE:Chief\r\nROLE:Architect\r\nBDAY:19840204\r\nEMAIL;WORK:[email protected]\r\nEMAIL;HOME:[email protected]\r\nTEL;CELL:222-222-2222\r\nTEL;WORK:333-333-3333\r\nTEL;HOME:111-111-1111\r\nTEL;FAX;WORK:555-555-5555\r\nTEL;FAX;HOME:444-444-4444\r\nURL;WORK:http://gototags.com/john\r\nURL;HOME:http://home.com/john\r\nADR;WORK:;;one gototags way;Seattle;WA;98034;USA\r\nADR;HOME:;;12206 Kinley Ave NE;Duvall;WA;98055;USA\r\nEND:VCARD");

            Console.WriteLine(contact);

            Console.WriteLine("---------------------------------Current User-----------------------------------");
            User user = client.GetCurrentUser();

            Console.WriteLine(user);

            Console.WriteLine("--------------------------------------------------------------------------------");
            Console.WriteLine("All Tests Passed");
        }