Exemple #1
0
 public void Read_nonexistent_directory_returns_null()
 {
     MockPlug.Setup(AwsTestHelpers.AWS.S3Uri)
     .Verb("GET")
     .At(_config.Bucket)
     .With("delimiter", "/")
     .With("prefix", "root/path/foo/bar/")
     .Returns(DreamMessage.Ok(new XDoc("ListBucketResult", "http://s3.amazonaws.com/doc/2006-03-01/")))
     .ExpectAtLeastOneCall();
     Assert.IsNull(_client.GetDataInfo("foo/bar/", false));
     MockPlug.VerifyAll();
 }
Exemple #2
0
        public void Cached_items_expire()
        {
            _cacheSeconds = 2;
            MockPlug.Setup(new XUri("http://s3.amazonaws.com").At(BUCKET));
            var attachment = CreateAttachmentForUpload();
            var storage    = Storage;

            Assert.IsFalse(Directory.GetFiles(_tempDirectory).Any(), "there's already files in the temp dir");
            storage.PutFile(attachment.Item1, SizeType.ORIGINAL, attachment.Item2);
            Assert.AreEqual(1, Directory.GetFiles(_tempDirectory).Length, "Unexpected number of cache files after put");
            Assert.IsTrue(Wait.For(() => !Directory.GetFiles(_tempDirectory).Any(), 120.Seconds()), "cache didn't empty in time");
        }
Exemple #3
0
        public void Ranked_search_hits_lucene_and_caches_result()
        {
            var  searchMock   = CreateMocks().Item1;
            var  luceneMock   = MockPlug.Setup(Utils.Settings.LuceneMockUri);
            var  before       = DateTime.UtcNow.AddDays(-2).WithoutMilliseconds();
            var  since        = DateTime.UtcNow.AddDays(-1).WithoutMilliseconds();
            uint limit        = 10;
            uint offset       = 20;
            var  responseXml  = new XDoc("response");
            var  luceneXml    = new XDoc("lucene");
            var  searchQuery  = new SearchQuery("raw", "processed", new LuceneClauseBuilder(), null);
            var  searchResult = new SearchResult();

            searchMock.Setup(x => x.BuildQuery("foo", "", SearchQueryParserType.BestGuess, false)).Returns(searchQuery).AtMostOnce().Verifiable();
            searchMock.Setup(x => x.GetCachedQuery(searchQuery)).Returns((SearchResult)null).AtMostOnce().Verifiable();
            luceneMock
            .Verb("GET")
            .At("compact")
            .With("wikiid", "default")
            .With("q", searchQuery.LuceneQuery)
            .Returns(luceneXml)
            .ExpectCalls(DreamTimes.Once());
            searchMock.Setup(x => x.CacheQuery(It.Is <XDoc>(v => v == luceneXml), searchQuery, It.Is <TrackingInfo>(t => !t.QueryId.HasValue)))
            .Returns(searchResult)
            .AtMostOnce()
            .Verifiable();
            Predicate <SetDiscriminator> discriminator = s => {
                return(s.Limit == limit && s.Offset == offset && s.SortField == "rank" && !s.Ascending);
            };

            searchMock.Setup(x => x.FormatResultSet(
                                 searchResult,
                                 It.Is <SetDiscriminator>(s => discriminator(s)),
                                 false,
                                 It.Is <TrackingInfo>(t => !t.QueryId.HasValue),
                                 It.IsAny <Result <XDoc> >()
                                 ))
            .Returns(new Result <XDoc>().WithReturn(responseXml))
            .AtMostOnce()
            .Verifiable();
            var response = _search
                           .With("q", "foo")
                           .With("since", since)
                           .With("before", before)
                           .With("limit", limit)
                           .With("offset", offset)
                           .Get(new Result <DreamMessage>()).Wait();

            Assert.IsTrue(response.IsSuccessful, response.ToErrorString());
            searchMock.VerifyAll();
            luceneMock.Verify();
            Assert.AreEqual(responseXml, response.ToDocument());
        }
        public void ImportManager_chains_reader_to_importer()
        {
            // Arrange
            var dekiApiUri     = new XUri("http://mock/@api/deki");
            var importManifest = new XDoc("manifest");
            var item1Uri       = dekiApiUri.At("foo", "bar", "abc");
            var item1Doc       = new XDoc("item1");
            var item2Uri       = dekiApiUri.At("foo", "bar", "def");
            var item2Doc       = new XDoc("item2");
            var importResponse = new XDoc("requests")
                                 .Start("request")
                                 .Attr("method", "POST")
                                 .Attr("dataid", "abc")
                                 .Attr("href", item1Uri)
                                 .Start("header").Attr("name", "h_1").Attr("value", "v_1").End()
                                 .Start("header").Attr("name", "h_2").Attr("value", "v_2").End()
                                 .End()
                                 .Start("request")
                                 .Attr("method", "PUT")
                                 .Attr("dataid", "def")
                                 .Attr("href", item2Uri)
                                 .End();
            var mock = MockPlug.Register(dekiApiUri);

            mock.Expect().Verb("POST").Uri(dekiApiUri.At("site", "import").With("relto", "0")).RequestDocument(importManifest).Response(DreamMessage.Ok(importResponse));
            mock.Expect().Verb("POST").Uri(item1Uri).RequestHeader("h_1", "v_1").RequestHeader("h_2", "v_2").RequestDocument(item1Doc);
            mock.Expect().Verb("PUT").Uri(item2Uri).RequestDocument(item2Doc);

            var mockPackageReader = new Mock <IPackageReader>();

            mockPackageReader.Setup(x => x.ReadManifest(It.IsAny <Result <XDoc> >())).Returns(importManifest.AsResult()).Verifiable("didn't get manifest");
            var item1stream = new MemoryStream(item1Doc.ToBytes());

            mockPackageReader.Setup(x => x.ReadData(It.Is <ImportItem>(y => y.DataId == "abc"), It.IsAny <Result <ImportItem> >()))
            .Returns(() => new ImportItem("abc", importResponse["request[@dataid='abc']"], null, item1stream, item1stream.Length).AsResult())
            .Verifiable();
            var item2stream = new MemoryStream(item2Doc.ToBytes());

            mockPackageReader.Setup(x => x.ReadData(It.Is <ImportItem>(y => y.DataId == "def"), It.IsAny <Result <ImportItem> >()))
            .Returns(() => new ImportItem("def", importResponse["request[@dataid='def']"], null, item2stream, item2stream.Length).AsResult())
            .Verifiable();
            mockPackageReader.Setup(x => x.Dispose()).Verifiable();

            // Act
            var manager = ImportManager.CreateAsync(Plug.New(dekiApiUri), 0, mockPackageReader.Object, new Result <ImportManager>()).Wait();

            manager.ImportAsync(new Result()).Wait();

            //Assert
            Assert.IsTrue(mock.WaitAndVerify(TimeSpan.FromSeconds(1)), mock.VerificationFailure);
            mockPackageReader.VerifyAll();
        }
Exemple #5
0
        public void Setup()
        {
            _inactiveLicense = Plug.New("resource://mindtouch.deki/MindTouch.Deki.Resources.license-inactive.xml").With(DreamOutParam.TYPE, MimeType.XML.ToString()).Get().ToDocument();

            MockPlug.DeregisterAll();
            _userMock          = new Mock <IUserBL>();
            _settingsMock      = new Mock <IInstanceSettings>();
            _licenseBLMock     = new Mock <ILicenseBL>();
            _seatingBLMock     = new Mock <ISeatingBL>();
            _userContext       = new MockUserContext();
            _wikiId            = "bob";
            _licenseController = new RemoteLicenseController(_wikiId, _storagePlug, GetRemoteLicense, LogUtils.CreateLog <RemoteLicenseController>());
        }
Exemple #6
0
        public void Items_without_pageid_are_not_affected_by_filtering()
        {
            MockPlug.Setup(_authUri).Verb("POST").ExpectCalls(Times.Never());
            var items = new[] {
                Result(1, null),
                Result(2, null),
            };
            var set = LuceneResultFilter.Filter(_authPlug, items, 0, int.MaxValue, new Result <IList <LuceneResult> >()).Wait();

            Assert.AreEqual(2, set.Count);
            Assert.AreEqual(items[0], set[0]);
            MockPlug.VerifyAll(1.Seconds());
        }
        public void Can_call_WebHtml_on_uri()
        {
            var mock = MockPlug.Setup(new XUri("mock://mock"))
                       .Verb("GET")
                       .Returns(DreamMessage.Ok(MimeType.TEXT, "<strong>hi</strong>"))
                       .ExpectCalls(Times.Once());

            DekiScriptTester.Default.Test(
                "web.html(\"mock://mock\")",
                "<html><body><strong>hi</strong></body></html>",
                typeof(DekiScriptXml));
            mock.Verify();
        }
Exemple #8
0
        public void Can_put_file()
        {
            var data = AwsTestHelpers.CreateRandomDocument();

            MockPlug.Setup(AwsTestHelpers.AWS.S3Uri)
            .Verb("PUT")
            .At(_config.RootedPath("foo", "bar"))
            .WithBody(data)
            .Returns(DreamMessage.Ok())
            .ExpectAtLeastOneCall();
            _client.PutFile("foo/bar", AwsTestHelpers.CreateFileHandle(data, null));
            MockPlug.VerifyAll();
        }
Exemple #9
0
        public void Ranked_search_tracks_previous_queryid()
        {
            var   searchMock      = CreateMocks().Item1;
            var   luceneMock      = MockPlug.Setup(Utils.Settings.LuceneMockUri);
            var   before          = DateTime.UtcNow.AddDays(-2).WithoutMilliseconds();
            var   since           = DateTime.UtcNow.AddDays(-1).WithoutMilliseconds();
            uint  limit           = 10;
            uint  offset          = 20;
            ulong previousqueryid = 43;
            var   responseXml     = new XDoc("response");
            var   luceneXml       = new XDoc("lucene");
            var   searchQuery     = new SearchQuery("raw", "processed", new LuceneClauseBuilder(), null);
            var   searchResult    = new SearchResult();

            searchMock.Setup(x => x.BuildQuery("foo", "", SearchQueryParserType.BestGuess, false)).Returns(searchQuery).AtMostOnce().Verifiable();
            searchMock.Setup(x => x.GetCachedQuery(searchQuery)).Returns((SearchResult)null).AtMostOnce().Verifiable();
            luceneMock
            .Verb("GET")
            .At("compact")
            .With("wikiid", "default")
            .With("q", searchQuery.LuceneQuery)
            .Returns(luceneXml)
            .ExpectCalls(DreamTimes.Once());
            searchMock.Setup(x => x.CacheQuery(It.IsAny <XDoc>(), searchQuery, It.Is <TrackingInfo>(t => t.PreviousQueryId == previousqueryid)))
            .Returns(searchResult)
            .AtMostOnce()
            .Verifiable();
            searchMock.Setup(x => x.FormatResultSet(
                                 searchResult,
                                 It.IsAny <SetDiscriminator>(),
                                 false,
                                 It.IsAny <TrackingInfo>(),
                                 It.IsAny <Result <XDoc> >())
                             )
            .Returns(new Result <XDoc>().WithReturn(responseXml))
            .AtMostOnce()
            .Verifiable();
            var response = _search
                           .With("q", "foo")
                           .With("previousqueryid", previousqueryid.ToString())
                           .With("since", since)
                           .With("before", before)
                           .With("limit", limit)
                           .With("offset", offset)
                           .Get(new Result <DreamMessage>()).Wait();

            Assert.IsTrue(response.IsSuccessful, response.ToErrorString());
            searchMock.VerifyAll();
            luceneMock.Verify();
            Assert.AreEqual(responseXml, response.ToDocument());
        }
 public void Instance_limit_kicks_running_instance_in_favor_of_new()
 {
     using (var server = CreateTestServer()) {
         var host             = server.CreateMultiTenantService(300, 2);
         var hostPlug         = host.WithInternalKey().AtLocalHost;
         var eventSubscriber  = new XUri("mock://event/subscriber");
         var subForAuthorized = new XDoc("subscription-set")
                                .Elem("uri.owner", eventSubscriber)
                                .Start("subscription")
                                .Attr("id", "1")
                                .Elem("channel", "event://a/deki/site/stop")
                                .Start("recipient")
                                .Attr("authtoken", Utils.Settings.ApiKey)
                                .Elem("uri", eventSubscriber)
                                .End()
                                .End();
         _log.Debug("--- subscribing to instance shutdown event");
         var result = hostPlug.At("pubsub", "subscribers").With("apikey", server.HostInfo.ApiKey).PostAsync(subForAuthorized).Wait();
         Assert.IsTrue(result.IsSuccessful);
         var resetEvent = new ManualResetEvent(false);
         MockPlug.Register(eventSubscriber, (p, v, u, r, r2) => {
             resetEvent.Set();
             r2.Return(DreamMessage.Ok());
         });
         Assert.AreEqual(0, hostPlug.At("host").Get().ToDocument()["tenant"].ListLength);
         _log.Debug("--- starting instance a");
         Assert.IsTrue(hostPlug.At("site", "settings").WithHeader("X-Deki-Site", "id=a").Get().IsSuccessful);
         _log.Debug("--- starting instance b");
         Assert.IsTrue(hostPlug.At("site", "settings").WithHeader("X-Deki-Site", "id=b").Get().IsSuccessful);
         _log.Debug("--- checking running instances");
         var msg = hostPlug.At("host").Get(new Result <DreamMessage>()).Wait();
         Assert.AreEqual(DreamStatus.Ok, msg.Status, "Failed to retrieve running instances");
         var tenants = msg.ToDocument();
         var tenant  = tenants["tenant"];
         Assert.AreEqual(2, tenant.ListLength, "Unexpected instance(s):\r\n" + tenants.ToPrettyString());
         Assert.IsFalse(tenants["tenant[@wikiid='a']"].IsEmpty, "couldn't find instance 'a'");
         Assert.IsFalse(tenants["tenant[@wikiid='b']"].IsEmpty, "couldn't find instance 'b'");
         _log.Debug("--- starting instance c");
         msg = hostPlug.At("site", "settings").WithHeader("X-Deki-Site", "id=c").Get(new Result <DreamMessage>()).Wait();
         Assert.IsTrue(msg.IsSuccessful, msg.ToErrorString());
         _log.Debug("--- waiting for some instance to shut down");
         Assert.IsTrue(resetEvent.WaitOne(10.Seconds()), "no instance was shut down");
         msg = hostPlug.At("host").Get(new Result <DreamMessage>()).Wait();
         Assert.AreEqual(DreamStatus.Ok, msg.Status, "Failed to retrieve running instances");
         tenants = msg.ToDocument();
         tenant  = tenants["tenant"];
         Assert.AreEqual(2, tenant.ListLength, "Unexpected instance(s):\r\n" + tenants.ToPrettyString());
         Assert.IsFalse(tenants["tenant[@wikiid='c']"].IsEmpty, "couldn't find instance 'c'");
     }
 }
Exemple #11
0
 public void Setup()
 {
     _config = new AwsS3ClientConfig {
         Endpoint   = AwsTestHelpers.AWS,
         Bucket     = "bucket",
         Delimiter  = "/",
         RootPath   = "root/path",
         PrivateKey = "private",
         PublicKey  = "public",
         Timeout    = TimeSpan.FromSeconds(30)
     };
     _client = new AwsS3Client(_config, TaskTimerFactory.Current);
     MockPlug.DeregisterAll();
 }
        public void Can_init_and_read_file()
        {
            var data = Helper.CreateRandomDocument();

            MockPlug.Setup(Helper.AWS)
            .Verb("GET")
            .At(_config.RootedPath("foo", "bar"))
            .Returns(DreamMessage.Ok(data))
            .ExpectAtLeastOneCall();
            var response = _storage.AtLocalHost.At("foo", "bar").Get(new Result <DreamMessage>()).Wait();

            Assert.IsTrue(response.IsSuccessful);
            Assert.AreEqual(data.ToCompactString(), response.ToDocument().ToCompactString());
        }
Exemple #13
0
 public void Teardown()
 {
     MockPlug.DeregisterAll();
     if (!string.IsNullOrEmpty(_tempFilename))
     {
         _filestream.Dispose();
         File.Delete(_tempFilename);
     }
     if (_s3Storage != null)
     {
         _s3Storage.Dispose();
     }
     _s3Storage = null;
 }
        public void Can_update_license_seat_licensing()
        {
            // Arrange
            var   currentLicense     = new XDoc("current");
            var   newLicense         = new XDoc("new");
            var   newExpiration      = DateTime.UtcNow.AddDays(1);
            var   newPermissions     = Permissions.BROWSE;
            ulong?newOwnerId         = 1;
            var   currentLicenseData = new LicenseData()
                                       .WithLicenseDocument(currentLicense)
                                       .WithState(LicenseStateType.COMMERCIAL)
                                       .WithExpiration(DateTime.UtcNow)
                                       .WithPermissions(Permissions.NONE)
                                       .WithSiteOwnerUserId(1)
                                       .Checked(DateTime.UtcNow);
            var newLicenseData = new LicenseData().WithLicenseDocument(newLicense)
                                 .WithState(LicenseStateType.COMMERCIAL)
                                 .WithExpiration(newExpiration)
                                 .WithPermissions(newPermissions)
                                 .WithSiteOwnerUserId(newOwnerId)
                                 .Checked(DateTime.UtcNow);
            var tempLicenseNewLicenseData = new LicenseData().WithLicenseDocument(newLicense);

            _licenseBLMock.Setup(x => x.BuildLicenseData(newLicense, true, true)).Returns(tempLicenseNewLicenseData).Verifiable();
            _licenseBLMock.Setup(x => x.ValidateNewLicenseTransition(It.Is <LicenseData>(l => l.AreSame(tempLicenseNewLicenseData)), It.Is <LicenseData>(l => l.AreSame(currentLicenseData))))
            .Returns(newLicenseData)
            .Verifiable();
            _seatingBLMock.Setup(x => x.IsSeatLicensingEnabled(currentLicenseData)).Returns(true);
            _seatingBLMock.Setup(x => x.IsSeatLicensingEnabled(newLicense)).Returns(true);
            _seatingBLMock.Setup(x => x.HandleSeatTransition(newLicense)).Returns(new SeatAssignmentInfo(2, 5));
            MockPlug.Setup(_storagePlug).At(_wikiId, "license.xml").Verb("Put").WithBody(newLicense).ExpectAtLeastOneCall();

            // Act
            var updatedLicense = _licenseController.UpdateLicense(newLicense, currentLicenseData, _licenseBLMock.Object, _seatingBLMock.Object);

            // Assert
            MockPlug.VerifyAll();
            _licenseBLMock.Verify(x => x.Validate(newLicense), Times.Once());
            _licenseBLMock.Verify(x => x.ValidateNewLicenseTransition(It.Is <LicenseData>(l => l.AreSame(tempLicenseNewLicenseData)), It.Is <LicenseData>(l => l.AreSame(currentLicenseData))), Times.Once());
            _seatingBLMock.Verify(x => x.IsSeatLicensingEnabled(currentLicenseData), Times.Once());
            _seatingBLMock.Verify(x => x.IsSeatLicensingEnabled(newLicense), Times.Once());
            _seatingBLMock.Verify(x => x.ValidateLicenseUpdateUser(newLicense), Times.Once());
            _seatingBLMock.Verify(x => x.HandleSeatTransition(newLicense), Times.Once());
            _seatingBLMock.Verify(x => x.SetOwnerUserSeat(newLicenseData), Times.Once());
            Assert.AreSame(newLicenseData, updatedLicense);
            Assert.AreEqual(newLicense, newLicenseData.LicenseDoc);
            Assert.AreEqual(newExpiration, newLicenseData.LicenseExpiration);
            Assert.AreEqual(newOwnerId, newLicenseData.SiteOwnerUserId);
            Assert.AreEqual(newPermissions, newLicenseData.AnonymousPermissions);
        }
Exemple #15
0
        public void Can_apply_limit()
        {
            MockPlug.Setup(_authUri)
            .Verb("POST")
            .Returns(DreamMessage.Ok(MimeType.TEXT, ""));
            var items = new[] {
                Result(1),
                Result(2),
            };
            var set = LuceneResultFilter.Filter(_authPlug, items, 0, 1, new Result <IList <LuceneResult> >()).Wait();

            Assert.AreEqual(1, set.Count);
            Assert.AreEqual(items[0], set[0]);
        }
Exemple #16
0
        public void Can_get_file()
        {
            var attachment = CreateAttachmentForDownload();
            var s3Filename = GetS3Filename(attachment);

            MockPlug.Setup(new XUri("http://s3.amazonaws.com").At(BUCKET))
            .Verb("GET")
            .At(s3Filename)
            .Returns(DreamMessage.Ok(MimeType.TEXT, "foobar"))
            .ExpectCalls(Times.Once());
            var info = Storage.GetFile(attachment, SizeType.ORIGINAL, false);

            Assert.AreEqual("foobar", Encoding.ASCII.GetString(info.Stream.ReadBytes(info.Length)));
            MockPlug.VerifyAll(1.Seconds());
        }
Exemple #17
0
        public void Exporter_can_retrieve_items_by_dataid()
        {
            // Arrange
            XUri dekiApiUri     = new XUri("http://mock/@api/deki");
            XDoc exportDocument = new XDoc("export");
            XUri item1Uri       = dekiApiUri.At("foo", "bar", "abc");
            XDoc item1Doc       = new XDoc("item1");
            XUri item2Uri       = dekiApiUri.At("foo", "bar", "def");
            XDoc item2Doc       = new XDoc("item2");
            XDoc exportResponse = new XDoc("export")
                                  .Start("requests")
                                  .Start("request")
                                  .Attr("method", "GET")
                                  .Attr("dataid", "abc")
                                  .Attr("href", item1Uri)
                                  .Start("header").Attr("name", "h_1").Attr("value", "v_1").End()
                                  .Start("header").Attr("name", "h_2").Attr("value", "v_2").End()
                                  .End()
                                  .Start("request")
                                  .Attr("method", "GET")
                                  .Attr("dataid", "def")
                                  .Attr("href", item2Uri)
                                  .End()
                                  .End()
                                  .Start("manifest")
                                  .Start("foo").Attr("dataid", "abc").End()
                                  .Start("bar").Attr("dataid", "def").End()
                                  .End();
            AutoMockPlug mock = MockPlug.Register(dekiApiUri);

            mock.Expect().Verb("POST").Uri(dekiApiUri.At("site", "export").With("relto", "0")).RequestDocument(exportDocument).Response(DreamMessage.Ok(exportResponse));
            mock.Expect().Verb("GET").Uri(item1Uri).RequestHeader("h_1", "v_1").RequestHeader("h_2", "v_2").Response(DreamMessage.Ok(item1Doc));
            mock.Expect().Verb("GET").Uri(item2Uri).Response(DreamMessage.Ok(item2Doc));

            // Act
            Exporter   exporter = Exporter.CreateAsync(Plug.New(dekiApiUri), exportDocument, 0, new Result <Exporter>()).Wait();
            ExportItem item1    = exporter.GetItemAsync("abc", new Result <ExportItem>()).Wait();
            ExportItem item2    = exporter.GetItemAsync("def", new Result <ExportItem>()).Wait();

            //Assert
            Assert.IsTrue(mock.WaitAndVerify(TimeSpan.FromSeconds(1)));
            Assert.AreEqual(exportResponse["manifest"], exporter.Manifest);
            Assert.AreEqual(new string[] { "abc", "def" }, exporter.DataIds);
            Assert.AreEqual(exporter.Manifest["*[@dataid='abc']"], item1.ItemManifest);
            Assert.AreEqual(exporter.Manifest["*[@dataid='def']"], item2.ItemManifest);
            Assert.AreEqual(item1Doc, XDocFactory.From(new StreamReader(item1.Data), MimeType.TEXT_XML));
            Assert.AreEqual(item2Doc, XDocFactory.From(new StreamReader(item2.Data), MimeType.TEXT_XML));
        }
Exemple #18
0
        public void Send_cache_control_header_when_writing_object()
        {
            var data = AwsTestHelpers.CreateRandomDocument();

            MockPlug.Setup(AwsTestHelpers.AWS.S3Uri)
            .Verb("PUT")
            .At(_config.RootedPath("foo", "bar"))
            .WithHeader("Cache-Control", "max-age=29030400, public")
            .WithBody(data)
            .Returns(DreamMessage.Ok())
            .ExpectAtLeastOneCall();
            var handle = AwsTestHelpers.CreateFileHandle(data, null);

            handle.CacheControl = "max-age=29030400, public";
            _client.PutFile("foo/bar", handle);
        }
Exemple #19
0
        public void Limit_smaller_than_item_set_forces_authorization_in_chunks_as_candidates_nears_limit()
        {
            var items = new List <LuceneResult>();

            for (var i = 1; i <= 200; i++)
            {
                items.Add(Result(i));
            }

            // first chunk should ask for 50 ids and we'll filter 20 from that set
            MockPlug.Setup(_authUri)
            .Verb("POST")
            .WithMessage(m => {
                var t     = m.ToText();
                var match = t.EqualsInvariant(items.Select(x => x.PageId.Value).Take(50).ToCommaDelimitedString());
                _log.DebugFormat("first chunk match? {0} => {1}", match, t);
                return(match);
            })
            .Returns(DreamMessage.Ok(MimeType.TEXT, S(10, 39).ToCommaDelimitedString()))
            .ExpectCalls(Times.Once());

            // second chunk should ask for 30 and we'll filter 5 from that set
            // which gives it a total larger than our limit, i.e. it won't try for a third chunk
            MockPlug.Setup(_authUri)
            .Verb("POST")
            .WithMessage(m => {
                var t     = m.ToText();
                var match = t.EqualsInvariant(items.Select(x => x.PageId.Value).Skip(50).Take(30).ToCommaDelimitedString());
                _log.DebugFormat("second chunk match? {0} => {1}", match, t);
                return(match);
            })
            .Returns(DreamMessage.Ok(MimeType.TEXT, S(51, 55).ToCommaDelimitedString()))
            .ExpectCalls(Times.Once());
            var builder = new LuceneResultFilter(_authPlug, 10000, 20);
            var set     = Coroutine.Invoke(builder.Filter, items, 0, 30, new Result <IList <LuceneResult> >()).Wait();

            Assert.AreEqual(30, set.Count);

            // we expect a sequence of 1-9,40-50,56-... and take the first 30
            var expected = S(1, 9).Union(S(40, 50)).Union(S(56, 100)).Take(30);

            Assert.AreEqual(
                expected.ToCommaDelimitedString(),
                set.Select(x => x.PageId.Value).ToCommaDelimitedString()
                );
            MockPlug.VerifyAll(1.Seconds());
        }
Exemple #20
0
        public void Read_file_with_lazy_expiration_returns_null()
        {
            var data = AwsTestHelpers.CreateRandomDocument();

            MockPlug.Setup(AwsTestHelpers.AWS.S3Uri)
            .Verb("GET")
            .At(_config.RootedPath("foo", "bar"))
            .Returns(invocation => {
                var msg = DreamMessage.Ok(data);
                msg.Headers["x-amz-meta-expire"] = DateTime.UtcNow.Subtract(10.Minutes()).ToEpoch().ToInvariantString();
                msg.Headers["x-amz-meta-ttl"]    = "10";
                return(msg);
            })
            .ExpectAtLeastOneCall();
            Assert.IsNull(_client.GetDataInfo("foo/bar", false));
            MockPlug.VerifyAll();
        }
        public void Importer_Items_are_populated_with_request_and_manifest_docs()
        {
            // Arrange
            var dekiApiUri     = new XUri("http://mock/@api/deki");
            var importManifest = new XDoc("manifest")
                                 .Start("item").Attr("dataid", "abc").Elem("foo", "bar").End()
                                 .Start("item").Attr("dataid", "def").Elem("baz", "flip").End();
            var item1Uri       = dekiApiUri.At("foo", "bar", "abc");
            var item2Uri       = dekiApiUri.At("foo", "bar", "def");
            var importResponse = new XDoc("requests")
                                 .Start("request")
                                 .Attr("method", "POST")
                                 .Attr("dataid", "abc")
                                 .Attr("href", item1Uri)
                                 .Start("header").Attr("name", "h_1").Attr("value", "v_1").End()
                                 .Start("header").Attr("name", "h_2").Attr("value", "v_2").End()
                                 .End()
                                 .Start("request")
                                 .Attr("method", "PUT")
                                 .Attr("dataid", "def")
                                 .Attr("href", item2Uri)
                                 .End();
            var mock = MockPlug.Register(dekiApiUri);

            mock.Expect().Verb("POST").Uri(dekiApiUri.At("site", "import").With("relto", "0")).RequestDocument(importManifest).Response(DreamMessage.Ok(importResponse));

            // Act
            var importer = Importer.CreateAsync(Plug.New(dekiApiUri), importManifest, 0, new Result <Importer>()).Wait();

            //Assert
            Assert.IsTrue(mock.WaitAndVerify(TimeSpan.FromSeconds(1)));
            var item1 = importer.Items.Where(x => x.DataId == "abc").FirstOrDefault();

            Assert.IsNotNull(item1);
            Assert.IsNotNull(item1.Manifest);
            Assert.AreEqual(importManifest[".//*[@dataid='abc']"], item1.Manifest);
            Assert.IsNotNull(item1.Request);
            Assert.AreEqual(importResponse[".//*[@dataid='abc']"], item1.Request);
            var item2 = importer.Items.Where(x => x.DataId == "def").FirstOrDefault();

            Assert.IsNotNull(item2);
            Assert.IsNotNull(item2.Manifest);
            Assert.AreEqual(importManifest[".//*[@dataid='def']"], item2.Manifest);
            Assert.IsNotNull(item1.Request);
            Assert.AreEqual(importResponse[".//*[@dataid='def']"], item2.Request);
        }
Exemple #22
0
        public void GetOpensearch()
        {
            // GET:site/opensearch
            // ...

            var p    = Utils.BuildPlugForAdmin();
            var mock = MockPlug.Setup(Utils.Settings.LuceneMockUri)
                       .Verb("GET")
                       .At(new[] { "compact" })
                       .With("wikiid", "default")
                       .With("q", "+(title:\"GetOpensearch\"^2) +type:(wiki document image comment binary)")
                       .Returns(DreamMessage.Ok(new XDoc("documents")))
                       .ExpectCalls(Times.Once());
            var msg = p.At("site", "opensearch").With("q", string.Format("title:\"GetOpensearch\"^2")).With("format", "xml").Get(new Result <DreamMessage>()).Wait();

            Assert.IsTrue(msg.IsSuccessful);
            mock.Verify();
        }
Exemple #23
0
        public void Can_put_file_with_expiration()
        {
            var data = AwsTestHelpers.CreateRandomDocument();

            MockPlug.Setup(AwsTestHelpers.AWS.S3Uri)
            .Verb("PUT")
            .At(_config.RootedPath("foo", "bar"))
            .WithHeader("x-amz-meta-ttl", 1.ToInvariantString())
            .WithBody(data)
            .Returns(DreamMessage.Ok())
            .ExpectAtLeastOneCall();
            MockPlug.Setup(AwsTestHelpers.AWS.S3Uri)
            .Verb("DELETE")
            .At(_config.RootedPath("foo", "bar"))
            .Returns(new DreamMessage(DreamStatus.NoContent, null))
            .ExpectAtLeastOneCall();
            _client.PutFile("foo/bar", AwsTestHelpers.CreateFileHandle(data, 1.Seconds()));
            MockPlug.VerifyAll(10.Seconds());
        }
        public void Instance_is_accessible_on_receiving_transition_push_via_update_license()
        {
            var eventSubscriber  = new XUri("mock://event/subscriber");
            var subForAuthorized = new XDoc("subscription-set")
                                   .Elem("uri.owner", eventSubscriber)
                                   .Start("subscription")
                                   .Attr("id", "1")
                                   .Elem("channel", "event://default/deki/site/license/update")
                                   .Start("recipient")
                                   .Attr("authtoken", Utils.Settings.ApiKey)
                                   .Elem("uri", eventSubscriber)
                                   .End()
                                   .End();
            var result = Utils.Settings.Server.At("pubsub", "subscribers").With("apikey", Utils.Settings.ApiKey).PostAsync(subForAuthorized).Wait();

            Assert.IsTrue(result.IsSuccessful);
            var          mre            = new ManualResetEvent(false);
            DreamMessage settingsResult = null;

            MockPlug.Register(eventSubscriber, (p, v, u, r, r2) => {
                r2.Return(DreamMessage.Ok());
                _log.DebugFormat("got transition event, trying to fetch license");
                settingsResult = Utils.Settings.Server.At("license")
                                 .With("apikey", Utils.Settings.ApiKey)
                                 .WithHeader("X-Deki-Site", "id=default")
                                 .Get(new Result <DreamMessage>()).Wait();
                mre.Set();
            });
            var licenses = new XDoc("licenses")
                           .Start("old-license").Add(LicenseUtil.InactiveLicense).End()
                           .Start("new-license").Add(LicenseUtil.TestLicense);
            var response = Utils.Settings.Server.At("license")
                           .With("apikey", Utils.Settings.ApiKey)
                           .Put(licenses, new Result <DreamMessage>())
                           .Wait();

            Assert.AreEqual(DreamStatus.Ok, response.Status, "unable to update license");
            Assert.IsTrue(mre.WaitOne(10.Seconds()));
            Assert.IsTrue(settingsResult.IsSuccessful);
            var settings = settingsResult.ToDocument();

            Assert.AreEqual("commercial", settings["@type"].AsText.ToLower());
        }
        public void Cache_hit_and_expire()
        {
            Plug            deki         = Plug.New("http://mock/deki");
            AutoMockPlug    autoMock     = MockPlug.Register(deki.Uri);
            Action          expire       = null;
            PageChangeCache cache        = new PageChangeCache(deki, (key, trigger) => expire = trigger);
            DateTime        timestamp    = DateTime.UtcNow;
            XUri            pageUri      = deki.Uri.At("pages", "10").With("redirects", "0");
            XDoc            pageResponse = new XDoc("page")
                                           .Elem("uri.ui", "http://foo.com/@api/deki/pages/10")
                                           .Elem("title", "foo")
                                           .Elem("path", "foo/bar");
            XUri feedUri = deki.Uri
                           .At("pages", "10", "feed")
                           .With("redirects", "0")
                           .With("format", "raw")
                           .With("since", timestamp.Subtract(TimeSpan.FromSeconds(10)).ToString("yyyyMMddHHmmss"));
            XDoc changeResponse = new XDoc("table")
                                  .Start("change")
                                  .Elem("rc_summary", "Two edits")
                                  .Elem("rc_comment", "edit 1")
                                  .Elem("rc_comment", "edit 2")
                                  .End();

            _log.Debug("first get");
            autoMock.Expect("GET", pageUri, (XDoc)null, DreamMessage.Ok(pageResponse));
            autoMock.Expect("GET", feedUri, (XDoc)null, DreamMessage.Ok(changeResponse));
            Assert.IsNotNull(Coroutine.Invoke(cache.GetPageData, (uint)10, "foo", timestamp, CultureInfo.InvariantCulture, (string)null, new Result <PageChangeData>()).Wait());
            Assert.IsTrue(autoMock.WaitAndVerify(10.Seconds()));

            _log.Debug("second get, cache hit");
            autoMock.Reset();
            Assert.IsNotNull(Coroutine.Invoke(cache.GetPageData, (uint)10, "foo", timestamp, CultureInfo.InvariantCulture, (string)null, new Result <PageChangeData>()).Wait());
            Assert.IsTrue(autoMock.WaitAndVerify(2.Seconds()));

            _log.Debug("third get, cache miss");
            autoMock.Reset();
            autoMock.Expect("GET", pageUri, (XDoc)null, DreamMessage.Ok(pageResponse));
            autoMock.Expect("GET", feedUri, (XDoc)null, DreamMessage.Ok(changeResponse));
            expire();
            Assert.IsNotNull(Coroutine.Invoke(cache.GetPageData, (uint)10, "foo", timestamp, CultureInfo.InvariantCulture, (string)null, new Result <PageChangeData>()).Wait());
            Assert.IsTrue(autoMock.WaitAndVerify(10.Seconds()));
        }
Exemple #26
0
        public void Items_are_filtered_by_pageId()
        {
            MockPlug.Setup(_authUri)
            .Verb("POST")
            .WithMessage(m => {
                var t = m.ToText();
                return(t.EqualsInvariant("1,2"));
            })
            .Returns(DreamMessage.Ok(MimeType.TEXT, "1"))
            .ExpectCalls(Times.Once());
            var items = new[] {
                Result(1),
                Result(2),
            };
            var set = LuceneResultFilter.Filter(_authPlug, items, 0, int.MaxValue, new Result <IList <LuceneResult> >()).Wait();

            Assert.AreEqual(1, set.Count);
            Assert.AreEqual(items[1], set[0]);
            MockPlug.VerifyAll(1.Seconds());
        }
Exemple #27
0
        public void Can_read_file()
        {
            var data = AwsTestHelpers.CreateRandomDocument();

            MockPlug.Setup(AwsTestHelpers.AWS.S3Uri)
            .Verb("GET")
            .At(_config.RootedPath("foo", "bar"))
            .Returns(DreamMessage.Ok(data))
            .ExpectAtLeastOneCall();
            var response = _client.GetDataInfo("foo/bar", false);

            MockPlug.VerifyAll();
            Assert.IsFalse(response.IsDirectory);
            var fileinfo = response.AsFileHandle();

            Assert.AreEqual(MimeType.XML.ToString(), fileinfo.MimeType.ToString());
            var data2 = XDocFactory.From(fileinfo.Stream, fileinfo.MimeType);

            Assert.AreEqual(data, data2);
        }
Exemple #28
0
        public void GetOpensearchSuggestions()
        {
            // GET:site/opensearch/suggestions
            // ...

            var p    = Utils.BuildPlugForAdmin();
            var mock = MockPlug.Setup(Utils.Settings.LuceneMockUri)
                       .Verb("GET")
                       .With("wikiid", "default")
                       .With("q", "+(title:/foo/bar ) +type:(wiki document image comment binary) -namespace:\"template_talk\" -namespace:\"help\" -namespace:\"help_talk\"")
                       .With("max", "100")
                       .With("offset", "0")
                       .With("sortBy", "-score")
                       .Returns(DreamMessage.Ok(new XDoc("documents")))
                       .ExpectCalls(Times.Once());
            var msg = p.At("site", "opensearch", "suggestions").With("q", "/foo/bar").Get(new Result <DreamMessage>()).Wait();

            Assert.IsTrue(msg.IsSuccessful);
            mock.Verify();
        }
 public void Instance_expires()
 {
     using (var server = CreateTestServer()) {
         _log.Debug("--- creating multitenant service");
         var host             = server.CreateMultiTenantService(5, 10);
         var p                = host.WithInternalKey().AtLocalHost;
         var eventSubscriber  = new XUri("mock://event/subscriber");
         var subForAuthorized = new XDoc("subscription-set")
                                .Elem("uri.owner", eventSubscriber)
                                .Start("subscription")
                                .Attr("id", "1")
                                .Elem("channel", "event://a/deki/site/stop")
                                .Start("recipient")
                                .Attr("authtoken", Utils.Settings.ApiKey)
                                .Elem("uri", eventSubscriber)
                                .End()
                                .End();
         _log.Debug("--- subscribing to instance shutdown event");
         var result = p.At("pubsub", "subscribers").With("apikey", server.HostInfo.ApiKey).PostAsync(subForAuthorized).Wait();
         Assert.IsTrue(result.IsSuccessful);
         MockPlug.Setup(eventSubscriber).Verb("POST").ExpectCalls(Times.Once());
         Assert.AreEqual(0, p.At("host").Get().ToDocument()["tenant"].ListLength);
         _log.Debug("--- gettings settings/forcing site init");
         Assert.IsTrue(p.At("site", "settings").WithHeader("X-Deki-Site", "id=a").Get().IsSuccessful);
         var msg = p.At("host").Get(new Result <DreamMessage>()).Wait();
         Assert.AreEqual(DreamStatus.Ok, msg.Status, "Failed to retrieve running instances");
         var tenants = msg.ToDocument();
         var tenant  = tenants["tenant"];
         Assert.AreEqual(1, tenant.ListLength, "Unexpected instance(s):\r\n" + tenants.ToPrettyString());
         Assert.AreEqual("a", tenant["@wikiid"].AsText ?? String.Empty, "Unexpected wiki id");
         var status = tenant["@status"].AsText ?? "";
         Assert.Contains(status, new[] { "running", "starting_services" }, "Unexpected status: " + status);
         _log.Debug("---- wait for expire");
         MockPlug.VerifyAll(30.Seconds());
         Assert.IsTrue(
             p.At("host").Get(new Result <DreamMessage>()).Wait().ToDocument()["tenant[@wikiid='a']"].IsEmpty,
             "instance didn't time out"
             );
         _log.Debug("----- instance has shut down");
     }
 }
        public void Importer_hits_import_feature_with_reltopath()
        {
            // Arrange
            XUri dekiApiUri     = new XUri("http://mock/@api/deki");
            XDoc importManifest = new XDoc("manifest");
            XDoc importResponse = new XDoc("requests")
                                  .Start("request").Attr("dataid", "a").End()
                                  .Start("request").Attr("dataid", "b").End()
                                  .Start("request").Attr("dataid", "c").End();
            AutoMockPlug mock = MockPlug.Register(dekiApiUri);

            mock.Expect("POST", dekiApiUri.At("site", "import").With("reltopath", "/foo/bar"), importManifest, DreamMessage.Ok(importResponse));

            // Act
            Importer importer = Importer.CreateAsync(Plug.New(dekiApiUri), importManifest, "/foo/bar", new Result <Importer>()).Wait();

            //Assert
            Assert.IsTrue(mock.WaitAndVerify(TimeSpan.FromSeconds(1)));
            Assert.AreEqual(importManifest, importer.Manifest);
            Assert.AreEqual(new[] { "a", "b", "c" }, importer.Items.Select(x => x.DataId).ToArray());
        }
Exemple #31
0
 public void Register(XUri uri, MockPlug.MockInvokeDelegate invokeDelegate)
 {
     lock(_registry) {
         if(_registry.ContainsKey(uri)) {
             throw new ArgumentException("the uri already has a mock registered");
         }
         _registry.Add(uri, invokeDelegate);
         _map.Add(uri, uri);
     }
 }
Exemple #32
0
 public void Register(MockPlug.IMockInvokee invokee)
 {
     lock(_registry) {
         if(_registry.ContainsKey(invokee.Uri)) {
             throw new ArgumentException("the uri already has a mock registered");
         }
         _registry.Add(invokee.Uri, invokee);
         _map.Add(invokee.Uri, invokee);
     }
 }