public async Task GetPublicIp_should_tolerate_echo_failure()
        {
            var echoUrlWithFailure = new[] { "https://this.will.fail.for.sure" }
            .Concat(Ip.DefaultIpEchoUrls).ToObservable();
            var myIp = await Ip.GetPublicIpAsync(echoUrlWithFailure);

            myIp.Should().NotBe(default(IPAddress));
        }
        public async Task GetPublicIp_should_not_wait_for_longest_response()
        {
            var delayedObservable = Ip.DefaultIpEchoUrls
                                    .Select((o, i) =>
            {
                return(i != 2
                        ? Observable.Timer(TimeSpan.FromSeconds(5)).Select(_ => o)
                        : Observable.Return(o));
            }).Merge();

            var stopWatch = new Stopwatch();

            stopWatch.Start();
            var myIp = await Ip.GetPublicIpAsync(delayedObservable);

            stopWatch.Stop();

            myIp.Should().NotBe(default(IPAddress));
            stopWatch.Elapsed.Should().BeLessThan(TimeSpan.FromSeconds(3));
        }
        public async Task GetPublicIp_should_usually_return_a_valid_ip()
        {
            var myIp = await Ip.GetPublicIpAsync();

            myIp.Should().NotBe(default(IPAddress));
        }