3782: bugfix and added integration test
authorTim Pierce <twp@curoverse.com>
Wed, 1 Oct 2014 17:50:53 +0000 (13:50 -0400)
committerTim Pierce <twp@curoverse.com>
Wed, 1 Oct 2014 17:50:53 +0000 (13:50 -0400)
* Fixed bug where log viewer would always request partial log and receive
  206, even when total log size is shorter than log_viewer_max_bytes.
* Added integration tests:
** set up KEEP_LOCAL_STORE with dummy log
** test retrieving full job log
** test retrieving partial job log

apps/workbench/app/assets/javascripts/log_viewer.js
apps/workbench/app/views/jobs/_show_log.html.erb
apps/workbench/test/integration/jobs_test.rb
services/api/test/fixtures/collections.yml
services/api/test/fixtures/jobs.yml

index 93681cc6d73fc7559120562f664e77c0a45d216e..0e12f9cfd4127c61eed5e4b764418b1cabed3ab6 100644 (file)
@@ -94,7 +94,7 @@ function addToLogViewer(logViewer, lines, taskState) {
             });
             count += 1;
         } else {
-            console.log("Did not parse: " + lines[a]);
+            console.log("Did not parse line " + a + ": " + lines[a]);
         }
     }
     logViewer.add(items);
index 01d5b18901e1cbba98cb783c5b6caa64bd7d35b3..01d2167ffca736e49613fa0e8b194bd2a50a113b 100644 (file)
@@ -53,20 +53,23 @@ var makeFilter = function() {
 <% if @object.log %>
   <% logcollection = Collection.find @object.log %>
   <% if logcollection %>
-    var log_maxbytes = <%= Rails.configuration.log_viewer_max_bytes %>;
+    log_size = <%= logcollection.files[0][2] %>
+    log_maxbytes = <%= Rails.configuration.log_viewer_max_bytes %>;
     logcollection_url = '<%=j url_for logcollection %>/<%=j logcollection.files[0][1] %>';
     $("#log-viewer-download-url").attr('href', logcollection_url);
     $("#log-viewer-download-pane").css('display', 'inline');
-    $.ajax(logcollection_url,
-          {
-            headers: {'Range': 'bytes=0-' + log_maxbytes}
-          }).
+    if (log_size > log_maxbytes) {
+      range_header = { 'Range': 'bytes=0-' + log_maxbytes };
+    } else {
+      range_header = null;
+    }
+    $.ajax(logcollection_url, { headers: range_header }).
        done(function(data, status, jqxhr) {
            logViewer.filter();
            addToLogViewer(logViewer, data.split("\n"), taskState);
            logViewer.filter(makeFilter());
-           var v = jqxhr.getResponseHeader('Content-Range')
-             .match(/bytes \d+-(\d+)\/(.+)/);
+            content_range_hdr = jqxhr.getResponseHeader('Content-Range');
+           var v = content_range_hdr && content_range_hdr.match(/bytes \d+-(\d+)\/(.+)/);
             short_log = v && (v[2] == '*' || parseInt(v[1]) + 1 < v[2]);
            if (jqxhr.status == 206 && short_log) {
              $("#log-viewer-overview").html(
index 50616de45fc077326cfed3de2e06f1e49276bcc6..8ecff4da8e3e43489e26c747020ed0187e03d775 100644 (file)
@@ -1,6 +1,33 @@
+require 'fileutils'
+require 'tmpdir'
+
 require 'integration_helper'
 
 class JobsTest < ActionDispatch::IntegrationTest
+
+  def setup
+    # Set up KEEP_LOCAL_STORE with a file that satisfies
+    # the log collection for job 'job_with_real_log'
+    # TODO: figure out a better way to store this test data
+    # (e.g. in a dummy test fixture)
+    #
+    ENV['KEEP_LOCAL_STORE'] ||= Dir.mktmpdir
+    keepdir = ENV['KEEP_LOCAL_STORE']
+    open(File.join(keepdir, 'b9f7e25b33844d816d8531686f8bf360'), 'w') do |f|
+      f.write("2014-01-01_12:00:01 zzzzz-8i9sb-abcdefghijklmno 0  log message 1\n")
+      f.write("2014-01-01_12:00:02 zzzzz-8i9sb-abcdefghijklmno 0  log message 2\n")
+      f.write("2014-01-01_12:00:03 zzzzz-8i9sb-abcdefghijklmno 0  log message 3\n")
+    end
+
+    @log_viewer_max_bytes = Rails.configuration.log_viewer_max_bytes
+  end
+
+  def teardown
+    keepdir = ENV.delete 'KEEP_LOCAL_STORE'
+    FileUtils.rm_rf(keepdir) if keepdir
+    Rails.configuration.log_viewer_max_bytes = @log_viewer_max_bytes
+  end
+
   test "add job description" do
     Capybara.current_driver = Capybara.javascript_driver
     visit page_with_token("active", "/jobs")
@@ -25,4 +52,33 @@ class JobsTest < ActionDispatch::IntegrationTest
     click_link 'Go to dashboard'
     assert page.has_text? 'Active pipelines'
   end
+
+  test "view job log" do
+    Capybara.current_driver = Capybara.javascript_driver
+    job = api_fixture('jobs')['job_with_real_log']
+
+    visit page_with_token("active", "/jobs/#{job['uuid']}")
+    assert page.has_text? job['script_version']
+
+    click_link 'Log'
+    wait_for_ajax
+    assert page.has_text? 'Started at'
+    assert page.has_text? 'Finished at'
+    assert page.has_text? 'log message 1'
+    assert page.has_text? 'log message 2'
+    assert page.has_text? 'log message 3'
+  end
+
+  test 'view partial job log' do
+    Capybara.current_driver = Capybara.javascript_driver
+    Rails.configuration.log_viewer_max_bytes = 100
+    job = api_fixture('jobs')['job_with_real_log']
+
+    visit page_with_token("active", "/jobs/#{job['uuid']}")
+    assert page.has_text? job['script_version']
+
+    click_link 'Log'
+    wait_for_ajax
+    assert page.has_text? 'Showing only 100 bytes of this log'
+  end
 end
index 18531174e0937991f17abbbc8bc43fe98dc90480..ba95b343233fc1aa5281ddefc2d890ca7a5a16e5 100644 (file)
@@ -199,3 +199,17 @@ collection_expires_in_future:
   expires_at: 2038-01-01T00:00:00Z
   manifest_text: ". 37b51d194a7513e45b56f6524f2d51f2+3 0:3:expired\n"
   name: collection_expires_in_future
+
+# a collection with a log file that can be parsed by the log viewer
+# This collection hash matches the following log text:
+#    2014-01-01_12:00:01 zzzzz-8i9sb-abcdefghijklmno 0  log message 1
+#    2014-01-01_12:00:02 zzzzz-8i9sb-abcdefghijklmno 0  log message 2
+#    2014-01-01_12:00:03 zzzzz-8i9sb-abcdefghijklmno 0  log message 3
+#
+real_log_collection:
+  uuid: zzzzz-4zz18-op4e2lbej01tcvu
+  owner_uuid: zzzzz-tpzed-xurymjxw79nv3jz
+  created_at: 2014-09-01 12:00:00
+  portable_data_hash: 3399cbb0953a7823618f3e288a85ee26+81
+  manifest_text: ". b9f7e25b33844d816d8531686f8bf360+195 0:195:zzzzz-8i9sb-abcdefghijklmno.log.txt\n"
+  name: real_log_collection
index e6772404f5c0ae41df6bb4d99160cd9b412c83d9..7c375bceb0c2bd54fedeb4430d37db2a649024ab 100644 (file)
@@ -212,3 +212,11 @@ queued:
   is_locked_by_uuid: ~
   tasks_summary: {}
   runtime_constraints: {}
+
+# A job with a log collection that can be parsed by the log viewer.
+job_with_real_log:
+  uuid: zzzzz-8i9sb-0vsrcqi7whchuil
+  created_at: 2014-09-01 12:00:00
+  owner_uuid: zzzzz-tpzed-xurymjxw79nv3jz
+  log: 3399cbb0953a7823618f3e288a85ee26+81
+  script_version: 7def43a4d3f20789dda4700f703b5514cc3ed250