Added: samza/site/learn/documentation/latest/api/test-framework.html
URL: 
http://svn.apache.org/viewvc/samza/site/learn/documentation/latest/api/test-framework.html?rev=1852769&view=auto
==============================================================================
--- samza/site/learn/documentation/latest/api/test-framework.html (added)
+++ samza/site/learn/documentation/latest/api/test-framework.html Fri Feb  1 
19:39:34 2019
@@ -0,0 +1,967 @@
+<!DOCTYPE html>
+<!--
+   Licensed to the Apache Software Foundation (ASF) under one or more
+   contributor license agreements.  See the NOTICE file distributed with
+   this work for additional information regarding copyright ownership.
+   The ASF licenses this file to You under the Apache License, Version 2.0
+   (the "License"); you may not use this file except in compliance with
+   the License.  You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+-->
+<html lang="en">
+
+<head>
+  <meta http-equiv="X-UA-Compatible" content="IE=edge">
+  <meta name="viewport" content="width=device-width, initial-scale=1, 
shrink-to-fit=no">
+  <meta charset="utf-8">
+  <title>Samza - Testing Samza jobs: Integration Framework</title>
+  <link rel="apple-touch-icon-precomposed" sizes="57x57" 
href="/img/favicon/apple-touch-icon-57x57.png" />
+  <link rel="apple-touch-icon-precomposed" sizes="114x114" 
href="/img/favicon/apple-touch-icon-114x114.png" />
+  <link rel="apple-touch-icon-precomposed" sizes="72x72" 
href="/img/favicon/apple-touch-icon-72x72.png" />
+  <link rel="apple-touch-icon-precomposed" sizes="144x144" 
href="/img/favicon/apple-touch-icon-144x144.png" />
+  <link rel="apple-touch-icon-precomposed" sizes="60x60" 
href="/img/favicon/apple-touch-icon-60x60.png" />
+  <link rel="apple-touch-icon-precomposed" sizes="120x120" 
href="/img/favicon/apple-touch-icon-120x120.png" />
+  <link rel="apple-touch-icon-precomposed" sizes="76x76" 
href="/img/favicon/apple-touch-icon-76x76.png" />
+  <link rel="apple-touch-icon-precomposed" sizes="152x152" 
href="/img/favicon/apple-touch-icon-152x152.png" />
+  <link rel="icon" type="image/png" href="/img/favicon/favicon-196x196.png" 
sizes="196x196" />
+  <link rel="icon" type="image/png" href="/img/favicon/favicon-96x96.png" 
sizes="96x96" />
+  <link rel="icon" type="image/png" href="/img/favicon/favicon-32x32.png" 
sizes="32x32" />
+  <link rel="icon" type="image/png" href="/img/favicon/favicon-16x16.png" 
sizes="16x16" />
+  <link rel="icon" type="image/png" href="/img/favicon/favicon-128.png" 
sizes="128x128" />
+  <meta name="application-name" content="https://samza.apache.org"; />
+  <meta name="msapplication-TileColor" content="#FFFFFF" />
+  <meta name="msapplication-TileImage" 
content="/img/favicon/mstile-144x144.png" />
+  <meta name="msapplication-square70x70logo" 
content="/img/favicon/mstile-70x70.png" />
+  <meta name="msapplication-square150x150logo" 
content="/img/favicon/mstile-150x150.png" />
+  <meta name="msapplication-wide310x150logo" 
content="/img/favicon/mstile-310x150.png" />
+  <meta name="msapplication-square310x310logo" 
content="/img/favicon/mstile-310x310.png" />
+  <link href="/css/ionicons.min.css" rel="stylesheet">
+  <link href="/css/google-fonts.css" rel="stylesheet">
+  <link href="/css/syntax.css" rel="stylesheet"/>
+  <link rel="stylesheet" href="/css/main.new.css" />
+</head>
+
+<body class="page">
+  <!--
+   Licensed to the Apache Software Foundation (ASF) under one or more
+   contributor license agreements.  See the NOTICE file distributed with
+   this work for additional information regarding copyright ownership.
+   The ASF licenses this file to You under the Apache License, Version 2.0
+   (the "License"); you may not use this file except in compliance with
+   the License.  You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+-->
+<div class="main-navigation" data-plugin="menu">
+  <div class="main-navigation__toggle" data-menu-closed>
+    <i class="icon ion-md-menu"></i>
+  </div>
+  <div class="main-navigation__toggle main-navigation__toggle--opened" 
data-menu-opened>
+    <i class="icon ion-md-close"></i>
+  </div>
+  <div class="main-navigation__inner">
+    <div class="main-navigation__logo">
+      <a href="/">
+        <img class="main-navigation__logo-img" src="/img/samza-logo.png" 
srcset="/img/samza-logo.png 1x, /img/samza-l...@2x.png 2x"
+          alt="Samza Logo" />
+      </a>
+    </div>
+    <div class="main-navigation__items" data-menu-opened>
+      <a class="main-navigation__item" href="/">Home</a>
+      <a class="main-navigation__item" 
href="/learn/documentation/latest/core-concepts/core-concepts.html">Docs</a>
+      <a class="main-navigation__item" href="/powered-by/">Powered By</a>
+      <a class="main-navigation__item" href="/startup/download/">Downloads</a>
+      <a class="main-navigation__item" href="/blog/">Blog</a>
+      <div class="main-navigation__item main-navigation__item--group">
+        <div class="main-navigation__item-group-title">
+          Community
+          <i class="icon ion-md-arrow-dropdown"></i>
+        </div>
+        <div class="main-navigation__item-group-list">
+          <a class="main-navigation__item" 
href="/community/contact-us.html">Contact Us</a>
+          <a class="main-navigation__item" 
href="/contribute/contributors-corner.html">Contributor's Corner</a>
+          <a class="main-navigation__item" 
href="/community/committers.html">PMC Members and committers</a>
+          <a class="main-navigation__item" href="/meetups/">Talks and 
Meetups</a>
+        </div>
+      </div>
+    </div>
+  </div>
+</div>
+
+  <div class="container">
+      <div class="container__toggle">
+        <i class="icon ion-md-arrow-dropleft-circle 
container__toggle-icon"></i>
+        <i class="icon ion-md-arrow-dropright-circle container__toggle-icon 
container__toggle-icon--opened"></i>
+      </div>
+      
+      <!-- There is only one menu, but made it as a no-output collection to 
grab data only -->
+      
+        <!--
+   Licensed to the Apache Software Foundation (ASF) under one or more
+   contributor license agreements.  See the NOTICE file distributed with
+   this work for additional information regarding copyright ownership.
+   The ASF licenses this file to You under the Apache License, Version 2.0
+   (the "License"); you may not use this file except in compliance with
+   the License.  You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+-->
+
+
+<div class="side-navigation">
+
+  
+
+    
+
+    
+    <!-- Start Group -->
+    
+    <div class="side-navigation__group side-navigation__group--has-nested" 
data-plugin="sub-menu" 
data-sub-menu-show-class="side-navigation__group--has-nested-visible">
+    
+
+    <!-- Make menu_title, and start items group if needed -->
+    
+      <div class="side-navigation__group-title">
+        <i class="side-navigation__group-title-icon icon 
ion-md-arrow-dropdown"></i>
+        Getting Started
+      </div>
+      <div class="side-navigation__group-items " data-sub-menu >
+    
+
+    <!-- Handle sub navigation items from data -->
+    
+      
+        
+      <a class="side-navigation__group-item" data-match-active="" 
href="/startup/quick-start/latest/">QuickStart</a>
+      
+        
+      <a class="side-navigation__group-item" data-match-active="" 
href="/startup/code-examples/latest/">Code Examples</a>
+      
+
+    
+
+    <!-- Handle sub nagivation from site collections -->
+    
+
+    <!-- Close sub nav group -->
+    
+      </div>
+    
+
+    <!-- Close menu group -->
+    </div>
+
+  
+
+    
+
+    
+    <!-- Start Group -->
+    
+    <div class="side-navigation__group side-navigation__group--has-nested" 
data-plugin="sub-menu" 
data-sub-menu-show-class="side-navigation__group--has-nested-visible">
+    
+
+    <!-- Make menu_title, and start items group if needed -->
+    
+      <div class="side-navigation__group-title">
+        <i class="side-navigation__group-title-icon icon 
ion-md-arrow-dropdown"></i>
+        Documentation
+      </div>
+      <div class="side-navigation__group-items 
side-navigation__group-has-submenus" data-sub-menu 
data-documentation="/learn/documentation/latest/">
+    
+
+    <!-- Handle sub navigation items from data -->
+    
+
+    <!-- Handle sub nagivation from site collections -->
+    
+
+    <!-- Close sub nav group -->
+    
+      </div>
+    
+
+    <!-- Close menu group -->
+    </div>
+
+  
+
+    
+
+    
+    <!-- Start Group -->
+    
+    <div class="side-navigation__group side-navigation__group--has-nested" 
data-plugin="sub-menu" 
data-sub-menu-show-class="side-navigation__group--has-nested-visible">
+    
+
+    <!-- Make menu_title, and start items group if needed -->
+    
+      <div class="side-navigation__group-title">
+        <i class="side-navigation__group-title-icon icon 
ion-md-arrow-dropdown"></i>
+        Releases
+      </div>
+      <div class="side-navigation__group-items " data-sub-menu >
+    
+
+    <!-- Handle sub navigation items from data -->
+    
+      
+        
+      <a class="side-navigation__group-item" data-match-active="" 
href="/releases/1.0.0">1.0.0</a>
+      
+        
+      <a class="side-navigation__group-item" data-match-active="" 
href="/releases/0.14">0.14</a>
+      
+        
+      <a class="side-navigation__group-item" data-match-active="" 
href="/releases/0.13">0.13</a>
+      
+        
+      <a class="side-navigation__group-item" data-match-active="" 
href="/releases/0.12">0.12</a>
+      
+        
+      <a class="side-navigation__group-item" data-match-active="" 
href="/releases/0.11">0.11</a>
+      
+        
+      <a class="side-navigation__group-item" data-match-active="" 
href="/releases/0.10">0.10</a>
+      
+
+    
+
+    <!-- Handle sub nagivation from site collections -->
+    
+
+    <!-- Close sub nav group -->
+    
+      </div>
+    
+
+    <!-- Close menu group -->
+    </div>
+
+  
+
+    
+
+    
+    <!-- Start Group -->
+    
+    <div class="side-navigation__group">
+    
+
+    <!-- Make menu_title, and start items group if needed -->
+    
+      <a class="side-navigation__group-title" data-plugin="top-menu" 
data-match-active="" href="/blog/">
+        Blog
+      </a>
+    
+
+    <!-- Handle sub navigation items from data -->
+    
+
+    <!-- Handle sub nagivation from site collections -->
+    
+
+    <!-- Close sub nav group -->
+    
+
+    <!-- Close menu group -->
+    </div>
+
+  
+
+    
+
+    
+    <!-- Start Group -->
+    
+    <div class="side-navigation__group side-navigation__group--has-nested" 
data-plugin="sub-menu" 
data-sub-menu-show-class="side-navigation__group--has-nested-visible">
+    
+
+    <!-- Make menu_title, and start items group if needed -->
+    
+      <div class="side-navigation__group-title">
+        <i class="side-navigation__group-title-icon icon 
ion-md-arrow-dropdown"></i>
+        Community
+      </div>
+      <div class="side-navigation__group-items " data-sub-menu >
+    
+
+    <!-- Handle sub navigation items from data -->
+    
+      
+        
+      <a class="side-navigation__group-item" data-match-active="" 
href="/community/contact-us.html">Contact Us</a>
+      
+        
+      <a class="side-navigation__group-item" data-match-active="" 
href="/contribute/contributors-corner.html">Contributor's Corner</a>
+      
+        
+      <a class="side-navigation__group-item" data-match-active="" 
href="/contribute/enhancement-proposal.html">Enhancement Proposal</a>
+      
+        
+      <a class="side-navigation__group-item" data-match-active="" 
href="/community/committers.html">PMC members & Committers</a>
+      
+        
+      <a class="side-navigation__group-item" data-match-active="" 
href="/meetups/">Talks and Meetups</a>
+      
+
+    
+
+    <!-- Handle sub nagivation from site collections -->
+    
+
+    <!-- Close sub nav group -->
+    
+      </div>
+    
+
+    <!-- Close menu group -->
+    </div>
+
+  
+
+    
+
+    
+    <!-- Start Group -->
+    
+    <div class="side-navigation__group side-navigation__group--has-nested" 
data-plugin="sub-menu" 
data-sub-menu-show-class="side-navigation__group--has-nested-visible">
+    
+
+    <!-- Make menu_title, and start items group if needed -->
+    
+      <div class="side-navigation__group-title">
+        <i class="side-navigation__group-title-icon icon 
ion-md-arrow-dropdown"></i>
+        Case Studies
+      </div>
+      <div class="side-navigation__group-items " data-sub-menu >
+    
+
+    <!-- Handle sub navigation items from data -->
+    
+      
+        
+      <a class="side-navigation__group-item" data-match-active="exact" 
href="/case-studies/">View All</a>
+      
+        
+          <hr>
+          
+
+    
+
+    <!-- Handle sub nagivation from site collections -->
+    
+
+      
+
+      
+
+      
+
+      
+        
+          
+        
+
+        
+        
+        
+
+        
+
+        
+
+        
+
+      <a class="side-navigation__group-item" href="/case-studies/ebay" 
data-match-active="">eBay</a>
+      
+        
+          
+        
+          
+        
+          
+        
+
+        
+        
+        
+
+        
+
+        
+
+        
+
+      <a class="side-navigation__group-item" href="/case-studies/tripadvisor" 
data-match-active="">TripAdvisor</a>
+      
+        
+          
+        
+
+        
+        
+        
+
+        
+
+        
+
+        
+
+      <a class="side-navigation__group-item" href="/case-studies/slack" 
data-match-active="">Slack</a>
+      
+        
+
+        
+        
+        
+
+        
+
+        
+
+        
+
+      <a class="side-navigation__group-item" href="/case-studies/optimizely" 
data-match-active="">Optimizely</a>
+      
+        
+
+        
+        
+        
+
+        
+
+        
+
+        
+
+      <a class="side-navigation__group-item" href="/case-studies/redfin" 
data-match-active="">Redfin</a>
+      
+        
+
+        
+        
+        
+
+        
+
+        
+
+        
+
+      <a class="side-navigation__group-item" href="/case-studies/linkedin" 
data-match-active="">LinkedIn</a>
+      
+        
+          
+        
+          
+        
+          
+
+    
+
+    <!-- Close sub nav group -->
+    
+      </div>
+    
+
+    <!-- Close menu group -->
+    </div>
+
+  
+
+</div>
+
+      
+      
+      <div class="section">
+        <div class="content">
+          
+          <h2>Testing Samza jobs: Integration Framework</h2>
+          
+
+          
+
+          <div class="releases-list-container">
+
+            <span>Releases</span>
+
+            <ul class="releases-list" data-releases-list>
+              <li class="hide"><a 
href="/learn/documentation/latest/api/test-framework">latest</a></li>
+              
+              
+              
+
+              <li class="hide"><a 
href="/learn/documentation/0.14/api/test-framework">0.14</a></li>
+
+              
+
+              <li class="hide"><a 
href="/learn/documentation/0.13/api/test-framework">0.13</a></li>
+
+              
+
+              <li class="hide"><a 
href="/learn/documentation/0.12/api/test-framework">0.12</a></li>
+
+              
+
+              <li class="hide"><a 
href="/learn/documentation/0.11/api/test-framework">0.11</a></li>
+
+              
+
+              <li class="hide"><a 
href="/learn/documentation/0.10/api/test-framework">0.10</a></li>
+
+              
+
+              <li class="hide"><a 
href="/learn/documentation/1.0/api/test-framework">1.0</a></li>
+
+              
+
+              <li class="hide"><a 
href="/learn/documentation/0.9/api/test-framework">0.9</a></li>
+
+              
+
+              <li class="hide"><a 
href="/learn/documentation/0.8/api/test-framework">0.8</a></li>
+
+              
+
+              <li class="hide"><a 
href="/learn/documentation/0.7/api/test-framework">0.7</a></li>
+
+              
+
+              <li class="hide"><a 
href="/learn/documentation/0.7.0/api/test-framework">0.7.0</a></li>
+
+              
+
+              <li class="hide"><a 
href="/learn/documentation/-1000/api/test-framework">-1000</a></li>
+
+              
+
+            </ul>
+
+          </div>
+
+          <hr class="releases-list-divider">
+
+          
+    
+          <!--
+   Licensed to the Apache Software Foundation (ASF) under one or more
+   contributor license agreements.  See the NOTICE file distributed with
+   this work for additional information regarding copyright ownership.
+   The ASF licenses this file to You under the Apache License, Version 2.0
+   (the "License"); you may not use this file except in compliance with
+   the License.  You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+-->
+
+<h1 id="what-is-samzas-integration-test-framework">What is Samza&rsquo;s 
Integration Test Framework ?</h1>
+
+<ul>
+<li>  Samza provides an Integration framework which allows you to test 
applications by quickly running them against a few messages and asserting on 
expected results. This alleviates the need to set up dependencies like Kafka, 
Yarn, Zookeeper to test your Samza applications</li>
+<li>  Integration Framework can test the new StreamDSL (StreamApplication) and 
Task APIs (TaskApplication) as well as supports testing for legacy low level 
(StreamTask and AsyncStreamTask) samza jobs</li>
+</ul>
+
+<h1 id="some-prerequisite-information">Some Prerequisite Information</h1>
+
+<ol>
+<li> Your Samza job will be executed in single container mode and framework 
will set all the required configs for you to run your job (more on configs 
later)</li>
+<li> Your Samza job will read from a special kind of bounded streams 
introduced in the next section, containing finite number of messages to make 
testing feasible.</li>
+</ol>
+
+<h1 id="key-concepts">Key Concepts</h1>
+
+<h2 id="introduction-to-in-memory-system-and-streams">Introduction to In 
Memory System and Streams</h2>
+
+<ol>
+<li> With Samza 1.0 we now get the feature of using streams that are 
maintained in memory using an in memory system.</li>
+<li> These in memory streams are described by InMemoryInputDescriptor, 
InMemoryOutputDescriptor and the corresponding system is described by 
InMemorySystemDescriptors</li>
+<li> These streams are like Kafka streams but there lifecycle is maintained in 
memory which means they get initialized with your job, are available throughout 
its run and are destroyed after the test ends . </li>
+</ol>
+
+<h2 id="introduction-to-testrunner-api">Introduction to TestRunner api</h2>
+
+<ol>
+<li> Samza 1.0 introduces a new TestRunner api to set up a test for Samza job, 
add configs, configure input/output streams, run the job in testing mode</li>
+<li> TestRunner also provides utilities to consume contents of a stream once 
the test has ran successfully</li>
+<li> TestRunner does basic config setup for you by default, you have 
flexibility to change these default configs if required</li>
+<li> TestRunner supports stateless and stateful job testing. TestRunner works 
with InMemoryTables and RocksDB Tables </li>
+</ol>
+
+<h2 id="how-to-write-test">How To Write Test</h2>
+
+<p>For example, here is a StreamApplication that validates and decorates page 
views with viewer’s profile information.</p>
+
+<figure class="highlight"><pre><code class="language-java" 
data-lang="java"><span></span>    
+    <span class="kd">class</span> <span 
class="nc">BadPageViewFilterApplication</span> <span 
class="kd">implements</span> <span class="n">StreamApplication</span> <span 
class="o">{</span>
+        <span class="nd">@Override</span>
+        <span class="kd">public</span> <span class="kt">void</span> <span 
class="nf">describe</span><span class="o">(</span><span 
class="n">StreamApplicationDescriptor</span> <span 
class="n">appDesc</span><span class="o">)</span> <span class="o">{</span> <span 
class="err">…</span> <span class="o">}</span>
+    <span class="o">}</span>
+    
+    <span class="kd">public</span> <span class="kd">class</span> <span 
class="nc">BadPageViewFilter</span> <span class="kd">implements</span> <span 
class="n">StreamApplication</span> <span class="o">{</span>
+      <span class="nd">@Override</span>
+      <span class="kd">public</span> <span class="kt">void</span> <span 
class="nf">describe</span><span class="o">(</span><span 
class="n">StreamApplicationDescriptor</span> <span 
class="n">appDesc</span><span class="o">)</span> <span class="o">{</span>
+        <span class="n">KafkaSystemDescriptor</span> <span 
class="n">kafka</span> <span class="o">=</span> <span class="k">new</span> 
<span class="n">KafkaSystemDescriptor</span><span class="o">(</span><span 
class="s">&quot;test&quot;</span><span class="o">);</span>
+        <span class="n">InputDescriptor</span><span class="o">&lt;</span><span 
class="n">PageView</span><span class="o">&gt;</span> <span 
class="n">pageViewInput</span> <span class="o">=</span> <span 
class="n">kafka</span><span class="o">.</span><span 
class="na">getInputDescriptor</span><span class="o">(</span><span 
class="err">“</span><span class="n">page</span><span class="o">-</span><span 
class="n">views</span><span class="err">”</span><span class="o">,</span> 
<span class="k">new</span> <span class="n">JsonSerdeV2</span><span 
class="o">&lt;&gt;(</span><span class="n">PageView</span><span 
class="o">.</span><span class="na">class</span><span class="o">));</span>
+        <span class="n">OutputDescriptor</span><span 
class="o">&lt;</span><span class="n">DecoratedPageView</span><span 
class="o">&gt;</span> <span class="n">outputPageViews</span> <span 
class="o">=</span> <span class="n">kafka</span><span class="o">.</span><span 
class="na">getOutputDescriptor</span><span class="o">(</span> <span 
class="err">“</span><span class="n">decorated</span><span 
class="o">-</span><span class="n">page</span><span class="o">-</span><span 
class="n">views</span><span class="err">”</span><span class="o">,</span> 
<span class="k">new</span> <span class="n">JsonSerdeV2</span><span 
class="o">&lt;&gt;(</span><span class="n">DecoratedPageView</span><span 
class="o">.</span><span class="na">class</span><span class="o">));</span>    
+        <span class="n">MessageStream</span><span class="o">&lt;</span><span 
class="n">PageView</span><span class="o">&gt;</span> <span 
class="n">pageViews</span> <span class="o">=</span> <span 
class="n">appDesc</span><span class="o">.</span><span 
class="na">getInputStream</span><span class="o">(</span><span 
class="n">pageViewInput</span><span class="o">);</span>
+        <span class="n">pageViews</span><span class="o">.</span><span 
class="na">filter</span><span class="o">(</span><span 
class="k">this</span><span class="o">::</span><span 
class="n">isValidPageView</span><span class="o">)</span>
+            <span class="o">.</span><span class="na">map</span><span 
class="o">(</span><span class="k">this</span><span class="o">::</span><span 
class="n">addProfileInformation</span><span class="o">)</span>
+            <span class="o">.</span><span class="na">sendTo</span><span 
class="o">(</span><span class="n">appDesc</span><span class="o">.</span><span 
class="na">getOutputStream</span><span class="o">(</span><span 
class="n">outputPageViews</span><span class="o">));</span>
+      <span class="o">}</span>
+    <span class="o">}</span>
+    </code></pre></figure>
+
+<p>There are 4 simple steps to write a test for your stream processing logic 
and assert on the output</p>
+
+<h2 id="step-1-construct-an-inmemorysystem">Step 1: Construct an 
InMemorySystem</h2>
+
+<p>In the example we are writing we use a Kafka system called 
&ldquo;test&rdquo;, so we will configure an equivalent in memory system (name 
should be the same as used in job) as shown below:   </p>
+
+<figure class="highlight"><pre><code class="language-java" 
data-lang="java"><span></span>    
+    <span class="n">InMemorySystemDescriptor</span> <span 
class="n">inMemory</span> <span class="o">=</span> <span class="k">new</span> 
<span class="n">InMemorySystemDescriptor</span><span class="o">(</span><span 
class="s">&quot;test&quot;</span><span class="o">);</span></code></pre></figure>
+
+<h2 id="step-2-initialize-your-input-and-output-streams">Step 2:  Initialize 
your input and output streams</h2>
+
+<ol>
+<li> TestRunner API uses a special kind of input and output streams called in 
memory streams which are easy to define and write assertions on.</li>
+<li> Data in these streams are maintained in memory hence they always use a 
NoOpSerde&lt;&gt;</li>
+<li> You need to configure all the stream that your job reads/writes to. </li>
+<li> You can obtain handle of these streams from the system we initialized in 
previous step</li>
+<li> We have two choices when we configure a stream type </li>
+</ol>
+
+<p>Input Stream described by InMemoryInputDescriptor, these streams need to be 
initialized with messages (data), since your job reads this.</p>
+
+<figure class="highlight"><pre><code class="language-java" 
data-lang="java"><span></span>     
+     <span class="n">InMemoryInputDescriptor</span><span 
class="o">&lt;</span><span class="n">PageView</span><span class="o">&gt;</span> 
<span class="n">pageViewInput</span> <span class="o">=</span> <span 
class="n">inMemory</span><span class="o">.</span><span 
class="na">getInputDescriptor</span><span class="o">(</span><span 
class="err">“</span><span class="n">page</span><span class="o">-</span><span 
class="n">views</span><span class="err">”</span><span class="o">,</span> 
<span class="k">new</span> <span class="n">NoOpSerde</span><span 
class="o">&lt;&gt;());</span></code></pre></figure>
+
+<figure class="highlight"><pre><code class="language-jproperties" 
data-lang="jproperties"><span></span><span class="na">    INFO</span><span 
class="o">:</span> <span class="s">Use the org.apache.samza.operators.KV as the 
message type ex: InMemoryInputDescriptor&lt;KV&lt;String,PageView&gt;&gt; as 
the message type</span>
+    <span class="err">to</span> <span class="err">use</span> <span 
class="err">key</span> <span class="err">of</span> <span class="err">the</span> 
<span class="err">KV</span> <span class="err">(String</span> <span 
class="err">here)</span> <span class="err">as</span> <span 
class="err">key</span> <span class="err">and</span> <span 
class="err">value</span> <span class="err">as</span> <span 
class="err">message</span> <span class="err">(PageView</span> <span 
class="err">here)</span> <span class="err">for</span> <span 
class="err">the</span> <span class="err">IncomingMessageEnvelope</span> <span 
class="err">in</span> <span class="err">samza</span> <span 
class="err">job,</span> <span class="err">using</span> <span 
class="err">all</span> <span class="err">the</span> <span 
class="err">other</span> <span class="err">data</span> <span 
class="err">types</span> <span class="err">will</span> <span 
class="err">result</span> <span class="err">in</span> <span 
class="err">key</span> <span class="err">
 of</span> <span class="err">the</span> <span class="err">the</span> <span 
class="err">IncomingMessageEnvelope</span> <span class="err">set</span> <span 
class="err">to</span> <span class="err">null</span> </code></pre></figure>
+
+<p>Output Stream described by InMemoryOutputDescriptor, these streams need to 
be initialized with with a partition count and are empty since your job writes 
to these streams</p>
+
+<figure class="highlight"><pre><code class="language-java" 
data-lang="java"><span></span>    <span 
class="n">InMemoryOutputDescriptor</span><span class="o">&lt;</span><span 
class="n">DecoratedPageView</span><span class="o">&gt;</span> <span 
class="n">outputPageViews</span> <span class="o">=</span> <span 
class="n">inMemory</span><span class="o">.</span><span 
class="na">getOutputDescriptor</span><span class="o">(</span><span 
class="s">&quot;decorated-page-views&quot;</span><span class="o">,</span> <span 
class="k">new</span> <span class="n">NoOpSerde</span><span 
class="o">&lt;&gt;())</span></code></pre></figure>
+
+<figure class="highlight"><pre><code class="language-jproperties" 
data-lang="jproperties"><span></span><span class="na">    Note</span><span 
class="o">:</span> <span class="s">Input streams are immutable - ie., once they 
have been created you can&#39;t modify their contents eg: by adding new 
messages&quot;All input streams are supposed to be 
bounded</span></code></pre></figure>
+
+<h2 id="step-3-create-a-testrunner">Step 3: Create a TestRunner</h2>
+
+<ol>
+<li> Initialize a TestRunner of your Samza job</li>
+<li> Configure TestRunner with input streams and mock data to it </li>
+<li> Configure TestRunner with output streams with a partition count</li>
+<li> Add any configs if necessary</li>
+<li> Run the test runner</li>
+</ol>
+
+<figure class="highlight"><pre><code class="language-java" 
data-lang="java"><span></span>    <span class="n">List</span><span 
class="o">&lt;</span><span class="n">PageView</span><span class="o">&gt;</span> 
<span class="n">pageViews</span> <span class="o">=</span> <span 
class="n">generateData</span><span class="o">(...);</span>
+    <span class="n">TestRunner</span>
+       <span class="o">.</span><span class="na">of</span><span 
class="o">(</span><span class="k">new</span> <span 
class="n">BadPageViewFilterApplication</span><span class="o">())</span>
+       <span class="o">.</span><span class="na">addInputStream</span><span 
class="o">(</span><span class="n">pageViewInput</span><span class="o">,</span> 
<span class="n">pageViews</span><span class="o">)</span>
+       <span class="o">.</span><span class="na">addOutputStream</span><span 
class="o">(</span><span class="n">outputPageViews</span><span 
class="o">,</span> <span class="mi">10</span><span class="o">)</span>
+       <span class="o">.</span><span class="na">run</span><span 
class="o">(</span><span class="n">Duration</span><span class="o">.</span><span 
class="na">ofMillis</span><span class="o">(</span><span 
class="mi">1500</span><span class="o">));</span></code></pre></figure>
+
+<figure class="highlight"><pre><code class="language-jproperties" 
data-lang="jproperties"><span></span><span class="na">    Info</span><span 
class="o">:</span> <span class="s">Use addConfig(Map&lt;String, String&gt; 
configs) or addConfig(String key, String value) to add/modify any config in the 
TestRunner</span></code></pre></figure>
+
+<h2 id="step-4-assert-on-the-output-stream">Step-4: Assert on the output 
stream</h2>
+
+<p>You have the following choices for asserting the results of your tests</p>
+
+<ol>
+<li>You can use StreamAssert utils on your In Memory Streams to do consumption 
of all partitions</li>
+</ol>
+
+<figure class="highlight"><pre><code class="language-java" 
data-lang="java"><span></span>    
+    <span class="c1">// Consume multi-paritioned stream, key of the map 
represents partitionId</span>
+    <span class="n">Map</span><span class="o">&lt;</span><span 
class="n">Integer</span><span class="o">,</span> <span 
class="n">PageView</span><span class="o">&gt;</span> <span 
class="n">expOutput</span><span class="o">;</span>
+    <span class="n">StreamAssert</span><span class="o">.</span><span 
class="na">containsInOrder</span><span class="o">(</span><span 
class="n">outputPageViews</span><span class="o">,</span> <span 
class="n">expectedOutput</span><span class="o">,</span> <span 
class="n">Duration</span><span class="o">.</span><span 
class="na">ofMillis</span><span class="o">(</span><span 
class="mi">1000</span><span class="o">));</span>
+    <span class="c1">// Consume single paritioned stream</span>
+    <span class="n">StreamAssert</span><span class="o">.</span><span 
class="na">containsInOrder</span><span class="o">(</span><span 
class="n">outputPageViews</span><span class="o">,</span> <span 
class="n">Arrays</span><span class="o">.</span><span 
class="na">asList</span><span class="o">(...),</span> <span 
class="n">Duration</span><span class="o">.</span><span 
class="na">ofMillis</span><span class="o">(</span><span 
class="mi">1000</span><span class="o">));</span></code></pre></figure>
+
+<ol>
+<li>You have the flexibility to define your custom assertions using API 
TestRunner.consumeStream() to assert on any partitions of the stream</li>
+</ol>
+
+<figure class="highlight"><pre><code class="language-java" 
data-lang="java"><span></span>    <span class="n">Assert</span><span 
class="o">.</span><span class="na">assertEquals</span><span class="o">(</span>
+        <span class="n">TestRunner</span><span class="o">.</span><span 
class="na">consumeStream</span><span class="o">(</span><span 
class="n">outputPageViews</span><span class="o">,</span><span 
class="n">Duration</span><span class="o">.</span><span 
class="na">ofMillis</span><span class="o">(</span><span 
class="mi">1000</span><span class="o">)).</span><span 
class="na">get</span><span class="o">(</span><span class="mi">0</span><span 
class="o">).</span><span class="na">size</span><span class="o">(),</span><span 
class="mi">1</span>
+       <span class="o">);</span></code></pre></figure>
+
+<p>Complete Glance at the code</p>
+
+<figure class="highlight"><pre><code class="language-java" 
data-lang="java"><span></span>    <span class="nd">@Test</span>
+    <span class="kd">public</span> <span class="kt">void</span> <span 
class="nf">testStreamDSLApi</span><span class="o">()</span> <span 
class="kd">throws</span> <span class="n">Exception</span> <span 
class="o">{</span>
+     <span class="c1">// Generate Mock Data</span>
+     <span class="n">List</span><span class="o">&lt;</span><span 
class="n">PageView</span><span class="o">&gt;</span> <span 
class="n">pageViews</span> <span class="o">=</span> <span 
class="n">genrateMockInput</span><span class="o">(...);</span>
+     <span class="n">List</span><span class="o">&lt;</span><span 
class="n">DecoratedPageView</span><span class="o">&gt;</span> <span 
class="n">expectedOutput</span> <span class="o">=</span> <span 
class="n">genrateMockOutput</span><span class="o">(...);</span>
+    
+     <span class="c1">// Configure System and Stream Descriptors</span>
+     <span class="n">InMemorySystemDescriptor</span> <span 
class="n">inMemory</span> <span class="o">=</span> <span class="k">new</span> 
<span class="n">InMemorySystemDescriptor</span><span class="o">(</span><span 
class="s">&quot;test&quot;</span><span class="o">);</span>
+     <span class="n">InMemoryInputDescriptor</span><span 
class="o">&lt;</span><span class="n">PageView</span><span class="o">&gt;</span> 
<span class="n">pageViewInput</span> <span class="o">=</span> <span 
class="n">inMemory</span>
+        <span class="o">.</span><span 
class="na">getInputDescriptor</span><span class="o">(</span><span 
class="err">“</span><span class="n">page</span><span class="o">-</span><span 
class="n">views</span><span class="err">”</span><span class="o">,</span> 
<span class="k">new</span> <span class="n">NoOpSerde</span><span 
class="o">&lt;&gt;());</span>
+     <span class="n">InMemoryOutputDescriptor</span><span 
class="o">&lt;</span><span class="n">DecoratedPageView</span><span 
class="o">&gt;</span> <span class="n">outputPageView</span> <span 
class="o">=</span> <span class="n">inMemory</span>
+        <span class="o">.</span><span 
class="na">getOutputDescriptor</span><span class="o">(</span><span 
class="err">“</span><span class="n">decorated</span><span 
class="o">-</span><span class="n">page</span><span class="o">-</span><span 
class="n">views</span><span class="err">”</span><span class="o">,</span> 
<span class="k">new</span> <span class="n">NoOpSerde</span><span 
class="o">&lt;&gt;())</span>
+     
+     <span class="c1">// Configure the TestRunner </span>
+     <span class="n">TestRunner</span>
+         <span class="o">.</span><span class="na">of</span><span 
class="o">(</span><span class="k">new</span> <span 
class="n">BadPageViewFilterApplication</span><span class="o">())</span>
+         <span class="o">.</span><span class="na">addInputStream</span><span 
class="o">(</span><span class="n">pageViewInput</span><span class="o">,</span> 
<span class="n">pageViews</span><span class="o">)</span>
+         <span class="o">.</span><span class="na">addOutputStream</span><span 
class="o">(</span><span class="n">outputPageView</span><span class="o">,</span> 
<span class="mi">10</span><span class="o">)</span>
+         <span class="o">.</span><span class="na">run</span><span 
class="o">(</span><span class="n">Duration</span><span class="o">.</span><span 
class="na">ofMillis</span><span class="o">(</span><span 
class="mi">1500</span><span class="o">));</span>
+    
+     <span class="c1">// Assert the results</span>
+     <span class="n">StreamAssert</span><span class="o">.</span><span 
class="na">containsInOrder</span><span class="o">(</span><span 
class="n">expectedOutput</span><span class="o">,</span> <span 
class="n">outputPageView</span><span class="o">,</span> <span 
class="n">Duration</span><span class="o">.</span><span 
class="na">ofMillis</span><span class="o">(</span><span 
class="mi">1000</span><span class="o">));</span>
+    <span class="o">}</span></code></pre></figure>
+ 
+
+<h3 id="example-for-low-level-api">Example for Low Level Api:</h3>
+
+<p>For a Low Level Task API</p>
+
+<figure class="highlight"><pre><code class="language-java" 
data-lang="java"><span></span>    <span class="kd">public</span> <span 
class="kd">class</span> <span class="nc">BadPageViewFilter</span> <span 
class="kd">implements</span> <span class="n">TaskApplication</span> <span 
class="o">{</span>
+      <span class="nd">@Override</span>
+      <span class="kd">public</span> <span class="kt">void</span> <span 
class="nf">describe</span><span class="o">(</span><span 
class="n">TaskApplicationDescriptor</span> <span class="n">appDesc</span><span 
class="o">)</span> <span class="o">{</span>
+        <span class="c1">// Add input, output streams and tables</span>
+        <span class="n">KafkaSystemDescriptor</span><span 
class="o">&lt;</span><span class="n">String</span><span class="o">,</span> 
<span class="n">PageViewEvent</span><span class="o">&gt;</span> <span 
class="n">kafkaSystem</span> <span class="o">=</span> 
+            <span class="k">new</span> <span 
class="n">KafkaSystemDescriptor</span><span class="o">(</span><span 
class="err">“</span><span class="n">kafka</span><span 
class="err">”</span><span class="o">)</span>
+              <span class="o">.</span><span 
class="na">withConsumerZkConnect</span><span class="o">(</span><span 
class="n">myZkServers</span><span class="o">)</span>
+              <span class="o">.</span><span 
class="na">withProducerBootstrapServers</span><span class="o">(</span><span 
class="n">myBrokers</span><span class="o">);</span>
+        <span class="n">KVSerde</span><span class="o">&lt;</span><span 
class="n">String</span><span class="o">,</span> <span 
class="n">PageViewEvent</span><span class="o">&gt;</span> <span 
class="n">serde</span> <span class="o">=</span> 
+            <span class="n">KVSerde</span><span class="o">.</span><span 
class="na">of</span><span class="o">(</span><span class="k">new</span> <span 
class="n">StringSerde</span><span class="o">(),</span> <span 
class="k">new</span> <span class="n">JsonSerdeV2</span><span 
class="o">&lt;</span><span class="n">PageViewEvent</span><span 
class="o">&gt;());</span>
+        <span class="c1">// Add input, output streams and tables</span>
+        <span class="n">appDesc</span><span class="o">.</span><span 
class="na">withInputStream</span><span class="o">(</span><span 
class="n">kafkaSystem</span><span class="o">.</span><span 
class="na">getInputDescriptor</span><span class="o">(</span><span 
class="err">“</span><span class="n">pageViewEvent</span><span 
class="err">”</span><span class="o">,</span> <span 
class="n">serde</span><span class="o">))</span>
+            <span class="o">.</span><span 
class="na">withOutputStream</span><span class="o">(</span><span 
class="n">kafkaSystem</span><span class="o">.</span><span 
class="na">getOutputDescriptor</span><span class="o">(</span><span 
class="err">“</span><span class="n">goodPageViewEvent</span><span 
class="err">”</span><span class="o">,</span> <span 
class="n">serde</span><span class="o">))</span>
+            <span class="o">.</span><span class="na">withTable</span><span 
class="o">(</span><span class="k">new</span> <span 
class="n">RocksDBTableDescriptor</span><span class="o">(</span>
+                <span class="err">“</span><span 
class="n">badPageUrlTable</span><span class="err">”</span><span 
class="o">,</span> <span class="n">KVSerde</span><span class="o">.</span><span 
class="na">of</span><span class="o">(</span><span class="k">new</span> <span 
class="n">StringSerde</span><span class="o">(),</span> <span 
class="k">new</span> <span class="n">IntegerSerde</span><span 
class="o">())</span>
+            <span class="o">.</span><span 
class="na">withTaskFactory</span><span class="o">(</span><span 
class="k">new</span> <span class="n">BadPageViewTaskFactory</span><span 
class="o">());</span>
+      <span class="o">}</span>
+    <span class="o">}</span>
+    
+    <span class="kd">public</span> <span class="kd">class</span> <span 
class="nc">BadPageViewTaskFactory</span> <span class="kd">implements</span> 
<span class="n">StreamTaskFactory</span> <span class="o">{</span>
+      <span class="nd">@Override</span>
+      <span class="kd">public</span> <span class="n">StreamTask</span> <span 
class="nf">createInstance</span><span class="o">()</span> <span 
class="o">{</span>
+        <span class="c1">// Add input, output streams and tables</span>
+        <span class="k">return</span> <span class="k">new</span> <span 
class="n">BadPageViewFilterTask</span><span class="o">();</span>
+      <span class="o">}</span>
+    <span class="o">}</span>
+    
+     <span class="kd">public</span> <span class="kd">class</span> <span 
class="nc">BadPageViewFilterTask</span> <span class="kd">implements</span> 
<span class="n">StreamTask</span> <span class="o">{</span>
+       <span class="nd">@Override</span>
+       <span class="kd">public</span> <span class="kt">void</span> <span 
class="nf">process</span><span class="o">(</span><span 
class="n">IncomingMessageEnvelope</span> <span class="n">envelope</span><span 
class="o">,</span>
+                           <span class="n">MessageCollector</span> <span 
class="n">collector</span><span class="o">,</span>
+                           <span class="n">TaskCoordinator</span> <span 
class="n">coordinator</span><span class="o">)</span> <span class="o">{</span>
+         <span class="c1">// process message synchronously</span>
+        <span class="o">}</span>
+     <span class="o">}</span>   
+     
+     
+     <span class="nd">@Test</span>
+     <span class="kd">public</span> <span class="kt">void</span> <span 
class="nf">testBadPageViewFilterTaskApplication</span><span class="o">()</span> 
<span class="o">{</span>
+       <span class="n">List</span><span class="o">&lt;</span><span 
class="n">PageView</span><span class="o">&gt;</span> <span 
class="n">badPageViews</span> <span class="o">=</span> <span 
class="n">Arrays</span><span class="o">.</span><span 
class="na">asList</span><span class="o">(</span><span 
class="n">generatePageViews</span><span class="o">(..));</span>
+       <span class="n">List</span><span class="o">&lt;</span><span 
class="n">Profile</span><span class="o">&gt;</span> <span 
class="n">expectedGoodPageViews</span> <span class="o">=</span> <span 
class="n">Arrays</span><span class="o">.</span><span 
class="na">asList</span><span class="o">(</span><span 
class="n">generatePageViews</span><span class="o">(..));</span>
+     
+       <span class="n">InMemorySystemDescriptor</span> <span 
class="n">inMemory</span> <span class="o">=</span> <span class="k">new</span> 
<span class="n">InMemorySystemDescriptor</span><span class="o">(</span><span 
class="s">&quot;kafka&quot;</span><span class="o">);</span>
+     
+       <span class="n">InMemoryInputDescriptor</span><span 
class="o">&lt;</span><span class="n">PageView</span><span class="o">&gt;</span> 
<span class="n">pageViewInput</span> <span class="o">=</span> <span 
class="n">inMemory</span>
+          <span class="o">.</span><span 
class="na">getInputDescriptor</span><span class="o">(</span><span 
class="s">&quot;pageViewEvent&quot;</span><span class="o">,</span> <span 
class="k">new</span> <span class="n">NoOpSerde</span><span 
class="o">&lt;&gt;());</span>
+     
+       <span class="n">InMemoryOutputDescriptor</span><span 
class="o">&lt;</span><span class="n">PageView</span><span class="o">&gt;</span> 
<span class="n">pageViewOutput</span> <span class="o">=</span> <span 
class="n">inMemory</span>
+          <span class="o">.</span><span 
class="na">getOutputDescriptor</span><span class="o">(</span><span 
class="s">&quot;goodPageViewEvent&quot;</span><span class="o">,</span> <span 
class="k">new</span> <span class="n">NoOpSerde</span><span 
class="o">&lt;&gt;());</span>
+     
+       <span class="n">TestRunner</span>
+          <span class="o">.</span><span class="na">of</span><span 
class="o">(</span><span class="k">new</span> <span 
class="n">BadPageViewFilter</span><span class="o">())</span>
+          <span class="o">.</span><span class="na">addInputStream</span><span 
class="o">(</span><span class="n">pageViewInput</span><span class="o">,</span> 
<span class="n">badPageViews</span><span class="o">)</span>
+          <span class="o">.</span><span class="na">addOutputStream</span><span 
class="o">(</span><span class="n">pageViewOutput</span><span class="o">,</span> 
<span class="mi">1</span><span class="o">)</span>
+          <span class="o">.</span><span class="na">run</span><span 
class="o">(</span><span class="n">Duration</span><span class="o">.</span><span 
class="na">ofSeconds</span><span class="o">(</span><span 
class="mi">2</span><span class="o">));</span>
+     
+       <span class="n">StreamAssert</span><span class="o">.</span><span 
class="na">containsInOrder</span><span class="o">(</span><span 
class="n">expectedGoodPageViews</span><span class="o">,</span> <span 
class="n">pageViewOutput</span><span class="o">,</span> <span 
class="n">Duration</span><span class="o">.</span><span 
class="na">ofMillis</span><span class="o">(</span><span 
class="mi">1000</span><span class="o">));</span>
+     <span class="o">}</span></code></pre></figure>
+
+<p>Follow a similar approach for Legacy Low Level API, just provide the 
classname 
+(class implementing StreamTask or AsyncStreamTask) to TestRunner</p>
+
+<figure class="highlight"><pre><code class="language-java" 
data-lang="java"><span></span>      <span class="kd">public</span> <span 
class="kd">class</span> <span class="nc">MultiplyByTenStreamTask</span> <span 
class="kd">implements</span> <span class="n">StreamTask</span> <span 
class="o">{</span>
+       <span class="nd">@Override</span>
+       <span class="kd">public</span> <span class="kt">void</span> <span 
class="nf">process</span><span class="o">(</span><span 
class="n">IncomingMessageEnvelope</span> <span class="n">envelope</span><span 
class="o">,</span> <span class="n">MessageCollector</span> <span 
class="n">collector</span><span class="o">,</span> <span 
class="n">TaskCoordinator</span> <span class="n">coordinator</span><span 
class="o">)</span>
+           <span class="kd">throws</span> <span class="n">Exception</span> 
<span class="o">{</span>
+         <span class="n">Integer</span> <span class="n">obj</span> <span 
class="o">=</span> <span class="o">(</span><span class="n">Integer</span><span 
class="o">)</span> <span class="n">envelope</span><span class="o">.</span><span 
class="na">getMessage</span><span class="o">();</span>
+         <span class="n">collector</span><span class="o">.</span><span 
class="na">send</span><span class="o">(</span><span class="k">new</span> <span 
class="n">OutgoingMessageEnvelope</span><span class="o">(</span><span 
class="k">new</span> <span class="n">SystemStream</span><span 
class="o">(</span><span class="s">&quot;test&quot;</span><span 
class="o">,</span> <span class="s">&quot;output&quot;</span><span 
class="o">),</span>
+             <span class="n">envelope</span><span class="o">.</span><span 
class="na">getKey</span><span class="o">(),</span> <span 
class="n">envelope</span><span class="o">.</span><span 
class="na">getKey</span><span class="o">(),</span> <span class="n">obj</span> 
<span class="o">*</span> <span class="mi">10</span><span class="o">));</span>
+       <span class="o">}</span>
+      <span class="o">}</span>
+       
+      <span class="nd">@Test</span>
+      <span class="kd">public</span> <span class="kt">void</span> <span 
class="nf">testLowLevelApi</span><span class="o">()</span> <span 
class="kd">throws</span> <span class="n">Exception</span> <span 
class="o">{</span>
+        <span class="n">List</span><span class="o">&lt;</span><span 
class="n">Integer</span><span class="o">&gt;</span> <span 
class="n">inputList</span> <span class="o">=</span> <span 
class="n">Arrays</span><span class="o">.</span><span 
class="na">asList</span><span class="o">(</span><span class="mi">1</span><span 
class="o">,</span> <span class="mi">2</span><span class="o">,</span> <span 
class="mi">3</span><span class="o">,</span> <span class="mi">4</span><span 
class="o">,</span> <span class="mi">5</span><span class="o">);</span>
+        <span class="n">List</span><span class="o">&lt;</span><span 
class="n">Integer</span><span class="o">&gt;</span> <span 
class="n">outputList</span> <span class="o">=</span> <span 
class="n">Arrays</span><span class="o">.</span><span 
class="na">asList</span><span class="o">(</span><span class="mi">10</span><span 
class="o">,</span> <span class="mi">20</span><span class="o">,</span> <span 
class="mi">30</span><span class="o">,</span> <span class="mi">40</span><span 
class="o">,</span> <span class="mi">50</span><span class="o">);</span>
+       
+        <span class="n">InMemorySystemDescriptor</span> <span 
class="n">inMemory</span> <span class="o">=</span> <span class="k">new</span> 
<span class="n">InMemorySystemDescriptor</span><span class="o">(</span><span 
class="s">&quot;test&quot;</span><span class="o">);</span>
+       
+        <span class="n">InMemoryInputDescriptor</span><span 
class="o">&lt;</span><span class="n">Integer</span><span class="o">&gt;</span> 
<span class="n">numInput</span> <span class="o">=</span> <span 
class="n">inMemory</span>
+           <span class="o">.</span><span 
class="na">getInputDescriptor</span><span class="o">(</span><span 
class="s">&quot;input&quot;</span><span class="o">,</span> <span 
class="k">new</span> <span class="n">NoOpSerde</span><span 
class="o">&lt;</span><span class="n">Integer</span><span 
class="o">&gt;());</span>
+       
+        <span class="n">InMemoryOutputDescriptor</span><span 
class="o">&lt;</span><span class="n">Integer</span><span class="o">&gt;</span> 
<span class="n">numOutput</span> <span class="o">=</span> <span 
class="n">inMemory</span>
+           <span class="o">.</span><span 
class="na">getOutputDescriptor</span><span class="o">(</span><span 
class="s">&quot;output&quot;</span><span class="o">,</span> <span 
class="k">new</span> <span class="n">NoOpSerde</span><span 
class="o">&lt;</span><span class="n">Integer</span><span 
class="o">&gt;());</span>
+       
+        <span class="n">TestRunner</span>
+           <span class="o">.</span><span class="na">of</span><span 
class="o">(</span><span class="n">MyStreamTestTask</span><span 
class="o">.</span><span class="na">class</span><span class="o">)</span>
+           <span class="o">.</span><span class="na">addInputStream</span><span 
class="o">(</span><span class="n">numInput</span><span class="o">,</span> <span 
class="n">inputList</span><span class="o">)</span>
+           <span class="o">.</span><span 
class="na">addOutputStream</span><span class="o">(</span><span 
class="n">numOutput</span><span class="o">,</span> <span 
class="mi">1</span><span class="o">)</span>
+           <span class="o">.</span><span class="na">run</span><span 
class="o">(</span><span class="n">Duration</span><span class="o">.</span><span 
class="na">ofSeconds</span><span class="o">(</span><span 
class="mi">1</span><span class="o">));</span>
+       
+        <span class="n">Assert</span><span class="o">.</span><span 
class="na">assertThat</span><span class="o">(</span><span 
class="n">TestRunner</span><span class="o">.</span><span 
class="na">consumeStream</span><span class="o">(</span><span 
class="n">imod</span><span class="o">,</span> <span 
class="n">Duration</span><span class="o">.</span><span 
class="na">ofMillis</span><span class="o">(</span><span 
class="mi">1000</span><span class="o">)).</span><span 
class="na">get</span><span class="o">(</span><span class="mi">0</span><span 
class="o">),</span>
+           <span class="n">IsIterableContainingInOrder</span><span 
class="o">.</span><span class="na">contains</span><span class="o">(</span><span 
class="n">outputList</span><span class="o">.</span><span 
class="na">toArray</span><span class="o">()));;</span>
+      <span class="o">}</span></code></pre></figure>
+
+<h2 id="stateful-testing">Stateful Testing</h2>
+
+<ol>
+<li>There is no additional config/changes required for TestRunner apis for 
testing samza jobs using StreamApplication or TaskApplication APIs</li>
+<li>Legacy task api only supports RocksDbTable and needs following configs to 
be added to TestRunner. 
+For example if your job is using a RocksDbTable named &ldquo;my-store&rdquo; 
with key and msg serde of String type</li>
+</ol>
+
+<figure class="highlight"><pre><code class="language-java" 
data-lang="java"><span></span>    <span class="n">Map</span><span 
class="o">&lt;</span><span class="n">String</span><span class="o">,</span> 
<span class="n">String</span><span class="o">&gt;</span> <span 
class="n">config</span> <span class="o">=</span> <span class="k">new</span> 
<span class="n">HashMap</span><span class="o">&lt;&gt;();</span>
+    <span class="n">config</span><span class="o">.</span><span 
class="na">put</span><span class="o">(</span><span 
class="s">&quot;stores.my-store.factory&quot;</span><span class="o">,</span> 
<span 
class="s">&quot;org.apache.samza.storage.kv.RocksDbKeyValueStorageEngineFactory&quot;</span><span
 class="o">);</span>
+    <span class="n">config</span><span class="o">.</span><span 
class="na">out</span><span class="o">(</span><span 
class="s">&quot;serializers.registry.string.class&quot;</span><span 
class="o">,</span> <span 
class="s">&quot;org.apache.samza.serializers.StringSerdeFactory&quot;</span><span
 class="o">);</span>
+    <span class="n">config</span><span class="o">.</span><span 
class="na">put</span><span class="o">(</span><span 
class="s">&quot;stores.my-store.key.serde&quot;</span><span class="o">,</span> 
<span class="s">&quot;string&quot;</span><span class="o">);</span>
+    <span class="n">config</span><span class="o">.</span><span 
class="na">put</span><span class="o">(</span><span 
class="s">&quot;stores.my-store.msg.serde&quot;</span><span class="o">,</span> 
<span class="s">&quot;string&quot;</span><span class="o">);</span>
+    
+    <span class="n">TestRunner</span>
+        <span class="o">.</span><span class="na">of</span><span 
class="o">(...)</span>
+        <span class="o">.</span><span class="na">addConfig</span><span 
class="o">(</span><span class="n">config</span><span class="o">)</span>
+        <span class="o">...</span>
+        </code></pre></figure>
+
+           
+        </div>
+      </div>
+
+  </div>
+  
+
+  <!-- footer starts here -->
+
+  <!--
+   Licensed to the Apache Software Foundation (ASF) under one or more
+   contributor license agreements.  See the NOTICE file distributed with
+   this work for additional information regarding copyright ownership.
+   The ASF licenses this file to You under the Apache License, Version 2.0
+   (the "License"); you may not use this file except in compliance with
+   the License.  You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+-->
+
+<footer>
+  <div class="footer-inner">
+    <div class="side-by-side">
+      <div>
+        <div class="footer__heading">Learn More</div>
+        <div class="footer__items">
+          <a class="footer__item" href="/meetups/">Meetups</a>
+          <a class="footer__item" href="/blog/">Blog</a>
+          <a class="footer__item" 
href="/learn/documentation/latest/introduction/background.html">About</a>
+        </div>
+      </div>
+      <div>
+        <div class="footer__heading">Community</div>
+        <div class="footer__items">
+          <a class="footer__item" href="/community/contact-us.html">Contact 
Us</a>
+          <a class="footer__item" 
href="/contribute/contributors-corner.html">Contributors' Corner</a>
+          <a class="footer__item" href="/community/committers.html">PMC 
members and committers</a>
+          <a class="footer__item" href="/powered-by/">Powered By</a>
+        </div>
+      </div>
+
+      <div>
+        <div class="quick-links">
+          <a class="quick-link" href="/startup/download" target="_blank">
+            <i class="icon ion-md-download"></i>
+          </a>
+          <a class="quick-link" 
href="https://git-wip-us.apache.org/repos/asf?p=samza.git;a=tree"; 
target="_blank">
+            <i class="icon ion-md-code"></i>
+          </a>
+          <a class="quick-link" href="https://twitter.com/samzastream"; 
target="_blank">
+            <i class="icon ion-logo-twitter"></i>
+          </a>
+        </div>
+
+        <p>
+          <script>document.write(new Date().getFullYear());</script> &copy; 
samza.apache.org</p>
+      </div>
+
+    </div>
+  </div>
+
+</footer>
+
+
+<script>
+  var tryFile = function (url, cb) {
+    var myRequest = new Request(url);
+    fetch(myRequest).then((response, cb) => {
+      console.log(response.status); // returns 200
+      cb(response.status != 404);
+    });
+  }
+
+  tryFile(window.location.pathname, function (status) {
+    // do something with the status
+    console.log(status);
+  });
+</script>
+
+
+<!-- Google Analytics -->
+<script>
+  (function (i, s, o, g, r, a, m) {
+    i['GoogleAnalyticsObject'] = r; i[r] = i[r] || function () {
+      (i[r].q = i[r].q || []).push(arguments)
+    }, i[r].l = 1 * new Date(); a = s.createElement(o),
+      m = s.getElementsByTagName(o)[0]; a.async = 1; a.src = g; 
m.parentNode.insertBefore(a, m)
+  })(window, document, 'script', '//www.google-analytics.com/analytics.js', 
'ga');
+
+  ga('create', 'UA-43122768-1', 'apache.org');
+  ga('send', 'pageview');
+
+</script>
+<script src="/js/main.new.js"></script>
+
+</body>
+
+</html>
\ No newline at end of file

Modified: samza/site/learn/documentation/latest/core-concepts/core-concepts.html
URL: 
http://svn.apache.org/viewvc/samza/site/learn/documentation/latest/core-concepts/core-concepts.html?rev=1852769&r1=1852768&r2=1852769&view=diff
==============================================================================
--- samza/site/learn/documentation/latest/core-concepts/core-concepts.html 
(original)
+++ samza/site/learn/documentation/latest/core-concepts/core-concepts.html Fri 
Feb  1 19:39:34 2019
@@ -610,7 +610,7 @@
 
 <p><em>Massive scale:</em> Battle-tested on applications that use several 
terabytes of state and run on thousands of cores. It <a 
href="/powered-by/">powers</a> multiple large companies including LinkedIn, 
Uber, TripAdvisor, Slack etc. </p>
 
-<p>Next, we will introduce Samza’s terminology. You will realize that it is 
extremely easy to <a href="/quickstart/latest">get started</a> with building 
your first application. </p>
+<p>Next, we will introduce Samza’s terminology. You will realize that it is 
extremely easy to <a href="/startup/quick-start/latest">get started</a> with 
building your first application. </p>
 
 <h3 id="streams-partitions">Streams, Partitions</h3>
 
@@ -620,24 +620,24 @@
 <br/>
 A stream can have multiple producers that write data to it and multiple 
consumers that read data from it. Data in a stream can be unbounded (eg: a 
Kafka topic) or bounded (eg: a set of files on HDFS). </p>
 
-<p>A stream is sharded into multiple partitions for scaling how its data is 
processed. Each <em>partition</em> is an ordered, replayable sequence of 
records. When a message is written to a stream, it ends up in one its 
partitions. Each message in a partition is uniquely identified by an 
<em>offset</em>. </p>
+<p>A stream is sharded into multiple partitions for scaling how its data is 
processed. Each <em>partition</em> is an ordered, replayable sequence of 
records. When a message is written to a stream, it ends up in one of its 
partitions. Each message in a partition is uniquely identified by an 
<em>offset</em>. </p>
 
 <p>Samza supports pluggable systems that can implement the stream abstraction. 
As an example, Kafka implements a stream as a topic while a database might 
implement a stream as a sequence of updates to its tables.</p>
 
 <h3 id="stream-application">Stream Application</h3>
 
-<p>A <em>stream application</em> processes messages from input streams, 
transforms them and emits results to an output stream or a database. It is 
built by chaining multiple operators, each of which take in one or more streams 
and transform them.</p>
+<p>A <em>stream application</em> processes messages from input streams, 
transforms them and emits results to an output stream or a database. It is 
built by chaining multiple operators, each of which takes in one or more 
streams and transforms them.</p>
 
 <p><img 
src="/img/latest/learn/documentation/core-concepts/stream-application.png" 
alt="diagram-medium"></p>
 
 <p>Samza offers three top-level APIs to help you build your stream 
applications: <br/>
-1. The <a href="/learn/documentation/latest/api/high-level-api.html">High 
Level Streams API</a>,  which offers several built-in operators like map, 
filter etc. This is the recommended API for most use-cases. <br/>
+1. The <a href="/learn/documentation/latest/api/high-level-api.html">High 
Level Streams API</a>,  which offers several built-in operators like map, 
filter, etc. This is the recommended API for most use-cases. <br/>
 2. The <a href="/learn/documentation/latest/api/low-level-api.html">Low Level 
Task API</a>, which allows greater flexibility to define your processing-logic 
and offers greater control <br/>
 3. <a href="/learn/documentation/latest/api/samza-sql.html">Samza SQL</a>, 
which offers a declarative SQL interface to create your applications <br/></p>
 
 <h3 id="state">State</h3>
 
-<p>Samza supports for both stateless and stateful stream processing. 
<em>Stateless processing</em>, as the name implies, does not retain any state 
associated with the current message after it has been processed. A good example 
of this is filtering an incoming stream of user-records by a field (eg:userId) 
and writing the filtered messages to their own stream. </p>
+<p>Samza supports both stateless and stateful stream processing. <em>Stateless 
processing</em>, as the name implies, does not retain any state associated with 
the current message after it has been processed. A good example of this is 
filtering an incoming stream of user-records by a field (eg:userId) and writing 
the filtered messages to their own stream. </p>
 
 <p>In contrast, <em>stateful processing</em> requires you to record some state 
about a message even after processing it. Consider the example of counting the 
number of unique users to a website every five minutes. This requires you to 
store information about each user seen thus far for de-duplication. Samza 
offers a fault-tolerant, scalable state-store for this purpose.</p>
 

Modified: samza/site/learn/documentation/latest/deployment/standalone.html
URL: 
http://svn.apache.org/viewvc/samza/site/learn/documentation/latest/deployment/standalone.html?rev=1852769&r1=1852768&r2=1852769&view=diff
==============================================================================
--- samza/site/learn/documentation/latest/deployment/standalone.html (original)
+++ samza/site/learn/documentation/latest/deployment/standalone.html Fri Feb  1 
19:39:34 2019
@@ -614,7 +614,7 @@
 
 <p>We will use the <code>./bin/grid</code> script from the 
<code>hello-samza</code> project to setup up Zookeeper and Kafka locally.</p>
 <div class="highlight"><pre><code class="language-bash" 
data-lang="bash"><span></span>./bin/grid start zookeeper
-./bin/grid start zookeeper
+./bin/grid start kafka
 </code></pre></div>
 <h4 id="building-the-binaries">Building the binaries</h4>
 

Modified: samza/site/learn/documentation/latest/index.html
URL: 
http://svn.apache.org/viewvc/samza/site/learn/documentation/latest/index.html?rev=1852769&r1=1852768&r2=1852769&view=diff
==============================================================================
--- samza/site/learn/documentation/latest/index.html (original)
+++ samza/site/learn/documentation/latest/index.html Fri Feb  1 19:39:34 2019
@@ -594,6 +594,7 @@
   <li><a href="api/high-level-api.html">High Level Streams API</a></li>
   <li><a href="api/low-level-api.html">Low Level Task API</a></li>
   <li><a href="api/table-api.html">Table API</a></li>
+  <li><a href="api/test-framework.html">Testing Samza</a></li>
   <li><a href="api/samza-sql.html">Samza SQL</a></li>
   <li><a href="https://beam.apache.org/documentation/runners/samza/";>Apache 
BEAM</a></li>
 </ul>

Modified: samza/site/learn/documentation/latest/jobs/logging.html
URL: 
http://svn.apache.org/viewvc/samza/site/learn/documentation/latest/jobs/logging.html?rev=1852769&r1=1852768&r2=1852769&view=diff
==============================================================================
--- samza/site/learn/documentation/latest/jobs/logging.html (original)
+++ samza/site/learn/documentation/latest/jobs/logging.html Fri Feb  1 19:39:34 
2019
@@ -583,7 +583,7 @@
    limitations under the License.
 -->
 
-<p>Samza uses <a href="http://www.slf4j.org/";>SLF4J</a> for all of its 
logging. By default, Samza only depends on slf4j-api, so it can work for 
whichever underlying logging platform you wish to use. You simply need to add 
the SLF4J bridge corresponding to the logging implementation chosen. Samza 
logging has been thoroughly tested against Log4j and Log4j2. Samza provides 
bundled modules for each of the Log4j versions along with additional 
functionality.</p>
+<p>Samza uses <a href="http://www.slf4j.org/";>SLF4J</a> for all of its 
logging. By default, Samza only depends on slf4j-api, so it can work for 
whichever underlying logging platform you wish to use. Make sure you are 
depending on slf4j-api version &gt;= 1.7.16. You simply need to add the SLF4J 
bridge corresponding to the logging implementation chosen. Samza logging has 
been thoroughly tested against Log4j and Log4j2. Samza provides bundled modules 
for each of the Log4j versions along with additional functionality.</p>
 
 <h3 id="logging-with-log4j">Logging with Log4j</h3>
 
@@ -666,16 +666,25 @@
 <figure class="highlight"><pre><code class="language-xml" 
data-lang="xml"><span></span><span class="nt">&lt;dependency&gt;</span>
   <span class="nt">&lt;groupId&gt;</span>org.apache.logging.log4j<span 
class="nt">&lt;/groupId&gt;</span>
   <span class="nt">&lt;artifactId&gt;</span>log4j-slf4j-impl<span 
class="nt">&lt;/artifactId&gt;</span>
-  <span class="nt">&lt;version&gt;</span>2.8<span 
class="nt">&lt;/version&gt;</span>
+  <span class="nt">&lt;version&gt;</span>2.11<span 
class="nt">&lt;/version&gt;</span>
 <span class="nt">&lt;/dependency&gt;</span>
 
 <span class="nt">&lt;dependency&gt;</span>
   <span class="nt">&lt;groupId&gt;</span>org.apache.samza<span 
class="nt">&lt;/groupId&gt;</span>
   <span class="nt">&lt;artifactId&gt;</span>samza-log4j2<span 
class="nt">&lt;/artifactId&gt;</span>
-  <span class="nt">&lt;version&gt;</span>0.14.0<span 
class="nt">&lt;/version&gt;</span>
+  <span class="nt">&lt;version&gt;</span>${samza.version}<span 
class="nt">&lt;/version&gt;</span>
+<span class="nt">&lt;/dependency&gt;</span>
+
+<span class="c">&lt;!-- We want to remove any dependencies on slf4j-log4j12 
while logging with log4j2. --&gt;</span>
+<span class="nt">&lt;dependency&gt;</span>
+  <span class="nt">&lt;groupId&gt;</span>org.slf4j<span 
class="nt">&lt;/groupId&gt;</span>
+  <span class="nt">&lt;artifactId&gt;</span>slf4j-log4j12<span 
class="nt">&lt;/artifactId&gt;</span>
+  <span class="nt">&lt;version&gt;</span>[1.6.1,)<span 
class="nt">&lt;/version&gt;</span>
+  <span class="nt">&lt;scope&gt;</span>provided<span 
class="nt">&lt;/scope&gt;</span>
 <span class="nt">&lt;/dependency&gt;</span></code></pre></figure>
 
-<p>If you’re not using Maven, please make sure both the above dependencies 
end up in your Samza package’s lib directory.</p>
+<p>If you’re not using Maven, please make sure both the above dependencies 
end up in your Samza package’s lib directory.
+Also, make sure there isn&rsquo;t any dependency on slf4j-log4j12 library 
while using Log4j2. </p>
 
 <p>Next, you need to make sure that these dependencies are also listed in your 
Samza project&rsquo;s build.gradle:</p>
 
@@ -699,18 +708,54 @@
 
 <p>Rest all of the system properties will be set exactly like in the case of 
log4j, stated above.</p>
 
+<p>Sample log4j2.xml:</p>
+
+<figure class="highlight"><pre><code class="language-xml" 
data-lang="xml"><span></span><span class="cp">&lt;?xml version=&quot;1.0&quot; 
encoding=&quot;UTF-8&quot; ?&gt;</span>
+
+<span class="nt">&lt;Configuration&gt;</span>
+
+  <span class="nt">&lt;Appenders&gt;</span>
+    <span class="nt">&lt;RollingFile</span> <span class="na">name=</span><span 
class="s">&quot;RollingFile&quot;</span> <span class="na">fileName=</span><span 
class="s">&quot;${sys:samza.log.dir}/${sys:samza.container.name}-log4j2.log&quot;</span>
 <span class="na">filePattern=</span><span 
class="s">&quot;${sys:samza.log.dir}/${sys:samza.container.name}-%d{MM-dd-yyyy}-log4j2-%i.log.gz&quot;</span><span
 class="nt">&gt;</span>
+      <span class="nt">&lt;PatternLayout</span> <span 
class="na">pattern=</span><span class="s">&quot;%d{yyyy-MM-dd HH:mm:ss.SSS} 
[%t] %c{1} [%p] %m%n&quot;</span><span class="nt">/&gt;</span>
+      <span class="nt">&lt;Policies&gt;</span>
+        <span class="nt">&lt;SizeBasedTriggeringPolicy</span> <span 
class="na">size=</span><span class="s">&quot;256MB&quot;</span> <span 
class="nt">/&gt;</span>
+      <span class="nt">&lt;/Policies&gt;</span>
+      <span class="nt">&lt;DefaultRolloverStrategy</span> <span 
class="na">max=</span><span class="s">&quot;20&quot;</span><span 
class="nt">/&gt;</span>
+    <span class="nt">&lt;/RollingFile&gt;</span>
+
+    <span class="nt">&lt;RollingFile</span> <span class="na">name=</span><span 
class="s">&quot;StartupAppender&quot;</span> <span 
class="na">fileName=</span><span 
class="s">&quot;${sys:samza.log.dir}/${sys:samza.container.name}-startup-log4j2.log&quot;</span>
 <span class="na">filePattern=</span><span 
class="s">&quot;${sys:samza.log.dir}/${sys:samza.container.name}-startup-%d{MM-dd-yyyy}-log4j2-%i.log.gz&quot;</span><span
 class="nt">&gt;</span>
+      <span class="nt">&lt;PatternLayout</span> <span 
class="na">pattern=</span><span class="s">&quot;%d{yyyy-MM-dd HH:mm:ss.SSS} 
[%t] %c{1} [%p] %m%n&quot;</span><span class="nt">/&gt;</span>
+      <span class="nt">&lt;Policies&gt;</span>
+        <span class="nt">&lt;SizeBasedTriggeringPolicy</span> <span 
class="na">size=</span><span class="s">&quot;256MB&quot;</span> <span 
class="nt">/&gt;</span>
+      <span class="nt">&lt;/Policies&gt;</span>
+      <span class="nt">&lt;DefaultRolloverStrategy</span> <span 
class="na">max=</span><span class="s">&quot;1&quot;</span><span 
class="nt">/&gt;</span>
+    <span class="nt">&lt;/RollingFile&gt;</span>
+  <span class="nt">&lt;/Appenders&gt;</span>
+
+  <span class="nt">&lt;Loggers&gt;</span>
+    <span class="nt">&lt;Logger</span> <span class="na">name=</span><span 
class="s">&quot;STARTUP_LOGGER&quot;</span> <span class="na">level=</span><span 
class="s">&quot;info&quot;</span> <span class="na">additivity=</span><span 
class="s">&quot;false&quot;</span><span class="nt">&gt;</span>
+      <span class="nt">&lt;AppenderRef</span> <span 
class="na">ref=</span><span class="s">&quot;StartupAppender&quot;</span><span 
class="nt">/&gt;</span>
+    <span class="nt">&lt;/Logger&gt;</span>
+
+    <span class="nt">&lt;Root</span> <span class="na">level=</span><span 
class="s">&quot;info&quot;</span><span class="nt">&gt;</span>
+      <span class="nt">&lt;AppenderRef</span> <span 
class="na">ref=</span><span class="s">&quot;RollingFile&quot;</span><span 
class="nt">/&gt;</span>
+    <span class="nt">&lt;/Root&gt;</span>
+  <span class="nt">&lt;/Loggers&gt;</span>
+
+<span class="nt">&lt;/Configuration&gt;</span></code></pre></figure>
+
 <h4 id="porting-from-log4j-to-log4j2">Porting from Log4j to Log4j2</h4>
 
 <p>If you are already using log4j and want to upgrade to using log4j2, 
following are the changes you will need to make in your job:
 -   Clean your lib directory. This will be rebuilt with new dependency JARs 
and xml files.</p>
 
 <ul>
-<li><p>Replace log4j’s dependencies with log4j2’s in your 
pom.xml/build.gradle as mentioned above. Please ensure that none of log4j’s 
dependencies remain in pom.xml/build.gradle</p></li>
-<li><p>Create a log4j2.xml to match your existing log4j.xml file. </p></li>
-<li><p>Rebuild your application</p></li>
+<li>  Replace log4j’s dependencies with log4j2’s in your 
pom.xml/build.gradle and src.xml as mentioned above. Please ensure that none of 
log4j’s dependencies remain in pom.xml/build.gradle</li>
+<li>  Create a log4j2.xml to match your existing log4j.xml file. </li>
+<li>  Rebuild your application</li>
 </ul>
 
-<p>NOTE: Please ensure that your classpath does not contain dependencies for 
both log4j and log4j2, as this might cause the application logging to not work 
correctly. </p>
+<p>NOTE: Please ensure that your classpath does not contain dependencies for 
both log4j and log4j2, as this might cause the application logging to not work 
correctly. For example, we need to exclude the slf4j-log4j12 dependency from 
the classpath for logging with log4j2 to work correctly.</p>
 
 <h4 id="startup-logger">Startup logger</h4>
 
@@ -737,6 +782,22 @@
 
 <p>This can be done in a similar way for log4j2.xml using its defined syntax 
for xml files. </p>
 
+<figure class="highlight"><pre><code class="language-xml" 
data-lang="xml"><span></span>  <span class="nt">&lt;Appenders&gt;</span>
+    <span class="nt">&lt;RollingFile</span> <span class="na">name=</span><span 
class="s">&quot;StartupAppender&quot;</span> <span 
class="na">fileName=</span><span 
class="s">&quot;${sys:samza.log.dir}/${sys:samza.container.name}-startup-log4j2.log&quot;</span>
 <span class="na">filePattern=</span><span 
class="s">&quot;${sys:samza.log.dir}/${sys:samza.container.name}-startup-%d{MM-dd-yyyy}-log4j2-%i.log.gz&quot;</span><span
 class="nt">&gt;</span>
+      <span class="nt">&lt;PatternLayout</span> <span 
class="na">pattern=</span><span class="s">&quot;%d{yyyy-MM-dd HH:mm:ss.SSS} 
[%t] %c{1} [%p] %m%n&quot;</span><span class="nt">/&gt;</span>
+      <span class="nt">&lt;Policies&gt;</span>
+        <span class="nt">&lt;SizeBasedTriggeringPolicy</span> <span 
class="na">size=</span><span class="s">&quot;256MB&quot;</span> <span 
class="nt">/&gt;</span>
+      <span class="nt">&lt;/Policies&gt;</span>
+      <span class="nt">&lt;DefaultRolloverStrategy</span> <span 
class="na">max=</span><span class="s">&quot;1&quot;</span><span 
class="nt">/&gt;</span>
+    <span class="nt">&lt;/RollingFile&gt;</span>
+  <span class="nt">&lt;/Appenders&gt;</span>
+
+  <span class="nt">&lt;Loggers&gt;</span>
+    <span class="nt">&lt;Root</span> <span class="na">name=</span><span 
class="s">&quot;STARTUP_LOGGER&quot;</span> <span class="na">level=</span><span 
class="s">&quot;info&quot;</span> <span class="na">additivity=</span><span 
class="s">&quot;false&quot;</span><span class="nt">&gt;</span>
+      <span class="nt">&lt;AppenderRef</span> <span 
class="na">ref=</span><span class="s">&quot;StartupAppender&quot;</span><span 
class="nt">/&gt;</span>
+    <span class="nt">&lt;/Root&gt;</span>
+  <span class="nt">&lt;/Loggers&gt;</span></code></pre></figure>
+
 <h4 id="changing-log-levels">Changing log levels</h4>
 
 <h5 id="log4j">Log4j:</h5>

Modified: 
samza/site/learn/documentation/latest/rest/javadocs/allclasses-frame.html
URL: 
http://svn.apache.org/viewvc/samza/site/learn/documentation/latest/rest/javadocs/allclasses-frame.html?rev=1852769&r1=1852768&r2=1852769&view=diff
==============================================================================
--- samza/site/learn/documentation/latest/rest/javadocs/allclasses-frame.html 
(original)
+++ samza/site/learn/documentation/latest/rest/javadocs/allclasses-frame.html 
Fri Feb  1 19:39:34 2019
@@ -2,9 +2,9 @@
 <!-- NewPage -->
 <html lang="en">
 <head>
-<!-- Generated by javadoc (1.8.0_181) on Fri Dec 21 10:56:56 PST 2018 -->
+<!-- Generated by javadoc (1.8.0_181) on Fri Feb 01 11:34:40 PST 2019 -->
 <title>All Classes (samza-rest_2.11 1.0.1-SNAPSHOT API)</title>
-<meta name="date" content="2018-12-21">
+<meta name="date" content="2019-02-01">
 <link rel="stylesheet" type="text/css" href="stylesheet.css" title="Style">
 <script type="text/javascript" src="script.js"></script>
 </head>

Modified: 
samza/site/learn/documentation/latest/rest/javadocs/allclasses-noframe.html
URL: 
http://svn.apache.org/viewvc/samza/site/learn/documentation/latest/rest/javadocs/allclasses-noframe.html?rev=1852769&r1=1852768&r2=1852769&view=diff
==============================================================================
--- samza/site/learn/documentation/latest/rest/javadocs/allclasses-noframe.html 
(original)
+++ samza/site/learn/documentation/latest/rest/javadocs/allclasses-noframe.html 
Fri Feb  1 19:39:34 2019
@@ -2,9 +2,9 @@
 <!-- NewPage -->
 <html lang="en">
 <head>
-<!-- Generated by javadoc (1.8.0_181) on Fri Dec 21 10:56:56 PST 2018 -->
+<!-- Generated by javadoc (1.8.0_181) on Fri Feb 01 11:34:40 PST 2019 -->
 <title>All Classes (samza-rest_2.11 1.0.1-SNAPSHOT API)</title>
-<meta name="date" content="2018-12-21">
+<meta name="date" content="2019-02-01">
 <link rel="stylesheet" type="text/css" href="stylesheet.css" title="Style">
 <script type="text/javascript" src="script.js"></script>
 </head>

Modified: 
samza/site/learn/documentation/latest/rest/javadocs/constant-values.html
URL: 
http://svn.apache.org/viewvc/samza/site/learn/documentation/latest/rest/javadocs/constant-values.html?rev=1852769&r1=1852768&r2=1852769&view=diff
==============================================================================
--- samza/site/learn/documentation/latest/rest/javadocs/constant-values.html 
(original)
+++ samza/site/learn/documentation/latest/rest/javadocs/constant-values.html 
Fri Feb  1 19:39:34 2019
@@ -2,9 +2,9 @@
 <!-- NewPage -->
 <html lang="en">
 <head>
-<!-- Generated by javadoc (1.8.0_181) on Fri Dec 21 10:56:56 PST 2018 -->
+<!-- Generated by javadoc (1.8.0_181) on Fri Feb 01 11:34:40 PST 2019 -->
 <title>Constant Field Values (samza-rest_2.11 1.0.1-SNAPSHOT API)</title>
-<meta name="date" content="2018-12-21">
+<meta name="date" content="2019-02-01">
 <link rel="stylesheet" type="text/css" href="stylesheet.css" title="Style">
 <script type="text/javascript" src="script.js"></script>
 </head>

Modified: 
samza/site/learn/documentation/latest/rest/javadocs/deprecated-list.html
URL: 
http://svn.apache.org/viewvc/samza/site/learn/documentation/latest/rest/javadocs/deprecated-list.html?rev=1852769&r1=1852768&r2=1852769&view=diff
==============================================================================
--- samza/site/learn/documentation/latest/rest/javadocs/deprecated-list.html 
(original)
+++ samza/site/learn/documentation/latest/rest/javadocs/deprecated-list.html 
Fri Feb  1 19:39:34 2019
@@ -2,9 +2,9 @@
 <!-- NewPage -->
 <html lang="en">
 <head>
-<!-- Generated by javadoc (1.8.0_181) on Fri Dec 21 10:56:56 PST 2018 -->
+<!-- Generated by javadoc (1.8.0_181) on Fri Feb 01 11:34:40 PST 2019 -->
 <title>Deprecated List (samza-rest_2.11 1.0.1-SNAPSHOT API)</title>
-<meta name="date" content="2018-12-21">
+<meta name="date" content="2019-02-01">
 <link rel="stylesheet" type="text/css" href="stylesheet.css" title="Style">
 <script type="text/javascript" src="script.js"></script>
 </head>

Modified: samza/site/learn/documentation/latest/rest/javadocs/help-doc.html
URL: 
http://svn.apache.org/viewvc/samza/site/learn/documentation/latest/rest/javadocs/help-doc.html?rev=1852769&r1=1852768&r2=1852769&view=diff
==============================================================================
--- samza/site/learn/documentation/latest/rest/javadocs/help-doc.html (original)
+++ samza/site/learn/documentation/latest/rest/javadocs/help-doc.html Fri Feb  
1 19:39:34 2019
@@ -2,9 +2,9 @@
 <!-- NewPage -->
 <html lang="en">
 <head>
-<!-- Generated by javadoc (1.8.0_181) on Fri Dec 21 10:56:56 PST 2018 -->
+<!-- Generated by javadoc (1.8.0_181) on Fri Feb 01 11:34:40 PST 2019 -->
 <title>API Help (samza-rest_2.11 1.0.1-SNAPSHOT API)</title>
-<meta name="date" content="2018-12-21">
+<meta name="date" content="2019-02-01">
 <link rel="stylesheet" type="text/css" href="stylesheet.css" title="Style">
 <script type="text/javascript" src="script.js"></script>
 </head>

Modified: samza/site/learn/documentation/latest/rest/javadocs/index-all.html
URL: 
http://svn.apache.org/viewvc/samza/site/learn/documentation/latest/rest/javadocs/index-all.html?rev=1852769&r1=1852768&r2=1852769&view=diff
==============================================================================
--- samza/site/learn/documentation/latest/rest/javadocs/index-all.html 
(original)
+++ samza/site/learn/documentation/latest/rest/javadocs/index-all.html Fri Feb  
1 19:39:34 2019
@@ -2,9 +2,9 @@
 <!-- NewPage -->
 <html lang="en">
 <head>
-<!-- Generated by javadoc (1.8.0_181) on Fri Dec 21 10:56:56 PST 2018 -->
+<!-- Generated by javadoc (1.8.0_181) on Fri Feb 01 11:34:40 PST 2019 -->
 <title>Index (samza-rest_2.11 1.0.1-SNAPSHOT API)</title>
-<meta name="date" content="2018-12-21">
+<meta name="date" content="2019-02-01">
 <link rel="stylesheet" type="text/css" href="stylesheet.css" title="Style">
 <script type="text/javascript" src="script.js"></script>
 </head>

Modified: samza/site/learn/documentation/latest/rest/javadocs/index.html
URL: 
http://svn.apache.org/viewvc/samza/site/learn/documentation/latest/rest/javadocs/index.html?rev=1852769&r1=1852768&r2=1852769&view=diff
==============================================================================
--- samza/site/learn/documentation/latest/rest/javadocs/index.html (original)
+++ samza/site/learn/documentation/latest/rest/javadocs/index.html Fri Feb  1 
19:39:34 2019
@@ -2,7 +2,7 @@
 <!-- NewPage -->
 <html lang="en">
 <head>
-<!-- Generated by javadoc (1.8.0_181) on Fri Dec 21 10:56:56 PST 2018 -->
+<!-- Generated by javadoc (1.8.0_181) on Fri Feb 01 11:34:40 PST 2019 -->
 <title>samza-rest_2.11 1.0.1-SNAPSHOT API</title>
 <script type="text/javascript">
     tmpTargetPage = "" + window.location.search;

Modified: 
samza/site/learn/documentation/latest/rest/javadocs/org/apache/samza/monitor/JobsClient.html
URL: 
http://svn.apache.org/viewvc/samza/site/learn/documentation/latest/rest/javadocs/org/apache/samza/monitor/JobsClient.html?rev=1852769&r1=1852768&r2=1852769&view=diff
==============================================================================
--- 
samza/site/learn/documentation/latest/rest/javadocs/org/apache/samza/monitor/JobsClient.html
 (original)
+++ 
samza/site/learn/documentation/latest/rest/javadocs/org/apache/samza/monitor/JobsClient.html
 Fri Feb  1 19:39:34 2019
@@ -2,9 +2,9 @@
 <!-- NewPage -->
 <html lang="en">
 <head>
-<!-- Generated by javadoc (1.8.0_181) on Fri Dec 21 10:56:55 PST 2018 -->
+<!-- Generated by javadoc (1.8.0_181) on Fri Feb 01 11:34:39 PST 2019 -->
 <title>JobsClient (samza-rest_2.11 1.0.1-SNAPSHOT API)</title>
-<meta name="date" content="2018-12-21">
+<meta name="date" content="2019-02-01">
 <link rel="stylesheet" type="text/css" href="../../../../stylesheet.css" 
title="Style">
 <script type="text/javascript" src="../../../../script.js"></script>
 </head>

Modified: 
samza/site/learn/documentation/latest/rest/javadocs/org/apache/samza/monitor/LocalStoreMonitor.html
URL: 
http://svn.apache.org/viewvc/samza/site/learn/documentation/latest/rest/javadocs/org/apache/samza/monitor/LocalStoreMonitor.html?rev=1852769&r1=1852768&r2=1852769&view=diff
==============================================================================
--- 
samza/site/learn/documentation/latest/rest/javadocs/org/apache/samza/monitor/LocalStoreMonitor.html
 (original)
+++ 
samza/site/learn/documentation/latest/rest/javadocs/org/apache/samza/monitor/LocalStoreMonitor.html
 Fri Feb  1 19:39:34 2019
@@ -2,9 +2,9 @@
 <!-- NewPage -->
 <html lang="en">
 <head>
-<!-- Generated by javadoc (1.8.0_181) on Fri Dec 21 10:56:55 PST 2018 -->
+<!-- Generated by javadoc (1.8.0_181) on Fri Feb 01 11:34:39 PST 2019 -->
 <title>LocalStoreMonitor (samza-rest_2.11 1.0.1-SNAPSHOT API)</title>
-<meta name="date" content="2018-12-21">
+<meta name="date" content="2019-02-01">
 <link rel="stylesheet" type="text/css" href="../../../../stylesheet.css" 
title="Style">
 <script type="text/javascript" src="../../../../script.js"></script>
 </head>

Modified: 
samza/site/learn/documentation/latest/rest/javadocs/org/apache/samza/monitor/LocalStoreMonitorConfig.html
URL: 
http://svn.apache.org/viewvc/samza/site/learn/documentation/latest/rest/javadocs/org/apache/samza/monitor/LocalStoreMonitorConfig.html?rev=1852769&r1=1852768&r2=1852769&view=diff
==============================================================================
--- 
samza/site/learn/documentation/latest/rest/javadocs/org/apache/samza/monitor/LocalStoreMonitorConfig.html
 (original)
+++ 
samza/site/learn/documentation/latest/rest/javadocs/org/apache/samza/monitor/LocalStoreMonitorConfig.html
 Fri Feb  1 19:39:34 2019
@@ -2,9 +2,9 @@
 <!-- NewPage -->
 <html lang="en">
 <head>
-<!-- Generated by javadoc (1.8.0_181) on Fri Dec 21 10:56:55 PST 2018 -->
+<!-- Generated by javadoc (1.8.0_181) on Fri Feb 01 11:34:39 PST 2019 -->
 <title>LocalStoreMonitorConfig (samza-rest_2.11 1.0.1-SNAPSHOT API)</title>
-<meta name="date" content="2018-12-21">
+<meta name="date" content="2019-02-01">
 <link rel="stylesheet" type="text/css" href="../../../../stylesheet.css" 
title="Style">
 <script type="text/javascript" src="../../../../script.js"></script>
 </head>

Modified: 
samza/site/learn/documentation/latest/rest/javadocs/org/apache/samza/monitor/LocalStoreMonitorFactory.html
URL: 
http://svn.apache.org/viewvc/samza/site/learn/documentation/latest/rest/javadocs/org/apache/samza/monitor/LocalStoreMonitorFactory.html?rev=1852769&r1=1852768&r2=1852769&view=diff
==============================================================================
--- 
samza/site/learn/documentation/latest/rest/javadocs/org/apache/samza/monitor/LocalStoreMonitorFactory.html
 (original)
+++ 
samza/site/learn/documentation/latest/rest/javadocs/org/apache/samza/monitor/LocalStoreMonitorFactory.html
 Fri Feb  1 19:39:34 2019
@@ -2,9 +2,9 @@
 <!-- NewPage -->
 <html lang="en">
 <head>
-<!-- Generated by javadoc (1.8.0_181) on Fri Dec 21 10:56:55 PST 2018 -->
+<!-- Generated by javadoc (1.8.0_181) on Fri Feb 01 11:34:39 PST 2019 -->
 <title>LocalStoreMonitorFactory (samza-rest_2.11 1.0.1-SNAPSHOT API)</title>
-<meta name="date" content="2018-12-21">
+<meta name="date" content="2019-02-01">
 <link rel="stylesheet" type="text/css" href="../../../../stylesheet.css" 
title="Style">
 <script type="text/javascript" src="../../../../script.js"></script>
 </head>


Reply via email to