[Libreoffice-commits] core.git: 2 commits - vcl/inc vcl/source vcl/workben

Caolán McNamara caolanm at redhat.com
Fri Oct 16 09:17:08 PDT 2015


 dev/null                         |binary
 vcl/inc/svdata.hxx               |    1 
 vcl/source/app/svapp.cxx         |   53 +++++++++++++++++++++++++--------------
 vcl/workben/README.eventtesting  |   18 +++++++++++--
 vcl/workben/eventtesting.impress |binary
 vcl/workben/eventtesting.writer  |binary
 6 files changed, 51 insertions(+), 21 deletions(-)

New commits:
commit 639854d77bafb19bda031505daad038916a11593
Author: Caolán McNamara <caolanm at redhat.com>
Date:   Fri Oct 16 16:21:03 2015 +0100

    afl-eventtesting: add a realistic impress workout
    
    Change-Id: Ie40071dd91e28131ddb62c03834fda097a1d90ea

diff --git a/vcl/source/app/svapp.cxx b/vcl/source/app/svapp.cxx
index 14b34c2a..fe4fb71 100644
--- a/vcl/source/app/svapp.cxx
+++ b/vcl/source/app/svapp.cxx
@@ -434,7 +434,7 @@ void Application::Execute()
     {
         if (GetCommandLineParam(i) == "--eventtesting")
         {
-            pSVData->maAppData.mnEventTestLimit = 10;
+            pSVData->maAppData.mnEventTestLimit = 50;
             pSVData->maAppData.mpEventTestingIdle = new Idle("eventtesting");
             pSVData->maAppData.mpEventTestingIdle->SetIdleHdl(LINK(&(pSVData->maAppData), ImplSVAppData, VclEventTestingHdl));
             pSVData->maAppData.mpEventTestingIdle->SetPriority(SchedulerPriority::MEDIUM);
diff --git a/vcl/workben/README.eventtesting b/vcl/workben/README.eventtesting
index 79472cd..963bed1 100644
--- a/vcl/workben/README.eventtesting
+++ b/vcl/workben/README.eventtesting
@@ -2,11 +2,23 @@ Notes on experimental afl driven ui fuzzing
 
 only keyboard events for now
 
-vcl/workben/eventtesting is just serialized "hello" + ctrl+a + ctrl+b keystrokes to get things started
+vcl/workben/eventtesting.writer is just serialized "hello" + ctrl+a + ctrl+b
+keystrokes to get things started
 
-currently an arbitrary limit of 10 keystrokes before application quits in
+vcl/workben/eventtesting.impress is a bit more involved and inserts text,
+a new slide via the menu, bullets and undos for all of that
+
+currently an arbitrary limit of 50 keystrokes before application quits in
 order to initially explore that shallow space
 
+writer:
 Xnest :1
-cp vcl/workben/eventtesting .
+cp vcl/workben/eventtesting.writer eventtesting
 afl-fuzz -f eventtesting -t 10000 -i ~/fuzz/in.vcl -o ~/fuzz/out.vcl -d -T vcl -m 50000000 instdir/program/soffice.bin --nologo --writer --eventtesting --norestore --display :1
+
+impress:
+Xnest :1
+cp vcl/workben/eventtesting.impress eventtesting
+afl-fuzz -f eventtesting -t 10000 -i ~/fuzz/in.vcl -o ~/fuzz/out.vcl -d -T vcl -m 50000000 instdir/program/soffice.bin --nologo --impress --eventtesting --norestore --display :1
+
+This also works with --headless and no --display entry and thus no Xnest required
diff --git a/vcl/workben/eventtesting.impress b/vcl/workben/eventtesting.impress
new file mode 100644
index 0000000..ac79918
Binary files /dev/null and b/vcl/workben/eventtesting.impress differ
diff --git a/vcl/workben/eventtesting b/vcl/workben/eventtesting.writer
similarity index 100%
rename from vcl/workben/eventtesting
rename to vcl/workben/eventtesting.writer
commit 6a627d6c5a94dbfae38bc1a6b1f716df19e47fd1
Author: Caolán McNamara <caolanm at redhat.com>
Date:   Fri Oct 16 15:53:32 2015 +0100

    afl-eventtesting: tweak key event injection
    
    lowest idles have a minimum time out associated
    with them. So just post events and use higher idle
    time priority as launcher for min-wait-for-opportune
    time to start inserting
    
    Change-Id: I8088e142199e880b198da11473558b4bd972a8d9

diff --git a/vcl/inc/svdata.hxx b/vcl/inc/svdata.hxx
index 0559cd8..0c850c03 100644
--- a/vcl/inc/svdata.hxx
+++ b/vcl/inc/svdata.hxx
@@ -163,6 +163,7 @@ struct ImplSVAppData
 
     DECL_STATIC_LINK_TYPED(ImplSVAppData, ImplQuitMsg, void*, void);
     DECL_STATIC_LINK_TYPED(ImplSVAppData, ImplEndAllDialogsMsg, void*, void);
+    DECL_STATIC_LINK_TYPED(ImplSVAppData, ImplVclEventTestingHdl, void*, void);
     DECL_LINK_TYPED(VclEventTestingHdl, Idle*, void);
 };
 
diff --git a/vcl/source/app/svapp.cxx b/vcl/source/app/svapp.cxx
index 1d92469..14b34c2a 100644
--- a/vcl/source/app/svapp.cxx
+++ b/vcl/source/app/svapp.cxx
@@ -347,9 +347,6 @@ namespace
 {
     bool InjectKeyEvent(SvStream& rStream)
     {
-        if (Application::AnyInput())
-            return false;
-
         VclPtr<vcl::Window> xWin(Application::GetFirstTopLevelWindow());
         while (xWin)
         {
@@ -360,6 +357,17 @@ namespace
         if (!xWin)
             return false;
 
+        // skip the first available cycle and insert on the next one when we
+        // are trying the initial event, flagged by a triggered but undeleted
+        // mpEventTestingIdle
+        ImplSVData* pSVData = ImplGetSVData();
+        if (pSVData->maAppData.mpEventTestingIdle)
+        {
+            delete pSVData->maAppData.mpEventTestingIdle;
+            pSVData->maAppData.mpEventTestingIdle = nullptr;
+            return false;
+        }
+
         SalKeyEvent aKeyEvent;
         aKeyEvent.mnTime = 0;
         rStream.ReadUInt16(aKeyEvent.mnCode);
@@ -375,7 +383,6 @@ namespace
 
     void CloseDialogsAndQuit()
     {
-        Scheduler::ProcessTaskScheduling(false);
         Application::EndAllDialogs();
         Application::Quit();
     }
@@ -383,26 +390,36 @@ namespace
 
 IMPL_LINK_NOARG_TYPED(ImplSVAppData, VclEventTestingHdl, Idle *, void)
 {
-    SAL_INFO("vcl.eventtesting", "EventTestLimit is " << mnEventTestLimit);
-    if (mnEventTestLimit == 0)
+    if (Application::AnyInput())
     {
-        delete mpEventTestInput;
-        delete mpEventTestingIdle;
-        SAL_INFO("vcl.eventtesting", "Event Limit reached, exiting" << mnEventTestLimit);
+        mpEventTestingIdle->Start();
+    }
+    else
+    {
+        Application::PostUserEvent( LINK( NULL, ImplSVAppData, ImplVclEventTestingHdl ) );
+    }
+}
+
+IMPL_STATIC_LINK_NOARG_TYPED( ImplSVAppData, ImplVclEventTestingHdl, void*, void )
+{
+    ImplSVData* pSVData = ImplGetSVData();
+    SAL_INFO("vcl.eventtesting", "EventTestLimit is " << pSVData->maAppData.mnEventTestLimit);
+    if (pSVData->maAppData.mnEventTestLimit == 0)
+    {
+        delete pSVData->maAppData.mpEventTestInput;
+        SAL_INFO("vcl.eventtesting", "Event Limit reached, exiting" << pSVData->maAppData.mnEventTestLimit);
         CloseDialogsAndQuit();
     }
     else
     {
-        Scheduler::ProcessTaskScheduling(false);
-        if (InjectKeyEvent(*mpEventTestInput))
-            --mnEventTestLimit;
-        if (!mpEventTestInput->good())
+        if (InjectKeyEvent(*pSVData->maAppData.mpEventTestInput))
+            --pSVData->maAppData.mnEventTestLimit;
+        if (!pSVData->maAppData.mpEventTestInput->good())
         {
             SAL_INFO("vcl.eventtesting", "Event Input exhausted, exit next cycle");
-            mnEventTestLimit = 0;
+            pSVData->maAppData.mnEventTestLimit = 0;
         }
-        Scheduler::ProcessTaskScheduling(false);
-        mpEventTestingIdle->Start();
+        Application::PostUserEvent( LINK( NULL, ImplSVAppData, ImplVclEventTestingHdl ) );
     }
 }
 
@@ -420,7 +437,7 @@ void Application::Execute()
             pSVData->maAppData.mnEventTestLimit = 10;
             pSVData->maAppData.mpEventTestingIdle = new Idle("eventtesting");
             pSVData->maAppData.mpEventTestingIdle->SetIdleHdl(LINK(&(pSVData->maAppData), ImplSVAppData, VclEventTestingHdl));
-            pSVData->maAppData.mpEventTestingIdle->SetPriority(SchedulerPriority::LOWEST);
+            pSVData->maAppData.mpEventTestingIdle->SetPriority(SchedulerPriority::MEDIUM);
             pSVData->maAppData.mpEventTestInput = new SvFileStream("eventtesting", StreamMode::READ);
             pSVData->maAppData.mpEventTestingIdle->Start();
             break;


More information about the Libreoffice-commits mailing list