public async Task CallFunctionAsyncTest()
        {
            using (ParticleCloudMock cloud = new ParticleCloudMock())
            {
                cloud.RequestCallBack = (a, b, c) =>
                {
                    Assert.AreEqual("POST", a);
                    Assert.AreEqual("devices/3/led", b);
                    Assert.AreEqual(1, c.Count());
                    var first = c.FirstOrDefault();
                    Assert.IsNotNull(first);
                    Assert.AreEqual("arg", first.Key);
                    Assert.AreEqual("on", first.Value);
                    return(new RequestResponse
                    {
                        StatusCode = System.Net.HttpStatusCode.OK,
                        Response = JToken.Parse(@"{
  'id': '3',
  'name': 'led',
  'last_app': '',
  'connected': true,
  'return_value': 1
}")
                    });
                };

                var p   = new ParticleDeviceMock(cloud, JObject.Parse("{'id':'3', 'name': 'test', 'functions':['led']}"));
                var exc = Assert.Throws <ArgumentNullException>(() => { p.CallFunctionAsync(null, "").GetAwaiter().GetResult(); });
                Assert.AreEqual("functionName", exc.ParamName);
                var result = await p.CallFunctionAsync("led", "on");

                Assert.IsTrue(result.Success);
                Assert.AreEqual(1, result.Data);
            }
        }
        public async Task CallFunctionAsyncHttpRequestExceptionTest()
        {
            using (ParticleCloudMock cloud = new ParticleCloudMock())
            {
                var ex = new HttpRequestException("Unable to Resolve");
                cloud.RequestCallBack = (a, b, c) =>
                {
                    throw ex;
                };
                var p = new ParticleDeviceMock(cloud, JObject.Parse("{'id':'3', 'name': 'test', 'functions':['led']}"));
                Assert.IsNotNull(p);
                var cf = await p.CallFunctionAsync("LED", "cheese");

                Assert.IsNotNull(cf);
                Assert.AreEqual(ex.Message, cf.Error);
                Assert.AreEqual(ex, cf.Exception);
            }
        }
		public async Task CallFunctionAsyncHttpRequestExceptionTest()
		{
			using (ParticleCloudMock cloud = new ParticleCloudMock())
			{
				var ex = new HttpRequestException("Unable to Resolve");
				cloud.RequestCallBack = (a, b, c) =>
				{
					throw ex;
				};
				var p = new ParticleDeviceMock(cloud, JObject.Parse("{'id':'3', 'name': 'test', 'functions':['led']}"));
				Assert.IsNotNull(p);
				var cf = await p.CallFunctionAsync("LED", "cheese");
				Assert.IsNotNull(cf);
				Assert.AreEqual(ex.Message, cf.Error);
				Assert.AreEqual(ex, cf.Exception);
			}
		}
		public async Task CallFunctionAsyncTest()
		{
			using (ParticleCloudMock cloud = new ParticleCloudMock())
			{
				cloud.RequestCallBack = (a, b, c) =>
				{
					Assert.AreEqual("POST", a);
					Assert.AreEqual("devices/3/led", b);
					Assert.AreEqual(1, c.Count());
					var first = c.FirstOrDefault();
					Assert.IsNotNull(first);
					Assert.AreEqual("arg", first.Key);
					Assert.AreEqual("on", first.Value);
					return new RequestResponse
					{
						StatusCode = System.Net.HttpStatusCode.OK,
						Response = JToken.Parse(@"{
  'id': '3',
  'name': 'led',
  'last_app': '',
  'connected': true,
  'return_value': 1
}")
					};
				};

				var p = new ParticleDeviceMock(cloud, JObject.Parse("{'id':'3', 'name': 'test', 'functions':['led']}"));
				var exc = Assert.Throws<ArgumentNullException>(() => { p.CallFunctionAsync(null, "").GetAwaiter().GetResult(); });
				Assert.AreEqual("functionName", exc.ParamName);
				var result = await p.CallFunctionAsync("led", "on");
				Assert.IsTrue(result.Success);
				Assert.AreEqual(1, result.Data);
			}
		}