make json_results tests pass again
diff --git a/typ/json_results.py b/typ/json_results.py
index 4b72b1c..fefa9ce 100644
--- a/typ/json_results.py
+++ b/typ/json_results.py
@@ -34,6 +34,31 @@
                 'Skip'][self]
 
 
+class Result(object): # pragma: no cover
+    # too many instance attributes  pylint: disable=R0902
+    # too many arguments  pylint: disable=R0913
+    def __init__(self, name, actual=None, unexpected=False, flaky=False,
+                 expected=None, out='', err='', code=0,
+                 started=None, took=None, worker=None):
+        self.name = name
+        self.expected = expected or [ResultType.Pass]
+        self.actual = actual
+        self.unexpected = unexpected
+        self.flaky = flaky
+        self.out = out
+        self.err = err
+        self.code = code
+        self.started = started
+        self.took = took
+        self.worker = worker
+
+
+class ResultSet(object): # pragma: no cover
+    def __init__(self):
+        self.results = []
+
+    def add(self, result):
+        self.results.append(result)
 
 
 TEST_SEPARATOR = '.'
diff --git a/typ/runner.py b/typ/runner.py
index d6eeabc..0ab32a8 100644
--- a/typ/runner.py
+++ b/typ/runner.py
@@ -30,6 +30,8 @@
 from typ.version import VERSION
 
 
+Result = json_results.Result
+ResultSet = json_results.ResultSet
 ResultType = json_results.ResultType
 
 
@@ -45,33 +47,6 @@
         self.teardown_fn = teardown_fn
 
 
-class Result(object): # pragma: no cover
-    # too many instance attributes  pylint: disable=R0902
-    # too many arguments  pylint: disable=R0913
-    def __init__(self, name, actual=None, unexpected=False, flaky=False,
-                 expected=None, out='', err='', code=0,
-                 started=None, took=None, worker=None):
-        self.name = name
-        self.expected = expected or [ResultType.Pass]
-        self.actual = actual
-        self.unexpected = unexpected
-        self.flaky = flaky
-        self.out = out
-        self.err = err
-        self.code = code
-        self.started = started
-        self.took = took
-        self.worker = worker
-
-
-class ResultSet(object): # pragma: no cover
-    def __init__(self):
-        self.results = []
-
-    def add(self, result):
-        self.results.append(result)
-
-
 class Runner(object):
     def __init__(self, host=None, loader=None):
         self.host = host or Host()
@@ -159,17 +134,6 @@
 
         return ret, full_results, trace
 
-    def _add_trace_event(self, trace, name, start, end):
-        event = {
-            'name': name,
-            'ts': int((start - self.stats.started_time) * 1000000),
-            'dur': int((end - start) * 1000000),
-            'ph': 'X',
-            'pid': 0,
-            'tid': 0,
-        }
-        trace['traceEvents'].append(event)
-
     def _set_up_runner(self):
         h = self.host
         args = self.args
@@ -504,6 +468,17 @@
     def exit_code_from_full_results(self, full_results): # pragma: no cover
         return json_results.exit_code_from_full_results(full_results)
 
+    def _add_trace_event(self, trace, name, start, end):
+        event = {
+            'name': name,
+            'ts': int((start - self.stats.started_time) * 1000000),
+            'dur': int((end - start) * 1000000),
+            'ph': 'X',
+            'pid': 0,
+            'tid': 0,
+        }
+        trace['traceEvents'].append(event)
+
     def _trace_from_results(self, result_set):
         trace = {
             'traceEvents': [],
diff --git a/typ/tests/json_results_test.py b/typ/tests/json_results_test.py
index 1826bec..54542bb 100644
--- a/typ/tests/json_results_test.py
+++ b/typ/tests/json_results_test.py
@@ -18,12 +18,14 @@
 
 
 class TestMakeUploadRequest(unittest.TestCase):
+    maxDiff = 4096
 
     def test_basic_upload(self):
-        results = {'foo': 'bar'}
+        results = json_results.ResultSet()
+        full_results = json_results.make_full_results([], 0, [], results)
         url, content_type, data = json_results.make_upload_request(
             'localhost', 'fake_builder_name', 'fake_master', 'fake_test_type',
-            results)
+            full_results)
 
         self.assertEqual(
             content_type,
@@ -49,21 +51,33 @@
              'filename="full_results.json"\r\n'
              'Content-Type: application/json\r\n'
              '\r\n'
-             '{"foo": "bar"}\r\n'
+             '{"tests": {}, "interrupted": false, "path_delimiter": ".", '
+             '"version": 3, "seconds_since_epoch": 0, '
+             '"num_failures_by_type": {"FAIL": 0, "SKIP": 0, "PASS": 0}}\r\n'
              '---J-S-O-N-R-E-S-U-L-T-S---B-O-U-N-D-A-R-Y---\r\n'))
 
 
 class TestMakeFullResults(unittest.TestCase):
     maxDiff = 2048
 
-    def disabled_test_basic(self):
-        return
+    def test_basic(self):
         test_names = ['foo_test.FooTest.test_fail',
                       'foo_test.FooTest.test_pass',
                       'foo_test.FooTest.test_skip']
 
+        result_set = json_results.ResultSet()
+        result_set.add(
+            json_results.Result('foo_test.FooTest.test_fail',
+                                actual=json_results.ResultType.Failure,
+                                unexpected=True))
+        result_set.add(json_results.Result('foo_test.FooTest.test_pass',
+                                           actual=json_results.ResultType.Pass))
+        result_set.add(json_results.Result('foo_test.FooTest.test_skip',
+                                           actual=json_results.ResultType.Skip,
+                                           unexpected=False))
+
         full_results = json_results.make_full_results(
-            ['foo=bar'], 0, test_names, [result])
+            ['foo=bar'], 0, test_names, result_set)
         expected_full_results = {
             'foo': 'bar',
             'interrupted': False,