CSC/ECE 517 Spring 2017/OSS M1706 Tracking intermittent test failures over time

From Expertiza_Wiki
Jump to navigation Jump to search

Introduction

This wiki provides details on new functionality programmed for the Servo OSS project.

Background

"Servo is a project to develop a new Web browser engine. Our goal is to create an architecture that takes advantage of parallelism at many levels while eliminating common sources of bugs and security vulnerabilities associated with incorrect memory management and data races." Servo can be used through Browser.html, embedded in a website, or natively in Mozilla Firefox. It is designed to load web pages more efficiently and more securely.

Motivation

This project is a request from the Servo OSS project to reduce the impact intermittent test failures have on the software. The request made is for a Flask service using Python 2.7. The intermittent test failure tracker stores information regarding a test that fails intermittently and also provides means to quickly query for tests that have failed.

Tasks

The intermittent test failure tracker initial steps (for the OSS project) include:

  • Build a Flask service
  • Use a JSON file to store information
  • Record required parameters: Test file, platform, test machine (builder), and related GitHub pull request number
  • Query the store results given a particular test file name
  • Use the known intermittent issue tracker as an example of a Simple flask server

Subsequent steps (for the final project) include:

  • Add ability to query the service by a date range, to find out which were occurred the most often
  • Build an HTML front-end to the service that queries using JS and reports the results
    • Links to GitHub
    • Sorting
  • Make filter-intermittents command record a separate failure for each intermittent failure encountered
  • Propogate the required information for recording failures in saltfs

Design

Design Pattern

The Servo and this project's code follow a Service Layer design pattern. This design pattern breaks up functionality into smaller "services" and applies the services to the topmost "layer" of the project for which they are needed.

Application Flow

Saving a Test

The Servo build agent calls a webhook (a way for an app to provide other applications with real-time information) inside the test tracker. The webhook then calls a handler that contains any business logic necessary to transform the request. Finally the handler persists the request into the db, in this case a json file. This flow can be seen in the graph below.

                    +---------------------------------------------+
                    |       Intermittent Test Failure Tracker     |
                    |                                             |
+--------------+    | +-----------+      +---------+    +------+  |
|              |    | |           |      |         |    |      |  |      +--------+
|    Servo     |    | |           |      |         |    |      |  |      |        |
|    Build     +------>  webhook  +------> handler +---->  db  +--------->  json  |
|    Server    |    | |           |      |         |    |      |  |      |  file  |
|              |    | |           |      |         |    |      |  |      |        |
+--------------+    | +-----------+      +---------+    +------+  |      +--------+
                    |                                             |
                    +---------------------------------------------+

Implementation

The implementation is entirely influenced by the request, the Servo team clearly defines what the service should do and how it would be made.

Data model

The model for an intermittent test is defined mostly by the request with a few additions to help with querying in later steps of the OSS request.

Name Type Description
test_file String Name of the intermittent test file
platform String Platform the test failed on
builder String The test machine (builder) the test failed on
number Integer The GitHub pull request number
fail_date ISO date (String) Date of the failure

Datastore

To store the intermittent test failures, a library called TinyDB is used. This library is a native python library that provides convenient SQL command like helpers around a JSON file to more easily use it like a database. The format of the JSON file is simply an array of JSON objects, making the file easily human readable.

Flask Service

Flask is a microservice framework written in Python. A flask service is a REST (representational state transfer) API that maps URL and HTTP verbs to python functions. Some basic examples of flask routes:

 @app.route('/')
 def index():
   return 'Index page'
 
 @app.route('/user/<username>')
 def show_user(username):
   return db.lookup(username)

The first method returns 'index page' at the root URL. The second method accepts a URL param after user and returns the user from a database.

Test Plan

Functional Testing

As a convenience to the testers included in this code base is a set of testing web applications and is only for illustrating the project's functionality. This simple set of forms allow a tester to exercise the functionality of the REST endpoints without having to write any REST code. The links on the page lead to demonstrations of the query and record handlers, as well as a display of the JSON file containing all the Intermittent Test Failure records. All usable for thorough integration testing.

Unit Testing

The Unit Tests included in the code exercise the major functions of this system. The tests exercise the addition of a record into the database, the removal of a record given a filename, the retrieval of a record, and the assertion that a record will not be added if any of the record parameters (test_file, platform, builder, number) is missing.

Before attempting either of the following, clone the repo

To Run Unit Tests
  • In the cloned repo folder, use the command python test.py
To Run The App Locally
  • In the cloned repo folder, use the command python -m flask_server
  • Go to http://localhost:5000 to launch the app

Submission/Pull Requests

There is no Pull Request because Servo manager Josh Matthews requested that we start a new (non-branched) repository for this project. The work has been started in a new GitHub repo located here. When Servo developers are ready, the project will be pulled in to the Servo project on GitHub. In the interim, we shared our repo with Josh, whose reply was "this looks really great! Thanks for tackling it!"