otarza / serv-cst

CST web III porject
6 stars 0 forks source link

Request Line Unit Tests #21

Closed ioseb closed 11 years ago

ioseb commented 11 years ago

@revazi მოკლედ იმ შენიშვნებს რომ გაასწორებ რაც დაგიწერე კომენტარებში(ყურადღებით იყავი არ გამოგრჩეს რამე). შემდეგ განახორციელებ შენი ტესტების მოდიფიცირებას და ნაცვლად იმ უამრავი copy/paste ტესტ მეთოდისა გამოიყენებ ასეთ მიდგომას:

package edu.cst.webserver.http;

import junit.framework.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameters;

import java.util.Arrays;
import java.util.Collection;

@RunWith(Parameterized.class)
public class HttpMethodTest {
    private static final String HTTP_VERSION = "HTTP/1.1";

    private String requestLineString;
    private String expectedMethod;
    private String expectedPath;
    private String expectedQueryString;
    private String expectedFragment;
    private String expectedHttpVersion;

    public HttpMethodTest(String requestLineString,
                          String expectedMethod,
                          String expectedPath,
                          String expectedQueryString,
                          String expectedFragment,
                          String expectedHttpVersion) {
        this.requestLineString = requestLineString;
        this.expectedMethod = expectedMethod;
        this.expectedPath = expectedPath;
        this.expectedQueryString = expectedQueryString;
        this.expectedFragment = expectedFragment;
        this.expectedHttpVersion = expectedHttpVersion;
    }

    @Parameters
    public static Collection getRequestLineData() {
        return Arrays.asList(new Object[][] {
                {
                        "GET /path/to/resource HTTP/1.1", // Request line to parse
                        HttpMethod.METHOD_GET,            // Expected HTTP method
                        "/path/to/resource",              // Expected Path
                        "",                               // Expected Query String
                        "",                               // Expected Fragment
                        HTTP_VERSION                      // Expected HTTP version
                },
                {
                        "GET /path/to/resource?param=value HTTP/1.1",
                        HttpMethod.METHOD_GET,
                        "/path/to/resource",
                        "param=value",
                        "",
                        HTTP_VERSION
                }
        });
    }

    @Test
    public void testHttpRequestLine() {
        HttpRequestLineParser parser = HttpRequestLineParser.newInstance();
        HttpRequestLine requestLine = parser.parse(requestLineString);

        Assert.assertEquals(this.expectedMethod, requestLine.getMethod().getMethodName());
        Assert.assertEquals(this.expectedPath, requestLine.getPath());
        // Add other assertions here for expectedQueryString, expectedFragment and expectedHttpVersion.
    }
}

ეს არის პარამეტრიზებული უნიტ ტესტის ნიმუში რომელიც უნდა გამართო თავიდან ბოლომდე შენ. getRequestLineData() მეთოდი აბრუნებს გასატესტირებელი მოთხოვნის სტრიქონის კონფიგურაციას და საკმაოდ თვითაღწერადია. გადაიტანე ყველა შენი სატესტო მოთხოვნის სტრიქონი მაგ ფორმატში. ყურადღება რომ არ გაგეფანტოს, მასივის ქვემასივის შემადგენლობა ასეთია:

{
        "GET /path/to/resource HTTP/1.1", // Request line to parse
        HttpMethod.METHOD_GET,            // Expected HTTP method
        "/path/to/resource",              // Expected Path
        "",                               // Expected Query String
        "",                               // Expected Fragment
        HTTP_VERSION                      // Expected HTTP version
}

სანამ რადიკალურ ქმედებებზე გადახვალ, გაითვალისწინე რომ მხოლოდ ერთი ტესტ მეთოდია საჭირო ამ შემთხვევაში დანარჩენზე JUnit იზრუნებს რომ კონფიგურაციის ყოველი ელემენტისთვის გამოიძახოს ეს ტესტი. იცოდე წუწაობა არ დაიწყო.

ioseb commented 11 years ago

@revazi ძალიან ჩირგვში ხომ არ ჩაჯექი ისევ?

revazi commented 11 years ago

@ioseb ვერ ვიყავი კარგად საღამოს. არ ჩავმჯდარვარ ჩირგვში :rabbit:

revazi commented 11 years ago

@ioseb ტესტს შევცლვი ASAP :watch:

revazi commented 11 years ago

java.lang.IllegalArgumentException: wrong number of arguments
ვიფიქრე რომ პრობლემა აქ არის: return Arrays.asList(new Object[][] რის შემდეგაც შევეცადე რაღაცების გამერკვია და გავიგე რომ JUnit იყენებს http://docs.oracle.com/javase/tutorial/reflect/index.html - Reflection API ს სადაც კონსტრუქტორი არის public შემდეგი სახის: ExampleParamTest(int i, String[] strings); ამიტომ ვიფიქრე რომ შეცდომას ასეთი რაღაც გამოასწორებდა

 {
  0,
   new String[]{
   "GET /path/to/resource HTTP/1.1", 
    HttpMethod.METHOD_GET,            
    "/path/to/resource",              
    "",                               
    "",                               
    HTTP_VERSION                     
    }

 }

თუმცა შევცდი და ახლა იქნებ რამენაირად დამეხმაროთ @ioseb

ioseb commented 11 years ago

@revazi მუშა კოდი დაგიდე. არ მითქვია არასწორად გადაწერეთქო. ის კოდი რაც დავდე მუშაა. როგორმე გამოაგენი და გაასწორე.

revazi commented 11 years ago

@ioseb გავასწორე უკვე

ioseb commented 11 years ago

:D :D :D რაში იყო პრობლემა?

On Wednesday, March 6, 2013 at 3:56 PM, Revaz wrote:

@ioseb (https://github.com/ioseb) გავასწორე უკვე

— Reply to this email directly or view it on GitHub (https://github.com/reflooding/serv-cst/issues/21#issuecomment-14495665).

revazi commented 11 years ago

:dancer: არ გეტყვი :D

ioseb commented 11 years ago

კარგად შეინახე :))))))))))

On Wednesday, March 6, 2013 at 4:03 PM, Revaz wrote:

არ გეტყვი :D

— Reply to this email directly or view it on GitHub (https://github.com/reflooding/serv-cst/issues/21#issuecomment-14495903).

revazi commented 11 years ago

კლასის სახელში იყო პრობლემა

ioseb commented 11 years ago

ჰმ… კარგია რომ დამოუკიდებლად გამოასწორე :როზგი:

On Wednesday, March 6, 2013 at 4:07 PM, Revaz wrote:

კლასის სახელში იყო პრობლემა

— Reply to this email directly or view it on GitHub (https://github.com/reflooding/serv-cst/issues/21#issuecomment-14496019).

revazi commented 11 years ago

:cactus: ტესტებს ჩავყრი ყველას და დავაკომიტებ

ioseb commented 11 years ago

დააკომიტე მაშინ როდესაც ეგ ტესტები გაიმართება წესიერად და ყველაფერი იმუშავებს.

On Wednesday, March 6, 2013 at 4:09 PM, Revaz wrote:

ტესტებს ჩავყრი ყველას და დავაკომიტებ

— Reply to this email directly or view it on GitHub (https://github.com/reflooding/serv-cst/issues/21#issuecomment-14496088).

revazi commented 11 years ago

ხო ეგ ვიგულისხმე :v:

ioseb commented 11 years ago

okay, ველოდები შედეგს.

On Wednesday, March 6, 2013 at 4:11 PM, Revaz wrote:

ხო ეგ ვიგულისხმე

— Reply to this email directly or view it on GitHub (https://github.com/reflooding/serv-cst/issues/21#issuecomment-14496196).

ioseb commented 11 years ago

@revazi ვნახე რომ გადაწყობილხარ ამ ტესტებზე. ორი შეკითხვა:

ანუ ამეებს იმიტომ გეკითხები, რომ მხოლოდ კოდის წერა არ არის ჩვენთვის თვითმიზანი.

revazi commented 11 years ago

@ioseb
ნელ-ნელა ვსწავლობ როგორ უნდა ვიმუშავო კოდზე და ამასთან შენგან სწორ მიდგომებს ვგებულობ რაღაც ბუნდოვანებები ისევ მრჩება მაგრამ დრო და დრო შევეცდები ყველაფერში გავერკვე.

ამ იუნიტ ტესტს რაც შეეხება როგორც გადავაკეთეთ მომეწონა და მგონია რომ გავიგე კიდეც.

ioseb commented 11 years ago

ოკეი :-)

On Wednesday, March 6, 2013 at 6:44 PM, Revaz wrote:

@ioseb (https://github.com/ioseb)

ნელ-ნელა ვსწავლობ როგორ უნდა ვიმუშავო კოდზე და ამასთან შენგან სწორ მიდგომებს ვგებულობ რაღაც ბუნდოვანებები ისევ მრჩება მაგრამ დრო და დრო შევეცდები ყველაფერში გავერკვე.
ამ იუნიტ ტესტს რაც შეეხება როგორც გადავაკეთეთ მომეწონა და მგონია რომ გავიგე კიდეც.

— Reply to this email directly or view it on GitHub (https://github.com/reflooding/serv-cst/issues/21#issuecomment-14502491).

revazi commented 11 years ago

ერთი კითხვა მაქვს უცებ. @Parameters და @Tests ამათი კავშირი მოკლედ მითხარი რაღაც წარმოდგენა მაქვს უბრალოდ დავრწმუნდე მინდა.

ioseb commented 11 years ago

@revazi ორივე არის JUnit - ის ანოტაციები. ანოტაციები გარკვეული მეტა ინფორმაციის დატვირთვას ატარებს ჯავაში. როდესაც ვწერთ ტესტებს და ვადებთ მაგ ანოტაციებს მეთოდებს(კლასებს ა.შ.) JUnit - ის შესრულების გარემო აღმოაჩენს შესაბამისად ანოტირებულ კლასებსა და მეთოდებს და უშვებს ტესტებს ავტომატურად.

როდესაც მეთოდს ვაწერთ ანოტაციას @Test ამითი JUnit - ს ვეუბნებით რომ ეს არის ტესტირების მეთოდი და იგი ამ მეთოდს იძახებს ჩვენთვის.

როდესაც კლასზე ვაკეთებთ ანოტაციას @RunWith(Parameterized.class) ამითი კიდევ დამატებით ინფორმაციას ვაწვდით JUnit - ს რომ გვინდა ამ კლასის შიგნით გამოყენებული პარამეტრიზებული მეთოდები გამოიყენოს ჩვენთვის საჭირო პარამეტრების გენერაციისთვის და მხოლოდ მას შემდეგ შეასრულოს ტესტები.

On Wednesday, March 6, 2013 at 6:48 PM, Revaz wrote:

ერთი კითხვა მაქვს უცებ.
@Parameters (https://github.com/Parameters) და @Tests (https://github.com/Tests) ამათი კავშირი მოკლედ მითხარი რაღაც წარმოდგენა მაქვს უბრალოდ დავრწმუნდე მინდა.

— Reply to this email directly or view it on GitHub (https://github.com/reflooding/serv-cst/issues/21#issuecomment-14502726).

revazi commented 11 years ago

@ioseb :+1: გავიგე. შევასწორებ იმ რაღაცებს კიდევ და დავაკომიტებ.

ioseb commented 11 years ago

ოკ

On Wednesday, March 6, 2013 at 6:55 PM, Revaz wrote:

@ioseb (https://github.com/ioseb) გავიგე. შევასწორებ იმ რაღაცებს კიდევ და დავაკომიტებ.

— Reply to this email directly or view it on GitHub (https://github.com/reflooding/serv-cst/issues/21#issuecomment-14503124).

demonno commented 11 years ago

საინტერესოაა , testHttpRequestLine() მეთოდის გამოძახება ხდება რეალურად იმდენჯერ რამდენი ელემენტიცაა მასივში და კონსტრუქტორისთვის პარამეტრების გადაცემაც ავტომატურად გვარდება .. ანოტაციების წყალობით ხდება ეს ყველაფერი . :cool: იმედია სწორად გავიგე :D

ioseb commented 11 years ago

დემურ,

რამდენი ელემენტიც არის მასივში იმდენჯერ იქმნება ობიექტი და შესაბამისად გადაეცემა პარამეტრებად ქვემასივის ელემენტები. ამის შემდეგ იძახება ტესტ მეთოდი რომელსაც თავისთავად ცხადია ხელი მიუწვდება ობიექტის ცვლადებზე.

Sent from my iPhone

On Mar 6, 2013, at 10:17 PM, Demur Nodia notifications@github.com wrote:

საინტერესოაა , testHttpRequestLine() მეთოდის გამოძახება ხდება რეალურად იმდენჯერ რამდენი ელემენტიცაა მასივში და კონსტრუქტორისთვის პარამეტრების გადაცემაც ავტომატურად გვარდება .. ანოტაციების წყალობით ხდება ეს ყველაფერი . იმედია სწორად გავიგე :D

— Reply to this email directly or view it on GitHub.

demonno commented 11 years ago

@ioseb გასაგებია enemy

revazi commented 11 years ago

@ioseb

  queryString = (queryString != null) ? queryString : "";
  fragmentString = (fragmentString != null) ? fragmentString : "";
  requestLine.setQueryString(queryString);
  requestLine.setFragment(fragmentString);

ამაზე რა აზრის ხარ :question:

revazi commented 11 years ago

@ioseb დავაკომიტო ასე :question:

ioseb commented 11 years ago

აზრი? ცარიელი სტრიქონი ვის რად უნდა?

Sent from my iPhone

On Mar 6, 2013, at 11:17 PM, Revaz notifications@github.com wrote:

@ioseb

queryString = (queryString != null) ? queryString : ""; fragmentString = (fragmentString != null) ? fragmentString : ""; ამაზე რა აზრის ხარ?

— Reply to this email directly or view it on GitHub.

ioseb commented 11 years ago

იხ. წინა პასუხი.

Sent from my iPhone

On Mar 6, 2013, at 11:42 PM, Revaz notifications@github.com wrote:

@ioseb დავაკომიტო ასე

— Reply to this email directly or view it on GitHub.

revazi commented 11 years ago

ის აზრი აქვს რომ სხვანაირად ტესტები warning-ს მაჩვენებს ანუ expected value fragmentString - თვის და queryStirng - თვის არის "" ცარიელი სტრიქონი და NULL - ზე :warning:

revazi commented 11 years ago

როდესაც expected value fragmentString და queryString-თვის არ არის "" მაშინ ყველაფერი რიგზეა თუარადა ცარიელი სტრიქონის მინიჭებით მოგვარდა პრობლემა და ალბათ რაღაც არ მესმის ნორალურად. :mag:

ioseb commented 11 years ago

Warning არ არის შეცდომა, დაიკიდე ტესტებში.

Sent from my iPhone

On Mar 6, 2013, at 11:54 PM, Revaz notifications@github.com wrote:

ის აზრი აქვს რომ სხვანაირად ტესტები warning-ს მაჩვენებს ანუ expected value fragmentString - თვის და queryStirng - თვის არის "" ცარიელი სტრიქონი და NULL - ზე

— Reply to this email directly or view it on GitHub.

ioseb commented 11 years ago

@revazi ბოდიში, არ მიმიწვდებოდა კომპზე ხელი ახლა მოვედი. აბა ამიხსენი წესიერად რომელი ქეისი იწვევს მაგას? კოდი დააკპირე რა აქ ასე ვერ ვიგებ მგონი მეც წესიერად.

revazi commented 11 years ago

ანუ ეს არის ჩვენი ტესტის ნიმუში

               {
                        "GET /path/to/resource HTTP/1.1", // Request line to parse
                        HttpMethod.METHOD_GET,            // Expected HTTP method
                        "/path/to/resource",              // Expected Path
                        "",                               // Expected Query String
                        "",                               // Expected Fragment
                        HTTP_VERSION                      // Expected HTTP version

                }

სადაც Expected Query String და Expected Fagment არის "" ამიტომ ამ ორ String - ს რომ ვხდით თავიდანვე null-ს არ აქვს მნიშვნელობა set-ს ვაკეთებთ თუ არა მაინც ერთი და იგივეს მიწერს

junit.framework.ComparisonFailure: null 
Expected :
Actual   :
ioseb commented 11 years ago

@revazi

საფუძვლიანად ჩავუჯექი შენს ნამუშევარს და მინდა გაგახარო რომ ძირეულად გადასაწერი გვაქვს. ეგ ვორნინგი ადვილად მოგვარდებოდა თუ ამას "", ჩავანაცვლებთ ამით null, (ყველგან რა თქმა უნდა).

გარდა იმისა რომ შენს კოდში მნიშვნელოვანი ცვლილებები გვაქვს შესატანი, თვითონ ტესტებიც არასწორად გაქვს შედგენილი.

revazi commented 11 years ago

@ioseb მაგის თქმას ვცდილობდი რომ ყველა ტესტში უნდა შემეცვალა "", ესენი null ებით.

ტესტებში სხვა რა შეცდომაა?

ioseb commented 11 years ago

@revazi ტესტებში გაქვს შეცდომები, მაგალითად:

აქ "?param=value", კითხვის ნიშანი უბრალოდ გამყოფია. რა ესაქმება მანდ?

{
                        "GET /path/to/resource?param=value HTTP/1.1",
                        HttpMethod.METHOD_GET,
                        "/path/to/resource",
                        "?param=value",
                        "",
                        HTTP_VERSION
                },

ასევე "?page=1" არასწორია, კითხვის ნიშნით არ უნდა იწყებოდეს. კითხვის ნიშანი უბრალოდ გამოყოფია. იგივე ეხება "#" სიმბოლოს, იგი გამყოფია და რეზულტატში არაფერი ესაქმება:

{
                        "GET /forums/1/topics/2375?page=1#posts-17408 HTTP/1.1\r\n",
                        HttpMethod.METHOD_GET,
                        "/forums/1/topics/2375",
                        "?page=1",
                        "#posts-17408",
                        HTTP_VERSION
                },

კიდევ არის რამდენიმე მასეთი ტესტი რომელიც არასწორია. შესაბამისად რადგან შენი პარსერი გადის ტესტირებას ამ არასწორი ტესტებით შენი პარსერიც არასწორად მუშაობს.

ioseb commented 11 years ago

@revazi

მაგალითად ამ ტესტზე საერთოდ უნდა ჩაიჩეხოს შენი პარსერი და სინამდვილეში მუშაობს:

{
                        "GET /with_\"stupid\"_quotes?foo=\"bar\" HTTP/1.1\r\n\r\n",
                        HttpMethod.METHOD_GET,
                        "/with_\"stupid\"_quotes",
                        "?foo=\"bar\"",
                        "",
                        HTTP_VERSION
                },
ioseb commented 11 years ago

ამ ცვლადებზე:

 private String queryString="";
    private String pathString ="";
    private String fragmentString = "";

უკვე მოგწერე რომ ლოკალური უნდა იყოსთქო და მაინც ობიექტის დონეზე დატოვე. დასკვნა: ჩემს კომენტარებს არ/ვერ კითხულობ. ისევ პრიმიტიულ "პრაგრამისტულ" შედეგზე ხარ ორიენტირებული.

revazi commented 11 years ago

@ioseb ანუ კითხვისნიშანი არ შედის queryString და არც # ეს არ შედის fragmentString - ში?

revazi commented 11 years ago

არა სოსო არ დამიკომიტებია იმის მერე რაც მომწერე შევცვალე და შენგან ველოდებოდი პასუხებს როგორ უნდა მოგვეგვარებინა ეს პრობლემა შეცვლილი მაქვს

revazi commented 11 years ago

"პრაგრამისტული" შედეგი არ ვიცი რა არის :baby:

ioseb commented 11 years ago

@revazi არა არ შედის. მოკლედ, ძალიან ვაფასებ რომ ბევრი იშრომე და ამ შრომამ(თუნდაც უარყოფითი შედეგით) პოზიტიური შედეგი მოგვცა ცოტა გაშინაურდი. ახლა საქმე რომ გავამარტივოთ მოაშორე URI - ს შენეული დახლეჩვის "ალგორითმი" და უფრო სწორი და საიმედო გზით წავიდეთ. გამოიყენე java.net.URI კლასი. გაარჩიე კარგად(!) ისე არა რომ სანახევროდ გაიგო. და შეეცადე დააინტეგრირო შენს პარსერში. გადააშენე ეგ substring() მეთოდები. შეგნებულად არ გითხარი მაგ კლასის არსებობის შესახებ აქამდე მინდოდა რომ გემუშავა შენით.

P.S. "პრაგრამისტული" შედეგი არის უბრალოდ შედეგი შედეგისთვის.

revazi commented 11 years ago

@ioseb
გადავაწყდი სადღაც მაგ java.net.URI-ს მაგრამ არ მიმიქცევია ყურადღება. გავარჩევ დღეს. დავაკომიტო ახლა ის რაც მაქვს?

ioseb commented 11 years ago

@revazi მოკლედ სამი ამოცანა გვაქვს:

როდესაც ამ ყველაფერს გააკეთებ მერე ტესტებიდან უნდა გამოარჩიო ის ნეგატიური ტესტები რომლებიც ცალკე უნდა გავიტანოთ, მაგ ტესტირების კლასში მხოლოდ პოზიტიური ტესტები უნდა დავტოვოთ.

დაკომიტებით არაფერი არ დააკომიტო, უამრავი საქმე გვაქვს. არავის არ ესაჭიროება ნახევარფაბრიკატები.

revazi commented 11 years ago

@ioseb გასაგებია.

ioseb commented 11 years ago

@revazi სანამ შუბლით შეეჭიდები რამეს ჯერ დოკუმენტაცია წაიკითხე ყურადღებით: http://docs.oracle.com/javase/7/docs/api/java/net/class-use/URI.html

revazi commented 11 years ago

@ioseb ok :mag:

ioseb commented 11 years ago

@revazi არ ჩათვალო რომ ცოტა საქმეა, საკმაოდ მოგიწევს ოფლის დაღვრა.

revazi commented 11 years ago

@ioseb შევეცდები ძირეულად გავარჩიო და დროშიც არ გავწელო